From 77580a84dc16fd19cd7afa4f61c59689de820065 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期五, 03 四月 2026 10:13:58 +0800
Subject: [PATCH] #增加同步地图坐标与库位绑定关系

---
 src/main/webapp/views/basMap/basMap.html                      |    8 +
 src/main/java/com/zy/asrs/service/impl/BasMapServiceImpl.java |  185 +++++++++++++++++++++++++++++++++++-
 src/main/java/com/zy/asrs/controller/BasMapController.java    |    7 +
 src/main/webapp/static/js/basMap/basMap.js                    |   44 ++++++++
 src/main/java/com/zy/asrs/service/BasMapService.java          |    2 
 5 files changed, 239 insertions(+), 7 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/BasMapController.java b/src/main/java/com/zy/asrs/controller/BasMapController.java
index a3ed90e..66318de 100644
--- a/src/main/java/com/zy/asrs/controller/BasMapController.java
+++ b/src/main/java/com/zy/asrs/controller/BasMapController.java
@@ -165,6 +165,13 @@
         return R.ok().add(levList);
     }
 
+    @PostMapping("/basMap/syncLocMast/auth")
+    @ManagerAuth(memo = "鍚屾搴撲綅鍙峰拰瀹為檯鍧愭爣")
+    public R syncLocMast(@RequestParam Integer lev) {
+        int updatedCount = basMapService.syncLocMastByMap(lev);
+        return R.ok("绗�" + lev + "灞俵ocType鍚屾瀹屾垚锛屾洿鏂�" + updatedCount + "鏉″簱浣嶆暟鎹�");
+    }
+
     @PostMapping("/basMap/crn/upload")
     public R uploadExcel(@RequestParam("file") MultipartFile file) {
         File tempFile = null;
diff --git a/src/main/java/com/zy/asrs/service/BasMapService.java b/src/main/java/com/zy/asrs/service/BasMapService.java
index f05d78e..0abd219 100644
--- a/src/main/java/com/zy/asrs/service/BasMapService.java
+++ b/src/main/java/com/zy/asrs/service/BasMapService.java
@@ -14,4 +14,6 @@
 
     List<Integer> getLevList();//鑾峰彇鎵�鏈夋ゼ灞傚湴鍥�
 
+    int syncLocMastByMap(Integer lev);//鎸夊湴鍥惧悓姝ユ寚瀹氭ゼ灞俵ocType
+
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/BasMapServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/BasMapServiceImpl.java
index b325718..8e15ed0 100644
--- a/src/main/java/com/zy/asrs/service/impl/BasMapServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/BasMapServiceImpl.java
@@ -1,18 +1,38 @@
 package com.zy.asrs.service.impl;
 
-import com.zy.asrs.mapper.BasMapMapper;
-import com.zy.asrs.entity.BasMap;
-import com.zy.asrs.service.BasMapService;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
+import com.core.common.Cools;
+import com.core.exception.CoolException;
+import com.zy.asrs.entity.BasMap;
+import com.zy.asrs.entity.LocMast;
+import com.zy.asrs.mapper.BasMapMapper;
+import com.zy.asrs.service.BasMapService;
+import com.zy.asrs.service.LocMastService;
+import com.zy.asrs.utils.Utils;
+import com.zy.common.utils.RedisUtil;
+import com.zy.core.enums.RedisKeyType;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 @Service("basMapService")
 public class BasMapServiceImpl extends ServiceImpl<BasMapMapper, BasMap> implements BasMapService {
+
+    @Autowired
+    private LocMastService locMastService;
+    @Autowired
+    private RedisUtil redisUtil;
 
     @Override
     public BasMap selectLatestMap(Integer lev) {
@@ -29,4 +49,155 @@
         return this.baseMapper.selectList(new QueryWrapper<>()).stream().map(BasMap::getLev).collect(Collectors.toList());
     }
 
+    @Override
+    @Transactional
+    public int syncLocMastByMap(Integer lev) {
+        if (lev == null || lev <= 0) {
+            throw new CoolException("璇疯緭鍏ユ湁鏁堟ゼ灞�");
+        }
+
+        List<Integer> locLevList = new ArrayList<>(locMastService.getLevList());
+        if (Cools.isEmpty(locLevList) || !locLevList.contains(lev)) {
+            throw new CoolException("绗�" + lev + "灞傛殏鏃犲簱浣嶆暟鎹紝璇峰厛鍒濆鍖栧簱浣�");
+        }
+
+        List<BasMap> basMapList = this.list(new QueryWrapper<BasMap>().orderByAsc("lev"));
+        if (Cools.isEmpty(basMapList)) {
+            throw new CoolException("璇峰厛鍒濆鍖栧湴鍥�");
+        }
+
+        Map<Integer, BasMap> basMapByLev = new LinkedHashMap<>();
+        for (BasMap basMap : basMapList) {
+            if (basMap != null && basMap.getLev() != null) {
+                basMapByLev.put(basMap.getLev(), basMap);
+            }
+        }
+        BasMap fallbackMap = basMapByLev.size() == 1 ? basMapList.get(0) : null;
+
+        BasMap basMap = basMapByLev.get(lev);
+        if (basMap == null) {
+            basMap = fallbackMap;
+        }
+        if (basMap == null) {
+            throw new CoolException("绗�" + lev + "灞傜己灏戝湴鍥撅紝鏃犳硶鍚屾locType");
+        }
+
+        List<TargetLocMeta> targetList = buildTargetLocMeta(basMap, lev);
+        List<LocMast> currentList = new ArrayList<>(locMastService.selectLocByLev(lev));
+        if (targetList.size() != currentList.size()) {
+            throw new CoolException("绗�" + lev + "灞傚湴鍥捐揣鏋舵暟(" + targetList.size() + ")涓庣幇鏈夊簱浣嶆暟(" + currentList.size() + ")涓嶄竴鑷达紝鏃犳硶鍚屾locType");
+        }
+
+        int updatedCount = syncLevelLocType(lev, currentList, targetList);
+        refreshLocMastMapListCache();
+        redisUtil.del(RedisKeyType.LOC_MAP_BASE.key);
+        return updatedCount;
+    }
+
+    private int syncLevelLocType(Integer lev, List<LocMast> currentList, List<TargetLocMeta> targetList) {
+        Map<String, TargetLocMeta> targetByLocNo = new LinkedHashMap<>();
+        for (TargetLocMeta target : targetList) {
+            if (targetByLocNo.put(target.locNo, target) != null) {
+                throw new CoolException("绗�" + lev + "灞傚瓨鍦ㄩ噸澶嶅簱浣嶅彿锛�" + target.locNo);
+            }
+        }
+
+        Date now = new Date();
+        int updatedCount = 0;
+        for (LocMast current : currentList) {
+            TargetLocMeta target = targetByLocNo.get(current.getLocNo());
+            if (target == null) {
+                throw new CoolException("绗�" + lev + "灞傚湴鍥句腑鏈壘鍒板簱浣嶅彿锛�" + current.getLocNo());
+            }
+            if (java.util.Objects.equals(current.getLocType(), target.locType)) {
+                continue;
+            }
+
+            UpdateWrapper<LocMast> updateWrapper = new UpdateWrapper<>();
+            updateWrapper.eq("loc_no", current.getLocNo())
+                    .set("loc_type", target.locType)
+                    .set("modi_time", now);
+            if (!locMastService.update(null, updateWrapper)) {
+                throw new CoolException("绗�" + lev + "灞傚簱浣峫ocType鍚屾澶辫触锛�" + current.getLocNo());
+            }
+            updatedCount++;
+        }
+        return updatedCount;
+    }
+
+    private void refreshLocMastMapListCache() {
+        List<LocMast> locMastList = locMastService.list(new QueryWrapper<LocMast>().eq("lev1", 1));
+        redisUtil.set(RedisKeyType.LOC_MAST_MAP_LIST.key, JSON.toJSONString(locMastList), 60 * 60 * 24);
+    }
+
+    private List<TargetLocMeta> buildTargetLocMeta(BasMap basMap, Integer targetLev) {
+        if (basMap == null || Cools.isEmpty(basMap.getData())) {
+            throw new CoolException("绗�" + targetLev + "灞傚湴鍥炬暟鎹负绌猴紝鏃犳硶鍚屾locType");
+        }
+
+        List<List<JSONObject>> dataList;
+        try {
+            dataList = JSON.parseObject(basMap.getData(), List.class);
+        } catch (Exception e) {
+            throw new CoolException("绗�" + targetLev + "灞傚湴鍥炬暟鎹牸寮忛敊璇紝鏃犳硶鍚屾locType");
+        }
+        if (Cools.isEmpty(dataList)) {
+            throw new CoolException("绗�" + targetLev + "灞傚湴鍥炬暟鎹负绌猴紝鏃犳硶鍚屾locType");
+        }
+
+        List<TargetLocMeta> targetList = new ArrayList<>();
+        int initRow = 1;
+        for (int mapX = 0; mapX < dataList.size(); mapX++) {
+            List<JSONObject> row = dataList.get(mapX);
+            if (row == null) {
+                continue;
+            }
+
+            int initBay = -1;
+            for (int mapY = 0; mapY < row.size(); mapY++) {
+                JSONObject cell = row.get(mapY);
+                if (cell == null || !"shelf".equals(cell.getString("type"))) {
+                    continue;
+                }
+
+                if (initBay == -1) {
+                    initBay = 2;
+                }
+
+                String value = cell.getString("value");
+                int userConfigRow = -1;
+                int userConfigBay = -1;
+                try {
+                    String[] split = value.split("-");
+                    userConfigRow = Integer.parseInt(split[0]);
+                    userConfigBay = Integer.parseInt(split[1]);
+                } catch (Exception ignored) {
+                }
+                if (userConfigBay != -1) {
+                    initRow = userConfigRow;
+                    initBay = userConfigBay;
+                }
+
+                targetList.add(new TargetLocMeta(
+                        Utils.getLocNo(initRow, initBay, targetLev),
+                        Utils.getLocNo(mapX, mapY, targetLev)
+                ));
+                initBay++;
+            }
+            if (initBay != -1) {
+                initRow++;
+            }
+        }
+        return targetList;
+    }
+
+    private static final class TargetLocMeta {
+        private final String locNo;
+        private final String locType;
+
+        private TargetLocMeta(String locNo, String locType) {
+            this.locNo = locNo;
+            this.locType = locType;
+        }
+    }
 }
diff --git a/src/main/webapp/static/js/basMap/basMap.js b/src/main/webapp/static/js/basMap/basMap.js
index 6cada5b..105fe22 100644
--- a/src/main/webapp/static/js/basMap/basMap.js
+++ b/src/main/webapp/static/js/basMap/basMap.js
@@ -819,6 +819,7 @@
                     loading: false,
                     exporting: false,
                     importingMap: false,
+                    syncingLocMast: false,
                     initializingLocMast: false,
                     tableData: [],
                     selection: [],
@@ -1230,6 +1231,49 @@
                         });
                     }).catch(function () {});
                 },
+                promptSyncLocMast: function () {
+                    var self = this;
+                    self.$prompt('璇疯緭鍏ラ渶瑕佸悓姝ョ殑妤煎眰', '鍚屾鍦板浘鍧愭爣', {
+                        confirmButtonText: '涓嬩竴姝�',
+                        cancelButtonText: '鍙栨秷',
+                        inputPattern: /^\d+$/,
+                        inputErrorMessage: '璇疯緭鍏ユ暟瀛楀眰鏁�'
+                    }).then(function (payload) {
+                        var lev = $.trim(payload && payload.value ? payload.value : '');
+                        self.$confirm('灏嗘寜褰撳墠鍦板浘閲嶆柊鍚屾绗�' + lev + '灞傚湴鍥惧潗鏍囦笌搴撲綅缁戝畾鍏崇郴銆傛槸鍚︾户缁紵', '鍚屾鍦板浘鍧愭爣', {
+                            confirmButtonText: '缁х画鍚屾',
+                            cancelButtonText: '鍙栨秷',
+                            type: 'warning'
+                        }).then(function () {
+                            self.syncingLocMast = true;
+                            $.ajax({
+                                url: baseUrl + '/basMap/syncLocMast/auth',
+                                method: 'POST',
+                                headers: self.authHeaders(),
+                                data: {
+                                    lev: lev
+                                },
+                                success: function (res) {
+                                    if (self.handleForbidden(res)) {
+                                        return;
+                                    }
+                                    if (!res || res.code !== 200) {
+                                        self.$message.error((res && res.msg) ? res.msg : '鍚屾澶辫触');
+                                        return;
+                                    }
+                                    self.$message.success(res.msg || '鍚屾鎴愬姛');
+                                    self.loadTable();
+                                },
+                                error: function () {
+                                    self.$message.error('鍚屾澶辫触');
+                                },
+                                complete: function () {
+                                    self.syncingLocMast = false;
+                                }
+                            });
+                        }).catch(function () {});
+                    }).catch(function () {});
+                },
                 submitDialog: function () {
                     var self = this;
                     if (!self.$refs.dialogForm) {
diff --git a/src/main/webapp/views/basMap/basMap.html b/src/main/webapp/views/basMap/basMap.html
index f152002..c6774fa 100644
--- a/src/main/webapp/views/basMap/basMap.html
+++ b/src/main/webapp/views/basMap/basMap.html
@@ -431,6 +431,14 @@
                             size="small"
                             plain
                             icon="el-icon-refresh"
+                            :loading="syncingLocMast"
+                            @click="promptSyncLocMast">
+                            鍚屾鍦板浘鍧愭爣
+                        </el-button>
+                        <el-button
+                            size="small"
+                            plain
+                            icon="el-icon-refresh"
                             :loading="initializingLocMast"
                             @click="promptInitLocMast">
                             鍒濆鍖栧簱浣�

--
Gitblit v1.9.1