802 lines
24 KiB
Go
802 lines
24 KiB
Go
|
// ==========================================================================
|
|||
|
// GFast自动生成controller操作代码。
|
|||
|
// 生成日期:2023-07-31 11:20:54
|
|||
|
// 生成路径: internal/app/system/controller/qianqi_fangzhen.go
|
|||
|
// 生成人:gfast
|
|||
|
// desc:方阵
|
|||
|
// company:云南奇讯科技有限公司
|
|||
|
// ==========================================================================
|
|||
|
|
|||
|
package controller
|
|||
|
|
|||
|
import (
|
|||
|
"context"
|
|||
|
"encoding/json"
|
|||
|
"errors"
|
|||
|
"fmt"
|
|||
|
"github.com/gogf/gf/v2/crypto/gmd5"
|
|||
|
"github.com/gogf/gf/v2/database/gdb"
|
|||
|
"github.com/gogf/gf/v2/frame/g"
|
|||
|
"github.com/google/uuid"
|
|||
|
"github.com/jinzhu/copier"
|
|||
|
"github.com/tiger1103/gfast/v3/api/v1/common/shp"
|
|||
|
tool2 "github.com/tiger1103/gfast/v3/api/v1/common/tool"
|
|||
|
"github.com/tiger1103/gfast/v3/api/v1/system"
|
|||
|
"github.com/tiger1103/gfast/v3/internal/app/system/dao"
|
|||
|
ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context"
|
|||
|
"github.com/tiger1103/gfast/v3/internal/app/system/model"
|
|||
|
"github.com/tiger1103/gfast/v3/internal/app/system/model/do"
|
|||
|
"github.com/tiger1103/gfast/v3/internal/app/system/model/entity"
|
|||
|
"github.com/tiger1103/gfast/v3/internal/app/system/service"
|
|||
|
"github.com/tiger1103/gfast/v3/library/liberr"
|
|||
|
"github.com/tiger1103/gfast/v3/third/create"
|
|||
|
tool "github.com/tiger1103/gfast/v3/utility/coryUtils"
|
|||
|
"math/rand"
|
|||
|
"os"
|
|||
|
"os/exec"
|
|||
|
"strconv"
|
|||
|
"strings"
|
|||
|
"time"
|
|||
|
)
|
|||
|
|
|||
|
type qianqiDxfController struct {
|
|||
|
BaseController
|
|||
|
}
|
|||
|
|
|||
|
var QianqiDxf = new(qianqiDxfController)
|
|||
|
|
|||
|
func (c *qianqiDxfController) FzFunc(ctx context.Context, req *system.FzReq) (res *system.FzRes, err error) {
|
|||
|
err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
|
|||
|
err = g.Try(ctx, func(ctx context.Context) {
|
|||
|
//1、获取数据
|
|||
|
point := req.Point
|
|||
|
plane := req.Plane
|
|||
|
//2、合并名称
|
|||
|
var listE []system.FacFeatureByPlane //面
|
|||
|
for _, data := range plane {
|
|||
|
adata := system.FacFeatureByPlane{}
|
|||
|
for _, bdata := range data.Features {
|
|||
|
copier.Copy(&adata, &bdata)
|
|||
|
listE = append(listE, adata)
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
var listT []system.FacFeatureByPoint //点
|
|||
|
for _, data := range point {
|
|||
|
adata := system.FacFeatureByPoint{}
|
|||
|
for _, bdata := range data.Features {
|
|||
|
copier.Copy(&adata, &bdata)
|
|||
|
listT = append(listT, adata)
|
|||
|
}
|
|||
|
}
|
|||
|
var templateDataList []do.WorkStatus
|
|||
|
//3、循环判断坐标是否在点内
|
|||
|
for _, i := range listE {
|
|||
|
var minVal float64
|
|||
|
var fzName string
|
|||
|
for num, j := range listT {
|
|||
|
inPolygon := tool.FanWei(i.Geometry.Coordinates[0], j.Geometry.Coordinates)
|
|||
|
//如果为true,说明在多边形内
|
|||
|
if inPolygon {
|
|||
|
//直接确认数据
|
|||
|
fzName = j.Properties.Text //名字
|
|||
|
} else {
|
|||
|
distance := tool.PointToPolygonDistance(i.Geometry.Coordinates[0], j.Geometry.Coordinates)
|
|||
|
fmt.Printf("点到多边形的最短距离(单位米):%.2f m\n", distance)
|
|||
|
if num == 0 {
|
|||
|
if len(listT) == 1 { //只有一个情况下直接赋值
|
|||
|
minVal = distance
|
|||
|
fzName = j.Properties.Text //名字
|
|||
|
break
|
|||
|
}
|
|||
|
minVal = distance
|
|||
|
fzName = j.Properties.Text //名字
|
|||
|
} else {
|
|||
|
if distance < minVal {
|
|||
|
minVal = distance
|
|||
|
fzName = j.Properties.Text //名字
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
//得到详情数据(方阵)
|
|||
|
points := []shp.Point{}
|
|||
|
for _, jwd := range i.Geometry.Coordinates[0] {
|
|||
|
points = append(points, shp.Point{
|
|||
|
Lng: jwd[0],
|
|||
|
Lat: jwd[1],
|
|||
|
})
|
|||
|
}
|
|||
|
polygon := shp.Polygon{
|
|||
|
Positions: points,
|
|||
|
}
|
|||
|
marshal, err := json.Marshal(polygon)
|
|||
|
if err != nil {
|
|||
|
liberr.ErrIsNil(ctx, err, "详情获取失败")
|
|||
|
}
|
|||
|
//分割名称
|
|||
|
if fzName != "" {
|
|||
|
fzName = strings.Split(fzName, " ")[0]
|
|||
|
}
|
|||
|
// 将方阵的名称 作为方阵的id
|
|||
|
fangzhen, err := dao.QianqiFangzhen.Ctx(ctx).Insert(&do.QianqiFangzhen{
|
|||
|
ProjectId: req.SubProjectId,
|
|||
|
Name: fzName,
|
|||
|
SourceId: tool2.GetUuid(),
|
|||
|
CreateBy: ct.New().GetLoginUser(ctx).Id,
|
|||
|
Detail: string(marshal),
|
|||
|
})
|
|||
|
templateID, err := fangzhen.LastInsertId()
|
|||
|
if err != nil {
|
|||
|
continue
|
|||
|
}
|
|||
|
templateData, err := create.FetchTemplateData(ctx, templateID)
|
|||
|
if err != nil {
|
|||
|
continue
|
|||
|
}
|
|||
|
templateDataList = append(templateDataList, templateData...)
|
|||
|
}
|
|||
|
_, err = dao.WorkStatus.Ctx(ctx).Data(templateDataList).Batch(50).Insert()
|
|||
|
})
|
|||
|
return err
|
|||
|
})
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
func (c *qianqiDxfController) XbFunc(ctx context.Context, req *system.XbReq) (res *system.XbRes, err error) {
|
|||
|
var xbList []shp.Polyline
|
|||
|
err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
|
|||
|
err = g.Try(ctx, func(ctx context.Context) {
|
|||
|
/**
|
|||
|
一、箱变的录入
|
|||
|
*/
|
|||
|
var listE []system.FacFeatureByPoint //面
|
|||
|
for _, data := range req.Plane {
|
|||
|
adata := system.FacFeatureByPoint{}
|
|||
|
for _, bdata := range data.Features {
|
|||
|
copier.Copy(&adata, &bdata)
|
|||
|
listE = append(listE, adata)
|
|||
|
}
|
|||
|
}
|
|||
|
var listT []system.FacFeatureByPoint //点
|
|||
|
for _, data := range req.Point {
|
|||
|
adata := system.FacFeatureByPoint{}
|
|||
|
for _, bdata := range data.Features {
|
|||
|
copier.Copy(&adata, &bdata)
|
|||
|
listT = append(listT, adata)
|
|||
|
}
|
|||
|
}
|
|||
|
var xiangbianArray []do.QianqiXiangbian
|
|||
|
//3、循环判断坐标是否在点内
|
|||
|
for _, i := range listE {
|
|||
|
var minVal float64
|
|||
|
var fzName string
|
|||
|
for num, j := range listT {
|
|||
|
distance := tool.PointToPointDistance(i.Geometry.Coordinates, j.Geometry.Coordinates)
|
|||
|
if num == 0 {
|
|||
|
if len(listT) == 1 { //只有一个情况下直接赋值
|
|||
|
minVal = distance
|
|||
|
fzName = j.Properties.Text //名字
|
|||
|
break
|
|||
|
}
|
|||
|
minVal = distance
|
|||
|
fzName = j.Properties.Text //名字
|
|||
|
} else {
|
|||
|
if distance < minVal {
|
|||
|
minVal = distance
|
|||
|
fzName = j.Properties.Text //名字
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if fzName != "" {
|
|||
|
fzName = strings.Split(fzName, " ")[0]
|
|||
|
}
|
|||
|
//得到详情数据(箱变)
|
|||
|
points := []shp.Point{
|
|||
|
{
|
|||
|
Lng: i.Geometry.Coordinates[0],
|
|||
|
Lat: i.Geometry.Coordinates[1],
|
|||
|
Property: shp.Property{
|
|||
|
Name: fzName,
|
|||
|
},
|
|||
|
},
|
|||
|
}
|
|||
|
polylines := shp.Polyline{
|
|||
|
Positions: points,
|
|||
|
Property: shp.Property{
|
|||
|
Name: fzName,
|
|||
|
},
|
|||
|
}
|
|||
|
xbList = append(xbList, polylines)
|
|||
|
marshal, err := json.Marshal(polylines)
|
|||
|
if err != nil {
|
|||
|
liberr.ErrIsNil(ctx, err, "详情获取失败")
|
|||
|
}
|
|||
|
xb := do.QianqiXiangbian{
|
|||
|
ProjectId: req.SubProjectId,
|
|||
|
SourceId: gmd5.MustEncryptString(req.ProjectId + fzName),
|
|||
|
Name: fzName,
|
|||
|
ModelId: "518bb3c165e22097ebbf2c2c42c8e308",
|
|||
|
CreateBy: ct.New().GetLoginUser(ctx).Id,
|
|||
|
Detail: string(marshal),
|
|||
|
}
|
|||
|
// 判断是否已经存在了该方阵,存在了就不再添加
|
|||
|
count, _ := dao.QianqiXiangbian.Ctx(ctx).Where(dao.QianqiXiangbian.Columns().SourceId, xb.SourceId).Count()
|
|||
|
if count == 0 {
|
|||
|
xiangbianArray = append(xiangbianArray, xb)
|
|||
|
}
|
|||
|
}
|
|||
|
if len(xiangbianArray) > 0 {
|
|||
|
_, err = dao.QianqiXiangbian.Ctx(ctx).Insert(&xiangbianArray)
|
|||
|
liberr.ErrIsNil(ctx, err, "添加失败")
|
|||
|
}
|
|||
|
/**
|
|||
|
二、需要操作pvmodel
|
|||
|
*/
|
|||
|
if err == nil {
|
|||
|
//1、获取当前项目的所有方阵,然后判断箱变是否在方阵内(或最近),然后记录方阵id
|
|||
|
var fzres []*model.QianqiFangzhenInfoRes
|
|||
|
dao.QianqiFangzhen.Ctx(ctx).Where(dao.QianqiFangzhen.Columns().ProjectId, req.SubProjectId).Scan(&fzres)
|
|||
|
for _, fz := range fzres {
|
|||
|
var minVal float64
|
|||
|
var fzId int
|
|||
|
var data *shp.Polyline
|
|||
|
// 解析JSON数据
|
|||
|
var polygon shp.Polygon
|
|||
|
err = json.Unmarshal([]byte(fz.Detail), &polygon)
|
|||
|
array := tool.ConvertPolygonToFloatArray(polygon)
|
|||
|
for num, xb := range xbList {
|
|||
|
numbers := []float64{xb.Positions[0].Lng, xb.Positions[0].Lat}
|
|||
|
wei := tool.FanWei(array, numbers)
|
|||
|
//如果为true,说明在多边形内
|
|||
|
if wei {
|
|||
|
fzId = fz.Id
|
|||
|
data = &xb
|
|||
|
} else {
|
|||
|
distance := tool.PointToPolygonDistance(array, numbers)
|
|||
|
if num == 0 {
|
|||
|
if len(xbList) == 1 { //只有一个情况下直接赋值
|
|||
|
minVal = distance
|
|||
|
fzId = fz.Id
|
|||
|
data = &xb
|
|||
|
break
|
|||
|
}
|
|||
|
minVal = distance
|
|||
|
fzId = fz.Id
|
|||
|
data = &xb
|
|||
|
} else {
|
|||
|
if distance < minVal {
|
|||
|
minVal = distance
|
|||
|
fzId = fz.Id
|
|||
|
data = &xb
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if data != nil {
|
|||
|
err := service.PvModule().ImportCory(ctx, &system.PvModuleImportCory{
|
|||
|
FangZhenID: strconv.Itoa(fzId),
|
|||
|
ProjectID: req.ProjectId,
|
|||
|
SubProjectID: req.SubProjectId,
|
|||
|
Shapes: &shp.ShpObj{
|
|||
|
Polylines: []shp.Polyline{
|
|||
|
*data,
|
|||
|
},
|
|||
|
},
|
|||
|
})
|
|||
|
liberr.ErrIsNil(ctx, err, "pvmodel箱变录入失败")
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
})
|
|||
|
return err
|
|||
|
})
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
func (c *qianqiDxfController) NbqFunc(ctx context.Context, req *system.NbqReq) (res *system.NbqRes, err error) {
|
|||
|
var nbqList []shp.Polyline
|
|||
|
err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
|
|||
|
err = g.Try(ctx, func(ctx context.Context) {
|
|||
|
/**
|
|||
|
一、处理逆变器数据
|
|||
|
*/
|
|||
|
//1、获取数据
|
|||
|
point := req.Point
|
|||
|
plane := req.Plane
|
|||
|
//2、合并名称
|
|||
|
var listE []system.FacFeatureByPoint //面
|
|||
|
for _, data := range plane {
|
|||
|
adata := system.FacFeatureByPoint{}
|
|||
|
for _, bdata := range data.Features {
|
|||
|
copier.Copy(&adata, &bdata)
|
|||
|
listE = append(listE, adata)
|
|||
|
}
|
|||
|
}
|
|||
|
var listT []system.FacFeatureByPoint //点
|
|||
|
for _, data := range point {
|
|||
|
adata := system.FacFeatureByPoint{}
|
|||
|
for _, bdata := range data.Features {
|
|||
|
copier.Copy(&adata, &bdata)
|
|||
|
listT = append(listT, adata)
|
|||
|
}
|
|||
|
}
|
|||
|
var arr []do.QianqiNibianqi
|
|||
|
//3、循环判断坐标是否在点内
|
|||
|
for _, i := range listE {
|
|||
|
var minVal float64
|
|||
|
var fzName string
|
|||
|
for num, j := range listT {
|
|||
|
distance := tool.PointToPointDistance(i.Geometry.Coordinates, j.Geometry.Coordinates)
|
|||
|
if num == 0 {
|
|||
|
if len(listT) == 1 { //只有一个情况下直接赋值
|
|||
|
minVal = distance
|
|||
|
fzName = j.Properties.Text //名字
|
|||
|
break
|
|||
|
}
|
|||
|
minVal = distance
|
|||
|
fzName = j.Properties.Text //名字
|
|||
|
} else {
|
|||
|
if distance < minVal {
|
|||
|
minVal = distance
|
|||
|
fzName = j.Properties.Text //名字
|
|||
|
}
|
|||
|
}
|
|||
|
//}
|
|||
|
}
|
|||
|
if fzName != "" {
|
|||
|
fzName = strings.Split(fzName, " ")[0]
|
|||
|
}
|
|||
|
//得到详情数据(方阵)
|
|||
|
points := []shp.Point{
|
|||
|
{
|
|||
|
Lng: i.Geometry.Coordinates[0],
|
|||
|
Lat: i.Geometry.Coordinates[1],
|
|||
|
Property: shp.Property{
|
|||
|
Name: fzName,
|
|||
|
},
|
|||
|
},
|
|||
|
}
|
|||
|
polylines := shp.Polyline{
|
|||
|
Positions: points,
|
|||
|
Property: shp.Property{
|
|||
|
Name: fzName,
|
|||
|
},
|
|||
|
}
|
|||
|
nbqList = append(nbqList, polylines)
|
|||
|
marshal, err := json.Marshal(polylines)
|
|||
|
if err != nil {
|
|||
|
liberr.ErrIsNil(ctx, err, "详情获取失败")
|
|||
|
}
|
|||
|
nibianqi := do.QianqiNibianqi{}
|
|||
|
nibianqi.ProjectId = req.SubProjectId
|
|||
|
nibianqi.SourceId = gmd5.MustEncryptString(req.ProjectId + fzName)
|
|||
|
nibianqi.Name = fzName
|
|||
|
nibianqi.ModelId = "41b366a9bae250098716da675d3ae26d"
|
|||
|
nibianqi.CreateBy = ct.New().GetLoginUser(ctx).Id
|
|||
|
nibianqi.Detail = string(marshal)
|
|||
|
// 判断是否已经存在了该方阵,存在了就不再添加
|
|||
|
count, _ := dao.QianqiNibianqi.Ctx(ctx).Where(dao.QianqiNibianqi.Columns().SourceId, nibianqi.SourceId).Count()
|
|||
|
if count == 0 {
|
|||
|
arr = append(arr, nibianqi)
|
|||
|
}
|
|||
|
}
|
|||
|
if len(arr) > 0 {
|
|||
|
_, err = dao.QianqiNibianqi.Ctx(ctx).Insert(&arr)
|
|||
|
liberr.ErrIsNil(ctx, err, "添加失败")
|
|||
|
}
|
|||
|
/**
|
|||
|
二、进行pvmodel数据处理
|
|||
|
*/
|
|||
|
if err == nil {
|
|||
|
//1、获取当前项目的所有方阵,然后判断箱变是否在方阵内(或最近),然后记录方阵id
|
|||
|
var fzres []*model.QianqiFangzhenInfoRes
|
|||
|
dao.QianqiFangzhen.Ctx(ctx).Where(dao.QianqiFangzhen.Columns().ProjectId, req.SubProjectId).Scan(&fzres)
|
|||
|
for _, fz := range fzres {
|
|||
|
var minVal float64
|
|||
|
var fzId int
|
|||
|
var data *shp.Polyline
|
|||
|
// 解析JSON数据
|
|||
|
var polygon shp.Polygon
|
|||
|
err = json.Unmarshal([]byte(fz.Detail), &polygon)
|
|||
|
array := tool.ConvertPolygonToFloatArray(polygon)
|
|||
|
for num, xb := range nbqList {
|
|||
|
numbers := []float64{xb.Positions[0].Lng, xb.Positions[0].Lat}
|
|||
|
wei := tool.FanWei(array, numbers)
|
|||
|
//如果为true,说明在多边形内
|
|||
|
if wei {
|
|||
|
fzId = fz.Id
|
|||
|
} else {
|
|||
|
distance := tool.PointToPolygonDistance(array, numbers)
|
|||
|
if num == 0 {
|
|||
|
if len(nbqList) == 1 { //只有一个情况下直接赋值
|
|||
|
minVal = distance
|
|||
|
fzId = fz.Id
|
|||
|
data = &xb
|
|||
|
break
|
|||
|
}
|
|||
|
minVal = distance
|
|||
|
fzId = fz.Id
|
|||
|
data = &xb
|
|||
|
} else {
|
|||
|
if distance < minVal {
|
|||
|
minVal = distance
|
|||
|
fzId = fz.Id
|
|||
|
data = &xb
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if data != nil {
|
|||
|
err := service.PvModule().ImportInverterCory(ctx, &system.ImportInverterCory{
|
|||
|
FangZhenID: strconv.Itoa(fzId),
|
|||
|
ProjectID: req.ProjectId,
|
|||
|
SubProjectID: req.SubProjectId,
|
|||
|
Shapes: &shp.ShpObj{
|
|||
|
Polylines: []shp.Polyline{
|
|||
|
*data,
|
|||
|
},
|
|||
|
},
|
|||
|
})
|
|||
|
liberr.ErrIsNil(ctx, err, "pvmodel逆变器录入失败")
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
})
|
|||
|
return err
|
|||
|
})
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
func (c *qianqiDxfController) GfbFunc(ctx context.Context, req *system.GfbReq) (res *system.GfbRes, err error) {
|
|||
|
err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
|
|||
|
err = g.Try(ctx, func(ctx context.Context) {
|
|||
|
var gfbList []shp.Polyline
|
|||
|
var eles []do.QianqiGuangfubanIds
|
|||
|
/**
|
|||
|
一、处理光伏板数据
|
|||
|
*/
|
|||
|
//1、获取数据
|
|||
|
point := req.Point
|
|||
|
plane := req.Plane
|
|||
|
//2、合并名称
|
|||
|
var listE []system.FacFeatureByPlane //面
|
|||
|
for _, data := range plane {
|
|||
|
adata := system.FacFeatureByPlane{}
|
|||
|
for _, bdata := range data.Features {
|
|||
|
copier.Copy(&adata, &bdata)
|
|||
|
listE = append(listE, adata)
|
|||
|
}
|
|||
|
}
|
|||
|
var listT []system.FacFeatureByPoint //点
|
|||
|
for _, data := range point {
|
|||
|
adata := system.FacFeatureByPoint{}
|
|||
|
for _, bdata := range data.Features {
|
|||
|
copier.Copy(&adata, &bdata)
|
|||
|
listT = append(listT, adata)
|
|||
|
}
|
|||
|
}
|
|||
|
//3、循环判断坐标是否在点内
|
|||
|
for _, i := range listE {
|
|||
|
var minVal float64
|
|||
|
var fzName string
|
|||
|
for num, j := range listT {
|
|||
|
inPolygon := tool.FanWei(i.Geometry.Coordinates[0], j.Geometry.Coordinates)
|
|||
|
//如果为true,说明在多边形内
|
|||
|
if inPolygon {
|
|||
|
//直接确认数据
|
|||
|
fzName = j.Properties.Text //名字
|
|||
|
break
|
|||
|
} else {
|
|||
|
distance := tool.PointToPolygonDistance(i.Geometry.Coordinates[0], j.Geometry.Coordinates)
|
|||
|
if num == 0 {
|
|||
|
if len(listT) == 1 { //只有一个情况下直接赋值
|
|||
|
minVal = distance
|
|||
|
fzName = j.Properties.Text //名字
|
|||
|
break
|
|||
|
}
|
|||
|
minVal = distance
|
|||
|
fzName = j.Properties.Text //名字
|
|||
|
} else {
|
|||
|
if distance < minVal {
|
|||
|
minVal = distance
|
|||
|
fzName = j.Properties.Text //名字
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if fzName != "" {
|
|||
|
fzName = strings.Split(fzName, " ")[0]
|
|||
|
}
|
|||
|
//得到详情数据(方阵)
|
|||
|
points := []shp.Point{}
|
|||
|
for _, jwd := range i.Geometry.Coordinates[0] {
|
|||
|
points = append(points, shp.Point{
|
|||
|
Lng: jwd[0],
|
|||
|
Lat: jwd[1],
|
|||
|
Property: shp.Property{
|
|||
|
Name: fzName,
|
|||
|
},
|
|||
|
})
|
|||
|
}
|
|||
|
polylines := shp.Polyline{
|
|||
|
Positions: points,
|
|||
|
Property: shp.Property{
|
|||
|
Name: fzName,
|
|||
|
},
|
|||
|
}
|
|||
|
gfbList = append(gfbList, polylines)
|
|||
|
marshal, err := json.Marshal(polylines)
|
|||
|
if err != nil {
|
|||
|
liberr.ErrIsNil(ctx, err, "详情获取失败")
|
|||
|
}
|
|||
|
//===================
|
|||
|
if !strings.HasPrefix(fzName, "G") {
|
|||
|
continue
|
|||
|
}
|
|||
|
// 设置随机数种子
|
|||
|
rand.Seed(time.Now().UnixNano())
|
|||
|
randomNum := rand.Intn(6) + 1
|
|||
|
randomStr1 := strconv.Itoa(randomNum)
|
|||
|
ele := do.QianqiGuangfubanIds{
|
|||
|
Name: fzName,
|
|||
|
DevType: "1",
|
|||
|
CreateBy: ct.New().GetLoginUser(ctx).Id,
|
|||
|
SourceType: "guangfuban",
|
|||
|
SourceId: tool2.GetUuid() + randomStr1,
|
|||
|
ProjectId: req.SubProjectId,
|
|||
|
Range: string(marshal),
|
|||
|
}
|
|||
|
eles = append(eles, ele)
|
|||
|
if len(eles) > 500 {
|
|||
|
dao.QianqiGuangfubanIds.Ctx(ctx).Insert(eles)
|
|||
|
eles = []do.QianqiGuangfubanIds{}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
二、进行pvmodel数据处理
|
|||
|
*/
|
|||
|
if err == nil {
|
|||
|
//1、获取当前项目的所有方阵,然后判断箱变是否在方阵内(或最近),然后记录方阵id
|
|||
|
fzres := []entity.QianqiFangzhen{}
|
|||
|
queryErr := dao.QianqiFangzhen.Ctx(ctx).
|
|||
|
Where(dao.QianqiFangzhen.Columns().ProjectId, req.SubProjectId).
|
|||
|
Scan(&fzres)
|
|||
|
if queryErr != nil {
|
|||
|
liberr.ErrIsNil(ctx, queryErr, "方阵获取失败")
|
|||
|
return
|
|||
|
}
|
|||
|
for _, fz := range fzres {
|
|||
|
var data []shp.Polyline
|
|||
|
// 解析JSON数据
|
|||
|
var polygon shp.Polygon
|
|||
|
err = json.Unmarshal([]byte(fz.Detail), &polygon)
|
|||
|
array := tool.ConvertPolygonToFloatArray(polygon)
|
|||
|
for _, xb := range gfbList {
|
|||
|
numbers := []float64{xb.Positions[0].Lng, xb.Positions[0].Lat}
|
|||
|
wei := tool.FanWei(array, numbers)
|
|||
|
//如果为true,说明在多边形内
|
|||
|
if wei {
|
|||
|
polyline := shp.Polyline{}
|
|||
|
polyline = xb
|
|||
|
data = append(data, polyline)
|
|||
|
}
|
|||
|
}
|
|||
|
if data != nil {
|
|||
|
err := service.PvModule().ImportPvBoardCory(ctx, &system.ImportPvBoardCory{
|
|||
|
FangZhenID: strconv.Itoa(fz.Id),
|
|||
|
ProjectID: req.ProjectId,
|
|||
|
SubProjectID: req.SubProjectId,
|
|||
|
Shapes: &shp.ShpObj{
|
|||
|
Polylines: data,
|
|||
|
},
|
|||
|
Fangzhens: fzres,
|
|||
|
})
|
|||
|
liberr.ErrIsNil(ctx, err, "pvmodel光伏板录入失败")
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
})
|
|||
|
return err
|
|||
|
})
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// 传入 point 构建出 detail 和 SourceID
|
|||
|
func buildDetailAndSourceID(point shp.Point, name string) (string, string) {
|
|||
|
// 生成 SourceID
|
|||
|
sourceID := fmt.Sprintf("%s.%s", point.Name, strings.ReplaceAll(uuid.New().String(), "-", ""))
|
|||
|
|
|||
|
detail := Zhuangdian{
|
|||
|
Position: point,
|
|||
|
}
|
|||
|
detail.Position.SourceId = sourceID
|
|||
|
|
|||
|
// 序列化后传回
|
|||
|
data, err := json.Marshal(detail)
|
|||
|
if err != nil {
|
|||
|
return "", ""
|
|||
|
}
|
|||
|
return string(data), sourceID
|
|||
|
}
|
|||
|
|
|||
|
func (c *qianqiDxfController) ZhuangDianFunc(ctx context.Context, req *system.ZdReq) (res *system.ZdRes, err error) {
|
|||
|
//1、获取数据
|
|||
|
plane := req.Plane
|
|||
|
//2、合并名称
|
|||
|
var listE []system.FacFeatureByPoint //面
|
|||
|
for _, data := range plane {
|
|||
|
adata := system.FacFeatureByPoint{}
|
|||
|
for _, bdata := range data.Features {
|
|||
|
copier.Copy(&adata, &bdata)
|
|||
|
listE = append(listE, adata)
|
|||
|
}
|
|||
|
}
|
|||
|
//3-1、获取到所有的方阵、光伏板,获取到方阵id根布版图绑定
|
|||
|
fzres := []entity.QianqiFangzhen{}
|
|||
|
queryErr := dao.QianqiFangzhen.Ctx(ctx).
|
|||
|
Where(dao.QianqiFangzhen.Columns().ProjectId, req.SubProjectid).
|
|||
|
Scan(&fzres)
|
|||
|
if queryErr != nil {
|
|||
|
liberr.ErrIsNil(ctx, queryErr, "方阵获取失败")
|
|||
|
return
|
|||
|
}
|
|||
|
columns := dao.QianqiGuangfubanIds.Columns()
|
|||
|
var resData []*model.QianqiGuangfubanIdsInfoRes
|
|||
|
dao.QianqiGuangfubanIds.Ctx(ctx).Where(columns.ProjectId, req.SubProjectid).Scan(&resData)
|
|||
|
if resData == nil && len(resData) == 0 {
|
|||
|
liberr.ErrIsNil(ctx, errors.New("光伏板获取失败"))
|
|||
|
return
|
|||
|
}
|
|||
|
for i, datum := range resData {
|
|||
|
//布版图
|
|||
|
var polygon1 shp.Polygon
|
|||
|
err = json.Unmarshal([]byte(datum.Range), &polygon1)
|
|||
|
if err != nil {
|
|||
|
liberr.ErrIsNil(ctx, err, "详情获取失败")
|
|||
|
return
|
|||
|
}
|
|||
|
f64 := []float64{polygon1.Positions[0].Lng, polygon1.Positions[0].Lat}
|
|||
|
for _, fzre := range fzres { //方阵
|
|||
|
//解析JSON数据
|
|||
|
var polygon shp.Polygon
|
|||
|
err = json.Unmarshal([]byte(fzre.Detail), &polygon)
|
|||
|
if err != nil {
|
|||
|
liberr.ErrIsNil(ctx, err, "详情获取失败")
|
|||
|
return
|
|||
|
}
|
|||
|
array2 := tool.ConvertPolygonToFloatArray(polygon)
|
|||
|
if tool.FanWei(array2, f64) {
|
|||
|
resData[i].FzId = fzre.Id
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
//3-2、获取布版图
|
|||
|
if resData != nil && len(resData) > 0 {
|
|||
|
insertList := []do.QianqiGuangfubanIdsZhuangdian{}
|
|||
|
for _, i := range resData { //面
|
|||
|
num := 0
|
|||
|
r := i.Range
|
|||
|
// 解析JSON数据
|
|||
|
var polygon shp.Polygon
|
|||
|
err = json.Unmarshal([]byte(r), &polygon)
|
|||
|
if err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
//判断点是否在多边形内
|
|||
|
array := tool.ConvertPolygonToFloatArray(polygon)
|
|||
|
for _, j := range listE { //坐标点()
|
|||
|
inPolygon := tool.FanWei(array, j.Geometry.Coordinates)
|
|||
|
if inPolygon {
|
|||
|
num = num + 1
|
|||
|
// 调用 buildDetailAndSourceID 生成 detail 和 SourceID
|
|||
|
pointcory := shp.Point{
|
|||
|
Lng: j.Geometry.Coordinates[0],
|
|||
|
Lat: j.Geometry.Coordinates[1],
|
|||
|
Property: shp.Property{
|
|||
|
Name: j.Geometry.Type,
|
|||
|
},
|
|||
|
}
|
|||
|
_, sourceID := buildDetailAndSourceID(pointcory, j.Geometry.Type)
|
|||
|
points := []shp.Point{pointcory}
|
|||
|
polylines := shp.Polyline{Positions: points}
|
|||
|
marshal, err := json.Marshal(polylines)
|
|||
|
if err != nil {
|
|||
|
liberr.ErrIsNil(ctx, err, "详情获取失败")
|
|||
|
}
|
|||
|
zhuangdian := do.QianqiGuangfubanIdsZhuangdian{
|
|||
|
Name: i.Name + "." + strconv.Itoa(num),
|
|||
|
SourceId: sourceID,
|
|||
|
ProjectId: req.ProjectId,
|
|||
|
Status: "0",
|
|||
|
Detail: marshal,
|
|||
|
SubProjectid: req.SubProjectid,
|
|||
|
FangzhenId: i.FzId,
|
|||
|
}
|
|||
|
insertList = append(insertList, zhuangdian)
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
if len(insertList) > 0 {
|
|||
|
batchNumber := 700
|
|||
|
_, err = dao.QianqiGuangfubanIdsZhuangdian.Ctx(ctx).Batch(batchNumber).Insert(&insertList)
|
|||
|
liberr.ErrIsNil(ctx, err, "光伏板插入失败")
|
|||
|
_, err = dao.QianqiGuangfubanIdsLizhu.Ctx(ctx).Batch(batchNumber).Insert(&insertList)
|
|||
|
liberr.ErrIsNil(ctx, err, "立柱插入失败")
|
|||
|
_, err = dao.QianqiGuangfubanIdsZhijia.Ctx(ctx).Batch(batchNumber).Insert(&insertList)
|
|||
|
liberr.ErrIsNil(ctx, err, "支架失败")
|
|||
|
}
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
func (c *qianqiDxfController) DxfGet(ctx context.Context, req *system.DxfGetReq) (res *system.DxfGetRes, err error) {
|
|||
|
// 定义 exe <DXF文件的绝对路径><结果 JS0N 文件的绝对路径><源 EPSG 代码><目标 EPSG 代码>
|
|||
|
cmd := exec.Command("E:\\cory\\project\\go\\zmkgC\\resource\\public\\zmFiles\\pythonDxf.exe",
|
|||
|
"E:\\cory\\project\\go\\zmkgC\\resource\\public\\zmFiles\\b93ba1d7008247a79503e8a80fe1de62.dxf",
|
|||
|
"E:\\cory\\project\\go\\zmkgC\\resource\\public\\zmFiles\\nr.json",
|
|||
|
"4524",
|
|||
|
"4326",
|
|||
|
)
|
|||
|
// 执行并获取输出
|
|||
|
output, err := cmd.CombinedOutput()
|
|||
|
if err != nil {
|
|||
|
fmt.Println("执行出错:", err)
|
|||
|
}
|
|||
|
fmt.Println("输出内容:", string(output))
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
func (c *qianqiDxfController) DxfData(ctx context.Context, req *system.DxfDataReq) (res *system.DxfDataRes, err error) {
|
|||
|
res = &system.DxfDataRes{}
|
|||
|
|
|||
|
err = g.Try(ctx, func(ctx context.Context) {
|
|||
|
// 指定要读取的JSON文件路径
|
|||
|
filePath := "E:\\cory\\project\\go\\zmkgC\\resource\\public\\zmFiles\\nr.json"
|
|||
|
// 读取文件内容
|
|||
|
data, err := os.ReadFile(filePath)
|
|||
|
if err != nil {
|
|||
|
liberr.ErrIsNil(ctx, err, "读取失败")
|
|||
|
}
|
|||
|
|
|||
|
// 用于存储解析后的JSON数据
|
|||
|
var result map[string]interface{}
|
|||
|
|
|||
|
// 解析JSON数据
|
|||
|
if err := json.Unmarshal(data, &result); err != nil {
|
|||
|
liberr.ErrIsNil(ctx, err, "解析JSON失败")
|
|||
|
}
|
|||
|
res.Map = result
|
|||
|
})
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
//func FanWei(mian [][]float64, dian [][]float64) bool {
|
|||
|
//
|
|||
|
// // 定义多边形范围 (经纬度点的顺序很重要,需要闭合:首尾点相同)
|
|||
|
// polygon := orb.Polygon{
|
|||
|
// {
|
|||
|
// {106.518314, 29.627223}, // 起始位置
|
|||
|
// {106.519419, 29.627223},
|
|||
|
// {106.518238, 29.626399},
|
|||
|
// {106.519491, 29.626435},
|
|||
|
// {106.518314, 29.627223}, // 回到起始
|
|||
|
// },
|
|||
|
// }
|
|||
|
// // 目标点
|
|||
|
// point := orb.Point{106.518907, 29.626458} // 假设是一个经纬度点
|
|||
|
//
|
|||
|
// // 判断点是否在多边形内
|
|||
|
// if planar.PolygonContains(polygon, point) {
|
|||
|
// fmt.Println("点在多边形范围内")
|
|||
|
// return true
|
|||
|
// } else {
|
|||
|
// fmt.Println("点不在多边形范围内")
|
|||
|
// return false
|
|||
|
// }
|
|||
|
//}
|