From 419c6a9b87b37be567a581d6a80d7e3f505d84e9 Mon Sep 17 00:00:00 2001
From: lty <876263681@qq.com>
Date: 星期一, 23 六月 2025 13:39:04 +0800
Subject: [PATCH] #新增空箱入库功能,界面等修改

---
 src/main/java/com/zy/asrs/controller/LocDetlController.java   |   31 +
 src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java   |    2 
 src/main/webapp/views/pakStore/locDetlQuery.html              |   15 
 src/main/java/com/zy/asrs/controller/MobileController.java    |   13 
 src/main/java/com/zy/asrs/service/impl/MatServiceImpl.java    |    6 
 src/main/webapp/static/js/locDetl/locDetl.js                  |    4 
 src/main/java/com/zy/asrs/entity/param/BoxInParam.java        |   13 
 src/main/webapp/static/js/mat/boxMat.js                       |  482 ++++++++++++++++
 src/main/webapp/views/mat/boxMat.html                         |  444 ++++++++++++++
 src/main/webapp/static/js/pakStore/boxOut.js                  |  180 ++++++
 src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java   |   12 
 src/main/java/com/zy/asrs/mapper/MatMapper.java               |    3 
 src/main/resources/mapper/MatMapper.xml                       |   38 
 src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java |  120 +++
 src/main/webapp/views/pakStore/boxQuery.html                  |  243 ++++++++
 src/main/java/com/zy/asrs/controller/MatController.java       |   27 
 src/main/webapp/views/pakStore/boxOut.html                    |  132 ++++
 src/main/java/com/zy/asrs/service/MatService.java             |    3 
 src/main/java/com/zy/asrs/service/MobileService.java          |    7 
 19 files changed, 1,755 insertions(+), 20 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/LocDetlController.java b/src/main/java/com/zy/asrs/controller/LocDetlController.java
index 9639102..952ed10 100644
--- a/src/main/java/com/zy/asrs/controller/LocDetlController.java
+++ b/src/main/java/com/zy/asrs/controller/LocDetlController.java
@@ -85,6 +85,15 @@
         return R.ok(locDetls);
     }
 
+    @PostMapping("/getBoxLocDateByLocNo")
+    @ManagerAuth(memo = "鏍规嵁鍖呰缁勫彿鎻愬彇涓�鏁寸搴撳瓨")
+    public R getBoxLocDateByLocNo(@RequestBody List<String> packageNoList) {
+
+        List<LocDetl> locDetls = locDetlMapper.selectList(new EntityWrapper<LocDetl>().in("loc_no", packageNoList));
+
+        return R.ok(locDetls);
+    }
+
     @Transactional(rollbackFor = Exception.class)
     public void importLocData1(MultipartFile multipartFile) throws IOException {
         EasyExcel.read(multipartFile.getInputStream(), LocMat.class,
@@ -148,6 +157,28 @@
         return R.ok(stockOut);
     }
 
+    @RequestMapping(value = "/stock/boxOut/list/auth")
+    @ManagerAuth
+    public R boxOut(@RequestParam(defaultValue = "1")Integer curr,
+                          @RequestParam(defaultValue = "10")Integer limit,
+                          @RequestParam Map<String, Object> param){
+        if (!Cools.isEmpty(param.get("modi_time"))){
+            String val = String.valueOf(param.get("modi_time"));
+            if (val.contains(RANGE_TIME_LINK)) {
+                String[] dates = val.split(RANGE_TIME_LINK);
+                param.put("startTime", DateUtils.convert(dates[0]));
+                param.put("endTime", DateUtils.convert(dates[1]));
+                param.remove("modi_time");
+            }
+        }
+        param.put("matnr","绌虹");
+        Page<LocDetl> stockOut = locDetlService.getStockOut(toPage(curr, limit, param, LocDetl.class));
+        if (stockOut.getRecords().size()==0){
+            stockOut = locDetlService.getStockOut(toPage(1, limit, param, LocDetl.class));
+        }
+        return R.ok(stockOut);
+    }
+
     @RequestMapping(value = "/locDetl/list/auth")// /locDetl/list/auth 鎺ュ彛闂
     @ManagerAuth
     public R list(@RequestParam(defaultValue = "1")Integer curr,
diff --git a/src/main/java/com/zy/asrs/controller/MatController.java b/src/main/java/com/zy/asrs/controller/MatController.java
index 9c53503..7f6de8b 100644
--- a/src/main/java/com/zy/asrs/controller/MatController.java
+++ b/src/main/java/com/zy/asrs/controller/MatController.java
@@ -105,6 +105,33 @@
 
     }
 
+    @RequestMapping(value = "/boxMat/list/auth")
+    @ManagerAuth
+    public R listBox(@RequestParam(defaultValue = "1") Integer curr,
+                     @RequestParam(defaultValue = "10") Integer limit,
+                     @RequestParam(required = false) String orderByField,
+                     @RequestParam(required = false) String orderByType,
+                     @RequestParam Map<String, Object> param) {
+
+        Object tagIdObj = param.get("tag_id");
+        if (Cools.isEmpty(tagIdObj)) {
+            tagIdObj = getOriginTag().getId();
+        }
+
+        String tagId = String.valueOf(tagIdObj);
+
+
+
+        return R.ok(matService.getPage(
+                new Page<>(curr, limit),
+                tagId,
+                param.get("matnr"),
+                param.get("memo")
+        ));
+    }
+
+
+
     private void convert(Map<String, Object> map, EntityWrapper wrapper){
         for (Map.Entry<String, Object> entry : map.entrySet()){
             String val = String.valueOf(entry.getValue());
diff --git a/src/main/java/com/zy/asrs/controller/MobileController.java b/src/main/java/com/zy/asrs/controller/MobileController.java
index 96b3c97..136a38d 100644
--- a/src/main/java/com/zy/asrs/controller/MobileController.java
+++ b/src/main/java/com/zy/asrs/controller/MobileController.java
@@ -598,6 +598,19 @@
         return mobileService.pdaFxprk(param, getUserId());
     }
 
+    @PostMapping("/pdaBoxIn")
+    @ManagerAuth(memo = "pda绌虹鍏ュ簱")
+    public synchronized R pdaBoxIn(@RequestBody BoxInParam param) {
+
+        return mobileService.pdaBoxIn(param, getUserId());
+    }
+
+    @PostMapping("/pdaGetMemo")
+    @ManagerAuth(memo = "pda鑾峰彇鏈ㄧ璧勬枡")
+    public synchronized  List<Map<String, Object>> pdaGetMemo() {
+        return mobileService.pdaGetMemo();
+    }
+
     @PostMapping("/pdaFhhd")
     @ManagerAuth(memo = "pda鍙戣揣鏍稿")
     public synchronized R pdaFhhd(@RequestBody PdaDhhdParam param) {
diff --git a/src/main/java/com/zy/asrs/entity/param/BoxInParam.java b/src/main/java/com/zy/asrs/entity/param/BoxInParam.java
new file mode 100644
index 0000000..edc3b99
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/param/BoxInParam.java
@@ -0,0 +1,13 @@
+package com.zy.asrs.entity.param;
+
+import lombok.Data;
+
+@Data
+public class BoxInParam {
+    private String barcode; //	鎵樼洏鐮�
+    private Integer palletizingNo;// 鐮佸灈浣嶇紪鍙�
+
+    private String batch; //灏哄
+    private String memo; // 澶囨敞
+    private Double anfme;
+}
diff --git a/src/main/java/com/zy/asrs/mapper/MatMapper.java b/src/main/java/com/zy/asrs/mapper/MatMapper.java
index bf12ef8..b3812ba 100644
--- a/src/main/java/com/zy/asrs/mapper/MatMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/MatMapper.java
@@ -15,7 +15,7 @@
 @Repository
 public interface MatMapper extends BaseMapper<Mat> {
 
-    List<Mat> listByPage(Page page, @Param("tagId") String tagId, @Param("matnr") Object matnr,  @Param("maktx") Object maktx);
+    List<Mat> listByPage(Page page, @Param("tagId") String tagId, @Param("matnr") Object matnr,  @Param("memo") Object memo);
     List<Mat> listByPage2(Page page, @Param("tagId") String tagId, @Param("matnr") Object matnr,  @Param("maktx") Object maktx,  @Param("specs") Object specs);
 
     Mat selectByMatnr(@Param("matnr")String matnr);
@@ -29,4 +29,5 @@
     @Update("update man_mat set origin= #{boxPos},barcode=#{barcode} where brand= #{packageGroupNo}")
     Integer updateBoxPos(@Param("packageGroupNo") String packageGroupNo, @Param("boxPos") String boxPos,@Param("barcode") String barcode);
 
+    List<Map<String, Object>> getBoxMemoMap(@Param("tagIds") List<Integer> tagIds);
 }
diff --git a/src/main/java/com/zy/asrs/service/MatService.java b/src/main/java/com/zy/asrs/service/MatService.java
index 59c97b2..47dcef7 100644
--- a/src/main/java/com/zy/asrs/service/MatService.java
+++ b/src/main/java/com/zy/asrs/service/MatService.java
@@ -8,7 +8,7 @@
 
 public interface MatService extends IService<Mat> {
 
-    Page<Mat> getPage(Page page, String tagId, Object matnr, Object maktx);
+    Page<Mat> getPage(Page page, String tagId, Object matnr,Object memo);
     Page<Mat> getPage2(Page page, String tagId, Object matnr, Object maktx, Object specs);
 
     Mat selectByMatnr(String matnr);
@@ -16,4 +16,5 @@
 
     Page<Mat> getMatTurnPage(Page<Mat> page);
 
+
 }
diff --git a/src/main/java/com/zy/asrs/service/MobileService.java b/src/main/java/com/zy/asrs/service/MobileService.java
index aa10f0c..1c9b78f 100644
--- a/src/main/java/com/zy/asrs/service/MobileService.java
+++ b/src/main/java/com/zy/asrs/service/MobileService.java
@@ -68,6 +68,11 @@
     R pdaFxprk(GwmsGenerateInventoryDto param, Long userId);
 
     /**
+     * pda绌虹鍏ュ簱
+     */
+    R pdaBoxIn(BoxInParam param, Long userId);
+
+    /**
      * 鐩樼偣寮傚父鎸夊疄鐗╄皟鏁村簱瀛樹俊鎭�
      */
     R pdtz(PdtzParam param);
@@ -76,4 +81,6 @@
      * 鍙戣揣鏍稿
      */
     R pdaFhhd(PdaDhhdParam param,Long userId);
+
+    List<Map<String, Object>> pdaGetMemo();
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/MatServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MatServiceImpl.java
index f7b239e..2bb6c66 100644
--- a/src/main/java/com/zy/asrs/service/impl/MatServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MatServiceImpl.java
@@ -13,8 +13,8 @@
 public class MatServiceImpl extends ServiceImpl<MatMapper, Mat> implements MatService {
 
     @Override
-    public Page<Mat> getPage(Page page, String tagId, Object matnr, Object maktx) {
-        return page.setRecords(baseMapper.listByPage(page, tagId, matnr, maktx));
+    public Page<Mat> getPage(Page page, String tagId, Object matnr, Object memo) {
+        return page.setRecords(baseMapper.listByPage(page, tagId, matnr, memo));
     }
     @Override
     public Page<Mat> getPage2(Page page, String tagId, Object matnr, Object maktx, Object specs) {
@@ -42,4 +42,6 @@
 
 
 
+
+
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
index fc60578..e957894 100644
--- a/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -1557,6 +1557,95 @@
         return R.ok("鍙嶄慨鍏ュ簱鎴愬姛");
     }
 
+    @Override
+    public R pdaBoxIn(BoxInParam param, Long userId) {
+
+        if (Cools.isEmpty(param.getBarcode())) {
+            throw new CoolException("鏉$爜涓嶈兘涓虹┖锛�" + 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());
+        }
+
+        LocTypeDto locTypeDto = new LocTypeDto();
+        locTypeDto.setLocType1((short) 1);
+        int iotype = 1; //绌虹
+
+        // 鏍规嵁婧愮珯鐐瑰鎵惧簱浣�
+        StartupDto dto = commonService.getLocNo(iotype, param.getPalletizingNo(), locTypeDto, 0);
+
+        int workNo = dto.getWorkNo();
+        Date now = new Date();
+        // 鐢熸垚宸ヤ綔妗�
+        WrkMast wrkMast = new WrkMast();
+        wrkMast.setWrkNo(workNo);
+        wrkMast.setIoTime(new Date());
+        wrkMast.setWrkSts(1L); // 宸ヤ綔鐘舵�侊細璁惧涓婅蛋
+        wrkMast.setIoType(iotype); // 鍏ュ嚭搴撶姸鎬侊細1.鍏ュ簱
+        wrkMast.setIoPri(13D); // 浼樺厛绾�
+        wrkMast.setCrnNo(dto.getCrnNo());
+        wrkMast.setSourceStaNo(param.getPalletizingNo());
+        wrkMast.setStaNo(dto.getStaNo());
+        wrkMast.setLocNo(dto.getLocNo());
+        wrkMast.setBarcode(param.getBarcode()); // 鎵樼洏鐮�
+        wrkMast.setFullPlt("Y"); // 婊℃澘锛歒
+        wrkMast.setPicking("N"); // 鎷f枡
+        wrkMast.setExitMk("N"); // 閫�鍑�
+        wrkMast.setEmptyMk("Y"); // 绌烘澘
+        wrkMast.setLinkMis("Y");
+        wrkMast.setCtnType(1); // 瀹瑰櫒绫诲瀷
+        // 鎿嶄綔浜哄憳鏁版嵁
+        wrkMast.setAppeTime(now);
+        wrkMast.setAppeUser(userId);
+        wrkMast.setModiTime(now);
+        wrkMast.setModiUser(userId);
+        wrkMastService.insert(wrkMast);
+
+        if (!Cools.isEmpty(param.getBatch())) {
+                WrkDetl wrkDetl = new WrkDetl();
+                wrkDetl.setMatnr("绌虹");
+                wrkDetl.setWrkNo(wrkMast.getWrkNo());
+                wrkDetl.setWrkNo(wrkMast.getWrkNo());
+                wrkDetl.setBatch(param.getBatch()); // 灏哄
+                wrkDetl.setZpallet(param.getBarcode()); // 鎵樼洏鐮�
+                wrkDetl.setBarcode(param.getBarcode());
+                wrkDetl.setMemo(param.getMemo()); //澶囨敞
+                wrkDetl.setAnfme(param.getAnfme());
+                wrkDetl.setIoTime(now);
+                wrkDetl.setAppeTime(now);
+                wrkDetl.setAppeUser(userId);
+                wrkDetl.setModiUser(userId);
+                wrkDetl.setModiTime(now);
+                if (!wrkDetlService.insert(wrkDetl)) {
+                    throw new CoolException("淇濆瓨宸ヤ綔鏄庣粏澶辫触");
+                }
+        }
+
+        // 鏇存柊鐩爣搴撲綅鐘舵��
+        LocMast locMast = locMastService.selectById(dto.getLocNo());
+        if (locMast.getLocSts().equals("O")) {
+            locMast.setLocSts("S"); // S.鍏ュ簱棰勭害
+            locMast.setModiTime(now);
+            if (!locMastService.updateById(locMast)) {
+                throw new CoolException("鏀瑰彉搴撲綅鐘舵�佸け璐�");
+            }
+        } else {
+            throw new CoolException(dto.getLocNo() + "鐩爣搴撲綅宸茶鍗犵敤");
+        }
+
+        // 杩斿洖GWCS鐩爣淇℃伅
+        openServiceImpl.pushStaNoToGwcs(param.getPalletizingNo(), dto.getStaNo(), dto.getWorkNo(), param.getBarcode(), "涓�妤肩┖绠卞叆搴撴帹閫乬wcs");
+
+        return R.ok("绌虹鍏ュ簱鎴愬姛");
+    }
+
     private void pushFxrkToMes(GwmsGenerateInventoryDto param) {
 
         for (GwmsGenerateInventoryDto.MatList matList : param.getMatList()){
@@ -1929,7 +2018,7 @@
      * 璋冩暣搴撳瓨鏄庣粏
      */
     @Transactional
-    void insertLocDetl(String locNo, String barcode, List<PdtzParam.MatList> matList) {
+    public void insertLocDetl(String locNo, String barcode, List<PdtzParam.MatList> matList) {
         Date now = new Date();
         for (PdtzParam.MatList mat : matList) {
             LocDetl locDetl = new LocDetl();
@@ -2114,4 +2203,33 @@
         }
         return result;
     }
+
+    @Override
+    public List<Map<String, Object>> pdaGetMemo() {
+        List<Integer> tagIds = Arrays.asList(7, 8);
+        List<Map<String, Object>> raw = matMapper.getBoxMemoMap(tagIds);
+
+        // 鐢� Map<String, List<String>> 鍒嗙粍
+        Map<String, List<String>> grouped = new HashMap<>();
+        for (Map<String, Object> row : raw) {
+            String tagId = String.valueOf(row.get("tag_id"));
+            String memo = String.valueOf(row.get("memo"));
+            if (memo == null || "null".equalsIgnoreCase(memo)) continue;
+
+            grouped.computeIfAbsent(tagId, k -> new ArrayList<>()).add(memo);
+        }
+
+        // 杞垚 List<Map<String, Object>> 缁撴瀯杩斿洖
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (Map.Entry<String, List<String>> entry : grouped.entrySet()) {
+            Map<String, Object> item = new HashMap<>();
+            item.put("tagId", entry.getKey());
+            item.put("memos", entry.getValue());
+            result.add(item);
+        }
+
+        return result;
+    }
+
+
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
index 8ef9e32..eaa13af 100644
--- a/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -183,14 +183,20 @@
         // 鑾峰彇搴撲綅鏄庣粏
         List<LocDetlDto> locDetlDtos = new ArrayList<>();
         for (StockOutParam.LocDetl paramLocDetl : param.getLocDetls()) {
+            LocDetl one = new LocDetl();
 //            if (!Cools.isEmpty(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getCount())) {
-                LocDetl one = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no",paramLocDetl.getLocNo())
+                one = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no",paramLocDetl.getLocNo())
                         .eq("brand",paramLocDetl.getBrand()).eq("model",paramLocDetl.getModel()));
 //                        selectItem(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getBatch());
-                if (null != one) {
+            if(paramLocDetl.getMatnr().equals("绌虹")){
+                one= locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no",paramLocDetl.getLocNo()));
+            }
+                if (null != one && !paramLocDetl.getMatnr().equals("绌虹")) {
                     if(!"鍚堟牸".equals(one.getThreeCode())) {
                         throw new CoolException(one.getModel() + "鍗蜂笉鍚堟牸:" + one.getThreeCode() );
                     }
+                    locDetlDtos.add(new LocDetlDto(one, paramLocDetl.getCount(), param.getOrderNo()));
+                }else{
                     locDetlDtos.add(new LocDetlDto(one, paramLocDetl.getCount(), param.getOrderNo()));
                 }
 //            }
@@ -950,7 +956,7 @@
         }
         // 鍏ュ簱 + 搴撲綅杞Щ
         if (wrkMast.getIoType() < 60) {
-            wrkMast.setWrkSts(5L);
+            wrkMast.setWrkSts(4L);
         // 鍑哄簱
         } else if (wrkMast.getIoType() > 100 && wrkMast.getIoType() != 103 && wrkMast.getIoType() != 107 && wrkMast.getIoType() != 109) {
             wrkMast.setWrkSts(14L);
diff --git a/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java b/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
index dbc1353..f549c1b 100644
--- a/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
+++ b/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -121,7 +121,7 @@
                             locDetl.setBarcode(wrkMast.getBarcode());
                             locDetl.setModiTime(now);
                             locDetl.setAppeTime(now);
-                            locDetl.setBatch("");
+//                            locDetl.setBatch("");
                             if (!locDetlService.insert(locDetl)) {
 //                                exceptionHandle("鍏ㄦ澘鍏ュ簱 ===>> 娣诲姞搴撳瓨鏄庣粏澶辫触锛沎workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
diff --git a/src/main/resources/mapper/MatMapper.xml b/src/main/resources/mapper/MatMapper.xml
index 09a8d0a..5cc3281 100644
--- a/src/main/resources/mapper/MatMapper.xml
+++ b/src/main/resources/mapper/MatMapper.xml
@@ -53,23 +53,28 @@
         FROM man_mat mm
         LEFT JOIN man_tag mt ON mm.tag_id = mt.id
         LEFT JOIN (
-            select
-            matnr,
-            sum(anfme) as amount
-            from man_loc_detl
-            group by matnr
-        ) as mld on mld.matnr = mm.matnr
+        SELECT
+        matnr,
+        SUM(anfme) AS amount
+        FROM man_loc_detl
+        GROUP BY matnr
+        ) AS mld ON mld.matnr = mm.matnr
         WHERE 1=1
-        and (mm.memo is null or mm.memo != '鎵撳寘涓婄嚎')
-        AND (CHARINDEX(','+#{tagId}+',', ','+mt.path+',') > 0 OR mt.id = #{tagId})
+        <!-- 鉁� 灞忚斀 tag_id = 6 -->
+        AND mt.id != 6
+
+        <!-- 鉁� 鍒ゆ柇鏄惁鍦ㄨ矾寰勪腑 or 鏈韩 id 鍖归厤 -->
+        AND (CHARINDEX(',' + #{tagId} + ',', ',' + mt.path + ',') > 0 OR mt.id = #{tagId})
+
         <if test="matnr != null and matnr != ''">
-            and mm.matnr like concat('%',#{matnr},'%')
+            AND mm.matnr LIKE CONCAT('%', #{matnr}, '%')
         </if>
-        <if test="maktx != null and maktx != ''">
-            and mm.maktx like concat('%',#{maktx},'%')
+        <if test="memo != null and memo != ''">
+            AND mm.memo LIKE CONCAT('%', #{memo}, '%')
         </if>
         ORDER BY mm.create_time DESC
     </select>
+
 
     <select id="listByPage2" resultMap="BaseResultMap">
         SELECT
@@ -125,6 +130,17 @@
         ) t where t.matNo between ((#{pageNumber}-1)*#{pageSize}+1) and (#{pageNumber}*#{pageSize})
     </select>
 
+
+    <select id="getBoxMemoMap" resultType="map">
+        SELECT tag_id, memo
+        FROM man_mat
+        WHERE tag_id IN
+        <foreach item="id" collection="tagIds" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </select>
+
+
     <select id="getStockOutPageCount" parameterType="java.util.Map" resultType="java.lang.Integer">
         select
         count(1)
diff --git a/src/main/webapp/static/js/locDetl/locDetl.js b/src/main/webapp/static/js/locDetl/locDetl.js
index a8bc332..8ca490d 100644
--- a/src/main/webapp/static/js/locDetl/locDetl.js
+++ b/src/main/webapp/static/js/locDetl/locDetl.js
@@ -8,6 +8,8 @@
         // ,{field: 'anfme', align: 'center',title: '鏁伴噺',hide: true}
         ,{field: 'zpallet', align: 'center',title: '鎵樼洏鏉$爜'}
         ,{field: 'matnr', align: 'center',title: '瑙勬牸', sort:true,width: 150}
+        ,{field: 'batch', align: 'center',title: '绌虹灏哄', hide: true}
+        ,{field: 'memo', align: 'center',title: '绌虹澶囨敞', hide: true}
         ,{field: 'brand', align: 'center',title: '鍖呰缁勫彿', hide: false,width: 150}
         ,{field: 'model', align: 'center',title: '鍗峰彿', hide: false,width: 150}
         ,{field: 'unit', align: 'center',title: '绠卞彿', hide: false,width: 150}
@@ -27,6 +29,8 @@
         ,{field: 'volume', align: 'center',title: '鍗曠姣涢噸', hide: true}
         ,{field: 'specs', align: 'center',title: '鎺ュご', hide:true}
         ,{field: 'deadWarn$', align: 'center',title: '鐞嗚揣鐘舵��', hide: false}
+
+
         ,{
             field: 'threeCode',
             align: 'center',
diff --git a/src/main/webapp/static/js/mat/boxMat.js b/src/main/webapp/static/js/mat/boxMat.js
new file mode 100644
index 0000000..7705d58
--- /dev/null
+++ b/src/main/webapp/static/js/mat/boxMat.js
@@ -0,0 +1,482 @@
+var pageCurr;
+var printMatCodeNos = [];
+var admin;
+function getCol() {
+    var cols = [
+        {type: 'checkbox'}
+        ,{field: 'tagId$', align: 'center',title: '褰掔被', templet: '#tagTpl'}
+        ,{field: 'memo', align: 'center',title: '鏈ㄧ璧勬枡',hide:false}
+    ];
+    // cols.push.apply(cols, matCols);
+    cols.push(
+        {fixed: 'right', title:'鎿嶄綔', align: 'center', toolbar: '#operate', width:150}
+    )
+    return cols;
+}
+
+layui.config({
+    base: baseUrl + "/static/layui/lay/modules/"
+}).extend({
+    dropdown: 'dropdown/dropdown',
+}).use(['table','laydate', 'form', 'treeTable', 'admin', 'xmSelect', 'dropdown', 'element'], function(){
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+    admin = layui.admin;
+    var treeTable = layui.treeTable;
+    var xmSelect = layui.xmSelect;
+
+    // 鍟嗗搧鍒嗙被鏁版嵁
+    var insTb = treeTable.render({
+        elem: '#tag',
+        url: baseUrl+'/tag/list/auth',
+        headers: {token: localStorage.getItem('token')},
+        tree: {
+            iconIndex: 2,           // 鎶樺彔鍥炬爣鏄剧ず鍦ㄧ鍑犲垪
+            isPidData: true,        // 鏄惁鏄痠d銆乸id褰㈠紡鏁版嵁
+            idName: 'id',           // id瀛楁鍚嶇О
+            pidName: 'parentId'     // pid瀛楁鍚嶇О
+        },
+        cols: [],
+        done: function (data) {
+            $('.ew-tree-table-box').css('height', '100%');
+            insTb.expandAll();
+        }
+    });
+
+    // 鏁版嵁娓叉煋
+    tableIns = table.render({
+        elem: '#mat',
+        headers: {token: localStorage.getItem('token')},
+        url: baseUrl+'/boxMat/list/auth',
+        page: true,
+        limit: 16,
+        limits: [16, 30, 50, 100, 200, 500],
+        toolbar: '#toolbar',
+        cellMinWidth: 50,
+        height: 'full-105',
+        cols: [getCol()],
+        request: {
+            pageName: 'curr',
+            pageSize: 'limit'
+        },
+        parseData: function (res) {
+            return {
+                'code': res.code,
+                'msg': res.msg,
+                'count': res.data.total,
+                'data': res.data.records
+            }
+        },
+        response: {
+            statusCode: 200
+        },
+        done: function(res, curr, count) {
+            if (res.code === 403) {
+                top.location.href = baseUrl+"/";
+            }
+            pageCurr=curr;
+            limit();
+            form.on('checkbox(tableCheckbox)', function (data) {
+                var _index = $(data.elem).attr('table-index')||0;
+                if(data.elem.checked){
+                    res.data[_index][data.value] = 'Y';
+                }else{
+                    res.data[_index][data.value] = 'N';
+                }
+            });
+        }
+    });
+
+    // 鐩戝惉鎺掑簭浜嬩欢
+    table.on('sort(locMast)', function (obj) {
+        var searchData = {};
+        $.each($('#search-box [name]').serializeArray(), function() {
+            searchData[this.name] = this.value;
+        });
+        searchData['orderByField'] = obj.field;
+        searchData['orderByType'] = obj.type;
+        tableIns.reload({
+            where: searchData,
+            page: {
+                curr: 1
+            },
+            done: function (res, curr, count) {
+                if (res.code === 403) {
+                    top.location.href = baseUrl+"/";
+                }
+                pageCurr=curr;
+                limit();
+            }
+        });
+    });
+
+    // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+    table.on('toolbar(mat)', function (obj) {
+        var checkStatus = table.checkStatus(obj.config.id);
+        switch(obj.event) {
+            case 'addData':
+                showEditModel()
+                break;
+            case 'deleteData':
+                var data = checkStatus.data;
+                if (data.length === 0){
+                    layer.msg('璇烽�夋嫨鏁版嵁');
+                } else {
+                    layer.confirm('纭畾鍒犻櫎'+(data.length===1?'姝�':data.length)+'鏉℃暟鎹悧', function(){
+                        $.ajax({
+                            url: baseUrl+"/mat/delete/auth",
+                            headers: {'token': localStorage.getItem('token')},
+                            data: {param: JSON.stringify(data)},
+                            method: 'POST',
+                            traditional:true,
+                            success: function (res) {
+                                if (res.code === 200){
+                                    layer.closeAll();
+                                    tableReload(false);
+                                } else if (res.code === 403){
+                                    top.location.href = baseUrl+"/";
+                                } else {
+                                    layer.msg(res.msg)
+                                }
+                            }
+                        })
+                    });
+                }
+                break;
+            case 'exportData':
+                layer.confirm('纭畾瀵煎嚭Excel鍚�', {shadeClose: true}, function(){
+                    var titles=[];
+                    var fields=[];
+                    obj.config.cols[0].map(function (col) {
+                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
+                            titles.push(col.title);
+                            fields.push(col.field);
+                        }
+                    });
+                    var exportData = {};
+                    $.each($('#search-box [name]').serializeArray(), function() {
+                        exportData[this.name] = this.value;
+                    });
+                    var param = {
+                        'mat': exportData,
+                        'fields': fields
+                    };
+                    $.ajax({
+                        url: baseUrl+"/mat/export/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: JSON.stringify(param),
+                        dataType:'json',
+                        contentType:'application/json;charset=UTF-8',
+                        method: 'POST',
+                        success: function (res) {
+                            layer.closeAll();
+                            if (res.code === 200) {
+                                table.exportFile(titles,res.data,'xls');
+                            } else if (res.code === 403) {
+                                top.location.href = baseUrl+"/";
+                            } else {
+                                layer.msg(res.msg)
+                            }
+                        }
+                    });
+                });
+                break;
+            // 鎵归噺鎵撳嵃
+            case "btnPrintBatch":
+                printMatCodeNos = [];
+                var data = checkStatus.data;
+                if (data.length === 0){
+                    layer.msg('璇烽�夋嫨鎵撳嵃鏁版嵁');
+                } else {
+                    layer.open({
+                        type: 1,
+                        title: '鎵归噺鎵撳嵃 [鏁伴噺'+ data.length +']',
+                        area: ['500px'],
+                        shadeClose: true,
+                        content: $('#printDataDiv'),
+                        success: function(layero, index){
+                            for (var i = 0; i<data.length;i++) {
+                                printMatCodeNos.push(data[i].matnr);
+                            }
+                        },
+                        end: function () {
+                        }
+                    });
+                }
+                break;
+        }
+    });
+
+    // 鐩戝惉琛屽伐鍏蜂簨浠�
+    table.on('tool(mat)', function(obj){
+        var data = obj.data;
+        switch (obj.event) {
+            // 鎵撳嵃
+            case "btnPrint":
+                printMatCodeNos = [];
+                layer.open({
+                    type: 1,
+                    title: data.matnr + ' [鏁伴噺锛�1]',
+                    area: ['500px'],
+                    shadeClose: true,
+                    content: $('#printDataDiv'),
+                    success: function(layero, index){
+                        layer.iframeAuto(index);
+                        printMatCodeNos.push(data.matnr);
+                    },
+                    end: function () {
+                    }
+                });
+                break;
+            // 缂栬緫
+            case 'edit':
+                showEditModel(data)
+                break;
+        }
+    });
+
+    /* 鏄剧ず琛ㄥ崟寮圭獥 */
+    function showEditModel(mData) {
+        admin.open({
+            type: 1,
+            area: '600px',
+            title: (mData ? '淇敼' : '娣诲姞') + '鍟嗗搧',
+            content: $('#editDialog').html(),
+            success: function (layero, dIndex) {
+                // 鍥炴樉琛ㄥ崟鏁版嵁
+                form.val('detail', mData);
+                // 鏂板鑷姩鐢熸垚鍟嗗搧缂栧彿
+                if (!mData) {
+                    http.get(baseUrl + "/mat/auto/matnr/auth", null, function (res) {
+                        $('#matnr').val(res.data);
+                    })
+                }
+                // 琛ㄥ崟鎻愪氦浜嬩欢
+                form.on('submit(editSubmit)', function (data) {
+                    console.log(data)
+                    data.field.tagId = insXmSel.getValue('valueStr');
+                    if (isEmpty(data.field.tagId)) {
+                        layer.msg('鍒嗙被涓嶈兘涓虹┖', {icon: 2});
+                        return false;
+                    }
+                    var loadIndex = layer.load(2);
+                    $.ajax({
+                        url: baseUrl+"/mat/"+(mData?'update':'add')+"/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: data.field,
+                        method: 'POST',
+                        success: function (res) {
+                            layer.close(loadIndex);
+                            if (res.code === 200){
+                                layer.close(dIndex);
+                                layer.msg(res.msg, {icon: 1});
+                                $(".layui-laypage-btn")[0].click();
+                            } else if (res.code === 403){
+                                top.location.href = baseUrl+"/";
+                            }else {
+                                layer.msg(res.msg, {icon: 2});
+                            }
+                        }
+                    })
+                    return false;
+                });
+                // 娓叉煋涓嬫媺鏍�
+                var insXmSel = xmSelect.render({
+                    el: '#tagSel',
+                    height: '250px',
+                    data: insTb.options.data,
+                    initValue: mData ? [mData.tagId] : [],
+                    model: {label: {type: 'text'}},
+                    prop: {
+                        name: 'name',
+                        value: 'id'
+                    },
+                    radio: true,
+                    clickClose: true,
+                    tree: {
+                        show: true,
+                        indent: 15,
+                        strict: false,
+                        expandedKeys: true
+                    }
+                });
+                // 寮圭獥涓嶅嚭鐜版粴鍔ㄦ潯
+                $(layero).children('.layui-layer-content').css('overflow', 'visible');
+                layui.form.render('select');
+            }
+        });
+    }
+
+    // 妯℃澘閫夋嫨
+    form.on('radio(selectTemplateRadio)', function (data) {
+        $('.template-preview').hide();
+        $('#template-preview-'+data.value).show();
+    });
+
+    // 寮�濮嬫墦鍗�
+    form.on('submit(doPrint)', function (data) {
+        var templateNo = data.field.selectTemplate;
+        $.ajax({
+            url: baseUrl+"/mat/print/auth",
+            headers: {'token': localStorage.getItem('token')},
+            data: {param: printMatCodeNos},
+            method: 'POST',
+            async: false,
+            success: function (res) {
+                if (res.code === 200){
+                    layer.closeAll();
+                    for (let i=0;i<res.data.length;i++){
+                        var templateDom = $("#templatePreview"+templateNo);
+                        var className = templateDom.attr("class");
+                        if (className === 'template-barcode') {
+                            res.data[i]["barcodeUrl"]=baseUrl+"/mac/code/auth?type=1&param="+res.data[i].matnr;
+                        } else {
+                            res.data[i]["barcodeUrl"]=baseUrl+"/mac/code/auth?type=2&param="+res.data[i].matnr;
+                        }
+                    }
+                    var tpl = templateDom.html();
+                    var template = Handlebars.compile(tpl);
+                    var html = template(res);
+                    var box = $("#box");
+                    box.html(html);box.show();
+                    box.print({mediaPrint:true});
+                    box.hide();
+                } else if (res.code === 403){
+                    top.location.href = baseUrl+"/";
+                }else {
+                    layer.msg(res.msg)
+                }
+            }
+        })
+    });
+
+    // 鎼滅储鏍忔悳绱簨浠�
+    form.on('submit(search)', function (data) {
+        pageCurr = 1;
+        tableReload(false);
+    });
+
+    // 鎼滅储鏍忛噸缃簨浠�
+    form.on('submit(reset)', function (data) {
+        pageCurr = 1;
+        clearFormVal($('#search-box'));
+        tableReload(false);
+    });
+
+    // 鏃堕棿閫夋嫨鍣�
+    layDate.render({
+        elem: '#createTime\\$',
+        type: 'datetime'
+    });
+    layDate.render({
+        elem: '#updateTime\\$',
+        type: 'datetime'
+    });
+
+
+});
+
+// excel瀵煎叆妯℃澘涓嬭浇
+function excelMouldDownload(){
+    layer.load(1, {shade: [0.1,'#fff']});
+    location.href = baseUrl + "/mat/excel/import/mould";
+    layer.closeAll('loading');
+}
+
+// excel瀵煎叆
+function importExcel() {
+    $("#importExcel").trigger("click");
+}
+function upload(obj){
+    if(!obj.files) {
+        return;
+    }
+    var file = obj.files[0];
+    admin.confirm('纭鍚屾 [' + file.name +'] 鏂囦欢鍚楋紵', function (index) {
+        layer.load(1, {shade: [0.1,'#fff']});
+        var url = baseUrl + "/mat/excel/import/auth";
+        var form = new FormData();
+        form.append("file", file);
+        xhr = new XMLHttpRequest();
+        xhr.open("post", url, true); //post鏂瑰紡锛寀rl涓烘湇鍔″櫒璇锋眰鍦板潃锛宼rue 璇ュ弬鏁拌瀹氳姹傛槸鍚﹀紓姝ュ鐞嗐��
+        xhr.setRequestHeader('token', localStorage.getItem('token'));
+        xhr.onload = uploadComplete; //璇锋眰瀹屾垚
+        xhr.onerror =  uploadFailed; //璇锋眰澶辫触
+        xhr.onloadend = function () { // // 涓婁紶瀹屾垚閲嶇疆鏂囦欢娴�
+            layer.closeAll('loading');
+            $("#importExcel").val("");
+        };
+        // xhr.upload.onprogress = progressFunction;//銆愪笂浼犺繘搴﹁皟鐢ㄦ柟娉曞疄鐜般��
+        xhr.upload.onloadstart = function(){//涓婁紶寮�濮嬫墽琛屾柟娉�
+            ot = new Date().getTime();   //璁剧疆涓婁紶寮�濮嬫椂闂�
+            oloaded = 0;//璁剧疆涓婁紶寮�濮嬫椂锛屼互涓婁紶鐨勬枃浠跺ぇ灏忎负0
+        };
+        xhr.send(form);
+    }, function(index){
+        $("#importExcel").val("");
+    });
+}
+function uploadComplete(evt) {
+    var res = JSON.parse(evt.target.responseText);
+    if(res.code === 200) {
+        layer.msg(res.msg, {icon: 1});
+        loadTree("");
+    } else {
+        layer.msg(res.msg, {icon: 2});
+    }
+}
+function uploadFailed(evt) {
+    var res = JSON.parse(evt.target.responseText);
+    layer.msg(res.msg, {icon: 2});
+}
+
+// excel瀵煎嚭
+function exportExcel() {
+
+}
+
+
+function tableReload(child) {
+    var searchData = {};
+    $.each($('#search-box [name]').serializeArray(), function() {
+        searchData[this.name] = this.value;
+    });
+    (child ? parent.tableIns : tableIns).reload({
+        where: searchData,
+        page: {
+            curr: pageCurr
+        },
+        done: function (res, curr, count) {
+            if (res.code === 403) {
+                top.location.href = baseUrl+"/";
+            }
+            pageCurr=curr;
+            if (res.data.length === 0 && count !== 0) {
+                tableIns.reload({
+                    where: searchData,
+                    page: {
+                        curr: pageCurr-1
+                    }
+                });
+                pageCurr -= 1;
+            }
+            limit(child);
+        }
+    });
+}
+
+function clearFormVal(el) {
+    $(':input', el)
+        .val('')
+        .removeAttr('checked')
+        .removeAttr('selected');
+}
+
+$('body').keydown(function () {
+    if (event.keyCode === 13) {
+        $("#search").click();
+    }
+});
diff --git a/src/main/webapp/static/js/pakStore/boxOut.js b/src/main/webapp/static/js/pakStore/boxOut.js
new file mode 100644
index 0000000..9377099
--- /dev/null
+++ b/src/main/webapp/static/js/pakStore/boxOut.js
@@ -0,0 +1,180 @@
+var locDetlLayerIdx;
+var locDetlData = [];
+var admin;
+function getCol() {
+    var cols = [
+        // {field: 'count', align: 'center',title: '鍑哄簱鏁伴噺', edit:'text', width: 130,  style:'color: blue;font-weight: bold'},
+        {field: 'anfme', align: 'center',title: '鏁伴噺'}
+        ,{field: 'locNo$', align: 'center',title: '搴撲綅鍙�'}
+        ,{field: 'batch', align: 'center',title: '鏈ㄧ灏哄'}
+        ,{field: 'memo', align: 'center',title: '鏈ㄧ澶囨敞'}
+    ];
+    // cols.push({fixed: 'right', title:'鎿嶄綔', align: 'center', toolbar: '#operate', width: 80})
+    return cols;
+}
+
+layui.config({
+    base: baseUrl + "/static/layui/lay/modules/"
+}).use(['table','laydate', 'form', 'admin'], function() {
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var form = layui.form;
+    admin = layui.admin;
+
+    tableIns = table.render({
+        elem: '#chooseData',
+        headers: {token: localStorage.getItem('token')},
+        data: [],
+        even: true,
+        toolbar: '#toolbar',
+        cellMinWidth: 50,
+        limit: 500,
+        cols: [getCol()],
+        done: function(res, curr, count) {
+            limit();
+            getOutBound();
+        }
+    });
+
+    // 椤甸潰淇敼
+    table.on('edit(chooseData)', function (obj) {
+        let index = obj.tr.attr("data-index");
+        let data = locDetlData[index];
+        let modify = true;
+        // if (obj.field === 'count'){
+        //     let vle = Number(obj.value);
+        //     if (isNaN(vle)) {
+        //         layer.msg("璇疯緭鍏ユ暟瀛�", {icon: 2});
+        //         modify = false;
+        //     } else {
+        //         if (vle <= 0) {
+        //             layer.msg("鏁伴噺蹇呴』澶т簬闆�", {icon: 2});
+        //             modify = false;
+        //         }
+        //         if (vle > Number(data.anfme)) {
+        //             layer.msg("鍑哄簱鏁伴噺涓嶅緱澶т簬搴撳瓨鏁伴噺", {icon: 2});
+        //             modify = false;
+        //         }
+        //     }
+        // }
+        if (modify) {
+            data[obj.field] = obj.value;
+        }
+        tableIns.reload({data: locDetlData});
+    });
+
+    // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+    table.on('toolbar(chooseData)', function (obj) {
+        switch (obj.event) {
+            case 'outbound':
+                if (locDetlData.length === 0){
+                    layer.msg('璇峰厛鎻愬彇鍟嗗搧搴撳瓨', {icon: 2});
+                } else {
+                    var staNo = $("#staNoSelect").val();
+                    if (staNo === "" || staNo === null){
+                        layer.msg("璇烽�夋嫨鍑哄簱鍙�", {icon: 2});
+                        return;
+                    }
+                    let param = {
+                        outSite: staNo,
+                        locDetls: locDetlData
+                    }
+                    $.ajax({
+                        url: baseUrl+"/plate/out/start",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: JSON.stringify(param),
+                        contentType:'application/json;charset=UTF-8',
+                        method: 'POST',
+                        success: function (res) {
+                            if (res.code === 200){
+                                locDetlData = [];
+                                tableIns.reload({data: locDetlData,done:function (res) {limit();getOutBound();}});
+                                layer.msg(res.msg, {icon: 1});
+                            } else if (res.code === 403){
+                                top.location.href = baseUrl+"/";
+                            } else {
+                                layer.msg(res.msg, {icon: 2})
+                            }
+                        }
+                    });
+                }
+                break;
+        }
+    });
+
+    // 鐩戝惉琛屽伐鍏蜂簨浠�
+    table.on('tool(chooseData)', function(obj){
+        switch (obj.event) {
+            case 'remove':
+                let index = obj.tr.attr("data-index");
+                locDetlData.splice(index, 1);
+                tableIns.reload({data: locDetlData});
+                break;
+        }
+    });
+
+    // 鑾峰彇鍑哄簱鍙�
+    function getOutBound(){
+        $.ajax({
+            url: baseUrl+"/available/take/site",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            async: false,
+            success: function (res) {
+                if (res.code === 200){
+                    var tpl = $("#takeSiteSelectTemplate").html();
+                    var template = Handlebars.compile(tpl);
+                    var html = template(res);
+                    $('#staNoSelect').append(html);
+                    form.render('select');
+                } else if (res.code === 403){
+                    top.location.href = baseUrl+"/";
+                }else {
+                    layer.msg(res.msg)
+                }
+            }
+        })
+    }
+
+
+    $(document).on('click','#mat-query', function () {
+        let loadIndex = layer.msg('璇锋眰涓�...', {icon: 16, shade: 0.01, time: false});
+        locDetlLayerIdx = layer.open({
+            type: 2,
+            title: false,
+            closeBtn: false,
+            maxmin: false,
+            area: ['90%', '85%'],
+            shadeClose: true,
+            content: 'boxQuery.html',
+            success: function(layero, index){
+                layer.close(loadIndex);
+            }
+        });
+    })
+
+})
+
+// 娣诲姞琛ㄦ牸鏁版嵁
+function addTableData(data) {
+    let newData = [];
+
+    for (let i = 0; i < data.length; i++) {
+        let item = data[i];
+        let exist = locDetlData.some(old =>
+            (old.locNo$ === item.locNo$ || old.locNo === item.locNo)
+        );
+
+        if (!exist) {
+            item.count = item.anfme;
+            newData.push(item);
+        }
+    }
+
+    locDetlData = locDetlData.concat(newData);
+    console.log("浼犲叆琛ㄦ牸鏁版嵁闀垮害锛�", locDetlData.length, locDetlData);
+    tableIns.reload({data: locDetlData});
+    layer.close(locDetlLayerIdx);
+}
+
diff --git a/src/main/webapp/views/mat/boxMat.html b/src/main/webapp/views/mat/boxMat.html
new file mode 100644
index 0000000..bb8b246
--- /dev/null
+++ b/src/main/webapp/views/mat/boxMat.html
@@ -0,0 +1,444 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title></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, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/tree.css" media="all">
+    <style>
+        body {
+            color: #595959;
+            background-color: #f5f7f9;
+        }
+        .layui-fluid {
+            padding: 15px;
+        }
+        .layui-form.layui-border-box.layui-table-view {
+            /*margin: 15px 0 35px 0;*/
+            width: 100%;
+            border-width: 1px;
+        }
+        .layui-form.layui-border-box.layui-table-view {
+            height: calc(100vh - 160px);
+        }
+        .layui-form.layui-border-box.layui-table-view {
+            margin: 0;
+        }
+        #search-box {
+            padding: 30px 30px 10px 0px;
+            margin-left: 0px;
+        }
+        .layui-form.layui-border-box.layui-table-view {
+            height: 100%;
+        }
+
+        .admin-form {
+            padding: 25px 30px 0 0 !important;
+            margin: 0 !important;
+        }
+
+        /* ------------------------- 鎵撳嵃琛ㄦ牸 -----------------------  */
+        .template-preview {
+            height: 200px;
+            display: inline-block;
+        }
+        .contain td {
+            border: 1px solid #000;
+            /*font-family: 榛戜綋;*/
+            /*font-weight: bold;*/
+            /*color: #000000;*/
+        }
+    </style>
+</head>
+<body>
+
+<div class="layui-fluid">
+    <!-- 宸� -->
+    <div class="layui-row layui-col-space15">
+        <div class="layui-col-md3">
+            <div class="layui-card">
+                <div class="layui-card-body" style="padding: 10px;">
+                    <!-- 鏍戝伐鍏锋爮 -->
+                    <div class="layui-form toolbar" id="organizationTreeBar">
+                        <div class="layui-inline" style="max-width: 200px;">
+                            <input id="condition" onkeyup="findData(this)" type="text" class="layui-input" placeholder="璇疯緭鍏ュ叧閿瓧" autocomplete="off">
+                        </div>
+                        <div class="layui-inline">
+                            <button class="layui-btn icon-btn layui-btn-sm" id="treeReset" style="padding: 0 10px">
+                                <i class="layui-icon layui-icon-close"></i>
+                            </button>
+                        </div>
+                    </div>
+                    <!-- 鏍� -->
+                    <div class="layui-form toolbar" id="organizationTree"></div>
+                </div>
+            </div>
+        </div>
+        <!-- 鍙� -->
+        <div class="layui-col-md9">
+            <div class="layui-card">
+                <div class="layui-card-body" style="padding: 10px;">
+                    <!-- 琛ㄦ牸宸ュ叿鏍�2 -->
+                    <div id="search-box" class="layui-form toolbar"  style="padding-top: 5px">
+<!--                        <div class="layui-inline">-->
+<!--                            <label class="layui-form-label" style="padding: 8px 15px 8px 15px">鏈ㄧ灏哄:</label>-->
+<!--                            <div class="layui-input-inline">-->
+<!--                                <input name="name" class="layui-input" placeholder="杈撳叆鏈ㄧ灏哄"/>-->
+<!--                            </div>-->
+<!--                        </div>-->
+                        <div class="layui-inline">
+                            <label class="layui-form-label" style="padding: 8px 15px 8px 15px">鏈ㄧ鍐呭:</label>
+                            <div class="layui-input-inline">
+                                <input name="memo" class="layui-input" placeholder="杈撳叆鏁版嵁"/>
+                            </div>
+                        </div>
+<!--                        <div class="layui-inline">-->
+<!--                            <label class="layui-form-label" style="padding: 8px 15px 8px 15px">鍟嗗搧瑙勬牸:</label>-->
+<!--                            <div class="layui-input-inline">-->
+<!--                                <input name="specs" class="layui-input" placeholder="杈撳叆鍟嗗搧瑙勬牸"/>-->
+<!--                            </div>-->
+<!--                        </div>-->
+                        <div class="layui-inline">&emsp;
+                            <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
+                                <i class="layui-icon">&#xe615;</i>鎼滅储
+                            </button>
+                            <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>
+                                <i class="layui-icon">&#xe666;</i>閲嶇疆
+                            </button>
+                        </div>
+                    </div>
+                    <table class="layui-hide" id="mat" lay-filter="mat"></table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/html" id="tagTpl">
+    <span name="tagId" class="layui-badge layui-badge-gray">{{d.tagId$}}</span>
+</script>
+
+<script type="text/html" id="toolbar">
+    <div class="layui-btn-container">
+<!--        <button class="layui-btn layui-btn-sm" id="btn-print-batch" lay-event="btnPrintBatch">鎵归噺鎵撳嵃</button>-->
+        <button class="layui-btn layui-btn-sm layui-btn-normal" id="btn-add" lay-event="addData">鏂板</button>
+        <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">鍒犻櫎</button>
+        <!-- 鍟嗗搧/鐗╂枡 鏁版嵁涓績 -->
+        <div class="dropdown-menu" style="float: right">
+<!--            <button class="layui-btn layui-btn-primary layui-border-black icon-btn layui-btn-sm">&nbsp;鏁版嵁鍚屾 <i class="layui-icon layui-icon-drop"></i></button>-->
+            <ul class="dropdown-menu-nav dark">
+                <div class="dropdown-anchor"></div>
+                <li class="title">1st menu</li>
+<!--                <li><a onclick="excelMouldDownload()" style="font-size: 12px"><i class="layui-icon layui-icon-template-1"></i>妯℃澘涓嬭浇</a></li>-->
+<!--                <li><a onclick="importExcel()" style="font-size: 12px"><i class="layui-icon layui-icon-upload"></i>瀵煎叆 Excel</a></li>-->
+<!--                <li style="display: none"><input id="importExcel" type="file" onchange="upload(this)" ></li>-->
+                <hr>
+                <li class="title">2nd menu</li>
+<!--                <li><a onclick="exportExcel()" style="font-size: 12px"><i class="layui-icon layui-icon-export"></i>瀵煎嚭 Excel</a></li>-->
+            </ul>
+        </div>
+        <!--        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right;margin-right: -10px">瀵煎嚭</button>-->
+    </div>
+</script>
+
+<script type="text/html" id="operate">
+    <a class="layui-btn layui-btn-xs btn-edit layui-btn-primary" lay-event="edit">淇敼</a>
+<!--    <button class="layui-btn layui-btn-xs btn-print" lay-event="btnPrint">鎵撳嵃</button>-->
+</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>
+<script type="text/javascript" src="../../static/js/jquery/jQuery.print.js"></script>
+<script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script>
+<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/mat/boxMat.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/tagTree.js" charset="utf-8"></script>
+
+<!-- 琛ㄥ崟寮圭獥 -->
+<script type="text/html" id="editDialog">
+    <form id="detail" lay-filter="detail" class="layui-form admin-form">
+        <input name="id" type="hidden">
+        <input name="uuid" type="hidden">
+        <input name="nodeId" type="hidden">
+        <input name="tag_id" type="hidden">
+        <input name="model" type="hidden">
+        <input name="name" type="hidden">
+        <input name="batch" type="hidden">
+        <input name="docId" type="hidden">
+        <input name="docNum" type="hidden">
+        <input name="custName" type="hidden">
+        <input name="itemNum" type="hidden">
+        <input name="count" type="hidden">
+        <input name="weight" type="hidden">
+        <input name="status" type="hidden">
+        <input name="createBy" type="hidden">
+        <input name="updateTime$" type="hidden">
+        <input name="updateBy" type="hidden">
+        <div class="layui-row">
+
+            <div class="layui-col-md6">
+
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鍒嗙被</label>
+                    <div class="layui-input-block">
+                        <div id="tagSel" class="ew-xmselect-tree"></div>
+                    </div>
+                </div>
+
+                <div class="layui-form-item">
+                    <label class="layui-form-label layui-form-required">鏈ㄧ璧勬枡</label>
+                    <div class="layui-input-block">
+                        <input name="memo" placeholder="璇疯緭鍏ヨ祫鏂�" class="layui-input" lay-vertype="tips" lay-verify="required" required="">
+                    </div>
+                </div>
+
+<!--                <div class="layui-form-item">-->
+<!--                    <label class="layui-form-label">閰嶇疆</label>-->
+<!--                    <div class="layui-input-block">-->
+<!--                        <input name="specs" placeholder="璇疯緭鍏ラ厤缃�" class="layui-input">-->
+<!--                    </div>-->
+<!--                </div>-->
+
+<!--                <div class="layui-form-item">-->
+<!--                    <label class="layui-form-label">鎬婚噸閲�</label>-->
+<!--                    <div class="layui-input-block">-->
+<!--                        <input name="weight" placeholder="璇疯緭鍏ユ�婚噸閲�" class="layui-input">-->
+<!--                    </div>-->
+<!--                </div>-->
+
+<!--                <div class="layui-form-item">-->
+<!--                    <label class="layui-form-label">鍗曠浣撶Н</label>-->
+<!--                    <div class="layui-input-block">-->
+<!--                        <input name="volume" placeholder="璇疯緭鍏ュ崟绠变綋绉�" class="layui-input">-->
+<!--                    </div>-->
+<!--                </div>-->
+
+<!--            </div>-->
+
+<!--            <div class="layui-col-md6">-->
+<!--                <div class="layui-form-item">-->
+<!--                    <label class="layui-form-label layui-form-required">鍟嗗搧缂栧彿</label>-->
+<!--                    <div class="layui-input-block">-->
+<!--                        <input id="matnr" name="matnr" placeholder="璇疯緭鍏ュ晢鍝佺紪鍙�" class="layui-input" lay-vertype="tips" lay-verify="required" required="">-->
+<!--                    </div>-->
+<!--                </div>-->
+
+<!--                <div class="layui-form-item">-->
+<!--                    <label class="layui-form-label">瑙勬牸</label>-->
+<!--                    <div class="layui-input-block">-->
+<!--                        <input name="specs" placeholder="璇疯緭鍏ヤ唬鐮�" class="layui-input">-->
+<!--                    </div>-->
+<!--                </div>-->
+
+<!--                <div class="layui-form-item">-->
+<!--                    <label class="layui-form-label">澶囨敞</label>-->
+<!--                    <div class="layui-input-block">-->
+<!--                        <input name="memo" placeholder="璇疯緭鍏ュ娉�" class="layui-input">-->
+<!--                    </div>-->
+<!--                </div>-->
+
+<!--                <div class="layui-form-item">-->
+<!--                    <label class="layui-form-label">鍗曠姣涢噸</label>-->
+<!--                    <div class="layui-input-block">-->
+<!--                        <input name="length" placeholder="璇疯緭鍏ュ崟绠辨瘺閲�" class="layui-input">-->
+<!--                    </div>-->
+<!--                </div>-->
+
+<!--                <div class="layui-form-item">-->
+<!--                    <label class="layui-form-label">鍗曠浣撶Н</label>-->
+<!--                    <div class="layui-input-block">-->
+<!--                        <input name="threeCode" placeholder="璇疯緭鍏ョ瀛愬昂瀵�" class="layui-input">-->
+<!--                    </div>-->
+<!--                </div>-->
+
+            </div>
+        </div>
+        <hr class="layui-bg-gray">
+        <div class="layui-form-item text-right">
+            <button class="layui-btn" lay-filter="editSubmit" lay-submit="">淇濆瓨</button>
+            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">鍙栨秷</button>
+        </div>
+    </form>
+</script>
+
+<!--&lt;!&ndash; 鎵撳嵃鎿嶄綔寮圭獥 &ndash;&gt;-->
+<!--<div id="printDataDiv" style="display: none;padding: 20px">-->
+<!--    <div class="layui-form" style="text-align: center">-->
+<!--        <hr>-->
+<!--        &lt;!&ndash;鍗曢�夋&ndash;&gt;-->
+<!--        <div class="layui-form-item" style="display: inline-block; margin-bottom: 10px">-->
+<!--            <input type="radio" name="selectTemplate" value="1" title="妯℃澘涓�"  lay-filter="selectTemplateRadio" checked="">-->
+<!--            <input type="radio" name="selectTemplate" value="2" title="妯℃澘浜�" lay-filter="selectTemplateRadio">-->
+<!--            <input type="radio" name="selectTemplate" value="3" title="妯℃澘涓�" lay-filter="selectTemplateRadio">-->
+<!--        </div>-->
+<!--        <fieldset class="layui-elem-field site-demo-button" style="margin-top: 30px;text-align: left;">-->
+<!--            <legend>鎵撳嵃棰勮</legend>-->
+<!--            <div id="template-container" style="margin: 20px;text-align: center">-->
+
+<!--                &lt;!&ndash; 棰勮鍥� 1 &ndash;&gt;-->
+<!--                <div id="template-preview-1" class="template-preview" style="display: inline-block">-->
+<!--                    <table class="contain" width="280" style="overflow: hidden;font-size: xx-small;table-layout: fixed;">-->
+<!--                        <tr style="height: 74px">-->
+<!--                            <td colspan="3" align="center" scope="col">鍟嗗搧缂栫爜</td>-->
+<!--                            <td class="barcode" colspan="9" align="center" scope="col">-->
+<!--                                <img class="template-code template-barcode" src="" width="90%;">-->
+<!--                                <div style="letter-spacing: 2px;margin-top: 1px; text-align: center;">-->
+<!--                                    <span>xxxxxx</span>-->
+<!--                                </div>-->
+<!--                            </td>-->
+<!--                        </tr>-->
+<!--                        <tr style="height: 74px">-->
+<!--                            <td align="center" colspan="3">鍟嗗搧</td>-->
+<!--                            <td align="center" colspan="5">xxxxxx-xx/xx</td>-->
+<!--                            <td align="center" colspan="2">澶囨敞</td>-->
+<!--                            <td align="center" colspan="2">xx</td>-->
+<!--                        </tr>-->
+<!--                    </table>-->
+<!--                </div>-->
+
+<!--                &lt;!&ndash; 棰勮鍥� 2 &ndash;&gt;-->
+<!--                <div id="template-preview-2" class="template-preview" style="display: none">-->
+<!--                    <table class="contain" width="280" style="overflow: hidden;font-size: xx-small;table-layout: fixed;">-->
+<!--                        <tr style="height: 30px">-->
+<!--                            <td align="center" width="20%">鍟嗗搧</td>-->
+<!--                            <td align="center" width="80%" style="overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">xxxxxxx</td>-->
+<!--                        </tr>-->
+<!--                        <tr style="height: 30px">-->
+<!--                            <td align="center" width="20%">澶囨敞</td>-->
+<!--                            <td align="center" width="80%">xxxxxxxx</td>-->
+<!--                        </tr>-->
+<!--                        <tr style="height: 75px;">-->
+<!--                            <td align="center" colspan="2" width="100%" style="border: none">-->
+<!--                                <img class="template-code template-barcode" src="" width="80%">-->
+<!--                                <div style="letter-spacing: 2px;margin-top: 1px; text-align: center">-->
+<!--                                    <span>xxxxxx</span>-->
+<!--                                </div>-->
+<!--                            </td>-->
+<!--                        </tr>-->
+<!--                    </table>-->
+<!--                </div>-->
+
+<!--                &lt;!&ndash; 棰勮鍥� 3 &ndash;&gt;-->
+<!--                <div id="template-preview-3" class="template-preview" style="display: none">-->
+<!--                    <table class="contain" width="280" style="overflow: hidden;font-size: xx-small;table-layout: fixed;">-->
+<!--                        <tr style="height: 74px">-->
+<!--                            <td align="center" scope="col" colspan="1">鍟嗗搧</td>-->
+<!--                            <td align="center" scope="col" colspan="1" style="">xxxxxx-xx/xx</td>-->
+<!--                            <td align="center" scope="col" colspan="2" rowspan="2">-->
+<!--                                <img class="template-code template-qrcode" src="" width="80%">-->
+<!--                                <div style="letter-spacing: 1px;margin-top: 1px; text-align: center">-->
+<!--                                    <span>xxxxxx</span>-->
+<!--                                </div>-->
+<!--                            </td>-->
+<!--                        </tr>-->
+<!--                        <tr style="height: 74px">-->
+<!--                            <td align="center" colspan="1">澶囨敞</td>-->
+<!--                            <td align="center" colspan="1" style="overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">xxxxxxx</td>-->
+<!--                        </tr>-->
+<!--                    </table>-->
+<!--                </div>-->
+<!--            </div>-->
+<!--        </fieldset>-->
+
+<!--        <button class="layui-btn" id="doPrint" lay-submit lay-filter="doPrint" style="margin-top: 20px">纭畾</button>-->
+<!--    </div>-->
+<!--</div>-->
+
+<!--<div id="box" style="display: block"></div>-->
+
+<!-- 鍒濆鍖栨墦鍗版ā鏉跨殑鏉″舰鐮� -->
+<script type="text/javascript">
+    $('.template-barcode').attr("src", baseUrl+"/mac/code/auth?type=1&param=123");
+    $('.template-qrcode').attr("src", baseUrl+"/mac/code/auth?type=2&param=123");
+</script>
+
+<!-- 妯℃澘寮曟搸 -->
+<!-- 妯℃澘1 -->
+<script type="text/template" id="templatePreview1" class="template-barcode">
+    {{#each data}}
+    <table class="contain" width="280" style="overflow: hidden;font-size: small;table-layout: fixed;">
+        <tr style="height: 74px">
+            <td align="center" colspan="3" scope="col">鍟嗗搧缂栫爜</td>
+            <td align="center" class="barcode" colspan="9" scope="col">
+                <img class="template-code" src="{{this.barcodeUrl}}" width="90%">
+                <div style="letter-spacing: 2px;margin-top: 1px; text-align: center">
+                    <span>{{this.matnr}}</span>
+                </div>
+            </td>
+        </tr>
+        <tr style="height: 74px">
+            <td align="center" colspan="3">鍟嗗搧</td>
+            <td align="center" colspan="5" style="overflow: hidden; white-space: nowrap;text-overflow: ellipsis;">{{this.maktx}}</td>
+            <td align="center" colspan="2">澶囨敞</td>
+            <td align="center" colspan="2">{{this.memo}}</td>
+        </tr>
+    </table>
+    {{/each}}
+</script>
+<!-- 妯℃澘2 -->
+<script type="text/template" id="templatePreview2" class="template-barcode">
+    {{#each data}}
+    <table class="contain" width="280" style="overflow: hidden;font-size: xx-small;table-layout: fixed;">
+        <tr style="height: 35px">
+            <td align="center" width="20%">鍟嗗搧</td>
+            <td align="center" width="80%" style="overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">{{this.maktx}}</td>
+        </tr>
+        <tr style="height: 35px">
+            <td align="center" width="20%">澶囨敞</td>
+            <td align="center" width="80%">{{this.memo}}</td>
+        </tr>
+        <tr style="height: 79px;">
+            <td align="center" colspan="2" width="100%" style="border: none">
+                <img class="template-code" src="{{this.barcodeUrl}}" width="80%">
+                <div style="letter-spacing: 2px;margin-top: 1px; text-align: center">
+                    <span>{{this.matnr}}</span>
+                </div>
+            </td>
+        </tr>
+    </table>
+    {{/each}}
+</script>
+<!-- 妯℃澘3 -->
+<script type="text/template" id="templatePreview3" class="template-qrcode">
+    {{#each data}}
+    <table class="contain" width="280" style="overflow: hidden;font-size: xx-small;table-layout: fixed;">
+        <tr style="height: 74px" >
+            <td align="center" scope="col" colspan="1">鍟嗗搧</td>
+            <td align="center" scope="col" colspan="1" style="
+                display: inline-block;
+                line-height: 20px;
+                vertical-align: middle;
+                border: none;
+                border-top: 1px solid #000;
+                overflow: hidden;
+                text-overflow: ellipsis;
+                display: -webkit-box;
+                -webkit-line-clamp: 3;
+                -webkit-box-orient: vertical;
+                    ">
+                {{this.maktx}}
+            </td>
+            <td align="center" scope="col" colspan="2" rowspan="2">
+                <img class="template-code template-qrcode" src="{{this.barcodeUrl}}" width="80%">
+                <div style="letter-spacing: 1px;margin-top: 1px; text-align: center">
+                    <span>{{this.matnr}}</span>
+                </div>
+            </td>
+        </tr>
+        <tr style="height: 74px">
+            <td align="center" colspan="1">澶囨敞</td>
+            <td align="center" colspan="1" style="overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">{{this.memo}}</td>
+        </tr>
+    </table>
+    {{/each}}
+</script>
+
+</body>
+</html>
+
diff --git a/src/main/webapp/views/pakStore/boxOut.html b/src/main/webapp/views/pakStore/boxOut.html
new file mode 100644
index 0000000..1ea8fbf
--- /dev/null
+++ b/src/main/webapp/views/pakStore/boxOut.html
@@ -0,0 +1,132 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title></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, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/common.css" media="all">
+    <style>
+        html {
+            height: 100%;
+            padding: 10px;
+            background-color: #f1f1f1;
+            box-sizing: border-box;
+        }
+        body {
+            background-color: #fff;
+            border-radius: 5px;
+            box-shadow: 0 0 3px rgba(0,0,0,.3);
+            padding-bottom: 20px;
+        }
+
+        #staNoSpan {
+            text-align: center;
+            display: inline-block;
+            width: 100px;
+            font-size: 13px;
+        }
+        .layui-btn-container .layui-form-select {
+            display: inline-block;
+            width: 150px;
+            height: 30px;
+        }
+        .layui-btn-container .layui-form-select.layui-form-selected {
+            display: inline-block;
+            width: 150px;
+        }
+        .layui-btn-container .layui-select-title input {
+            font-size: 13px;
+        }
+        .layui-btn-container .layui-anim.layui-anim-upbit dd {
+            font-size: 13px;
+        }
+
+        #btn-outbound {
+            margin-left: 60px;
+            display: none;
+        }
+
+        /*----------------------------------*/
+        .function-area {
+            padding: 20px 50px;
+        }
+        .function-btn {
+            font-size: 16px;
+            padding: 1px 2px;
+            width: 100px;
+            height: 50px;
+            border-color: #2b425b;
+            border-radius: 4px;
+            border-width: 2px;
+            background: none;
+            border-style: solid;
+            transition: 0.4s;
+            cursor: pointer;
+            letter-spacing: 1.5px;
+        }
+        .function-btn:hover {
+            background-color: #2b425b;
+            color: #fff;
+        }
+
+        #mat-query {
+            display: none;
+        }
+    </style>
+</head>
+<body>
+
+<!-- 鍔熻兘鍖� -->
+<div class="function-area">
+    <button id="mat-query" class="function-btn">鎻愬彇搴撳瓨</button>
+</div>
+
+<hr>
+
+<!-- 琛ㄦ牸 -->
+<div style="padding-bottom: 5px; margin-bottom: 45px">
+
+    <!-- 澶撮儴 -->
+    <script type="text/html" id="toolbar">
+        <div class="layui-form">
+            <div class="layui-btn-container">
+                <!-- 1.閫夋嫨鍑哄簱鍙� -->
+                <span id="staNoSpan">鍑哄簱鍙o細</span>
+                <select id="staNoSelect" lay-verify="required">
+                    <option value="">璇烽�夋嫨绔欑偣</option>
+                </select>
+                <!-- 2.鍚姩鍑哄簱 -->
+                <button class="layui-btn layui-btn-lg" id="btn-outbound" lay-event="outbound">鍚姩鍑哄簱</button>
+            </div>
+        </div>
+    </script>
+
+    <!-- 琛� -->
+    <script type="text/html" id="operate">
+        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="remove">绉婚櫎</a>
+    </script>
+
+    <table class="layui-table" id="chooseData" lay-filter="chooseData"></table>
+</div>
+
+<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>
+<script type="text/javascript" src="../../static/js/jquery/jQuery.print.js"></script>
+<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script>
+<script type="text/javascript" src="../../static/js/pakStore/boxOut.js" charset="utf-8"></script>
+
+<script type="text/template" id="takeSiteSelectTemplate">
+    {{#each data}}
+    <option value="{{siteId}}">{{desc}}</option>
+    {{/each}}
+</script>
+</body>
+</html>
+
diff --git a/src/main/webapp/views/pakStore/boxQuery.html b/src/main/webapp/views/pakStore/boxQuery.html
new file mode 100644
index 0000000..b34da5a
--- /dev/null
+++ b/src/main/webapp/views/pakStore/boxQuery.html
@@ -0,0 +1,243 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="utf-8">
+  <title></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, maximum-scale=1">
+  <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+  <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
+  <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+  <link rel="stylesheet" href="../../static/css/common.css" media="all">
+  <style>
+    body {
+    }
+    .layui-table-box {
+      border-right: 1px solid #9F9F9F;
+      border-left: 1px solid #9F9F9F;
+    }
+
+    #search-box {
+      padding: 30px 0 20px 0;
+    }
+    #search-box .layui-inline:first-child {
+      margin-left: 30px;
+    }
+    #search-box .layui-inline {
+      margin-right: 5px;
+    }
+
+    #data-search-btn {
+      margin-left: 10px;
+      display: inline-block;
+    }
+    #data-search-btn.layui-btn-container .layui-btn {
+      margin-right: 20px;
+    }
+  </style>
+</head>
+<body>
+<div style="padding: 25px; line-height: 22px; background-color: #393D49; color: #fff; font-weight: 300;">
+  <span style="font-size: large; font-weight: bold">鎻愬彇搴撳瓨鍟嗗搧</span>
+</div>
+<!-- 鎼滅储鏍� -->
+<fieldset class="layui-elem-field site-demo-button" style="margin: 20px;">
+  <legend>鎼滅储鏍�</legend>
+  <!-- 鎼滅储鏍� -->
+  <div id="search-box" class="layui-form layui-card-header">
+    <div class="layui-inline">
+      <div class="layui-input-inline cool-auto-complete">
+        <input id="crnNo" class="layui-input" name="crnNo" type="text" placeholder="璇疯緭鍏�" autocomplete="off" style="display: none">
+        <input id="crnNo$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="鍫嗗灈鏈哄彿" onfocus=this.blur()>
+        <div class="cool-auto-complete-window">
+          <input class="cool-auto-complete-window-input" data-key="basCrnpQueryBycrnNo" onkeyup="autoLoad(this.getAttribute('data-key'))">
+          <select class="cool-auto-complete-window-select" data-key="basCrnpQueryBycrnNoSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
+          </select>
+        </div>
+      </div>
+    </div>
+    <div class="layui-inline">
+      <div class="layui-input-inline">
+        <input class="layui-input" type="text" name="loc_no" placeholder="搴撲綅鍙�" autocomplete="off">
+      </div>
+    </div>
+<!--    <div class="layui-inline">-->
+<!--      <div class="layui-input-inline">-->
+<!--        <input class="layui-input" type="text" name="matnr" placeholder="绌虹" autocomplete="off">-->
+<!--      </div>-->
+<!--    </div>-->
+    <div class="layui-inline">
+      <div class="layui-input-inline">
+        <input class="layui-input" type="text" name="batch" placeholder="灏哄" autocomplete="off">
+      </div>
+    </div>
+    <div class="layui-inline">
+      <div class="layui-input-inline">
+        <input class="layui-input" type="text" name="memo" placeholder="澶囨敞" autocomplete="off">
+      </div>
+    </div>
+    <!-- 鏃ユ湡鑼冨洿 -->
+    <div class="layui-inline" style="width: 300px">
+      <div class="layui-input-inline">
+        <input class="layui-input layui-laydate-range" name="modi_time" type="text" placeholder="璧峰鏃堕棿 - 缁堟鏃堕棿" autocomplete="off" style="width: 300px">
+      </div>
+    </div>
+    <!-- 寰呮坊鍔� -->
+    <div id="data-search-btn" class="layui-btn-container layui-form-item" style="display: inline-block">
+      <button id="search" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="search">鎼滅储</button>
+    </div>
+  </div>
+</fieldset>
+
+<script type="text/html" id="toolbar">
+  <div class="layui-btn-container">
+    <button class="layui-btn" id="btn-confirm" lay-event="confirm" style="">鎻愬彇</button>
+  </div>
+</script>
+
+<div class="layui-form">
+  <table class="layui-hide" id="stockOut" lay-filter="stockOut"></table>
+</div>
+
+<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>
+<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script>
+
+</body>
+<script>
+
+  function getCol() {
+    var cols = [
+      {type: 'checkbox', merge: ['locNo']}
+      ,{field: 'locNo', align: 'center',title: '搴撲綅鍙�', merge: true, style: 'font-weight: bold'}
+      ,{field: 'matnr', align: 'center',title: '鐗╂枡绫诲瀷',style: 'font-weight: bold'}
+      ,{field: 'batch', align: 'center',title: '鏈ㄧ灏哄',style: 'font-weight: bold'}
+      ,{field: 'memo', align: 'center',title: '鏈ㄧ澶囨敞',style: 'font-weight: bold'}
+      ,{field: 'anfme', align: 'center',title: '鏁伴噺',style: 'font-weight: bold'}
+
+    ];
+    cols.push({field: 'modiUser$', align: 'center',title: '淇敼浜哄憳',hide:true}
+            ,{field: 'modiTime$', align: 'center',title: '淇敼鏃堕棿'})
+    return cols;
+  }
+
+  layui.config({
+    base: baseUrl + "/static/layui/lay/modules/"
+  }).use(['table','laydate', 'form', 'admin', 'tableMerge'], function() {
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+    var admin = layui.admin;
+    var tableMerge = layui.tableMerge;
+    var dataSource = []
+
+    // 鏁版嵁娓叉煋
+    locDetlTableIns = table.render({
+      elem: '#stockOut',
+      headers: {token: localStorage.getItem('token')},
+      url: baseUrl+'/stock/boxOut/list/auth',
+      page: true,
+      limits: [16, 30, 50, 100, 200, 500],
+      limit: 16,
+      even: true,
+      toolbar: '#toolbar',
+      cellMinWidth: 50,
+      cols: [getCol()],
+      request: {
+        pageName: 'curr',
+        pageSize: 'limit',
+      },
+      parseData: function (res) {
+        dataSource = res.data.records
+        return {
+          'code': res.code,
+          'msg': res.msg,
+          'count': res.data.total,
+          'data': res.data.records
+        }
+      },
+      response: {
+        statusCode: 200
+      },
+      done: function(res, curr, count) {
+        tableMerge.render(this);
+        if (res.code === 403) {
+          top.location.href = baseUrl+"/";
+        }
+      }
+    });
+
+    // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+    table.on('toolbar(stockOut)', function (obj) {
+
+      var checkStatus = table.checkStatus(obj.config.id);
+      var data = checkStatus.data;
+      var dataList = []
+      for (var j = 0; j < data.length; j++) {
+        var locno = data[j].locNo
+        for(var i = 0;i < dataSource.length; i++) {
+          if (dataSource[i].locNo === locno) {
+            dataList.push(dataSource[i])
+          }
+        }
+      }
+
+      switch(obj.event) {
+        case 'confirm':
+          if (data.length === 0){
+            layer.msg("璇烽�夋嫨鏁版嵁");
+            return;
+          }
+
+          const reqDate = [...new Set(dataList.map(obj => obj.locNo))]
+          $.ajax({
+            url: baseUrl+"/getBoxLocDateByLocNo",
+            headers: {'token': localStorage.getItem('token')},
+            data: JSON.stringify(reqDate),
+            contentType:'application/json;charset=UTF-8',
+            dataType:'json',
+            method: 'POST',
+            success: function (res) {
+              if (res.code === 200){
+                console.log(res)
+                parent.addTableData(res.data);
+              } else if (res.code === 403){
+                top.location.href = baseUrl+"/";
+              } else {
+                layer.msg(res.msg, {icon: 2})
+              }
+            }
+          });
+          break;
+      }
+    });
+
+    // 鎼滅储鏍忔悳绱簨浠�
+    form.on('submit(search)', function (data) {
+      tableReload();
+    });
+
+    layDate.render({
+      elem: '.layui-laydate-range'
+      ,type: 'datetime'
+      ,range: true
+    });
+  })
+
+  function tableReload() {
+    var searchData = {};
+    $.each($('#search-box [name]').serializeArray(), function() {
+      searchData[this.name] = this.value;
+    });
+    locDetlTableIns.reload({
+      where: searchData,
+    });
+  }
+</script>
+</html>
+
diff --git a/src/main/webapp/views/pakStore/locDetlQuery.html b/src/main/webapp/views/pakStore/locDetlQuery.html
index 12616cf..6e7e5b1 100644
--- a/src/main/webapp/views/pakStore/locDetlQuery.html
+++ b/src/main/webapp/views/pakStore/locDetlQuery.html
@@ -77,6 +77,21 @@
                 <input class="layui-input" type="text" name="unit" placeholder="绠卞彿" autocomplete="off">
             </div>
         </div>
+        <div class="layui-inline">
+            <div class="layui-input-inline">
+                <input class="layui-input" type="text" name="matnr" placeholder="绌虹" autocomplete="off">
+            </div>
+        </div>
+        <div class="layui-inline">
+            <div class="layui-input-inline">
+                <input class="layui-input" type="text" name="batch" placeholder="灏哄" autocomplete="off">
+            </div>
+        </div>
+        <div class="layui-inline">
+            <div class="layui-input-inline">
+                <input class="layui-input" type="text" name="memo" placeholder="澶囨敞" autocomplete="off">
+            </div>
+        </div>
         <!-- 鏃ユ湡鑼冨洿 -->
         <div class="layui-inline" style="width: 300px">
             <div class="layui-input-inline">

--
Gitblit v1.9.1