map_service.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690
  1. package map_service
  2. import (
  3. "archive/zip"
  4. "context"
  5. "encoding/json"
  6. "fmt"
  7. "github.com/cloudwego/hertz/pkg/app"
  8. "github.com/cloudwego/hertz/pkg/protocol/consts"
  9. uuid "github.com/satori/go.uuid"
  10. "io"
  11. "io/ioutil"
  12. "net/http"
  13. "os"
  14. "path/filepath"
  15. "pji_desktop_http/biz/dal/mysql"
  16. "pji_desktop_http/biz/model"
  17. "pji_desktop_http/common/config"
  18. "pji_desktop_http/common/config/c_log"
  19. "pji_desktop_http/common/config/c_pji"
  20. "pji_desktop_http/common/entity"
  21. "pji_desktop_http/common/util"
  22. "pji_desktop_http/pji_client"
  23. "strconv"
  24. "strings"
  25. )
  26. // CheckMapBufConsistency 检查请求id对应的mapBuf文件夹的一致性
  27. // @router /map/checkmapbuf [POST]
  28. func CheckMapBufConsistency(ctx context.Context, c *app.RequestContext) {
  29. var req []string
  30. err := c.BindAndValidate(&req)
  31. if err != nil {
  32. c.String(consts.StatusBadRequest, err.Error())
  33. return
  34. }
  35. fmt.Println(req)
  36. if len(req) == 0 { // 请求数据为空
  37. c.JSON(consts.StatusBadRequest, entity.HttpResult{Status: false, Code: "", Message: "请求数据为空。"})
  38. } else if len(req) == 1 { // 只有一条数据则直接返回
  39. c.JSON(consts.StatusOK, entity.HttpResult{Status: true, Code: "", Message: "mapBuf文件夹数据一致。"})
  40. } else {
  41. var firstValue int
  42. for i, id := range req {
  43. // 根据id获取对应的oss文件列表
  44. fileList, err := util.GetExactedMapFileById(id)
  45. // 过滤特定后缀的文件列表
  46. fileList = util.FilterBySuffixes(fileList, config.MapBufFiltersuffixes...)
  47. //fmt.Println("Filtered Strings:", fileList)
  48. if err != nil {
  49. c.String(consts.StatusBadRequest, err.Error())
  50. return
  51. }
  52. // 获取文件列表的总大小
  53. totalSize := calculateTotalFileSize(fileList)
  54. fmt.Println("Total Size:", totalSize)
  55. // 判断不同文件列表(mapBuf)中文件的总大小是否一致
  56. if i == 0 {
  57. firstValue = totalSize
  58. } else {
  59. if totalSize != firstValue {
  60. c.JSON(consts.StatusOK, entity.HttpResult{Status: false, Code: "", Message: "mapBuf文件夹数据不一致。"})
  61. return
  62. }
  63. }
  64. }
  65. c.JSON(consts.StatusOK, entity.HttpResult{Status: true, Code: "", Message: "mapBuf文件夹数据一致。"})
  66. }
  67. }
  68. // DownloadOSSFile 根据objectKey下载指定的oss文件
  69. // @router /map/downloadossfile [GET]
  70. func DownloadOSSFile(ctx context.Context, c *app.RequestContext) {
  71. objectKey := c.Query("objectKey")
  72. // 从OSS下载文件
  73. reader, err := config.OssBucket.GetObject(objectKey)
  74. if err != nil {
  75. c.JSON(http.StatusInternalServerError, map[string]string{"error": err.Error()})
  76. return
  77. }
  78. defer reader.Close()
  79. // 设置响应头
  80. c.Response.Header.Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, filepath.Base(objectKey)))
  81. c.Response.Header.Set("Content-Type", "binary/octet-stream")
  82. // 将文件流式传输回客户端
  83. data, err := io.ReadAll(reader)
  84. if err != nil {
  85. panic(err)
  86. }
  87. if _, err := c.Write(data); err != nil {
  88. c.JSON(http.StatusInternalServerError, map[string]string{"error": err.Error()})
  89. return
  90. }
  91. }
  92. // DownloadMapZipFile 根据请求id从oss拉取并打包下载建图所需要的文件
  93. // @router /map/download/map/zip [GET]
  94. func DownloadMapZipFile(ctx context.Context, c *app.RequestContext) {
  95. id := c.Query("id")
  96. fmt.Println("id", id)
  97. ids := strings.Split(id, ",")
  98. fmt.Println("ids", ids)
  99. // 根据id生成用于地图更新的压缩包
  100. filePath, tmpDir, err := generateMapZipById(ids)
  101. if err != nil {
  102. c.JSON(http.StatusInternalServerError, map[string]string{"error": err.Error()})
  103. }
  104. fmt.Println("filePath", filePath)
  105. // 检查文件是否存在
  106. if _, err := os.Stat(filePath); os.IsNotExist(err) {
  107. c.JSON(http.StatusNotFound, map[string]string{"error": "File not found"})
  108. return
  109. }
  110. // 打开文件
  111. f, err := os.Open(filePath)
  112. if err != nil {
  113. c.JSON(http.StatusInternalServerError, map[string]string{"error": "Failed to open file"})
  114. return
  115. }
  116. defer f.Close()
  117. // 设置响应头
  118. c.Response.Header.Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, filepath.Base(filePath)))
  119. c.Response.Header.Set("Content-Type", "binary/octet-stream")
  120. // 将文件流式传输回客户端
  121. data, err := io.ReadAll(f)
  122. if err != nil {
  123. panic(err)
  124. }
  125. if _, err := c.Write(data); err != nil {
  126. c.JSON(http.StatusInternalServerError, map[string]string{"error": err.Error()})
  127. return
  128. }
  129. defer os.RemoveAll(tmpDir)
  130. }
  131. // DownloadMapBagFile 根据请求id从oss拉取并下载解析后的map.bag文件
  132. // @router /map/downloadmapbagfile [GET]
  133. func DownloadMapBagFile(ctx context.Context, c *app.RequestContext) {
  134. id := c.Query("id")
  135. fmt.Println("id: ", id)
  136. // 根据id获取对应的oss文件列表
  137. fileList, err := util.GetExactedMapFileById(id)
  138. // 过滤特定后缀的文件列表
  139. fileList = util.FilterBySuffixes(fileList, config.MapBagFiltersuffixes...)
  140. //fmt.Println("fileList", fileList)
  141. objectKey := fileList[0]
  142. // 从OSS下载文件
  143. reader, err := config.OssBucket.GetObject(objectKey)
  144. if err != nil {
  145. c.JSON(consts.StatusInternalServerError, entity.HttpResult{Status: false, Code: "", Message: "解析地图Bag下载失败。"})
  146. return
  147. }
  148. defer reader.Close()
  149. // 设置响应头
  150. c.Response.Header.Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, filepath.Base(objectKey)))
  151. c.Response.Header.Set("Content-Type", "binary/octet-stream")
  152. // 将文件流式传输回客户端
  153. data, err := io.ReadAll(reader)
  154. if err != nil {
  155. panic(err)
  156. }
  157. if _, err := c.Write(data); err != nil {
  158. c.JSON(consts.StatusInternalServerError, entity.HttpResult{Status: false, Code: "", Message: "解析地图Bag下载失败。"})
  159. return
  160. }
  161. c.JSON(consts.StatusOK, entity.HttpResult{Status: true, Code: "", Message: "解析地图Bag下载成功。"})
  162. }
  163. // 根据id生成用于地图更新的压缩包
  164. func generateMapZipById(ids []string) (file string, tmpDir string, err error) {
  165. // 根据id获取对应的oss文件列表
  166. allFileList, err := util.GetExactedMapFileByIds(ids)
  167. fmt.Println("allFileList", allFileList)
  168. // 过滤特定后缀的文件列表
  169. mapBufFileList := util.FilterBySuffixes(allFileList, config.MapBufFiltersuffixes...)
  170. //fmt.Println("Filtered Strings:", fileList)
  171. if err != nil {
  172. return
  173. }
  174. // 创建临时文件夹
  175. tmpDir, err = os.MkdirTemp("", "temp-download-*")
  176. fmt.Println("tmpDir:", tmpDir)
  177. if err != nil {
  178. fmt.Println("Error creating temporary directory:", err)
  179. return "", "", err
  180. }
  181. c_log.GlobalLogger.Info("创建下载-临时文件夹:", tmpDir)
  182. // 创建根文件夹(文件打包的根目录)
  183. baseDir := filepath.Join(tmpDir, "data")
  184. if err := os.Mkdir(baseDir, 0755); err != nil {
  185. fmt.Println("Error creating subdirectory:", err)
  186. return "", "", err
  187. }
  188. c_log.GlobalLogger.Info("创建文件打包根目录:", baseDir)
  189. // 根目录创建子文件夹 bag_folder
  190. bagFolderDir := filepath.Join(baseDir, "bag_folder")
  191. if err := os.Mkdir(bagFolderDir, 0755); err != nil {
  192. fmt.Println("Error creating subdirectory:", err)
  193. return "", "", err
  194. }
  195. c_log.GlobalLogger.Info("根目录下创建bag_folder子文件夹:", bagFolderDir)
  196. // 根目录创建子文件夹 origin_map_folder
  197. originMapFolderDir := filepath.Join(baseDir, "origin_map_folder")
  198. if err := os.Mkdir(originMapFolderDir, 0755); err != nil {
  199. fmt.Println("Error creating subdirectory:", err)
  200. return "", "", err
  201. }
  202. c_log.GlobalLogger.Info("根目录下创建origin_map_folder子文件夹:", originMapFolderDir)
  203. // 子文件夹 bag_folder 创建子文件夹 mapBuf
  204. mapBufDir := filepath.Join(bagFolderDir, "mapBuf")
  205. if err := os.Mkdir(mapBufDir, 0755); err != nil {
  206. fmt.Println("Error creating subdirectory:", err)
  207. return "", "", err
  208. }
  209. c_log.GlobalLogger.Info("bag_folder创建mapBuf子文件夹 :", mapBufDir)
  210. // 从oss下载build_map.bag文件到 bag_folder 文件夹
  211. // 过滤特定后缀的文件列表
  212. buildMapBagFileList := util.FilterBySuffixes(allFileList, config.BuildMapBagFiltersuffixes...)
  213. fmt.Println("buildMapBagFileList", buildMapBagFileList)
  214. //buildMapBagFile := buildMapBagFileList[0]
  215. //err = config.OssBucket.GetObjectToFile(buildMapBagFile, filepath.Join(bagFolderDir, filepath.Base(buildMapBagFile)))
  216. for i, file := range buildMapBagFileList {
  217. fileName := "build_map" + "-" + strconv.Itoa(i) + ".bag"
  218. err = config.OssBucket.GetObjectToFile(file, filepath.Join(bagFolderDir, fileName))
  219. if err != nil {
  220. fmt.Println("Error downloading build map file:", err)
  221. return "", "", err
  222. }
  223. }
  224. if err != nil {
  225. fmt.Println("Error downloading Bag file:", err)
  226. return "", "", err
  227. }
  228. c_log.GlobalLogger.Info("下载文件到bag_folder文件夹 - 成功")
  229. // 从oss下载文件到 mapBuf 文件夹
  230. for _, file := range mapBufFileList {
  231. err = config.OssBucket.GetObjectToFile(file, filepath.Join(mapBufDir, filepath.Base(file)))
  232. if err != nil {
  233. fmt.Println("Error downloading mapBuf file:", err)
  234. return "", "", err
  235. }
  236. }
  237. c_log.GlobalLogger.Info("下载文件到mapBuf子文件夹 - 成功")
  238. // 从oss下载bag文件到 origin_map_folder 文件夹
  239. // 过滤特定后缀的文件列表
  240. originMapFileList := util.FilterBySuffixes(allFileList, config.OriginMapFiltersuffixes...)
  241. for _, file := range originMapFileList {
  242. err = config.OssBucket.GetObjectToFile(file, filepath.Join(originMapFolderDir, filepath.Base(file)))
  243. if err != nil {
  244. fmt.Println("Error downloading origin_map file:", err)
  245. return "", "", err
  246. }
  247. }
  248. c_log.GlobalLogger.Info("下载文件到origin_map_folder文件夹 - 成功")
  249. // 创建压缩文件
  250. zipPath := filepath.Join(tmpDir, "mapFile-"+ids[0]+".zip")
  251. zipFile, err := os.Create(zipPath)
  252. if err != nil {
  253. fmt.Println("Error creating ZIP file:", err)
  254. return "", "", err
  255. }
  256. defer zipFile.Close()
  257. zipWriter := zip.NewWriter(zipFile)
  258. defer zipWriter.Close()
  259. // 压缩文件夹
  260. if err := util.AddDirToZip(baseDir, zipWriter); err != nil {
  261. fmt.Println("Error adding directory to ZIP:", err)
  262. return "", "", err
  263. }
  264. fmt.Println("ZIP file created successfully.")
  265. c_log.GlobalLogger.Info("创建压缩文件 - 成功")
  266. return zipPath, tmpDir, nil
  267. }
  268. // UploadMapFile 将地图更新相关文件上传到oss
  269. // @router /map/upload/map [GET]
  270. func UploadMapFile(ctx context.Context, c *app.RequestContext) {
  271. equipmentNo := c.Query("equipmentNo")
  272. fmt.Println("equipmentNo", equipmentNo)
  273. mapId := c.Query("mapId")
  274. fmt.Println("mapId", mapId)
  275. timeStamp := c.Query("timeStamp")
  276. fmt.Println("timeStamp", timeStamp)
  277. header, err := c.FormFile("file")
  278. if err != nil {
  279. c.String(http.StatusBadRequest, fmt.Sprintf("get form err: %s", err.Error()))
  280. return
  281. }
  282. fileName := header.Filename
  283. fmt.Println("filename", fileName)
  284. ossObjectKey := config.UpdateMapOssBasePrefix + "/" + equipmentNo + "/" + mapId + "/" + timeStamp + "/" + fileName
  285. fmt.Println("ossObjectKey", ossObjectKey)
  286. f, _ := header.Open()
  287. defer f.Close()
  288. config.OssMutex.Lock()
  289. err = config.OssBucket.PutObject(ossObjectKey, f)
  290. config.OssMutex.Unlock()
  291. if err != nil {
  292. c_log.GlobalLogger.Error("程序异常退出。上传文件", fileName, "->", ossObjectKey, "出错:", err)
  293. c.JSON(consts.StatusOK, entity.HttpResult{Status: false, Code: "", Message: "上传文件失败", Details: ""})
  294. return
  295. }
  296. c_log.GlobalLogger.Info("上传文件", fileName, "->", ossObjectKey, "成功。")
  297. c.JSON(consts.StatusOK, entity.HttpResult{Status: true, Code: "", Message: "上传文件成功", Details: ossObjectKey})
  298. }
  299. // AddMapUpdateRecord 添加仿真测试记录
  300. // @router /map/add/record [GET]
  301. func AddMapUpdateRecord(ctx context.Context, c *app.RequestContext) {
  302. var record model.MapUpdate
  303. err := c.BindAndValidate(&record)
  304. record.ID = uuid.NewV1().String()
  305. fmt.Println("record", record)
  306. if err != nil {
  307. c.String(http.StatusBadRequest, fmt.Sprintf("get form err: %s", err.Error()))
  308. return
  309. }
  310. err = mysql.AddMapUpdateOneRecord(ctx, record)
  311. if err != nil {
  312. c.JSON(consts.StatusOK, entity.HttpResult{Status: false, Code: "", Message: "地图更新记录添加失败"})
  313. return
  314. }
  315. c.JSON(consts.StatusOK, entity.HttpResult{Status: true, Code: "", Message: "地图更新记录添加成功"})
  316. }
  317. // QueryMapUpdateRecord 根据条件查询地图更新记录
  318. // @router /map/query/update/record [GET]
  319. func QueryMapUpdateRecord(ctx context.Context, c *app.RequestContext) {
  320. var record model.MapUpdate
  321. err := c.BindAndValidate(&record)
  322. fmt.Println("record", record)
  323. var pageFlag bool
  324. if c.Query("page") != "" && c.Query("pageSize") != "" {
  325. pageFlag = true
  326. } else {
  327. pageFlag = false
  328. }
  329. page, _ := strconv.Atoi(c.Query("page"))
  330. pageSize, _ := strconv.Atoi(c.Query("pageSize"))
  331. records, count, err := mysql.QueryMapUpdateRecords(ctx, &record, pageFlag, page, pageSize)
  332. if err != nil {
  333. c.JSON(consts.StatusOK, entity.Response{Status: false, Code: "", Message: "地图更新记录查询失败", Total: 0})
  334. return
  335. }
  336. output, err := json.Marshal(records)
  337. if err != nil {
  338. c.JSON(consts.StatusOK, entity.Response{Status: false, Code: "", Message: "地图更新记录查询失败", Total: 0})
  339. return
  340. }
  341. c.JSON(consts.StatusOK, entity.Response{Status: true, Code: "", Message: "地图更新查询成功", Data: string(output), Total: int(count)})
  342. }
  343. // TestUploadUpdateMap 测试朴津地图上传接口
  344. // @router /map/upload/update/map [GET]
  345. func TestUploadUpdateMap(ctx context.Context, c *app.RequestContext) {
  346. header, err := c.FormFile("file")
  347. if err != nil {
  348. c.String(http.StatusBadRequest, fmt.Sprintf("get form err: %s", err.Error()))
  349. return
  350. }
  351. fileName := header.Filename
  352. fmt.Println("filename", fileName)
  353. f, _ := header.Open()
  354. defer f.Close()
  355. paramMap := make(map[string]interface{})
  356. // Map<String, String> paramMap=new HashMap<>();
  357. // paramMap.put("mapId","2247aeb31ad34wwddfd9c3ba24536e52859");
  358. // paramMap.put("mapName","合肥演示");
  359. // paramMap.put("buildId"," 7b4e8d01c08f472fabf7ccff2b2336s");
  360. // paramMap.put("floorId"," 695abbcfdf99471sdfff3b9b1d0818164e7");
  361. // paramMap.put("updateType"," 7b4e8d01c08f472fabf7ccff2b2336s");
  362. // paramMap.put("floor","1");
  363. // paramMap.put("buildName"," 2");
  364. // paramMap.put("customAreaId"," 355");
  365. // paramMap.put("snCode","P1YTYD1M233M00224");
  366. // paramMap.put("fileName","1702284791385137152.zip");
  367. // paramMap.put("mapType","0");
  368. paramMap["snCode"] = "P1YTXS1M22AM00001"
  369. paramMap["mapId"] = "553d9d47f8404734997e11175f0e63f5"
  370. paramMap["updateType"] = "0"
  371. paramMap["mapType"] = "0"
  372. paramMap["mapName"] = "北京办公区20230224"
  373. bytes, err := io.ReadAll(f)
  374. if err != nil {
  375. return
  376. }
  377. // 调用 朴津地图上传 接口
  378. resp, err := pji_client.ApiClient.UploadRequest(c_pji.PjiApiSitBaseUrl+"mapUpload", paramMap, pji_client.MapSecretId, bytes)
  379. fmt.Println(string(resp.Body()))
  380. c.JSON(consts.StatusOK, entity.HttpResult{Status: true, Code: "", Message: "上传地图测试"})
  381. }
  382. // UpdateDeviceMapById 根据场景id维护设备地图表
  383. // @router /map/update/deviceMap/record [GET]
  384. func UpdateDeviceMapById(ctx context.Context, c *app.RequestContext) {
  385. sceneId := c.Query("sceneId")
  386. fmt.Println("sceneId", sceneId)
  387. deviceNo := c.Query("deviceNo")
  388. fmt.Println("deviceNo", deviceNo)
  389. deviceName := c.Query("deviceName")
  390. fmt.Println("deviceName", deviceName)
  391. deviceType := c.Query("deviceType")
  392. fmt.Println("deviceType", deviceType)
  393. // 根据场景id查询地图id
  394. mapId, err := getMapIdById(sceneId)
  395. if err != nil || mapId == "" {
  396. c.JSON(consts.StatusOK, entity.Response{Status: false, Code: "", Message: "获取mapId失败"})
  397. return
  398. }
  399. fmt.Println("mapId", mapId)
  400. // 查询朴津地图列表
  401. mapInfoList, err := getMapInfoList()
  402. if err != nil || mapInfoList == nil {
  403. c.JSON(consts.StatusOK, entity.Response{Status: false, Code: "", Message: "获取地图列表数据失败"})
  404. return
  405. }
  406. fmt.Println("mapInfoList", mapInfoList)
  407. // 判断map id是否存在于朴津地图列表中
  408. mapId = "fee84db56d254d79b85971cb4ab2e7f1" // 存在
  409. //mapId = "553d9d47f8404734997e11175f0e63f5" // 不存在
  410. exist, record := checkMapIdExist(mapId, mapInfoList)
  411. fmt.Println("exist", exist)
  412. fmt.Println("record", record)
  413. if !exist { // map id不存在于朴津地图列表中
  414. // 查询地图设备表中是否存在对应map id且有效的记录
  415. records, err := mysql.QueryValidDeviceMapByMapId(ctx, mapId)
  416. if err != nil {
  417. c.JSON(consts.StatusOK, entity.Response{Status: false, Code: "", Message: " 查询设备地图失败"})
  418. return
  419. }
  420. fmt.Println("records", records)
  421. if len(records) > 0 { // 存在,
  422. fmt.Println("设置无效")
  423. // 将对应的map id的记录设置为无效
  424. update, err := mysql.UpdateDeviceMapValidFlagByMapId(ctx, mapId, config.MAP_NOT_VALID_FLAG)
  425. if err != nil {
  426. c.JSON(consts.StatusOK, entity.Response{Status: false, Code: "", Message: "更新设备地图状态失败"})
  427. return
  428. }
  429. fmt.Println("update", update)
  430. }
  431. c.JSON(consts.StatusOK, entity.Response{Status: true, Code: "1001", Message: "map id不存在地图列表中"})
  432. } else { // map id存在于朴津地图列表中
  433. snCodeList := record.SnCodeList
  434. for _, snCode := range snCodeList { // snCodeList 代表配置了对应map id地图的机器人sn码列表, 上限为机器人数量
  435. fmt.Println("snCode", snCode)
  436. deviceMap := model.DeviceMap{DeviceNo: snCode, DeviceName: deviceName,
  437. DeviceType: deviceType, MapID: record.MapId, MapType: record.MapType, MapName: record.MapName, FloorID: record.FloorId,
  438. Floor: strconv.Itoa(record.Floor), BuildID: record.BuildId, BuildName: record.BuildName, MapCreateTime: record.CreateTime, MapUpdateTime: record.UpdateTime,
  439. MapVersion: strconv.Itoa(record.Version), MapValidFlag: config.MAP_VALID_FLAG, PjiMapZipURL: record.ZipUrl, CustomAreaID: int32(record.CustomAreaId)}
  440. fmt.Println("deviceMap", deviceMap)
  441. deviceMap.MapVersion = "123456"
  442. // 查询[对应设备]是否存在对应map id且有效的记录
  443. records, err := mysql.QueryValidDeviceMapByDevice(ctx, mapId, snCode)
  444. if err != nil {
  445. c.JSON(consts.StatusOK, entity.Response{Status: false, Code: "", Message: " 查询设备地图失败"})
  446. return
  447. }
  448. fmt.Println("records", records)
  449. if len(records) == 0 { // 对应设备不存在对应map id且有效的记录, 说明该设备部署了新的地图(重采或新的区域地图)
  450. // 添加记录
  451. deviceMap.ID = uuid.NewV1().String()
  452. err = mysql.AddDeviceMapOneRecord(ctx, deviceMap)
  453. if err != nil {
  454. c.JSON(consts.StatusOK, entity.Response{Status: false, Code: "", Message: "添加设备地图记录失败"})
  455. return
  456. }
  457. } else if len(records) == 1 { // 对应设备存在1个对应map id且有效的记录, 说明该设备之前部署过该地图, 需要检测版本号来判断更新记录(版本号一致)还是添加记录(版本号不一致)
  458. fmt.Println("record", record)
  459. if deviceMap.MapVersion == records[0].MapVersion { // 地图列表查询到的版本与设备地图表中版本一致, 则更新记录
  460. // 更新记录
  461. deviceMap.ID = records[0].ID
  462. update, err := mysql.UpdateDeviceMapOneRecord(ctx, deviceMap)
  463. if err != nil {
  464. c.JSON(consts.StatusOK, entity.Response{Status: false, Code: "", Message: "更新设备地图记录失败"})
  465. return
  466. }
  467. fmt.Println("update", update)
  468. } else { // 地图列表查询到的版本与设备地图表中版本不一致, 则先将之前的记录状态设置为无效, 然后添加记录
  469. // 将对应设备存在的对应map id的记录设置为无效
  470. update, err := mysql.UpdateDeviceMapValidFlagByDevice(ctx, mapId, snCode, config.MAP_NOT_VALID_FLAG)
  471. if err != nil {
  472. c.JSON(consts.StatusOK, entity.Response{Status: false, Code: "", Message: "更新设备地图状态失败"})
  473. return
  474. }
  475. fmt.Println("update", update)
  476. // 添加记录
  477. deviceMap.ID = uuid.NewV1().String()
  478. err = mysql.AddDeviceMapOneRecord(ctx, deviceMap)
  479. if err != nil {
  480. c.JSON(consts.StatusOK, entity.Response{Status: false, Code: "", Message: "添加设备地图记录失败"})
  481. return
  482. }
  483. }
  484. }
  485. //if len(records) > 0 { // 对应设备存在对应map id且有效的记录
  486. // // 设置之前记录地图标志为无效
  487. // fmt.Println("设置无效")
  488. // // 将对应设备存在的对应map id的记录设置为无效
  489. // update, err := mysql.UpdateDeviceMapValidFlagByDevice(ctx, mapId, snCode, config.MAP_NOT_VALID_FLAG)
  490. // if err != nil {
  491. // c.JSON(consts.StatusOK, entity.Response{Status: false, Code: "", Message: "更新设备地图状态失败"})
  492. // return
  493. // }
  494. // fmt.Println("update", update)
  495. // // 更新记录
  496. // mysql.UpdateDeviceMapOneRecord(ctx, deviceMap)
  497. //} else { // 对应设备不存在对应map id且有效的记录
  498. // // 添加记录
  499. // deviceMap.ID = uuid.NewV1().String()
  500. // err = mysql.AddDeviceMapOneRecord(ctx, deviceMap)
  501. // if err != nil {
  502. // c.JSON(consts.StatusOK, entity.Response{Status: false, Code: "", Message: "添加设备地图记录失败"})
  503. // return
  504. // }
  505. //}
  506. }
  507. c.JSON(consts.StatusOK, entity.Response{Status: true, Code: "", Message: "设备地图数据更新成功"})
  508. }
  509. }
  510. // 计算oss中文件列表的总大小
  511. func calculateTotalFileSize(fileList []string) int {
  512. var totalSize int
  513. for _, file := range fileList {
  514. size, err := util.GetOSSFileSize(config.OssBucket, file) // 获取oss中单个文件的大小
  515. if err != nil {
  516. return 0
  517. }
  518. totalSize += size
  519. }
  520. return totalSize
  521. }
  522. // 调用 朴津地图列表查询 接口
  523. func getMapInfoList() ([]model.MapInfo, error) {
  524. paramMap := make(map[string]interface{})
  525. paramMap["mapType"] = "0"
  526. resp, err := pji_client.ApiClient.GetRequest(c_pji.PjiApiSitBaseUrl+"mapList?mapType=0", paramMap, pji_client.MapSecretId)
  527. if err != nil {
  528. return nil, err
  529. }
  530. //fmt.Println(string(resp.Body()))
  531. // 解析json响应
  532. body := resp.Body()
  533. var mapRes model.MapInfoRes
  534. err = json.Unmarshal(body, &mapRes)
  535. if err != nil || mapRes.Code != 200 {
  536. return nil, err
  537. }
  538. //fmt.Println("mapRes", mapRes)
  539. return mapRes.Data, nil
  540. }
  541. // 查询地图id是否存在于地图列表中
  542. func checkMapIdExist(mapId string, mapInfoList []model.MapInfo) (bool, model.MapInfo) {
  543. // 转为map
  544. IdMap := make(map[string]model.MapInfo)
  545. for _, info := range mapInfoList {
  546. IdMap[info.MapId] = info
  547. }
  548. record, exist := IdMap[mapId]
  549. return exist, record
  550. }
  551. // 根据场景id获取数据采集时的地图id
  552. func getMapIdById(id string) (string, error) {
  553. var mapId string
  554. // 下载map.json
  555. // 根据id获取对应的oss文件列表
  556. allFileList, err := util.GetExactedMapFileById(id)
  557. fmt.Println("allFileList", allFileList)
  558. // 过滤特定后缀的文件列表
  559. fileList := util.FilterBySuffixes(allFileList, config.MapJsonFiltersuffixes...)
  560. fmt.Println("fileList", fileList)
  561. // 创建临时文件夹
  562. tmpDir, err := os.MkdirTemp("", "temp-download-*")
  563. fmt.Println("tmpDir:", tmpDir)
  564. if err != nil {
  565. fmt.Println("Error creating temporary directory:", err)
  566. return "", err
  567. }
  568. c_log.GlobalLogger.Info("创建下载-临时文件夹:", tmpDir)
  569. for _, file := range fileList {
  570. path := filepath.Join(tmpDir, filepath.Base(file))
  571. err = config.OssBucket.GetObjectToFile(file, path)
  572. if err != nil {
  573. fmt.Println("Error downloading file:", err)
  574. return "", err
  575. }
  576. c_log.GlobalLogger.Info("下载map.json文件 - 成功")
  577. // 读取json文件 - mapId
  578. // 打开文件
  579. file, err := os.Open(path)
  580. if err != nil {
  581. fmt.Println("Error opening file:", err)
  582. return "", err
  583. }
  584. defer file.Close()
  585. // 读取文件内容
  586. fileData, err := ioutil.ReadAll(file)
  587. if err != nil {
  588. fmt.Println("Error reading file:", err)
  589. return "", err
  590. }
  591. // Json转换为map
  592. var mapData map[string]interface{}
  593. err = json.Unmarshal(fileData, &mapData)
  594. data := mapData["map"].(map[string]interface{})
  595. // 读取mapId
  596. mapId = data["mapId"].(string)
  597. fmt.Println("mapId:", mapId)
  598. }
  599. return mapId, err
  600. }