From 11e44b3012e829ff7c85363ce1a7c2c0457c72f0 Mon Sep 17 00:00:00 2001
From: vincentlu <t1341870251@gmail.com>
Date: 星期二, 17 三月 2026 13:59:27 +0800
Subject: [PATCH] #

---
 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/LocController.java |  210 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 205 insertions(+), 5 deletions(-)

diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/LocController.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/LocController.java
index 4c307dc..01e3979 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/LocController.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/LocController.java
@@ -2,20 +2,26 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zy.acs.common.constant.CommonConstant;
 import com.zy.acs.common.utils.Utils;
 import com.zy.acs.framework.common.Cools;
 import com.zy.acs.framework.common.R;
 import com.zy.acs.framework.exception.CoolException;
-import com.zy.acs.manager.common.utils.ExcelUtil;
 import com.zy.acs.manager.common.annotation.OperationLog;
 import com.zy.acs.manager.common.domain.BaseParam;
 import com.zy.acs.manager.common.domain.KeyValVo;
 import com.zy.acs.manager.common.domain.PageParam;
+import com.zy.acs.manager.common.utils.ExcelUtil;
 import com.zy.acs.manager.manager.controller.param.LocInitParam;
+import com.zy.acs.manager.manager.entity.Code;
 import com.zy.acs.manager.manager.entity.Loc;
+import com.zy.acs.manager.manager.entity.LocSts;
+import com.zy.acs.manager.manager.entity.LocType;
 import com.zy.acs.manager.manager.entity.Zone;
-import com.zy.acs.manager.manager.enums.LocStsType;
+import com.zy.acs.manager.manager.service.CodeService;
 import com.zy.acs.manager.manager.service.LocService;
+import com.zy.acs.manager.manager.service.LocStsService;
+import com.zy.acs.manager.manager.service.LocTypeService;
 import com.zy.acs.manager.manager.service.ZoneService;
 import com.zy.acs.manager.system.controller.BaseController;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -24,6 +30,7 @@
 
 import javax.servlet.http.HttpServletResponse;
 import java.util.*;
+import java.util.stream.Collectors;
 
 @RestController
 @RequestMapping("/api")
@@ -33,13 +40,19 @@
     private LocService locService;
     @Autowired
     private ZoneService zoneService;
+    @Autowired
+    private CodeService codeService;
+    @Autowired
+    private LocStsService locStsService;
+    @Autowired
+    private LocTypeService locTypeService;
 
     @PreAuthorize("hasAuthority('manager:loc:list')")
     @PostMapping("/loc/page")
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<Loc, BaseParam> pageParam = new PageParam<>(baseParam, Loc.class);
-        return R.ok().add(locService.page(pageParam, pageParam.buildWrapper(true)));
+        return R.ok().add(locService.page(pageParam, pageParam.buildWrapper(false)));
     }
 
     @PreAuthorize("hasAuthority('manager:loc:list')")
@@ -86,6 +99,22 @@
         return R.ok("Update Success").add(loc);
     }
 
+    @PreAuthorize("hasAuthority('manager:loc:update')")
+    @OperationLog("Update Loc")
+    @PostMapping("/loc/update/many")
+    public R updateMany(@RequestBody List<Loc> locList) {
+        if (!Cools.isEmpty(locList)) {
+            for (Loc loc : locList) {
+                loc.setUpdateBy(getLoginUserId());
+                loc.setUpdateTime(new Date());
+                if (!locService.updateById(loc)) {
+                    return R.error("Update Fail");
+                }
+            }
+        }
+        return R.ok("Update Success").add(locList.stream().map(Loc::getId).collect(Collectors.toList()));
+    }
+
     @PreAuthorize("hasAuthority('manager:loc:remove')")
     @OperationLog("Delete Loc")
     @PostMapping("/loc/remove/{ids}")
@@ -117,6 +146,64 @@
     }
 
     @PreAuthorize("hasAuthority('manager:loc:save')")
+    @PostMapping("/loc/import")
+    public R importBatch(@RequestBody List<Map<String, Object>> rows) {
+        if (Cools.isEmpty(rows)) {
+            return R.ok();
+        }
+        Date now = new Date();
+        Long userId = getLoginUserId();
+        for (Map<String, Object> row : rows) {
+            Zone zone = resolveZone(readCell(row, "zone"));
+            Integer rowNo = parseInteger(row.get("row"), "row", true);
+            Integer bayNo = parseInteger(row.get("bay"), "bay", true);
+            Integer levNo = parseInteger(row.get("lev"), "lev", true);
+            String locNo = buildLocNo(zone, rowNo, bayNo, levNo);
+
+            Long locStsId = resolveLocStsId(readCell(row, "loc_sts"));
+            Long locTypeId = resolveLocTypeId(readCell(row, "loc_type"));
+            Long codeId = resolveCodeId(readCell(row, "code"));
+            Integer compDirect = parseInteger(row.get("comp_direct"), "comp_direct", false);
+            Double offset = parseDouble(row.get("offset"), "offset");
+
+            Loc loc = locService.selectByLocNo(locNo);
+            boolean exists = loc != null;
+            if (!exists) {
+                loc = new Loc();
+                loc.setUuid(locNo);
+                loc.setLocNo(locNo);
+                loc.setName(locNo);
+                loc.setStatus(1);
+                loc.setDeleted(0);
+                loc.setCreateBy(userId);
+                loc.setCreateTime(now);
+            }
+            loc.setZoneId(zone.getId());
+            loc.setRow(rowNo);
+            loc.setBay(bayNo);
+            loc.setLev(levNo);
+            loc.setLocSts(locStsId);
+            loc.setLocType(locTypeId);
+            loc.setCode(codeId);
+            loc.setCompDirect(compDirect);
+            loc.setOffset(offset);
+            loc.setUpdateBy(userId);
+            loc.setUpdateTime(now);
+
+            if (!exists) {
+                if (!locService.save(loc)) {
+                    throw new CoolException(locNo + " save fail !");
+                }
+            } else {
+                if (!locService.updateById(loc)) {
+                    throw new CoolException(locNo + " update fail !");
+                }
+            }
+        }
+        return R.ok();
+    }
+
+    @PreAuthorize("hasAuthority('manager:loc:save')")
     @OperationLog
     @PostMapping("/loc/init")
     public R init(@RequestBody LocInitParam param) {
@@ -141,13 +228,13 @@
                             locNo,    // 搴撲綅缂栧彿
                             null,    // 鍚嶇О
                             null,    // 鏉$爜
-                            LocStsType.IDLE.val(),    // 搴撲綅鐘舵��
+                            param.getLocSts(),    // 搴撲綅鐘舵��
                             offset,    // 鍋忕Щ閲�
                             r,    // 鎺�
                             b,    // 鍒�
                             l,    // 灞�
                             null,    // 鎵樼洏鐮�
-                            null,    // 搴撲綅绫诲瀷
+                            param.getLocType(),    // 搴撲綅绫诲瀷
                             null,    // 鐘舵�乕闈炵┖]
                             null,    // 鏄惁鍒犻櫎[闈炵┖]
                             null,    // 绉熸埛
@@ -157,6 +244,7 @@
                             null,    // 淇敼鏃堕棿
                             null    // 澶囨敞
                     );
+                    loc.setCompDirect(param.getCompDirect());
                     if (locService.count(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, locNo)) > 0) {
                         throw new CoolException(locNo + " location has exist !");
                     }
@@ -169,4 +257,116 @@
         return R.ok("initialize success");
     }
 
+    private Zone resolveZone(String identifier) {
+        if (Cools.isEmpty(identifier)) {
+            throw new CoolException("zone is required");
+        }
+        Zone zone = zoneService.getOne(new LambdaQueryWrapper<Zone>().eq(Zone::getUuid, identifier), false);
+        if (zone == null) {
+            zone = zoneService.getOne(new LambdaQueryWrapper<Zone>().eq(Zone::getName, identifier), false);
+        }
+        if (zone == null) {
+            throw new CoolException("zone " + identifier + " not found");
+        }
+        return zone;
+    }
+
+    private Long resolveLocStsId(String identifier) {
+        if (Cools.isEmpty(identifier)) {
+            throw new CoolException("loc_sts is required");
+        }
+        LocSts locSts = locStsService.getOne(new LambdaQueryWrapper<LocSts>().eq(LocSts::getUuid, identifier), false);
+        if (locSts == null) {
+            locSts = locStsService.getOne(new LambdaQueryWrapper<LocSts>().eq(LocSts::getName, identifier), false);
+        }
+        if (locSts == null) {
+            throw new CoolException("loc_sts " + identifier + " not found");
+        }
+        return locSts.getId();
+    }
+
+    private Long resolveLocTypeId(String identifier) {
+        if (Cools.isEmpty(identifier)) {
+            return null;
+        }
+        LocType locType = locTypeService.getOne(new LambdaQueryWrapper<LocType>().eq(LocType::getUuid, identifier), false);
+        if (locType == null) {
+            locType = locTypeService.getOne(new LambdaQueryWrapper<LocType>().eq(LocType::getName, identifier), false);
+        }
+        if (locType == null) {
+            throw new CoolException("loc_type " + identifier + " not found");
+        }
+        return locType.getId();
+    }
+
+    private Long resolveCodeId(String data) {
+        if (Cools.isEmpty(data)) {
+            return null;
+        }
+        String codeData = Utils.zeroFill(data, CommonConstant.QR_CODE_LEN);
+        Code code = codeService.getCacheByData(codeData);
+        if (code == null) {
+            throw new CoolException("code " + data + " not exist");
+        }
+        return code.getId();
+    }
+
+    private Integer parseInteger(Object value, String field, boolean required) {
+        if (value instanceof Number) {
+            return ((Number) value).intValue();
+        }
+        String text = value == null ? null : String.valueOf(value).trim();
+        if (Cools.isEmpty(text)) {
+            if (required) {
+                throw new CoolException(field + " is required");
+            }
+            return null;
+        }
+        try {
+            return Double.valueOf(text).intValue();
+        } catch (NumberFormatException ex) {
+            throw new CoolException(field + " format error: " + text);
+        }
+    }
+
+    private Double parseDouble(Object value, String field) {
+        if (value instanceof Number) {
+            return ((Number) value).doubleValue();
+        }
+        String text = value == null ? null : String.valueOf(value).trim();
+        if (Cools.isEmpty(text)) {
+            return null;
+        }
+        try {
+            return Double.valueOf(text);
+        } catch (NumberFormatException ex) {
+            throw new CoolException(field + " format error: " + text);
+        }
+    }
+
+    private String readCell(Map<String, Object> row, String key) {
+        if (row == null) {
+            return null;
+        }
+        Object value = row.get(key);
+        if (value == null) {
+            return null;
+        }
+        String text = String.valueOf(value).trim();
+        return Cools.isEmpty(text) ? null : text;
+    }
+
+    private String buildLocNo(Zone zone, Integer row, Integer bay, Integer lev) {
+        if (zone == null || row == null || bay == null || lev == null) {
+            throw new CoolException("zone/row/bay/lev cannot be null");
+        }
+        if (Cools.isEmpty(zone.getUuid())) {
+            throw new CoolException("zone uuid is empty");
+        }
+        return Utils.zeroFill(zone.getUuid(), 2)
+                + String.format("%03d", row)
+                + String.format("%03d", bay)
+                + String.format("%02d", lev);
+    }
+
 }

--
Gitblit v1.9.1