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