// ========================================================================== // 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 <结果 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 // } //}