Quellcode durchsuchen

feat: 设备地图更新v1.0

HeWang vor 8 Monaten
Ursprung
Commit
e30e210c67

+ 62 - 0
biz/dal/mysql/device_map.go

@@ -0,0 +1,62 @@
+package mysql
+
+import (
+	"context"
+	"fmt"
+	"gorm.io/gen"
+	"pji_desktop_http/biz/dal/query"
+	"pji_desktop_http/biz/model"
+	"pji_desktop_http/common/config"
+)
+
+func AddDeviceMapOneRecord(ctx context.Context, record model.DeviceMap) error {
+	r := query.DeviceMap
+	err := r.WithContext(ctx).Create(&record)
+	return err
+}
+
+func UpdateDeviceMapOneRecord(ctx context.Context, record model.DeviceMap) (gen.ResultInfo, error) {
+	r := query.DeviceMap
+	fmt.Println("record update", record)
+	info, err := r.WithContext(ctx).Where(r.ID.Eq(record.ID)).Updates(record)
+	if err != nil {
+		return info, err
+	}
+	return info, nil
+}
+
+func QueryValidDeviceMapByMapId(ctx context.Context, mapId string) ([]*model.DeviceMap, error) {
+	r := query.DeviceMap
+	deviceMaps, err := r.WithContext(ctx).Where(r.MapID.Eq(mapId), r.MapValidFlag.Eq(config.MAP_VALID_FLAG)).Find()
+	if err != nil {
+		return nil, err
+	}
+	return deviceMaps, nil
+}
+
+func QueryValidDeviceMapByDevice(ctx context.Context, mapId string, deviceNo string) ([]*model.DeviceMap, error) {
+	r := query.DeviceMap
+	deviceMaps, err := r.WithContext(ctx).Where(r.MapID.Eq(mapId), r.DeviceNo.Eq(deviceNo), r.MapValidFlag.Eq(config.MAP_VALID_FLAG)).Find()
+	if err != nil {
+		return nil, err
+	}
+	return deviceMaps, nil
+}
+
+func UpdateDeviceMapValidFlagByMapId(ctx context.Context, mapId string, flag int) (gen.ResultInfo, error) {
+	r := query.DeviceMap
+	info, err := r.WithContext(ctx).Where(r.MapID.Eq(mapId)).Update(r.MapValidFlag, flag)
+	if err != nil {
+		return info, err
+	}
+	return info, nil
+}
+
+func UpdateDeviceMapValidFlagByDevice(ctx context.Context, mapId string, deviceNo string, flag int) (gen.ResultInfo, error) {
+	r := query.DeviceMap
+	info, err := r.WithContext(ctx).Where(r.MapID.Eq(mapId), r.DeviceNo.Eq(deviceNo)).Update(r.MapValidFlag, flag)
+	if err != nil {
+		return info, err
+	}
+	return info, nil
+}

+ 4 - 8
biz/dal/query/device_map.gen.go

@@ -28,7 +28,6 @@ func newDeviceMap(db *gorm.DB, opts ...gen.DOOption) deviceMap {
 	tableName := _deviceMap.deviceMapDo.TableName()
 	_deviceMap.ALL = field.NewAsterisk(tableName)
 	_deviceMap.ID = field.NewString(tableName, "id")
-	_deviceMap.DeviceID = field.NewString(tableName, "device_id")
 	_deviceMap.DeviceNo = field.NewString(tableName, "device_no")
 	_deviceMap.DeviceName = field.NewString(tableName, "device_name")
 	_deviceMap.DeviceType = field.NewString(tableName, "device_type")
@@ -41,7 +40,7 @@ func newDeviceMap(db *gorm.DB, opts ...gen.DOOption) deviceMap {
 	_deviceMap.BuildName = field.NewString(tableName, "build_name")
 	_deviceMap.MapCreateTime = field.NewString(tableName, "map_create_time")
 	_deviceMap.MapUpdateTime = field.NewString(tableName, "map_update_time")
-	_deviceMap.MapVersion = field.NewInt32(tableName, "map_version")
+	_deviceMap.MapVersion = field.NewString(tableName, "map_version")
 	_deviceMap.MapValidFlag = field.NewInt32(tableName, "map_valid_flag")
 	_deviceMap.PjiMapZipURL = field.NewString(tableName, "pji_map_zip_url")
 	_deviceMap.CicvMapZipURL = field.NewString(tableName, "cicv_map_zip_url")
@@ -60,7 +59,6 @@ type deviceMap struct {
 
 	ALL           field.Asterisk
 	ID            field.String
-	DeviceID      field.String
 	DeviceNo      field.String
 	DeviceName    field.String
 	DeviceType    field.String
@@ -73,7 +71,7 @@ type deviceMap struct {
 	BuildName     field.String
 	MapCreateTime field.String
 	MapUpdateTime field.String
-	MapVersion    field.Int32
+	MapVersion    field.String
 	MapValidFlag  field.Int32
 	PjiMapZipURL  field.String
 	CicvMapZipURL field.String
@@ -98,7 +96,6 @@ func (d deviceMap) As(alias string) *deviceMap {
 func (d *deviceMap) updateTableName(table string) *deviceMap {
 	d.ALL = field.NewAsterisk(table)
 	d.ID = field.NewString(table, "id")
-	d.DeviceID = field.NewString(table, "device_id")
 	d.DeviceNo = field.NewString(table, "device_no")
 	d.DeviceName = field.NewString(table, "device_name")
 	d.DeviceType = field.NewString(table, "device_type")
@@ -111,7 +108,7 @@ func (d *deviceMap) updateTableName(table string) *deviceMap {
 	d.BuildName = field.NewString(table, "build_name")
 	d.MapCreateTime = field.NewString(table, "map_create_time")
 	d.MapUpdateTime = field.NewString(table, "map_update_time")
-	d.MapVersion = field.NewInt32(table, "map_version")
+	d.MapVersion = field.NewString(table, "map_version")
 	d.MapValidFlag = field.NewInt32(table, "map_valid_flag")
 	d.PjiMapZipURL = field.NewString(table, "pji_map_zip_url")
 	d.CicvMapZipURL = field.NewString(table, "cicv_map_zip_url")
@@ -145,9 +142,8 @@ func (d *deviceMap) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
 }
 
 func (d *deviceMap) fillFieldMap() {
-	d.fieldMap = make(map[string]field.Expr, 22)
+	d.fieldMap = make(map[string]field.Expr, 21)
 	d.fieldMap["id"] = d.ID
-	d.fieldMap["device_id"] = d.DeviceID
 	d.fieldMap["device_no"] = d.DeviceNo
 	d.fieldMap["device_name"] = d.DeviceName
 	d.fieldMap["device_type"] = d.DeviceType

+ 278 - 0
biz/handler/map_service/map_service.go

@@ -9,6 +9,7 @@ import (
 	"github.com/cloudwego/hertz/pkg/protocol/consts"
 	uuid "github.com/satori/go.uuid"
 	"io"
+	"io/ioutil"
 	"net/http"
 	"os"
 	"path/filepath"
@@ -16,8 +17,10 @@ import (
 	"pji_desktop_http/biz/model"
 	"pji_desktop_http/common/config"
 	"pji_desktop_http/common/config/c_log"
+	"pji_desktop_http/common/config/c_pji"
 	"pji_desktop_http/common/entity"
 	"pji_desktop_http/common/util"
+	"pji_desktop_http/pji_client"
 	"strconv"
 	"strings"
 )
@@ -398,6 +401,192 @@ func QueryMapUpdateRecord(ctx context.Context, c *app.RequestContext) {
 	c.JSON(consts.StatusOK, entity.Response{Status: true, Code: "", Message: "地图更新查询成功", Data: string(output), Total: int(count)})
 }
 
+// TestUploadUpdateMap 测试朴津地图上传接口
+// @router /map/upload/update/map [GET]
+func TestUploadUpdateMap(ctx context.Context, c *app.RequestContext) {
+	header, err := c.FormFile("file")
+	if err != nil {
+		c.String(http.StatusBadRequest, fmt.Sprintf("get form err: %s", err.Error()))
+		return
+	}
+
+	fileName := header.Filename
+	fmt.Println("filename", fileName)
+
+	f, _ := header.Open()
+	defer f.Close()
+
+	paramMap := make(map[string]interface{})
+
+	// Map<String, String> paramMap=new HashMap<>();
+	// paramMap.put("mapId","2247aeb31ad34wwddfd9c3ba24536e52859");
+	// paramMap.put("mapName","合肥演示");
+	// paramMap.put("buildId"," 7b4e8d01c08f472fabf7ccff2b2336s");
+
+	// paramMap.put("floorId"," 695abbcfdf99471sdfff3b9b1d0818164e7");
+	// paramMap.put("updateType"," 7b4e8d01c08f472fabf7ccff2b2336s");
+	// paramMap.put("floor","1");
+	// paramMap.put("buildName"," 2");
+	// paramMap.put("customAreaId"," 355");
+	// paramMap.put("snCode","P1YTYD1M233M00224");
+	// paramMap.put("fileName","1702284791385137152.zip");
+	// paramMap.put("mapType","0");
+
+	paramMap["snCode"] = "P1YTXS1M22AM00001"
+	paramMap["mapId"] = "553d9d47f8404734997e11175f0e63f5"
+	paramMap["updateType"] = "0"
+	paramMap["mapType"] = "0"
+	paramMap["mapName"] = "北京办公区20230224"
+
+	bytes, err := io.ReadAll(f)
+	if err != nil {
+		return
+	}
+
+	// 调用 朴津地图上传 接口
+	resp, err := pji_client.ApiClient.UploadRequest(c_pji.PjiApiSitBaseUrl+"mapUpload", paramMap, pji_client.MapSecretId, bytes)
+	fmt.Println(string(resp.Body()))
+
+	c.JSON(consts.StatusOK, entity.HttpResult{Status: true, Code: "", Message: "上传地图测试"})
+}
+
+// UpdateDeviceMapById 根据场景id维护设备地图表
+// @router /map/update/deviceMap/record [GET]
+func UpdateDeviceMapById(ctx context.Context, c *app.RequestContext) {
+	sceneId := c.Query("sceneId")
+	fmt.Println("sceneId", sceneId)
+	deviceNo := c.Query("deviceNo")
+	fmt.Println("deviceNo", deviceNo)
+	deviceName := c.Query("deviceName")
+	fmt.Println("deviceName", deviceName)
+	deviceType := c.Query("deviceType")
+	fmt.Println("deviceType", deviceType)
+
+	// 根据场景id查询地图id
+	mapId, err := getMapIdById(sceneId)
+	if err != nil || mapId == "" {
+		c.JSON(consts.StatusOK, entity.Response{Status: false, Code: "", Message: "获取mapId失败"})
+		return
+	}
+	fmt.Println("mapId", mapId)
+
+	// 查询朴津地图列表
+	mapInfoList, err := getMapInfoList()
+	if err != nil || mapInfoList == nil {
+		c.JSON(consts.StatusOK, entity.Response{Status: false, Code: "", Message: "获取地图列表数据失败"})
+		return
+	}
+	fmt.Println("mapInfoList", mapInfoList)
+
+	// 判断map id是否存在于朴津地图列表中
+	mapId = "fee84db56d254d79b85971cb4ab2e7f1" // 存在
+	//mapId = "553d9d47f8404734997e11175f0e63f5" // 不存在
+	exist, record := checkMapIdExist(mapId, mapInfoList)
+	fmt.Println("exist", exist)
+	fmt.Println("record", record)
+
+	if !exist { // map id不存在于朴津地图列表中
+		// 查询地图设备表中是否存在对应map id且有效的记录
+		records, err := mysql.QueryValidDeviceMapByMapId(ctx, mapId)
+		if err != nil {
+			c.JSON(consts.StatusOK, entity.Response{Status: false, Code: "", Message: " 查询设备地图失败"})
+			return
+		}
+		fmt.Println("records", records)
+		if len(records) > 0 { // 存在,
+			fmt.Println("设置无效")
+			// 将对应的map id的记录设置为无效
+			update, err := mysql.UpdateDeviceMapValidFlagByMapId(ctx, mapId, config.MAP_NOT_VALID_FLAG)
+			if err != nil {
+				c.JSON(consts.StatusOK, entity.Response{Status: false, Code: "", Message: "更新设备地图状态失败"})
+				return
+			}
+			fmt.Println("update", update)
+		}
+		c.JSON(consts.StatusOK, entity.Response{Status: true, Code: "1001", Message: "map id不存在地图列表中"})
+	} else { // map id存在于朴津地图列表中
+		snCodeList := record.SnCodeList
+		for _, snCode := range snCodeList { // snCodeList 代表配置了对应map id地图的机器人sn码列表, 上限为机器人数量
+			fmt.Println("snCode", snCode)
+			deviceMap := model.DeviceMap{DeviceNo: snCode, DeviceName: deviceName,
+				DeviceType: deviceType, MapID: record.MapId, MapType: record.MapType, MapName: record.MapName, FloorID: record.FloorId,
+				Floor: strconv.Itoa(record.Floor), BuildID: record.BuildId, BuildName: record.BuildName, MapCreateTime: record.CreateTime, MapUpdateTime: record.UpdateTime,
+				MapVersion: strconv.Itoa(record.Version), MapValidFlag: config.MAP_VALID_FLAG, PjiMapZipURL: record.ZipUrl, CustomAreaID: int32(record.CustomAreaId)}
+			fmt.Println("deviceMap", deviceMap)
+
+			deviceMap.MapVersion = "123456"
+
+			// 查询[对应设备]是否存在对应map id且有效的记录
+			records, err := mysql.QueryValidDeviceMapByDevice(ctx, mapId, snCode)
+			if err != nil {
+				c.JSON(consts.StatusOK, entity.Response{Status: false, Code: "", Message: " 查询设备地图失败"})
+				return
+			}
+			fmt.Println("records", records)
+
+			if len(records) == 0 { // 对应设备不存在对应map id且有效的记录, 说明该设备部署了新的地图(重采或新的区域地图)
+				// 添加记录
+				deviceMap.ID = uuid.NewV1().String()
+				err = mysql.AddDeviceMapOneRecord(ctx, deviceMap)
+				if err != nil {
+					c.JSON(consts.StatusOK, entity.Response{Status: false, Code: "", Message: "添加设备地图记录失败"})
+					return
+				}
+			} else if len(records) == 1 { // 对应设备存在1个对应map id且有效的记录, 说明该设备之前部署过该地图, 需要检测版本号来判断更新记录(版本号一致)还是添加记录(版本号不一致)
+				fmt.Println("record", record)
+				if deviceMap.MapVersion == records[0].MapVersion { // 地图列表查询到的版本与设备地图表中版本一致, 则更新记录
+					// 更新记录
+					deviceMap.ID = records[0].ID
+					update, err := mysql.UpdateDeviceMapOneRecord(ctx, deviceMap)
+					if err != nil {
+						c.JSON(consts.StatusOK, entity.Response{Status: false, Code: "", Message: "更新设备地图记录失败"})
+						return
+					}
+					fmt.Println("update", update)
+				} else { // 地图列表查询到的版本与设备地图表中版本不一致, 则先将之前的记录状态设置为无效, 然后添加记录
+					// 将对应设备存在的对应map id的记录设置为无效
+					update, err := mysql.UpdateDeviceMapValidFlagByDevice(ctx, mapId, snCode, config.MAP_NOT_VALID_FLAG)
+					if err != nil {
+						c.JSON(consts.StatusOK, entity.Response{Status: false, Code: "", Message: "更新设备地图状态失败"})
+						return
+					}
+					fmt.Println("update", update)
+					// 添加记录
+					deviceMap.ID = uuid.NewV1().String()
+					err = mysql.AddDeviceMapOneRecord(ctx, deviceMap)
+					if err != nil {
+						c.JSON(consts.StatusOK, entity.Response{Status: false, Code: "", Message: "添加设备地图记录失败"})
+						return
+					}
+				}
+			}
+
+			//if len(records) > 0 { // 对应设备存在对应map id且有效的记录
+			//	// 设置之前记录地图标志为无效
+			//	fmt.Println("设置无效")
+			//	// 将对应设备存在的对应map id的记录设置为无效
+			//	update, err := mysql.UpdateDeviceMapValidFlagByDevice(ctx, mapId, snCode, config.MAP_NOT_VALID_FLAG)
+			//	if err != nil {
+			//		c.JSON(consts.StatusOK, entity.Response{Status: false, Code: "", Message: "更新设备地图状态失败"})
+			//		return
+			//	}
+			//	fmt.Println("update", update)
+			//	// 更新记录
+			//	mysql.UpdateDeviceMapOneRecord(ctx, deviceMap)
+			//} else { // 对应设备不存在对应map id且有效的记录
+			//	// 添加记录
+			//	deviceMap.ID = uuid.NewV1().String()
+			//	err = mysql.AddDeviceMapOneRecord(ctx, deviceMap)
+			//	if err != nil {
+			//		c.JSON(consts.StatusOK, entity.Response{Status: false, Code: "", Message: "添加设备地图记录失败"})
+			//		return
+			//	}
+			//}
+		}
+		c.JSON(consts.StatusOK, entity.Response{Status: true, Code: "", Message: "设备地图数据更新成功"})
+	}
+}
+
 // 计算oss中文件列表的总大小
 func calculateTotalFileSize(fileList []string) int {
 	var totalSize int
@@ -410,3 +599,92 @@ func calculateTotalFileSize(fileList []string) int {
 	}
 	return totalSize
 }
+
+// 调用 朴津地图列表查询 接口
+func getMapInfoList() ([]model.MapInfo, error) {
+	paramMap := make(map[string]interface{})
+	paramMap["mapType"] = "0"
+	resp, err := pji_client.ApiClient.GetRequest(c_pji.PjiApiSitBaseUrl+"mapList?mapType=0", paramMap, pji_client.MapSecretId)
+	if err != nil {
+		return nil, err
+	}
+	//fmt.Println(string(resp.Body()))
+
+	// 解析json响应
+	body := resp.Body()
+	var mapRes model.MapInfoRes
+	err = json.Unmarshal(body, &mapRes)
+	if err != nil || mapRes.Code != 200 {
+		return nil, err
+	}
+	//fmt.Println("mapRes", mapRes)
+	return mapRes.Data, nil
+}
+
+// 查询地图id是否存在于地图列表中
+func checkMapIdExist(mapId string, mapInfoList []model.MapInfo) (bool, model.MapInfo) {
+	// 转为map
+	IdMap := make(map[string]model.MapInfo)
+	for _, info := range mapInfoList {
+		IdMap[info.MapId] = info
+	}
+	record, exist := IdMap[mapId]
+	return exist, record
+}
+
+// 根据场景id获取数据采集时的地图id
+func getMapIdById(id string) (string, error) {
+	var mapId string
+	// 下载map.json
+	// 根据id获取对应的oss文件列表
+	allFileList, err := util.GetExactedMapFileById(id)
+	fmt.Println("allFileList", allFileList)
+
+	// 过滤特定后缀的文件列表
+	fileList := util.FilterBySuffixes(allFileList, config.MapJsonFiltersuffixes...)
+	fmt.Println("fileList", fileList)
+	// 创建临时文件夹
+	tmpDir, err := os.MkdirTemp("", "temp-download-*")
+
+	fmt.Println("tmpDir:", tmpDir)
+	if err != nil {
+		fmt.Println("Error creating temporary directory:", err)
+		return "", err
+	}
+	c_log.GlobalLogger.Info("创建下载-临时文件夹:", tmpDir)
+
+	for _, file := range fileList {
+		path := filepath.Join(tmpDir, filepath.Base(file))
+		err = config.OssBucket.GetObjectToFile(file, path)
+		if err != nil {
+			fmt.Println("Error downloading file:", err)
+			return "", err
+		}
+		c_log.GlobalLogger.Info("下载map.json文件 - 成功")
+		// 读取json文件 - mapId
+		// 打开文件
+		file, err := os.Open(path)
+		if err != nil {
+			fmt.Println("Error opening file:", err)
+			return "", err
+		}
+		defer file.Close()
+
+		// 读取文件内容
+		fileData, err := ioutil.ReadAll(file)
+		if err != nil {
+			fmt.Println("Error reading file:", err)
+			return "", err
+		}
+
+		// Json转换为map
+		var mapData map[string]interface{}
+		err = json.Unmarshal(fileData, &mapData)
+		data := mapData["map"].(map[string]interface{})
+		// 读取mapId
+		mapId = data["mapId"].(string)
+		fmt.Println("mapId:", mapId)
+	}
+
+	return mapId, err
+}

+ 2 - 3
biz/model/device_map..go → biz/model/device_map.go

@@ -15,7 +15,6 @@ const TableNameDeviceMap = "device_map"
 // DeviceMap mapped from table <device_map>
 type DeviceMap struct {
 	ID            string         `gorm:"column:id;type:varchar(100);primaryKey" json:"id"`
-	DeviceID      string         `gorm:"column:device_id;type:varchar(100);not null" json:"device_id"`
 	DeviceNo      string         `gorm:"column:device_no;type:varchar(100);not null" json:"device_no"`
 	DeviceName    string         `gorm:"column:device_name;type:varchar(100);not null" json:"device_name"`
 	DeviceType    string         `gorm:"column:device_type;type:varchar(100);not null" json:"device_type"`
@@ -28,10 +27,10 @@ type DeviceMap struct {
 	BuildName     string         `gorm:"column:build_name;type:varchar(100);not null" json:"build_name"`
 	MapCreateTime string         `gorm:"column:map_create_time;type:varchar(100);not null" json:"map_create_time"`
 	MapUpdateTime string         `gorm:"column:map_update_time;type:varchar(100);not null" json:"map_update_time"`
-	MapVersion    int32          `gorm:"column:map_version;type:int(11);not null" json:"map_version"`
+	MapVersion    string         `gorm:"column:map_version;type:varchar(100);not null" json:"map_version"`
 	MapValidFlag  int32          `gorm:"column:map_valid_flag;type:int(11);not null;default:1" json:"map_valid_flag"`
 	PjiMapZipURL  string         `gorm:"column:pji_map_zip_url;type:varchar(255);not null" json:"pji_map_zip_url"`
-	CicvMapZipURL string         `gorm:"column:cicv_map_zip_url;type:varchar(255);not null" json:"cicv_map_zip_url"`
+	CicvMapZipURL *string        `gorm:"column:cicv_map_zip_url;type:varchar(255)" json:"cicv_map_zip_url"`
 	CustomAreaID  int32          `gorm:"column:custom_area_id;type:int(11);not null" json:"custom_area_id"`
 	CreatedAt     time.Time      `gorm:"column:created_at;type:datetime;not null" json:"created_at"`
 	UpdatedAt     *time.Time     `gorm:"column:updated_at;type:datetime" json:"updated_at"`

+ 23 - 0
biz/model/map_info.go

@@ -0,0 +1,23 @@
+package model
+
+type MapInfoRes struct {
+	Msg  string    `json:"msg"`
+	Code int       `json:"code"`
+	Data []MapInfo `json:"data"`
+}
+
+type MapInfo struct {
+	MapType      string   `json:"mapType"`
+	MapId        string   `json:"mapId"`
+	MapName      string   `json:"mapName"`
+	Floor        int      `json:"floor"`
+	FloorId      string   `json:"floorId"`
+	BuildId      string   `json:"buildId"`
+	BuildName    string   `json:"buildName"`
+	CreateTime   string   `json:"createTime"`
+	UpdateTime   string   `json:"updateTime"`
+	Version      int      `json:"version"`
+	ZipUrl       string   `json:"zipUrl"`
+	CustomAreaId int      `json:"customAreaId"`
+	SnCodeList   []string `json:"snCodeList"`
+}

+ 6 - 0
common/config/c_map.go

@@ -2,9 +2,15 @@ package config
 
 var (
 	MapBufFiltersuffixes      = []string{"map.pgm", "map.yaml", "map.json", "forbid_area.json"}
+	MapJsonFiltersuffixes     = []string{"map.json"}
 	MapBagFiltersuffixes      = []string{"map.bag"}
 	BuildMapBagFiltersuffixes = []string{"build_map.bag"}
 	OriginMapFiltersuffixes   = []string{"map.pgm", "map.yaml"}
 	SimulationFiltersuffixes  = []string{"data.zip", "map.pgm", "map.yaml", "map.bag", "merged_obstacles_new.csv"}
 	DataFiltersuffixes        = []string{"data.zip"}
 )
+
+const (
+	MAP_VALID_FLAG     = 1
+	MAP_NOT_VALID_FLAG = 0
+)

+ 1 - 3
common/config/c_pji/c_pji.go

@@ -8,7 +8,5 @@ var (
 
 	Token = "4773hd92ysj54paflw2jem3onyhywxt2"
 
-	mapSecretId = "bz765sfnx4wsr6axx91b09ugi56jvzqox"
-
-	mapPrivateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJ/7TuC6YrE6wX4qIyKi7ZmGl6cyYkmTwohCsvAnUdTK1l2uX2C4/lVybgFCp4dklZZgNewDDG8jMSp1KxXVUE4TxEJQQt8g1qx0JWPs1GPz5vP67yMndLbGfm360SDLjgnEBYKcpWe65f6eAPjFXgBrwdue2kZBHqTGRB8LwweVAgMBAAECgYABZx67RxHJJA7A9cr2aXSpPU45ym36NIV8KbmP9DL6KV0qgnZA+Yj2uYN6wgQzYmUSuyfojeOfWzD516qCYoB1wJYXXL3OgDP0HLJZ6WsZfIHC4uSfIRtfepccfGDxjWTCoQHYoHMC1uWww79XjqS6bnRgXCulG7itg9SHHfO2cQJBANVuktJq/bZJFGt7tXvV1IAqJ6Cc5zS62OmAeQ7YYJJIdh9xdtW0ASGzVS6Cj5wPfXp/SsfKl9ZGfql3BaeOzhsCQQC/46qqds6ztKfIAs1uKwB7M0SjASXLmO/+4dubvkabbyT4tcSqmAdOt0RqGb7/AgE6QU/an3IdbUcl/RXpLhwPAkBF0CZsd5zHzH3Gbq+9cwNQbPmLWudx4xBiyKhQh8yG7PbecCHb40ZffKaHUSOie5qiwBJ46bbi2ypBSnJqDZczAkBMEjhtXa4yJdNCAoJoQ1nsfXWfXWwbW6UBGY7THkqlghlZE85EhwKWnSbdHRnPxH6yFoROulkl+1VyZPPTvjjXAkEAryJwhKTIYXwc+cgUhWeLY/Yehj6iuwWwOfT9UbuwjnhKgKmn2tPnwY8JJcQQ99zBhQDWizj7Z9F+LlkMR6rlxw=="
+	PjiApiSitBaseUrl = "https://sitwebapi.chinapji.com/webapi/openapi/console/v1/loop/"
 )

+ 2 - 0
main.go

@@ -8,12 +8,14 @@ import (
 	"pji_desktop_http/biz/dal"
 	"pji_desktop_http/common/config"
 	"pji_desktop_http/common/config/c_log"
+	"pji_desktop_http/pji_client"
 )
 
 func main() {
 	dal.Init()
 	c_log.InitLog("logs/", "desktop_http")
 	config.InitOssConfig()
+	pji_client.InitApiClient()
 	//h := server.Default()
 	h := server.New(
 		server.WithStreamBody(true),

+ 45 - 5
pji_client/pji client_test.go

@@ -21,7 +21,7 @@ func TestSendMsg(t *testing.T) {
 	}
 
 	paramMap := make(map[string]interface{})
-	paramMap["mapId"] = "da747cc5150741cebb186f8306ab159d"
+	paramMap["mapId"] = "fee84db56d254d79b85971cb4ab2e7f1"
 	paramMap["type"] = 0
 	paramMap["customAreaId"] = 334
 
@@ -63,10 +63,9 @@ func TestMapList(t *testing.T) {
 	//	"value": "123",
 	//}
 
-	paramMap := map[string]string{
-		//"mapType": "0",
-	}
-	resp, err := apiClient.GetRequest("https://sitwebapi.chinapji.com/webapi/openapi/console/v1/loop/mapList", paramMap, secretId)
+	paramMap := make(map[string]interface{})
+	paramMap["mapType"] = "0" // 值必须是字符串,不能是数字
+	resp, err := apiClient.GetRequest("https://sitwebapi.chinapji.com/webapi/openapi/console/v1/loop/mapList?mapType=0", paramMap, secretId)
 
 	if err != nil {
 		t.Fatalf("Request failed: %v", err)
@@ -81,3 +80,44 @@ func TestMapList(t *testing.T) {
 		t.Errorf("Expected body %s, got %s", expectedBody, string(resp.Body()))
 	}
 }
+
+//func TestUploadMap(t *testing.T) {
+//	// 生成测试 RSA 私钥
+//	//priv, err := pji_client.ParsePrivateKey("MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJ/\n7TuC6YrE6wX4qIyKi7ZmGl6cyYkmTwohCsvAnUdTK1l2uX2C4/\nlVybgFCp4dklZZgNewDDG8jMSp1KxXVUE4TxEJQQt8g1qx0JWPs1GPz5vP67yMndLbGfm360SDLjgnEBYKcpWe65f6eAPjFXgBrwdue2kZBHqTGRB8LwweVAgMBAAECgYABZx67RxHJJA7A9cr2aXSpPU45ym36NIV8KbmP9DL6KV0qgnZA+Yj2uYN6wgQzYmUSuyfojeOfWzD516qCYoB1wJYXXL3OgDP0HLJZ6WsZfIHC4uSfIRtfepccfGDxjWTCoQHYoHMC1uWww79XjqS6bnRgXCulG7itg9SHHfO2cQJBANVuktJq/\nbZJFGt7tXvV1IAqJ6Cc5zS62OmAeQ7YYJJIdh9xdtW0ASGzVS6Cj5wPfXp/\nSsfKl9ZGfql3BaeOzhsCQQC/\n46qqds6ztKfIAs1uKwB7M0SjASXLmO/+4dubvkabbyT4tcSqmAdOt0RqGb7/AgE6QU/\nan3IdbUcl/\nRXpLhwPAkBF0CZsd5zHzH3Gbq+9cwNQbPmLWudx4xBiyKhQh8yG7PbecCHb40ZffKaHUSOie5qiwBJ46bbi2ypBSnJqDZczAkBMEjhtXa4yJdNCAoJoQ1nsfXWfXWwbW6UBGY7THkqlghlZE85EhwKWnSbdHRnPxH6yFoROulkl+1VyZPPTvjjXAkEAryJwhKTIYXwc+cgUhWeLY/\nYehj6iuwWwOfT9UbuwjnhKgKmn2tPnwY8JJcQQ99zBhQDWizj7Z9F+LlkMR6rlxw==")
+//	priv, err := pji_client.ParsePrivateKey("MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJ/7TuC6YrE6wX4qIyKi7ZmGl6cyYkmTwohCsvAnUdTK1l2uX2C4/lVybgFCp4dklZZgNewDDG8jMSp1KxXVUE4TxEJQQt8g1qx0JWPs1GPz5vP67yMndLbGfm360SDLjgnEBYKcpWe65f6eAPjFXgBrwdue2kZBHqTGRB8LwweVAgMBAAECgYABZx67RxHJJA7A9cr2aXSpPU45ym36NIV8KbmP9DL6KV0qgnZA+Yj2uYN6wgQzYmUSuyfojeOfWzD516qCYoB1wJYXXL3OgDP0HLJZ6WsZfIHC4uSfIRtfepccfGDxjWTCoQHYoHMC1uWww79XjqS6bnRgXCulG7itg9SHHfO2cQJBANVuktJq/bZJFGt7tXvV1IAqJ6Cc5zS62OmAeQ7YYJJIdh9xdtW0ASGzVS6Cj5wPfXp/SsfKl9ZGfql3BaeOzhsCQQC/46qqds6ztKfIAs1uKwB7M0SjASXLmO/+4dubvkabbyT4tcSqmAdOt0RqGb7/AgE6QU/an3IdbUcl/RXpLhwPAkBF0CZsd5zHzH3Gbq+9cwNQbPmLWudx4xBiyKhQh8yG7PbecCHb40ZffKaHUSOie5qiwBJ46bbi2ypBSnJqDZczAkBMEjhtXa4yJdNCAoJoQ1nsfXWfXWwbW6UBGY7THkqlghlZE85EhwKWnSbdHRnPxH6yFoROulkl+1VyZPPTvjjXAkEAryJwhKTIYXwc+cgUhWeLY/Yehj6iuwWwOfT9UbuwjnhKgKmn2tPnwY8JJcQQ99zBhQDWizj7Z9F+LlkMR6rlxw==")
+//	//priv, err := pji_client.ParsePrivateKey("7TuC6YrE6wX4qIyKi7ZmGl6cyYkmTwohCsvAnUdTK1l2uX2C4/\nlVybgFCp4dklZZgNewDDG8jMSp1KxXVUE4TxEJQQt8g1qx0JWPs1GPz5vP67yMndLbGf\nm360SDLjgnEBYKcpWe65f6eAPjFXgBrwdue2kZBHqTGRB8LwweVAgMBAAECgYABZx6\n7RxHJJA7A9cr2aXSpPU45ym36NIV8KbmP9DL6KV0qgnZA+Yj2uYN6wgQzYmUSuyfojeO\nfWzD516qCYoB1wJYXXL3OgDP0HLJZ6WsZfIHC4uSfIRtfepccfGDxjWTCoQHYoHMC1u\nWww79XjqS6bnRgXCulG7itg9SHHfO2cQJBANVuktJq/\nbZJFGt7tXvV1IAqJ6Cc5zS62OmAeQ7YYJJIdh9xdtW0ASGzVS6Cj5wPfXp/\nSsfKl9ZGfql3BaeOzhsCQQC/\n46qqds6ztKfIAs1uKwB7M0SjASXLmO/+4dubvkabbyT4tcSqmAdOt0RqGb7/AgE6QU/\nan3IdbUcl/\nRXpLhwPAkBF0CZsd5zHzH3Gbq+9cwNQbPmLWudx4xBiyKhQh8yG7PbecCHb40ZffKa\nHUSOie5qiwBJ46bbi2ypBSnJqDZczAkBMEjhtXa4yJdNCAoJoQ1nsfXWfXWwbW6UBGY7\nTHkqlghlZE85EhwKWnSbdHRnPxH6yFoROulkl+1VyZPPTvjjXAkEAryJwhKTIYXwc+cgUh\nWeLY/\nYehj6iuwWwOfT9UbuwjnhKgKmn2tPnwY8JJcQQ99zBhQDWizj7Z9F+LlkMR6rlxw==")
+//
+//	//fmt.Println("priv", priv)
+//	if err != nil {
+//		panic(err)
+//	}
+//	secretId := "bz765sfnx4wsr6axx91b09ugi56jvzqox"
+//	// 创建客户端
+//	apiClient, err := pji_client.NewSysUserApiClient(priv)
+//	if err != nil {
+//		t.Fatalf("Failed to create client: %v", err)
+//	}
+//
+//	paramMap := make(map[string]interface{})
+//	paramMap["file"] = []byte{}
+//	paramMap["snCode"] = "P1YTXS1M22AM00001"
+//	paramMap["mapId"] = "553d9d47f8404734997e11175f0e63f5"
+//	paramMap["updateType"] = "0"
+//	paramMap["mapType"] = "0"
+//	paramMap["mapType"] = "北京办公区20230224"
+//
+//	resp, err := apiClient.UploadRequest("https://sitwebapi.chinapji.com/webapi/openapi/console/v1/loop/mapUpload", paramMap, secretId)
+//
+//	if err != nil {
+//		t.Fatalf("Request failed: %v", err)
+//	}
+//
+//	if resp.StatusCode() != 200 {
+//		t.Errorf("Expected status code 200, got %d", resp.StatusCode())
+//	}
+//
+//	expectedBody := `{"status": "success", "data": "123"}`
+//	if string(resp.Body()) != expectedBody {
+//		t.Errorf("Expected body %s, got %s", expectedBody, string(resp.Body()))
+//	}
+//}

+ 93 - 143
pji_client/test_pji.go → pji_client/pji_client.go

@@ -1,6 +1,7 @@
 package pji_client
 
 import (
+	"bytes"
 	"context"
 	"crypto/rand"
 	"crypto/rsa"
@@ -15,6 +16,9 @@ import (
 	"fmt"
 	"github.com/cloudwego/hertz/pkg/app/client"
 	"github.com/cloudwego/hertz/pkg/protocol"
+	"io"
+	"mime/multipart"
+	"pji_desktop_http/common/config/c_log"
 	"sort"
 	"strconv"
 	"strings"
@@ -26,6 +30,35 @@ const (
 	PEM_END   = "\n-----END PRIVATE KEY-----"
 )
 
+var (
+	ApiClient *SysUserApiClient
+)
+
+var (
+	MapSecretId   = "bz765sfnx4wsr6axx91b09ugi56jvzqox"
+	MapPrivateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJ/7TuC6YrE6wX4qIyKi7ZmGl6cyYkmTwohCsvAnUdTK1l2uX2C4/lVybgFCp4dklZZgNewDDG8jMSp1KxXVUE4TxEJQQt8g1qx0JWPs1GPz5vP67yMndLbGfm360SDLjgnEBYKcpWe65f6eAPjFXgBrwdue2kZBHqTGRB8LwweVAgMBAAECgYABZx67RxHJJA7A9cr2aXSpPU45ym36NIV8KbmP9DL6KV0qgnZA+Yj2uYN6wgQzYmUSuyfojeOfWzD516qCYoB1wJYXXL3OgDP0HLJZ6WsZfIHC4uSfIRtfepccfGDxjWTCoQHYoHMC1uWww79XjqS6bnRgXCulG7itg9SHHfO2cQJBANVuktJq/bZJFGt7tXvV1IAqJ6Cc5zS62OmAeQ7YYJJIdh9xdtW0ASGzVS6Cj5wPfXp/SsfKl9ZGfql3BaeOzhsCQQC/46qqds6ztKfIAs1uKwB7M0SjASXLmO/+4dubvkabbyT4tcSqmAdOt0RqGb7/AgE6QU/an3IdbUcl/RXpLhwPAkBF0CZsd5zHzH3Gbq+9cwNQbPmLWudx4xBiyKhQh8yG7PbecCHb40ZffKaHUSOie5qiwBJ46bbi2ypBSnJqDZczAkBMEjhtXa4yJdNCAoJoQ1nsfXWfXWwbW6UBGY7THkqlghlZE85EhwKWnSbdHRnPxH6yFoROulkl+1VyZPPTvjjXAkEAryJwhKTIYXwc+cgUhWeLY/Yehj6iuwWwOfT9UbuwjnhKgKmn2tPnwY8JJcQQ99zBhQDWizj7Z9F+LlkMR6rlxw=="
+)
+
+func InitApiClient() {
+	var err error
+	c_log.GlobalLogger.Info("初始化Pji Api客户端对象 - 开始。")
+
+	priv, err := ParsePrivateKey(MapPrivateKey)
+
+	if err != nil {
+		c_log.GlobalLogger.Error("无法解析私钥:", err)
+	}
+
+	// 创建客户端
+	ApiClient, err = NewSysUserApiClient(priv)
+
+	if err != nil {
+		c_log.GlobalLogger.Error("无法创建 Pji Api客户端:", err)
+	}
+
+	c_log.GlobalLogger.Info("初始化Pji Api客户端对象 - 成功。")
+}
+
 // SysUserApiClient 是用于API交互的客户端结构体
 type SysUserApiClient struct {
 	HttpClient *client.Client  // Hertz客户端实例
@@ -49,7 +82,7 @@ func NewSysUserApiClient(privateKey *rsa.PrivateKey) (*SysUserApiClient, error)
 func ParsePrivateKey(privateKeyPEM string) (*rsa.PrivateKey, error) {
 	privateKeyPEM = FormatPrivateKey(privateKeyPEM)
 	//fmt.Println("privateKeyPEM", privateKeyPEM)
-	// 2、解码私钥字节,生成加密对象
+	// 解码私钥字节,生成加密对象
 	block, _ := pem.Decode([]byte(privateKeyPEM))
 
 	if block == nil {
@@ -58,12 +91,12 @@ func ParsePrivateKey(privateKeyPEM string) (*rsa.PrivateKey, error) {
 	}
 
 	//fmt.Println("block", block.Bytes)
-	// 3、生成私钥对象
+	// 生成私钥对象
 	priKey, err := x509.ParsePKCS8PrivateKey(block.Bytes)
 	if err != nil {
 		return nil, err
 	}
-	// 4. 类型断言为*RSA私钥
+	// 类型断言为*RSA私钥
 	privateKey := priKey.(*rsa.PrivateKey)
 	return privateKey, nil
 }
@@ -128,8 +161,6 @@ func (c *SysUserApiClient) getHttpRequest(method string, url string, secretId st
 	req.Header.Set("PJI-ALGORITHM", "SHA3-256")
 	req.Header.Set("PJI-SECRET-ID", secretId)
 	req.Header.Set("PJI-ABSTRACT-SIGN", encode)
-	req.Header.Set("Content-Type", "application/json")
-	fmt.Println("req", req.Header.String())
 	return req
 }
 
@@ -143,7 +174,7 @@ func (c *SysUserApiClient) JsonPostRequest(url string, paramMap map[string]inter
 		return nil, err
 	}
 	str := string(jsonData)
-	if string(jsonData) == "{}" {
+	if str == "{}" {
 		return nil, nil
 	}
 
@@ -154,6 +185,7 @@ func (c *SysUserApiClient) JsonPostRequest(url string, paramMap map[string]inter
 
 	req := c.getHttpRequest("POST", url, secretId, signature)
 	req.SetBody(jsonData)
+	req.Header.Set("Content-Type", "application/json")
 
 	resp := protocol.AcquireResponse()
 
@@ -162,45 +194,16 @@ func (c *SysUserApiClient) JsonPostRequest(url string, paramMap map[string]inter
 	return resp, err
 }
 
-//// PutRequest 发送PUT请求
-//func (c *SysUserApiClient) PutRequest(url string, paramMap map[string]interface{}, secretId string) (*protocol.Response, error) {
-//	paramMap = sortMapByKey(paramMap)
-//
-//	jsonData, err := json.Marshal(paramMap)
-//	if err != nil {
-//		return nil, err
-//	}
-//
-//	signature, err := c.generateSignature(jsonData)
-//	if err != nil {
-//		return nil, err
-//	}
-//
-//	req := c.getHttpRequest("PUT", url, secretId, signature)
-//	req.SetBody(jsonData)
-//
-//	resp := protocol.AcquireResponse()
-//	ctx := context.Background()
-//	err = c.HttpClient.Do(ctx, req, resp)
-//	return resp, err
-//}
-
 // GetRequest 发送GET请求
-func (c *SysUserApiClient) GetRequest(url string, paramMap map[string]string, secretId string) (*protocol.Response, error) {
-	//sortedParams := url.Values{}
-	//for k, v := range paramMap {
-	//	sortedParams.Add(k, v)
-	//}
-	//sortedURL := url + "?" + sortedParams.Encode()
-
-	//jsonData, err := json.Marshal(paramMap)
+func (c *SysUserApiClient) GetRequest(url string, paramMap map[string]interface{}, secretId string) (*protocol.Response, error) {
+	paramMap = sortMapByKey(paramMap)
 	jsonData, err := json.Marshal(paramMap)
 	fmt.Println("jsonData", string(jsonData))
 	if err != nil {
 		return nil, err
 	}
 	str := string(jsonData)
-	if string(jsonData) == "{}" {
+	if str == "{}" {
 		str = ""
 	}
 	signature, err := c.generateSignature(str)
@@ -216,111 +219,58 @@ func (c *SysUserApiClient) GetRequest(url string, paramMap map[string]string, se
 	return resp, err
 }
 
-//// DeleteRequest 发送DELETE请求
-//func (c *SysUserApiClient) DeleteRequest(url string, paramMap map[string]string, secretId string) (*protocol.Response, error) {
-//	sortedParams := url.Values{}
-//	for k, v := range paramMap {
-//		sortedParams.Add(k, v)
-//	}
-//	sortedURL := url + "?" + sortedParams.Encode()
-//
-//	jsonData, err := json.Marshal(paramMap)
-//	if err != nil {
-//		return nil, err
-//	}
-//
-//	signature, err := c.generateSignature(jsonData)
-//	if err != nil {
-//		return nil, err
-//	}
-//
-//	req := c.getHttpRequest("DELETE", sortedURL, secretId, signature)
-//
-//	resp := protocol.AcquireResponse()
-//	err = c.HttpClient.Do(req, resp)
-//	return resp, err
-//}
-
-//// FormDataRequest 发送带有form-data的POST请求
-//func (c *SysUserApiClient) FormDataRequest(url string, paramMap map[string]string, secretId string) (*protocol.Response, error) {
-//	paramMap = sortMapByKeyString(paramMap)
-//
-//	jsonData, err := json.Marshal(paramMap)
-//	if err != nil {
-//		return nil, err
-//	}
-//
-//	signature, err := c.generateSignature(jsonData)
-//	if err != nil {
-//		return nil, err
-//	}
-//
-//	req := c.getHttpRequest("POST", url, secretId, signature)
-//	formBody := url.Values{}
-//	for k, v := range paramMap {
-//		formBody.Set(k, v)
-//	}
-//	req.Header.SetContentType("multipart/form-data")
-//	req.SetBody([]byte(formBody.Encode()))
-//
-//	resp := protocol.AcquireResponse()
-//	err = c.HttpClient.Do(req, resp)
-//	return resp, err
-//}
-
-//// UploadRequest 上传文件
-//func (c *SysUserApiClient) UploadRequest(url string, paramMap map[string]string, file []byte, secretId string) (*protocol.Response, error) {
-//	paramMap = sortMapByKeyString(paramMap)
-//
-//	jsonData, err := json.Marshal(paramMap)
-//	if err != nil {
-//		return nil, err
-//	}
-//
-//	signature, err := c.generateSignature(jsonData)
-//	if err != nil {
-//		return nil, err
-//	}
-//
-//	req := c.getHttpRequest("POST", url, secretId, signature)
-//	formBody := url.Values{}
-//	for k, v := range paramMap {
-//		formBody.Set(k, v)
-//	}
-//
-//	req.Header.SetContentType("multipart/form-data")
-//	req.SetBody([]byte(formBody.Encode())) // 文件数据可以单独处理
-//
-//	resp := protocol.AcquireResponse()
-//	err = c.HttpClient.Do(req, resp)
-//	return resp, err
-//}
-//
-//// DownLoadRequest 文件下载
-//func (c *SysUserApiClient) DownLoadRequest(url string, paramMap map[string]string, secretId string) (*protocol.Response, error) {
-//	sortedParams := url.Values{}
-//	for k, v := range paramMap {
-//		sortedParams.Add(k, v)
-//	}
-//	sortedURL := url + "?" + sortedParams.Encode()
-//
-//	jsonData, err := json.Marshal(paramMap)
-//	if err != nil {
-//		return nil, err
-//	}
-//
-//	signature, err := c.generateSignature(jsonData)
-//	if err != nil {
-//		return nil, err
-//	}
-//
-//	req := c.getHttpRequest("GET", sortedURL, secretId, signature)
-//	req.SetBody([]byte{})
-//
-//	resp := protocol.AcquireResponse()
-//	err = c.HttpClient.Do(req, resp)
-//	return resp, err
-//}
+// UploadRequest 上传文件
+func (c *SysUserApiClient) UploadRequest(url string, paramMap map[string]interface{}, secretId string, file []byte) (*protocol.Response, error) {
+	paramMap = sortMapByKey(paramMap)
+	jsonData, err := json.Marshal(paramMap)
+	fmt.Println("jsonData", string(jsonData))
+	if err != nil {
+		return nil, err
+	}
+	str := string(jsonData)
+	if str == "{}" {
+		str = ""
+	}
+	signature, err := c.generateSignature(str)
+	if err != nil {
+		return nil, err
+	}
+
+	req := c.getHttpRequest("POST", url, secretId, signature)
+
+	body := &bytes.Buffer{}
+	writer := multipart.NewWriter(body)
+	//req.Header.Set("Content-Type", writer.FormDataContentType())
+	req.Header.Set("Content-Type", writer.FormDataContentType())
+
+	fmt.Println("req", req.Header.String())
+
+	// 添加表单字段
+	for key, val := range paramMap {
+		part, err := writer.CreateFormField(key)
+		if err != nil {
+			fmt.Println("Error creating form field", key)
+			return nil, err
+		}
+		part.Write([]byte(val.(string)))
+	}
+	formFile, err := writer.CreateFormFile("file", "map.zip")
+	if err != nil {
+		return nil, err
+	}
+	_, err = io.Copy(formFile, bytes.NewReader(file))
+
+	//fmt.Println("body", body.String())
+
+	writer.Close()
+
+	req.SetBody(body.Bytes()) // 文件数据可以单独处理
+
+	resp := protocol.AcquireResponse()
+	ctx := context.Background()
+	err = c.HttpClient.Do(ctx, req, resp)
+	return resp, err
+}
 
 // 辅助函数:对字符串Map的键进行排序
 func sortMapByKeyString(m map[string]string) map[string]string {

+ 3 - 0
router.go

@@ -31,6 +31,9 @@ func customizedRegister(r *server.Hertz) {
 	r.POST("/map/add/record", map_service.AddMapUpdateRecord)
 
 	r.POST("/map/query/update/record", map_service.QueryMapUpdateRecord)
+	r.POST("/map/upload/update/map", map_service.TestUploadUpdateMap)
+
+	r.GET("/map/update/deviceMap/record", map_service.UpdateDeviceMapById)
 
 	r.GET("/world/upload/world", world_service.UploadWorldFile)
 	r.POST("/world/upload/world", world_service.UploadWorldFile)