From de8e16542594e01210aba8a72d18f2d2874681c2 Mon Sep 17 00:00:00 2001
From: pang.jiabao <pang_jiabao@163.com>
Date: 星期一, 12 八月 2024 13:39:33 +0800
Subject: [PATCH] #

---
 src/main/webapp/views/locDetl/locDetl.html                     |   27 ++
 src/main/java/com/zy/asrs/mapper/LocDetlMapper.java            |    4 
 src/main/java/com/zy/asrs/controller/LocDetlController.java    |   28 ++
 src/main/java/com/zy/asrs/importexcle/LocMatListener.java      |  140 +++++++++++
 src/main/java/com/zy/asrs/service/impl/BasCrnpServiceImpl.java |    5 
 src/main/java/com/zy/asrs/controller/OpenController.java       |  124 +++++-----
 src/main/resources/mapper/LocDetlMapper.xml                    |   27 ++
 src/main/java/com/zy/asrs/service/OpenService.java             |   70 +++--
 src/main/webapp/static/js/locDetl/locDetl.js                   |   14 
 src/main/java/com/zy/asrs/importexcle/LocMat.java              |   28 ++
 src/main/webapp/views/index.html                               |    4 
 src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java    |   18 
 src/main/java/com/zy/common/service/CommonService.java         |  177 +++-----------
 src/main/webapp/views/login.html                               |    6 
 14 files changed, 415 insertions(+), 257 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/LocDetlController.java b/src/main/java/com/zy/asrs/controller/LocDetlController.java
index 6eba1f6..8b23556 100644
--- a/src/main/java/com/zy/asrs/controller/LocDetlController.java
+++ b/src/main/java/com/zy/asrs/controller/LocDetlController.java
@@ -13,16 +13,20 @@
 import com.core.common.DateUtils;
 import com.core.common.R;
 import com.zy.asrs.entity.LocDetl;
-import com.zy.asrs.entity.ManLocDetl;
 import com.zy.asrs.entity.Mat;
+import com.zy.asrs.importexcle.LocMat;
+import com.zy.asrs.importexcle.LocMatListener;
 import com.zy.asrs.mapper.LocDetlMapper;
 import com.zy.asrs.service.LocDetlService;
-import com.zy.asrs.service.ManLocDetlService;
+import com.zy.asrs.service.LocMastService;
 import com.zy.asrs.service.MatService;
 import com.zy.common.web.BaseController;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.net.URLEncoder;
@@ -39,6 +43,26 @@
     @Autowired
     private MatService matService;
 
+    @Resource
+    private LocMastService locMastService;
+
+    @PostMapping("/importLocData")
+    @ManagerAuth(memo = "瀵煎叆绔嬪簱宸叉湁搴撳瓨")
+    public R importLocData(@RequestParam("file") MultipartFile multipartFile) {
+        try {
+            importLocData1(multipartFile);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.error(e.getMessage());
+        }
+        return R.ok("瀵煎叆鎴愬姛");
+    }
+    @Transactional(rollbackFor = Exception.class)
+    public void importLocData1(MultipartFile multipartFile) throws IOException {
+        EasyExcel.read(multipartFile.getInputStream(), LocMat.class,
+                new LocMatListener(locMastService,locDetlMapper,getUserId())).sheet().doReadSync();
+    }
+
     @RequestMapping(value = "/locDetl/update")
     public R update1() {
         if (!locDetlService.updateLocNo("0402805", "0402804")) {
diff --git a/src/main/java/com/zy/asrs/controller/OpenController.java b/src/main/java/com/zy/asrs/controller/OpenController.java
index 15a7c44..72275cb 100644
--- a/src/main/java/com/zy/asrs/controller/OpenController.java
+++ b/src/main/java/com/zy/asrs/controller/OpenController.java
@@ -31,6 +31,69 @@
     @Autowired
     private OpenService openService;
 
+    @PostMapping("/scrk")
+    @AppAuth(memo = "GWMS璋冪敤鐢熸垚鍏ュ簱宸ヤ綔妗�")
+    public synchronized R gwmsGenerateInventory(@RequestHeader(required = false) String appkey,
+                                                @RequestBody GwmsGenerateInventoryDto param,
+                                                HttpServletRequest request) {
+        auth(appkey, param, request);
+        return R.ok(openService.gwmsGenerateInventory(param));
+    }
+
+    @PostMapping("/zxrk")
+    @AppAuth(memo = "GWCS鍒拌揪鍫嗗灈鏈哄叆搴撶珯鐐硅姹俍WCS鎵ц")
+    public synchronized R crnExecute(@RequestHeader(required = false) String appkey,
+                                     @RequestBody CrnExecuteParam param,
+                                     HttpServletRequest request) {
+        auth(appkey, param, request);
+        return R.ok(openService.crnExecute(param));
+    }
+
+    @PostMapping("/ckrw")
+    @AppAuth(memo = "ZWMS鎺ユ敹MES涓嬪彂鍑哄簱浠诲姟")
+    public synchronized R zwmsOutLocWork(@RequestHeader(required = false) String appkey,
+                                         @RequestBody ZwmsOutLocWorkDto param,
+                                         HttpServletRequest request) {
+        auth(appkey, param, request);
+        return R.ok(openService.zwmsOutLocWork(param));
+    }
+
+    @PostMapping("/ckjgsb")
+    @AppAuth(memo = "璐х墿鍒拌揪鍑哄簱鍙d互鍚庯紝涓婃姤鍑哄簱缁撴灉")
+    public synchronized R outLocResultReport(@RequestHeader(required = false) String appkey,
+                                             @RequestBody GhjtApiParam param,
+                                             HttpServletRequest request) {
+        auth(appkey, param, request);
+        return R.ok(openService.outLocResultReport(param));
+    }
+
+    @PostMapping("/cpjck")
+    @AppAuth(memo = "鎷嗙洏鏈哄嚭搴撴帴鍙�")
+    public synchronized R emptyOutLoc(@RequestHeader(required = false) String appkey,
+                                      @RequestBody GhjtApiParam param,
+                                      HttpServletRequest request) {
+        auth(appkey, param, request);
+        return R.ok(openService.emptyOutLoc(param));
+    }
+
+    @PostMapping("/zpckdw")
+    @AppAuth(memo = "缁勭洏妗佹灦gwcs鍛婅瘔zwms璐х墿鍒颁綅锛寊mws鍛婅瘔gwcs鎬庝箞鎷�")
+    public synchronized R zphjDw(@RequestHeader(required = false) String appkey,
+                                 @RequestBody ZphjckdwParam param,
+                                 HttpServletRequest request) {
+        auth(appkey, param, request);
+        return openService.zphjDw(param);
+    }
+
+    @PostMapping("/cdwc")
+    @AppAuth(memo = "缁勭洏妗佹灦鎷嗗灈瀹屾垚gwcs璇锋眰zwms")
+    public synchronized R zphjCdwc(@RequestHeader(required = false) String appkey,
+                                   @RequestBody ZphjcdwcParam param,
+                                   HttpServletRequest request) {
+        auth(appkey, param, request);
+        return openService.zphjCdwc(param);
+    }
+
     /*@PostMapping("/order/matSync/default/v1")
     @AppAuth(memo = "鍟嗗搧淇℃伅鍚屾鎺ュ彛")
     public synchronized R syncMatInfo(@RequestHeader(required = false) String appkey,
@@ -147,68 +210,7 @@
         }
     }
 
-    @PostMapping("/scrk")
-    @AppAuth(memo = "GWMS璋冪敤鐢熸垚鍏ュ簱宸ヤ綔妗�")
-    public synchronized R gwmsGenerateInventory(@RequestHeader(required = false) String appkey,
-                                      @RequestBody GwmsGenerateInventoryDto param,
-                                      HttpServletRequest request) {
-        auth(appkey, param, request);
-        return R.ok(openService.gwmsGenerateInventory(param));
-    }
 
-    @PostMapping("/zxrk")
-    @AppAuth(memo = "GWCS鍒拌揪鍫嗗灈鏈哄叆搴撶珯鐐硅姹俍WCS鎵ц")
-    public synchronized R crnExecute(@RequestHeader(required = false) String appkey,
-                                                @RequestBody CrnExecuteParam param,
-                                                HttpServletRequest request) {
-        auth(appkey, param, request);
-        return R.ok(openService.crnExecute(param));
-    }
-
-    @PostMapping("/ckrw")
-    @AppAuth(memo = "ZWMS鎺ユ敹MES涓嬪彂鍑哄簱浠诲姟")
-    public synchronized R zwmsOutLocWork(@RequestHeader(required = false) String appkey,
-                                     @RequestBody ZwmsOutLocWorkDto param,
-                                     HttpServletRequest request) {
-        auth(appkey, param, request);
-        return R.ok(openService.zwmsOutLocWork(param));
-    }
-
-    @PostMapping("/ckjgsb")
-    @AppAuth(memo = "璐х墿鍒拌揪鍑哄簱鍙d互鍚庯紝涓婃姤鍑哄簱缁撴灉")
-    public synchronized R outLocResultReport(@RequestHeader(required = false) String appkey,
-                                         @RequestBody GhjtApiParam param,
-                                         HttpServletRequest request) {
-        auth(appkey, param, request);
-        return R.ok(openService.outLocResultReport(param));
-    }
-
-    @PostMapping("/cpjck")
-    @AppAuth(memo = "鎷嗙洏鏈哄嚭搴撴帴鍙�")
-    public synchronized R emptyOutLoc(@RequestHeader(required = false) String appkey,
-                                             @RequestBody GhjtApiParam param,
-                                             HttpServletRequest request) {
-        auth(appkey, param, request);
-        return R.ok(openService.emptyOutLoc(param));
-    }
-
-    @PostMapping("/zpckdw")
-    @AppAuth(memo = "缁勭洏妗佹灦gwcs鍛婅瘔zwms璐х墿鍒颁綅锛寊mws鍛婅瘔gwcs鎬庝箞鎷�")
-    public synchronized R zphjDw(@RequestHeader(required = false) String appkey,
-                                      @RequestBody ZphjckdwParam param,
-                                      HttpServletRequest request) {
-        auth(appkey, param, request);
-        return openService.zphjDw(param);
-    }
-
-    @PostMapping("/cdwc")
-    @AppAuth(memo = "缁勭洏妗佹灦鎷嗗灈瀹屾垚gwcs璇锋眰zwms")
-    public synchronized R zphjCdwc(@RequestHeader(required = false) String appkey,
-                                      @RequestBody ZphjcdwcParam param,
-                                      HttpServletRequest request) {
-        auth(appkey, param, request);
-        return openService.zphjCdwc(param);
-    }
 //    @PostMapping("/cpjck")
 //    @AppAuth(memo = "鐗╂枡淇℃伅鑾峰彇")
 //    public synchronized R emptyOutLoc(@RequestHeader(required = false) String appkey,
diff --git a/src/main/java/com/zy/asrs/importexcle/LocMat.java b/src/main/java/com/zy/asrs/importexcle/LocMat.java
new file mode 100644
index 0000000..0dd9717
--- /dev/null
+++ b/src/main/java/com/zy/asrs/importexcle/LocMat.java
@@ -0,0 +1,28 @@
+package com.zy.asrs.importexcle;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 鍚屾绔嬪簱宸叉湁鐗╂枡
+ *
+ * @author pang.jiabao
+ * @since 2023-09-25 16:59:21
+ */
+@Data
+public class LocMat implements Serializable {
+
+    // index浠�0寮�濮�
+    @ExcelProperty(value = "搴撲綅鍙�",index = 0)
+    private String a;
+
+    @ExcelProperty(value = "绌虹瀛怓,绌烘墭鐩楧",index = 1)
+    private String b;
+
+    @ExcelProperty(value = "鏈ㄧ绫诲瀷",index = 2)
+    private String c;
+
+}
+
diff --git a/src/main/java/com/zy/asrs/importexcle/LocMatListener.java b/src/main/java/com/zy/asrs/importexcle/LocMatListener.java
new file mode 100644
index 0000000..502cfbc
--- /dev/null
+++ b/src/main/java/com/zy/asrs/importexcle/LocMatListener.java
@@ -0,0 +1,140 @@
+package com.zy.asrs.importexcle;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.alibaba.fastjson.JSON;
+import com.core.exception.CoolException;
+import com.zy.asrs.entity.LocDetl;
+import com.zy.asrs.entity.LocMast;
+import com.zy.asrs.mapper.LocDetlMapper;
+import com.zy.asrs.service.LocMastService;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author pang.jiabao
+ * @description 鐩戝惉绔嬪簱宸叉湁鐗╂枡excel鏁版嵁瀵煎叆
+ * @createDate 2023/10/9 11:13
+ */
+@Slf4j
+public class LocMatListener extends AnalysisEventListener<LocMat> {
+
+    /**
+     * 姣忛殧1000鏉″瓨鍌ㄦ暟鎹簱锛屽疄闄呬娇鐢ㄤ腑鍙互3000鏉★紝鐒跺悗娓呯悊list 锛屾柟渚垮唴瀛樺洖鏀�
+     */
+    private static final int BATCH_COUNT = 400;
+
+    private static int num = 1;
+
+    private int count = 0;
+
+    List<LocMat> list = new ArrayList<>();
+    /**
+     * 鍋囪杩欎釜鏄竴涓狣AO锛屽綋鐒舵湁涓氬姟閫昏緫杩欎釜涔熷彲浠ユ槸涓�涓猻ervice銆傚綋鐒跺鏋滀笉鐢ㄥ瓨鍌ㄨ繖涓璞℃病鐢ㄣ��
+     */
+    private final LocMastService locMastService;
+    private final LocDetlMapper locDetlMapper;
+    private final Long userId;
+
+    /**
+     * 濡傛灉浣跨敤浜唖pring,璇蜂娇鐢ㄨ繖涓瀯閫犳柟娉曘�傛瘡娆″垱寤篖istener鐨勬椂鍊欓渶瑕佹妸spring绠$悊鐨勭被浼犺繘鏉�
+     */
+    public LocMatListener(LocMastService locMastService,LocDetlMapper locDetlMapper, Long userId) {
+        this.locMastService = locMastService;
+        this.locDetlMapper = locDetlMapper;
+        this.userId = userId;
+    }
+
+    /**
+     * 杩欎釜姣忎竴鏉℃暟鎹В鏋愰兘浼氭潵璋冪敤
+     */
+    @SneakyThrows
+    @Override
+    public void invoke(LocMat data, AnalysisContext context) {
+        log.info("瑙f瀽鍒扮 {} 鏉℃暟鎹�:{}", ++count, JSON.toJSONString(data));
+
+        list.add(data);
+
+        // 杈惧埌BATCH_COUNT浜嗭紝闇�瑕佸幓瀛樺偍涓�娆℃暟鎹簱锛岄槻姝㈡暟鎹嚑涓囨潯鏁版嵁鍦ㄥ唴瀛橈紝瀹规槗OOM
+        if (list.size() >= BATCH_COUNT) {
+            saveData();
+            // 瀛樺偍瀹屾垚娓呯悊 list
+            list.clear();
+        }
+    }
+
+    /**
+     * 鎵�鏈夋暟鎹В鏋愬畬鎴愪簡 閮戒細鏉ヨ皟鐢�
+     */
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+        // 杩欓噷涔熻淇濆瓨鏁版嵁锛岀‘淇濇渶鍚庨仐鐣欑殑鏁版嵁涔熷瓨鍌ㄥ埌鏁版嵁搴�
+        if (list.size() > 0) {
+            saveData();
+        }
+        log.info("鎵�鏈夋暟鎹В鏋愬畬鎴愶紒");
+    }
+
+    /**
+     * 鍔犱笂瀛樺偍鏁版嵁搴�
+     */
+    private void saveData() {
+        log.info("{}鏉℃暟鎹紝寮�濮嬪瓨鍌ㄦ暟鎹簱锛�", list.size());
+        List<LocDetl> locDetls = new ArrayList<>();
+            list.forEach(locMat -> {
+                LocMast locMast = locMastService.selectById(locMat.getA());
+                if (!locMast.getLocSts().equals("O")) {
+                    throw new CoolException(locMat.getA() + ":搴撲綅涓嶄负绌猴紒");
+                }
+                Date now = new Date();
+                if ("F".equals(locMat.getB())) {
+                    LocDetl locDetl = new LocDetl();
+                    locDetl.setLocNo(locMat.getA());
+                    locDetl.setZpallet("test" + num);
+                    locDetl.setAnfme(1.0);
+                    locDetl.setMatnr("3渭m脳10mm");
+                    locDetl.setMaktx("3渭m脳10mm");
+                    locDetl.setBatch("t" + num);
+                    locDetl.setSpecs("1");
+                    locDetl.setModel("t" + num);
+                    locDetl.setColor(locMat.getC()); // 鏈ㄧ绫诲瀷
+                    locDetl.setBrand("t" + num);
+                    locDetl.setPrice(800.0);
+                    locDetl.setOrigin("涓�");
+                    locDetl.setWeight(900.0);
+                    locDetl.setVolume(1000.0);
+                    locDetl.setModiTime(now);
+                    locDetl.setModiUser(userId);
+                    locDetl.setAppeTime(now);
+                    locDetl.setAppeUser(userId);
+
+                    // 娣诲姞杩涘簱瀛樻槑缁嗗垪琛�
+                    locDetls.add(locDetl);
+                    num ++;
+                }
+
+                // 鏇存柊搴撲綅鐘舵��
+                locMast.setLocSts(locMat.getB());
+                locMastService.updateById(locMast);
+            });
+            // 鎵归噺鎻掑叆搴撳瓨鏄庣粏
+            if (!locDetls.isEmpty()) {
+                locDetlMapper.batchDetls(locDetls);
+            }
+
+        log.info("瀛樺偍鏁版嵁搴撴垚鍔燂紒");
+    }
+
+    /**
+     *瑙f瀽鍑虹幇閿欒浼氳繘鍏ヨ鏂规硶 鍏蜂綋鐪嬫簮浠g爜鎴栨枃妗�
+     */
+    @Override
+    public void onException(Exception exception, AnalysisContext context) throws Exception {
+        log.error("澶勭悊寮傚父锛�" + exception.getMessage());
+        throw exception;
+    }
+}
diff --git a/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java b/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
index 1860139..aa12bf6 100644
--- a/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
@@ -76,4 +76,8 @@
 
     void updateMatTurn(@Param("matnrOld")String matnrOld,@Param("matnr")String matnr);
 
+    /**
+     * 鎵归噺鎻掑叆搴撳瓨鏄庣粏
+     */
+    int batchDetls(@Param("locDetls") List<LocDetl> locDetls);
 }
diff --git a/src/main/java/com/zy/asrs/service/OpenService.java b/src/main/java/com/zy/asrs/service/OpenService.java
index acb9a73..2a2b672 100644
--- a/src/main/java/com/zy/asrs/service/OpenService.java
+++ b/src/main/java/com/zy/asrs/service/OpenService.java
@@ -10,6 +10,42 @@
 public interface OpenService {
 
     /**
+     * GWMS璇锋眰ZWMS鐢熸垚鍏ュ簱浠诲姟
+     * @return 鐩爣淇℃伅
+     */
+    R gwmsGenerateInventory(GwmsGenerateInventoryDto param);
+
+    /**
+     *GWMS鍒拌揪鐩爣绔欑偣璇锋眰ZWCS鎵ц鍏ュ簱
+     */
+    String crnExecute(CrnExecuteParam param);
+
+    /**
+     * ZWMS鎺ユ敹MES涓嬪彂鍑哄簱浠诲姟
+     */
+    String zwmsOutLocWork(ZwmsOutLocWorkDto param);
+
+    /**
+     * 璐х墿鍒拌揪鍑哄簱鍙d互鍚庯紝涓婃姤鍑哄簱缁撴灉
+     */
+    String outLocResultReport(GhjtApiParam param);
+
+    /**
+     * 鎷嗙洏鏈哄嚭搴撴帴鍙�(绌烘墭鐩樺嚭搴�)
+     */
+    String emptyOutLoc(GhjtApiParam param);
+
+    /**
+     * 缁勭洏妗佹灦gwcs鍛婅瘔zwms璐х墿鍒颁綅锛寊mws鍛婅瘔gwcs鎬庝箞鎷�
+     */
+    R zphjDw(ZphjckdwParam param);
+
+    /**
+     * 缁勭洏妗佹灦鎷嗗灈瀹屾垚gwcs璇锋眰zwms
+     */
+    R zphjCdwc(ZphjcdwcParam param);
+
+    /**
      * 娣诲姞鍏ュ簱鍗�
      */
     void pakinOrderCreate(OpenOrderPakinParam param);
@@ -60,39 +96,5 @@
 
     void cs2();
 
-    /**
-     * GWMS璇锋眰ZWMS鐢熸垚鍏ュ簱浠诲姟
-     * @return 鐩爣淇℃伅
-     */
-    R gwmsGenerateInventory(GwmsGenerateInventoryDto param);
 
-    /**
-     *GWMS鍒拌揪鐩爣绔欑偣璇锋眰ZWCS鎵ц鍏ュ簱
-     */
-    String crnExecute(CrnExecuteParam param);
-
-    /**
-     * ZWMS鎺ユ敹MES涓嬪彂鍑哄簱浠诲姟
-     */
-    String zwmsOutLocWork(ZwmsOutLocWorkDto param);
-
-    /**
-     * 璐х墿鍒拌揪鍑哄簱鍙d互鍚庯紝涓婃姤鍑哄簱缁撴灉
-     */
-    String outLocResultReport(GhjtApiParam param);
-
-    /**
-     * 鎷嗙洏鏈哄嚭搴撴帴鍙�(绌烘墭鐩樺嚭搴�)
-     */
-    String emptyOutLoc(GhjtApiParam param);
-
-    /**
-     * 缁勭洏妗佹灦gwcs鍛婅瘔zwms璐х墿鍒颁綅锛寊mws鍛婅瘔gwcs鎬庝箞鎷�
-     */
-    R zphjDw(ZphjckdwParam param);
-
-    /**
-     * 缁勭洏妗佹灦鎷嗗灈瀹屾垚gwcs璇锋眰zwms
-     */
-    R zphjCdwc(ZphjcdwcParam param);
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/BasCrnpServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/BasCrnpServiceImpl.java
index 92f3aa3..f4adf4e 100644
--- a/src/main/java/com/zy/asrs/service/impl/BasCrnpServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/BasCrnpServiceImpl.java
@@ -1,12 +1,9 @@
 package com.zy.asrs.service.impl;
 
-import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.service.impl.ServiceImpl;
 import com.core.common.Cools;
 import com.core.exception.CoolException;
 import com.zy.asrs.entity.BasCrnp;
-import com.zy.asrs.entity.BasDevp;
-import com.zy.asrs.entity.WrkMast;
 import com.zy.asrs.mapper.BasCrnpMapper;
 import com.zy.asrs.service.BasCrnpService;
 import com.zy.asrs.service.BasDevpService;
@@ -43,7 +40,7 @@
     public boolean checkSiteError(Integer crnNo, boolean pakin) {
         BasCrnp crnp = this.selectById(crnNo);
         if (Cools.isEmpty(crnp)) {
-            log.error("{}鍙峰爢鍨涙満涓嶅瓨鍦�", crnNo);
+//            log.error("{}鍙峰爢鍨涙満涓嶅瓨鍦�", crnNo);
             return false;
         }
         if (crnp.getCrnErr() != null && crnp.getCrnSts() != 3){
diff --git a/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
index 01d76b9..1324b6a 100644
--- a/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -30,7 +30,6 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.net.CookieStore;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -993,16 +992,17 @@
         if (Cools.isEmpty(param)) {
             throw new CoolException("璇锋眰鍙傛暟鏈夎锛�" + param);
         }
-        int zpalletCount = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet", param.getBarcode()));
-        if (zpalletCount > 0) {
-            throw new CoolException("搴撳瓨鎵樼洏鐮佸凡瀛樺湪锛�" + param.getBarcode());
-        }
+        if (!Cools.isEmpty(param.getBarcode())) {
+            int zpalletCount = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet", param.getBarcode()));
+            if (zpalletCount > 0) {
+                throw new CoolException("搴撳瓨鎵樼洏鐮佸凡瀛樺湪锛�" + param.getBarcode());
+            }
 
-        int barcodeCount = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("barcode", param.getBarcode()));
-        if (barcodeCount > 0) {
-            throw new CoolException("宸ヤ綔妗e凡瀛樺湪璇ユ墭鐩樼爜锛�" + param.getBarcode());
+            int barcodeCount = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("barcode", param.getBarcode()));
+            if (barcodeCount > 0) {
+                throw new CoolException("宸ヤ綔妗e凡瀛樺湪璇ユ墭鐩樼爜锛�" + param.getBarcode());
+            }
         }
-
         LocTypeDto locTypeDto = new LocTypeDto();
         locTypeDto.setLocType1((short)1);
         int iotype = 1;
diff --git a/src/main/java/com/zy/common/service/CommonService.java b/src/main/java/com/zy/common/service/CommonService.java
index a1548b8..48928ae 100644
--- a/src/main/java/com/zy/common/service/CommonService.java
+++ b/src/main/java/com/zy/common/service/CommonService.java
@@ -3,7 +3,6 @@
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.mapper.Wrapper;
-import com.core.common.Arith;
 import com.core.common.Cools;
 import com.core.exception.CoolException;
 import com.zy.asrs.entity.*;
@@ -11,7 +10,6 @@
 import com.zy.asrs.utils.Utils;
 import com.zy.asrs.utils.VersionUtils;
 import com.zy.common.model.LocTypeDto;
-import com.zy.common.model.Shelves;
 import com.zy.common.model.StartupDto;
 import com.zy.common.properties.SlaveProperties;
 import lombok.extern.slf4j.Slf4j;
@@ -19,7 +17,10 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 璐ф灦鏍稿績鍔熻兘
@@ -122,115 +123,9 @@
      */
     @Transactional
     public StartupDto getLocNo(Integer staDescId, Integer sourceStaNo,LocTypeDto locTypeDto,int times) {
+        LocMast locMast;
 
-        // 鍒濆鍖栧弬鏁�
-        int crnNo = 0;      //鍫嗗灈鏈哄彿
-        int nearRow = 0;    //鏈�娴呭簱浣嶆帓
-        int curRow = 0;     //鏈�娣卞簱浣嶆帓
-        LocMast locMast = null;     // 鐩爣搴撲綅
-
-        StartupDto startupDto = new StartupDto();
-        RowLastno rowLastno = rowLastnoService.selectById(1);
-        int sRow = rowLastno.getsRow();
-        int eRow = rowLastno.geteRow();
-        int crn_qty = rowLastno.getCrnQty();
-        int rowCount = eRow - sRow + 1;
-        if (Cools.isEmpty(rowLastno)) {
-            throw new CoolException("鏁版嵁寮傚父锛岃鑱旂郴绠$悊鍛�");
-        }
-        // ===============>>>> 寮�濮嬫墽琛�
-
-        curRow = rowLastno.getCurrentRow();
-
-        // 濡傛灉娌℃湁鐩歌繎鐗╂枡锛屽垯鎸夎鍒欒疆璇㈣揣鏋�
-        if (Cools.isEmpty(locMast)) {
-            Shelves shelves = new Shelves(rowCount, crn_qty);
-            int divides = (int) Arith.divides(1, curRow - 1, 4);
-            curRow = (int) Arith.remainder(curRow, 4);
-            if (curRow == 0) {
-                curRow = 4;
-            }
-            for (int i = 0; i < shelves.group; i ++) {
-                curRow = shelves.start(curRow);
-                if (curRow < 0) {
-                    throw new CoolException("妫�绱㈠簱浣嶅け璐ワ紝璇疯仈绯荤鐞嗗憳");
-                }
-                Integer crnNo1 = shelves.get(curRow);
-                crnNo1 = crnNo1 + divides*1;
-                if (basCrnpService.checkSiteError(crnNo1, true)) {
-                    crnNo = crnNo1;
-                    curRow = curRow + divides*4;
-                    break;
-                }
-            }
-        }
-
-        if (crnNo == 0) {
-            throw new CoolException("娌℃湁鍙敤鐨勫爢鍨涙満");
-        }
-
-        // 1.褰撴绱㈠簱鎺掍负娴呭簱浣嶆帓鏃讹紝浼樺厛瀵绘壘褰撳墠搴撴帓鐨勬繁搴撲綅鎺�
-        if (locMast == null) {
-            if (Utils.isShallowLoc(slaveProperties, curRow)) {
-                Integer deepRow = Utils.getDeepRow(slaveProperties, curRow);
-                locMast = locMastService.queryFreeLocMast(deepRow, locTypeDto.getLocType1());
-                // todo:luxiaotao 濡傛灉鐢ㄦ祬鎺掓壘鍒扮殑娣卞簱浣嶏紝閭d箞鍒欓渶瑕佸垽鏂繖涓繁搴撲綅瀵瑰簲鐨勬祬搴撲綅鏄惁鏈夎揣锛團銆乆銆丏锛�
-                // 鍥犲簱浣嶇Щ杞�侀渶棰勭暀绌哄簱浣�
-                if (!locMastService.checkEmptyCount(locMast)) {
-                    locMast = null;
-                }
-            }
-            if (Cools.isEmpty(locMast)) {
-                locMast = locMastService.queryFreeLocMast(curRow, locTypeDto.getLocType1());
-                // 鍥犲簱浣嶇Щ杞�侀渶棰勭暀绌哄簱浣�
-                if (!locMastService.checkEmptyCount(locMast)) {
-                    locMast = null;
-                }
-                // 鐩爣搴撲綅 ===>> 娴呭簱浣嶏紝 鍒欐牎楠屽叾娣卞簱浣嶆槸鍚︿负 F D X
-                if (null != locMast && Utils.isShallowLoc(slaveProperties, locMast.getLocNo())) {
-                    LocMast deepLoc = locMastService.selectById(Utils.getDeepLoc(slaveProperties, locMast.getLocNo()));
-                    if (!deepLoc.getLocSts().equals("F") && !deepLoc.getLocSts().equals("D") && !deepLoc.getLocSts().equals("X")) {
-                        locMast = null;
-                    }
-                }
-                // 鐩爣搴撲綅 ===>> 娣卞簱浣嶏紝 鍒欐牎楠屽叾娴呭簱浣嶆槸鍚︿负 O
-                if (null != locMast && Utils.isDeepLoc(slaveProperties, locMast.getLocNo())) {
-                    LocMast shallowLoc = locMastService.selectById(Utils.getShallowLoc(slaveProperties, locMast.getLocNo()));
-                    if (!Cools.isEmpty(shallowLoc)) {
-                        if (!shallowLoc.getLocSts().equals("O")) {
-                            locMast = null;
-                        }
-                    }
-
-
-                }
-            }
-        }
-        // 鏇存柊搴撲綅鎺掑彿
-        rowLastno.setCurrentRow(curRow);
-        rowLastnoService.updateById(rowLastno);
-        // 2.搴撲綅褰撳墠鎵�灞炲昂瀵告棤绌哄簱浣嶆椂锛岃皟鏁村昂瀵稿弬鏁帮紝鍚戜笂鍏煎妫�绱㈠簱浣�
-        if (Cools.isEmpty(locMast)) {
-            // 褰撳墠宸烽亾鏃犵┖搴撲綅鏃讹紝閫掑綊璋冩暣鑷充笅涓�宸烽亾锛屾绱㈠叏閮ㄥ贩閬撴棤鏋滃悗锛岃烦鍑洪�掑綊
-            if (times < rowCount) {
-                times = times + 1;
-                return getLocNo(staDescId, sourceStaNo, locTypeDto, times);
-            }
-            log.error("绯荤粺娌℃湁绌哄簱浣嶏紒锛侊紒 灏哄瑙勬牸锛� {}锛� 杞娆℃暟锛歿}", JSON.toJSONString(locTypeDto), times);
-            throw new CoolException("娌℃湁绌哄簱浣�");
-        }
-
-
-//        // 鎼滅储绌烘墭
-//        locMast = getLocNoStep4(staDescId, sourceStaNo);
-//        if (locMast != null) {
-//            //鎵惧埌搴撲綅锛岃繑鍥瀌to
-//            return getLocNoStep6(staDescId, sourceStaNo, locMast);//杩斿洖dto
-//        }
-        if (locMast == null) {
-            //鎼滅储鏁翠釜绌哄簱浣嶇粍
-            locMast = getLocNoStepSingle(locTypeDto);
-        }
+        locMast = getLocNoStepSingle(locTypeDto);
 
         if (locMast != null) {
             //鎵惧埌搴撲綅锛岃繑鍥瀌to
@@ -240,37 +135,49 @@
        //鎵句笉鍒板簱浣嶏紝鎶涘嚭寮傚父
         throw new CoolException("娌℃湁绌哄簱浣�");
     }
+
     // 鎼滅储鍗曞搧(鏁翠釜搴撲綅缁�)
     private LocMast getLocNoStepSingle(LocTypeDto locTypeDto) {
+
         LocMast locMast = null;
-        //鍗曞搧
-        List<LocMast> locMasts = locMastService.selectAreaEmpty(locTypeDto.getLocType1());//鎼滅储璐х墿
 
+        // 鑾峰彇妯″紡涓虹數鑴戞ā寮忥紝鏃犱换鍔$殑鍫嗗灈鏈哄垪琛�:闃叉鍒嗛厤鍒板爢鍨涙満涓嶅彲鐢�
+        List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>().eq("crn_sts",3)
+                .eq("wrk_no",0));
+        if (basCrnps.isEmpty()) {
+            // 閮芥湁浠诲姟鍒欒幏鍙栫數鑴戞ā寮忕殑鍫嗗灈鏈哄垪琛�
+            basCrnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>().eq("crn_sts",3));
+        }
+        if (basCrnps.isEmpty()) {
+            throw new CoolException("娌℃湁鍙敤鍫嗗灈鏈�,鍫嗗灈鏈哄仠姝㈡垨寮傚父");
+        }
+        // 鍙敤鍫嗗灈鏈哄垪琛�
+        List<Integer> crnNoList = basCrnps.stream().map(BasCrnp::getCrnNo).collect(Collectors.toList());
+
+        // 鎼滅储娣卞簱浣�
+        List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
+                .eq("loc_sts","O").in("crn_no",crnNoList).in("row1","1,4,5,8,9,12,13,16,17,20,21,24").orderBy("lev1,bay1,row1"));
+
+        // 娣卞簱浣嶆病鏈夊垯鎼滅储娴呭簱浣�
+        if (locMasts.isEmpty()) {
+            locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
+                    .eq("loc_sts","O").in("crn_no",crnNoList).in("row1","2,3,6,7,10,11,14,15,18,19,22,23").orderBy("lev1,bay1,row1"));
+        }
+        if (locMasts.isEmpty()) {
+            throw new CoolException("娌℃湁鍙敤搴撲綅");
+        }
+
+        // 璁板綍鍫嗗灈鏈烘槸鍚︽煡璇㈣繃锛岄伩鍏嶉噸澶嶆煡璇�
+        Map<Integer,Boolean> crnMap = new HashMap<>();
         for (LocMast mast : locMasts) {
-            List<String> groupLoc = Utils.getGroupLocNo(mast.getLocNo(), true);
-//            if (!locMastService.checkAllLocEmpty(groupLoc)) {
-//                continue;
-//            }
-
-            LocMast tmp = null;
-            for (String loc : groupLoc) {
-                LocMast locMast1 = locMastService.selectByLoc(loc);
-                if (locMast1 == null) {
-                    continue;
+            if (crnMap.get(mast.getCrnNo()) == null) {
+                //棰勭暀绌哄簱浣�
+                if (locMastService.checkEmptyCount(mast, 10)) {
+                    locMast = mast;
+                    break;
+                } else {
+                    crnMap.put(mast.getCrnNo(),true);
                 }
-
-                if (!locMast1.getLocSts().equals("O")) {
-                    continue;
-                }
-
-                tmp = locMast1;
-                break;
-            }
-
-            //棰勭暀绌哄簱浣�
-            if (tmp != null && locMastService.checkEmptyCount(mast, 10)) {
-                locMast = tmp;
-                break;
             }
         }
 
diff --git a/src/main/resources/mapper/LocDetlMapper.xml b/src/main/resources/mapper/LocDetlMapper.xml
index a87dcd3..6a04062 100644
--- a/src/main/resources/mapper/LocDetlMapper.xml
+++ b/src/main/resources/mapper/LocDetlMapper.xml
@@ -57,6 +57,33 @@
             </otherwise>
         </choose>
     </sql>
+    <insert id="batchDetls">
+        INSERT INTO
+        asr_loc_detl(loc_no,zpallet,anfme,matnr,maktx,batch,specs,model,color,brand,price
+        ,origin,weight,volume,modi_time,modi_user,appe_time,appe_user)
+        VALUES
+        <foreach collection="locDetls" item="item" index="index" separator=",">
+            (
+            #{item.locNo},
+            #{item.zpallet},
+            #{item.anfme},
+            #{item.matnr},
+            #{item.maktx},
+            #{item.batch},
+            #{item.specs},
+            #{item.model},
+            #{item.color},
+            #{item.brand},
+            #{item.price},
+            #{item.origin},
+            #{item.weight},
+            #{item.volume},
+            #{item.modiTime},
+            #{item.modiUser},
+            #{item.appeTime},
+            #{item.appeUser}
+            )</foreach>
+    </insert>
 
     <select id="selectItem" resultMap="BaseResultMap">
         select top 1 *
diff --git a/src/main/webapp/static/js/locDetl/locDetl.js b/src/main/webapp/static/js/locDetl/locDetl.js
index 5e624fb..265898a 100644
--- a/src/main/webapp/static/js/locDetl/locDetl.js
+++ b/src/main/webapp/static/js/locDetl/locDetl.js
@@ -2,17 +2,17 @@
 function getCol() {
     var cols = [
         {field: 'locNo$', align: 'center',title: '搴撲綅鍙�'},
-        {field: 'matnr', align: 'center',title: '瑙勬牸', sort:true}
-        ,{field: 'maktx', align: 'center',title: '鍟嗗搧鍚嶇О', sort:true}
+        {field: 'matnr', align: 'center',title: '瑙勬牸', sort:true,width: 120}
+        ,{field: 'maktx', align: 'center',title: '鍟嗗搧鍚嶇О', sort:true,hide: true}
         ,{field: 'orderNo', align: 'center',title: '鍗曟嵁缂栧彿', hide: true}
-        ,{field: 'batch', align: 'center',title: '绠卞彿', width: 300, sort:true}
+        ,{field: 'batch', align: 'center',title: '绠卞彿', width: 250, sort:true}
         ,{field: 'anfme', align: 'center',title: '鏁伴噺'}
         ,{field: 'zpallet', align: 'center',title: '鎵樼洏鏉$爜'}
         ,{field: 'specs', align: 'center',title: '鎺ュご'}
         ,{field: 'model', align: 'center',title: '鍗峰彿', hide: false}
-        ,{field: 'color', align: 'center',title: '棰滆壊', hide: true}
-        ,{field: 'brand', align: 'center',title: '鏈ㄧ绫诲瀷', hide: true}
-        ,{field: 'brand$', align: 'center',title: '鏈ㄧ绫诲瀷', hide: false}
+        ,{field: 'color', align: 'center',title: '鏈ㄧ绫诲瀷', hide: false,width: 250}
+        ,{field: 'brand', align: 'center',title: '鍖呰缁勫彿', hide: false}
+        ,{field: 'brand$', align: 'center',title: '鏈ㄧ绫诲瀷', hide: true}
         ,{field: 'unit', align: 'center',title: '鍗曚綅', hide: true}
         ,{field: 'price', align: 'center',title: '闀垮害', hide: false}
         ,{field: 'sku', align: 'center',title: 'sku', hide: true}
@@ -40,7 +40,7 @@
 
     // cols.push.apply(cols, detlCols);
     cols.push({field: 'modiUser$', align: 'center',title: '淇敼浜哄憳',hide: true}
-        ,{field: 'modiTime$', align: 'center',title: '淇敼鏃堕棿'}
+        ,{field: 'modiTime$', align: 'center',title: '淇敼鏃堕棿',width: 200}
     )
     return cols;
 }
diff --git a/src/main/webapp/views/index.html b/src/main/webapp/views/index.html
index 55db7b2..09e8e21 100644
--- a/src/main/webapp/views/index.html
+++ b/src/main/webapp/views/index.html
@@ -2,7 +2,7 @@
 <html lang="en">
 <head>
   <meta charset="utf-8">
-  <title>鍐犻缚姹熼摐 - 鑷姩鍖栫珛浣撲粨搴� - AS / RS</title>
+  <title>鍐犻缚姹熼摐WMS</title>
   <meta name="renderer" content="webkit">
   <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
   <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
@@ -26,7 +26,7 @@
   <!-- 澶撮儴 -->
   <div class="layui-header">
     <div class="layui-logo">
-      <img src="../static/image/logo.png" style="display: inline-block; width: 40%;height: auto">
+<!--      <img src="../static/image/logo.png" style="display: inline-block; width: 40%;height: auto">-->
       <!--          <span style="margin-top: 0; letter-spacing: 10px">涓壃绔嬪簱</span>-->
 <!--                <img src="../static/image/favicon.ico"/>-->
 <!--                <cite>鍐犻缚姹熼摐</cite>-->
diff --git a/src/main/webapp/views/locDetl/locDetl.html b/src/main/webapp/views/locDetl/locDetl.html
index 1ec1a96..16f7a7e 100644
--- a/src/main/webapp/views/locDetl/locDetl.html
+++ b/src/main/webapp/views/locDetl/locDetl.html
@@ -73,11 +73,38 @@
     <div class="layui-btn-container">
         <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="margin-top: 10px">瀵煎嚭</button>
     </div>
+    <input type="file" id="fileInput" accept=".xlsx, .xls">
+    <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-import" onclick="exportExc()" style="margin-top: 10px">瀵煎叆</button>
 </script>
 
 <script type="text/html" id="operate">
     <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">璇︽儏</a>
 </script>
+<script>
+    function exportExc() {
+        var fileInput = document.getElementById('fileInput');
+        var file = fileInput.files[0];
+        if (file === undefined) {
+            alert('璇峰厛閫夋嫨鏂囦欢')
+            return
+        }
+        var formData = new FormData();
+        formData.append('file', file);
+
+        fetch(baseUrl+'/importLocData', {
+            method: 'POST',
+            headers: {'token': localStorage.getItem('token')},
+            body: formData
+        }).then(response => {
+            response.text().then(data => {
+                var res = JSON.parse(data)
+                alert(res.msg)
+            })
+        }).catch(error => {
+            alert('瀵煎叆寮傚父');
+        });
+    }
+</script>
 
 <script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
 <script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
diff --git a/src/main/webapp/views/login.html b/src/main/webapp/views/login.html
index b7c93a9..5a3decb 100644
--- a/src/main/webapp/views/login.html
+++ b/src/main/webapp/views/login.html
@@ -3,7 +3,7 @@
   <head>
     <meta charset="utf-8">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <title>鍐犻缚姹熼摐 鈹� login of zoneyung wms</title>
+    <title>鍐犻缚姹熼摐WMS</title>
     <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1">
     <meta name="description" content="study of Instancing with three.js">
     <meta name="keywords" content="undefined, Yoichi Kobayashi, WebGL, three.js">
@@ -53,7 +53,7 @@
                     z-index: 100;
                     top: 22px;
                     left: 20px;">
-        <img src="../static/image/logo.png" alt="" style="width: 20%">
+<!--        <img src="../static/image/logo.png" alt="" style="width: 20%">-->
       </div>
       <div class="p-sketch-outline">
         <h2 class="p-sketch-outline__title">Automatic Storage and Retrieval System</h2>
@@ -67,7 +67,7 @@
     <div id="sidebar">
       <div class="login-contain">
         <div class="login-box">
-          <img src="../static/image/logo.png" alt="" style="width: 80%">
+<!--          <img src="../static/image/logo.png" alt="" style="width: 80%">-->
 <!--          <span class="login100-form-title p-t-20 p-b-45">涓壃绔嬪簱</span>-->
 <!--          <span class="login100-form-title p-t-20 p-b-45" style="margin: 15px 0;color: #868686;font-size: 24px">WMS</span>-->
           <div class="wrap-input100 validate-input m-b-10" data-validate="璇疯緭鍏ョ敤鎴峰悕">

--
Gitblit v1.9.1