浏览代码

增加基站安装参数导出为bin文件的功能

zhoutao 12 小时之前
父节点
当前提交
6e3aa0db66

+ 9 - 0
ipsomcadmin/src/api/bparam.js

@@ -35,6 +35,15 @@ export function enableLayerBts(paramData) {
     })
 }
 
+//导出基站安装参数
+export function exportBtsInstallParamHan(paramData) {
+    return request({
+        url: '/bparam/exportBtsInstallParamHan',
+        method: 'post',
+        data: paramData
+    })
+}
+
 
 
 //删除某项目

+ 29 - 1
ipsomcadmin/src/views/bparam/baseparam.vue

@@ -86,6 +86,7 @@
                     <el-button type="success" @click="openAddDlg">新增</el-button>
                     <el-button type="primary" @click="hEnableLayerBts">开启某楼层基站</el-button>
                     <el-button type="danger" @click="hDisableLayerBts">关闭某楼层基站</el-button>
+                    <el-button type="success" @click="exportBtsInstallParamHan">导出基站安装参数</el-button>
                 </el-form-item>
             </el-form>
         </app-search>
@@ -209,7 +210,7 @@
 
 
 <script>
-import { deleteBtsBaseParam, getBtsBaseParamPageList, saveBtsOamParam, resetBts, enableLayerBts, enableBtsBaseParam } from "@/api/bparam"
+import { deleteBtsBaseParam, getBtsBaseParamPageList, saveBtsOamParam, resetBts, enableLayerBts, exportBtsInstallParamHan } from "@/api/bparam"
 import { genCarrierIdList, genTimeslotList, genBuildIdList, genLayerIdList, genBlockIdList, genLocationTypeIdList, genBtsStatusList, genBtsTypeList } from "./basestaticdata.js"
 import BaseParamDlg from "./component/baseparamdlg.vue"
 import DeviceParamDlg from "./component/deviceparamdlg.vue"
@@ -736,6 +737,33 @@ export default {
                     this.$message({ message: '关闭楼层基站失败', type: 'success' })
                 }
             })
+        },
+        //导出基站安装参数
+        exportBtsInstallParamHan() {
+            let paramData = {}
+            let itemId = 0
+            itemId = parseInt(this.tableData.listData.search.build_id)
+            if (itemId > 0) {
+                paramData.build_id = itemId
+            } else {
+                this.$message({ message: '请选择大楼编号', type: 'error' })
+                return
+            }
+
+            itemId = parseInt(this.tableData.listData.search.layer_id)
+            if (itemId != 0) {
+                paramData.layer_id = itemId
+            }
+            else {
+                this.$message({ message: '请选择楼层编号', type: 'error' })
+                return
+            }
+            paramData.enable_flag = 1
+            exportBtsInstallParamHan(paramData).then(() => {
+                this.$message({ message: '基站参数文件导出成功', type: 'success' })
+            }).catch(() => {
+                this.$message({ message: '基站参数文件导出失败', type: 'success' })
+            })
         }
     }
 }

二进制
ipsomcapi/build_layer_bts_param.bin


+ 1 - 1
ipsomcapi/main.go

@@ -19,7 +19,7 @@ import (
 var socketCreateApi socketcreate.SocketCreate
 
 // 系统工作模式,0:开发模式,1:生产模式
-var sysWorkMode uint32 = 1
+var sysWorkMode uint32 = 0
 
 func main() {
 	ctx := context.Background()

+ 11 - 0
ipsomcapi/module/bparam/bparamapi/bparamapi.go

@@ -115,6 +115,17 @@ func (obj *BparamApi) EnableLayerBts(dataModel *bparammodel.BtsBaseParam) error
 	return nil
 }
 
+// 按大楼和楼层导出基站参数
+func (obj *BparamApi) ExportBtsInstallParam(dataModel *bparammodel.BtsBaseParam) ([]bparammodel.BtsBaseParam, error) {
+	tmpMode := new(bparammodel.BtsBaseParam)
+	dataList := []bparammodel.BtsBaseParam{}
+	if err := obj.MySqlApi.GetDb().Model(tmpMode).Where("project_id=? and build_id=? and layer_id=? and enable_flag=?", dataModel.ProjectID, dataModel.BuildID, dataModel.LayerID, dataModel.EnableFlag).Scan(&dataList).Error; err != nil {
+		return dataList, err
+	}
+
+	return dataList, nil
+}
+
 // 更新基站在线状态
 // heartMap:心跳map
 func (obj *BparamApi) UpdateBtsStatusByHeartMap(heartMap map[string]public.HeartMapValue) error {

+ 143 - 0
ipsomcapi/module/bparam/bparamhandler/bparamhandler.go

@@ -5,6 +5,7 @@
 package bparamhandler
 
 import (
+	"encoding/binary"
 	"fmt"
 	"ipsomc/core/dao/mysql/mysqlmodel"
 	"ipsomc/core/gin/bind"
@@ -14,6 +15,9 @@ import (
 	"ipsomc/module/bparam/bparammodel"
 	"ipsomc/module/bparam/bparamoam"
 	"ipsomc/public"
+	"os"
+	"strconv"
+	"strings"
 	"time"
 
 	"github.com/gin-gonic/gin"
@@ -713,3 +717,142 @@ func (obj *BparamHan) ResetBtsHan(c *gin.Context) {
 
 	resp.RespOk(c)
 }
+
+// 按照大楼和楼层导出基站安装参数
+func (obj *BparamHan) ExportBtsInstallParamHan(c *gin.Context) {
+	dataModel := new(bparammodel.BtsBaseParam)
+
+	//把前端数据绑定到模型上
+	if err := obj.bindApi.Bind2Model(c, dataModel); err != nil {
+		resp.RespFail(c, "数据错误")
+		return
+	}
+
+	dataList, err := obj.bparamApi.ExportBtsInstallParam(dataModel)
+	if err != nil {
+		resp.RespFail(c, "查询数据错误")
+		return
+	}
+
+	// 创建二进制文件
+	file, err := os.Create("build_layer_bts_param.bin")
+	if err != nil {
+		resp.RespFail(c, "文件操作失败")
+		panic(err)
+	}
+	defer file.Close()
+
+	//生成bin文件
+	buf := make([]byte, 4)
+	for _, v := range dataList {
+		//大楼编号
+		binary.LittleEndian.PutUint32(buf, uint32(v.BuildID))
+		if _, err := file.Write(buf); err != nil {
+			resp.RespFail(c, "文件操作失败")
+			panic(err)
+		}
+
+		//楼层编号
+		binary.LittleEndian.PutUint32(buf, uint32(v.LayerID))
+		if _, err := file.Write(buf); err != nil {
+			resp.RespFail(c, "文件操作失败")
+			panic(err)
+		}
+
+		//基站编号
+		binary.LittleEndian.PutUint32(buf, uint32(v.BtsID))
+		if _, err := file.Write(buf); err != nil {
+			resp.RespFail(c, "文件操作失败")
+			panic(err)
+		}
+
+		//载波编号
+		binary.LittleEndian.PutUint32(buf, uint32(v.CarrierID))
+		if _, err := file.Write(buf); err != nil {
+			resp.RespFail(c, "文件操作失败")
+			panic(err)
+		}
+
+		//时隙编号
+		binary.LittleEndian.PutUint32(buf, uint32(v.Timeslot))
+		if _, err := file.Write(buf); err != nil {
+			resp.RespFail(c, "文件操作失败")
+			panic(err)
+		}
+
+		//X坐标
+		binary.LittleEndian.PutUint32(buf, uint32(v.CoordX))
+		if _, err := file.Write(buf); err != nil {
+			resp.RespFail(c, "文件操作失败")
+			panic(err)
+		}
+
+		//Y坐标
+		binary.LittleEndian.PutUint32(buf, uint32(v.CoordY))
+		if _, err := file.Write(buf); err != nil {
+			resp.RespFail(c, "文件操作失败")
+			panic(err)
+		}
+
+		//Z坐标
+		binary.LittleEndian.PutUint32(buf, uint32(v.CoordZ))
+		if _, err := file.Write(buf); err != nil {
+			resp.RespFail(c, "文件操作失败")
+			panic(err)
+		}
+
+		//定位类型
+		binary.LittleEndian.PutUint32(buf, uint32(v.LocationType))
+		if _, err := file.Write(buf); err != nil {
+			resp.RespFail(c, "文件操作失败")
+			panic(err)
+		}
+
+		//两站数量
+		binary.LittleEndian.PutUint32(buf, uint32(v.TwoBtsNum))
+		if _, err := file.Write(buf); err != nil {
+			resp.RespFail(c, "文件操作失败")
+			panic(err)
+		}
+
+		//两站列表
+		if v.LocationType == 1 || v.LocationType == 3 {
+			input := strings.ReplaceAll(v.TwoBtsList, " ", "") // 去除空格
+			parts := strings.Split(input, ",")                 // 分割字符串
+			btsNum := len(parts)
+			for _, part := range parts {
+				if part == "" {
+					continue // 跳过空字符串
+				}
+				num, _ := strconv.ParseInt(part, 10, 32)
+				binary.LittleEndian.PutUint32(buf, uint32(num))
+				if _, err := file.Write(buf); err != nil {
+					resp.RespFail(c, "文件操作失败")
+					panic(err)
+				}
+			}
+
+			//补齐6个两站定位编号
+			for i := btsNum; i < 6; i++ {
+				binary.LittleEndian.PutUint32(buf, uint32(0))
+				if _, err := file.Write(buf); err != nil {
+					resp.RespFail(c, "文件操作失败")
+					panic(err)
+				}
+			}
+		} else {
+			//初始化6个两站定位编号
+			for i := 0; i < 6; i++ {
+				binary.LittleEndian.PutUint32(buf, uint32(0))
+				if _, err := file.Write(buf); err != nil {
+					resp.RespFail(c, "文件操作失败")
+					panic(err)
+				}
+			}
+		}
+	}
+
+	//TODO 把bin文件发送到前端
+
+	resp.RespOk(c)
+}

+ 3 - 2
ipsomcapi/module/bparam/bparamrouter/bparamrouter.go

@@ -31,8 +31,9 @@ func SetRouter(r *gin.RouterGroup) {
 	groupRouter.POST("/getBtsBaseParamById", groupHand.GetBtsBaseParamByIdHan)
 	groupRouter.POST("/getBtsBaseParamPageList", groupHand.GetBtsBaseParamPageListHan)
 	groupRouter.POST("/getBtsBaseParamList", groupHand.GetBtsBaseParamListHan)
-	groupRouter.POST("/enableBtsBaseParam", groupHand.EnableBtsBaseParamHan) //开起和停用基站
-	groupRouter.POST("/enableLayerBts", groupHand.EnableLayerBtsHan)         //开起和停用基站
+	groupRouter.POST("/enableBtsBaseParam", groupHand.EnableBtsBaseParamHan)          //开起和停用基站
+	groupRouter.POST("/enableLayerBts", groupHand.EnableLayerBtsHan)                  //开起和停用基站
+	groupRouter.POST("/exportBtsInstallParamHan", groupHand.ExportBtsInstallParamHan) //导出基站安装参数
 
 	//UDP查询操作接口
 	groupRouter.POST("/getBtsOamParamDeviceHan", groupHand.GetBtsOamParamDeviceHan)