From 1a88411d65508409011cdedb4d8d8b74bb60baa6 Mon Sep 17 00:00:00 2001
From: pang.jiabao <pang_jiabao@163.com>
Date: 星期三, 18 十二月 2024 09:01:58 +0800
Subject: [PATCH] 库位冻结/解冻,库存冻结/解冻

---
 src/main/webapp/views/locDetl/locDetl.html                     |   23 ++
 src/main/webapp/views/locMast/locMast.html                     |   18 +
 src/main/java/com/zy/asrs/mapper/LocDetlMapper.java            |   14 +
 src/main/java/com/zy/asrs/controller/LocMastController.java    |   75 +++++++-
 src/main/java/com/zy/asrs/service/LocDetlService.java          |   12 +
 src/main/java/com/zy/asrs/controller/LocDetlController.java    |   21 ++
 src/main/resources/mapper/LocDetlMapper.xml                    |    7 
 src/main/resources/mapper/LocMastMapper.xml                    |    9 
 src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java |   22 ++
 src/main/webapp/views/pakStore/locDetlQuery.html               |   14 +
 src/main/webapp/static/js/stoMan/stoQue.js                     |   10 +
 src/main/webapp/static/js/locDetl/locDetl.js                   |   83 +++++++++
 src/main/webapp/views/locMast/locMast_detail.html              |   17 +
 src/main/java/com/zy/asrs/entity/LocDetl.java                  |   18 ++
 src/main/webapp/views/pakStore/locDetlCheckQuery.html          |   16 +
 src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java    |   37 ++++
 src/main/java/com/zy/asrs/entity/FrozenParam.java              |   28 +++
 src/main/java/com/zy/asrs/mapper/LocMastMapper.java            |    7 
 src/main/webapp/views/stoMan/stoQue.html                       |   16 +
 src/main/webapp/static/js/common.js                            |    9 +
 src/main/webapp/static/js/locMast/locMast.js                   |   13 +
 src/main/java/com/zy/asrs/entity/LocMast.java                  |   25 ++
 22 files changed, 468 insertions(+), 26 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/LocDetlController.java b/src/main/java/com/zy/asrs/controller/LocDetlController.java
index edfb2a5..619459d 100644
--- a/src/main/java/com/zy/asrs/controller/LocDetlController.java
+++ b/src/main/java/com/zy/asrs/controller/LocDetlController.java
@@ -12,6 +12,7 @@
 import com.core.common.Cools;
 import com.core.common.DateUtils;
 import com.core.common.R;
+import com.zy.asrs.entity.FrozenParam;
 import com.zy.asrs.entity.LocDetl;
 import com.zy.asrs.entity.LocOwner;
 import com.zy.asrs.entity.Mat;
@@ -252,6 +253,26 @@
         return R.ok();
     }
 
+    @PostMapping(value = "/locDetl/frozenInventory")
+    @ManagerAuth(memo = "搴撳瓨鍐荤粨")
+    public R frozen(@RequestBody List<FrozenParam> param){
+        if (param.size() == 0)  {
+            return R.parse("鏈敹鍒版暟鎹�");
+        }
+
+        return locDetlService.frozenInventory(param);
+    }
+
+    @PostMapping(value = "/locDetl/unfreezeInventory")
+    @ManagerAuth(memo = "搴撳瓨瑙e喕")
+    public R unfreeze(@RequestBody List<FrozenParam> param){
+        if (param.size() == 0)  {
+            return R.parse("鏈敹鍒版暟鎹�");
+        }
+
+        return locDetlService.unfreezeInventory(param);
+    }
+
     @RequestMapping(value = "/locDetl/export/auth")
     @ManagerAuth(memo = "搴撲綅鏄庣粏瀵煎嚭")
     public R export(@RequestBody JSONObject param){
diff --git a/src/main/java/com/zy/asrs/controller/LocMastController.java b/src/main/java/com/zy/asrs/controller/LocMastController.java
index 2eae903..757a36f 100644
--- a/src/main/java/com/zy/asrs/controller/LocMastController.java
+++ b/src/main/java/com/zy/asrs/controller/LocMastController.java
@@ -10,21 +10,18 @@
 import com.core.common.Cools;
 import com.core.common.DateUtils;
 import com.core.common.R;
-import com.zy.asrs.entity.BasWhs;
-import com.zy.asrs.entity.LocDetl;
-import com.zy.asrs.entity.LocMast;
+import com.core.exception.CoolException;
+import com.zy.asrs.entity.*;
 import com.zy.asrs.entity.param.LocMastInitParam;
-import com.zy.asrs.service.BasWhsService;
-import com.zy.asrs.service.LocDetlService;
-import com.zy.asrs.service.LocMastService;
-import com.zy.asrs.utils.Utils;
+import com.zy.asrs.mapper.LocDetlMapper;
+import com.zy.asrs.service.*;
 import com.zy.common.entity.Parameter;
 import com.zy.common.model.Shelves;
 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 javax.annotation.Resource;
 import java.util.*;
 
 @RestController
@@ -36,6 +33,15 @@
     private LocDetlService locDetlService;
     @Autowired
     private BasWhsService basWhsService;
+
+    @Resource
+    private WrkMastService wrkMastService;
+
+    @Resource
+    private AdjDetlService adjDetlService;
+
+    @Resource
+    private LocDetlMapper locDetlMapper;
 
     @RequestMapping(value = "/locMast/init/pwd")
     public R locMastInitPwd(@RequestParam(required = false) String pwd) {
@@ -107,22 +113,67 @@
 	@RequestMapping(value = "/locMast/update/auth")
 	@ManagerAuth(memo = "搴撲綅淇敼")
     public R update(LocMast locMast){
+
         if (Cools.isEmpty(locMast) || null==locMast.getLocNo()){
             return R.error();
         }
+
+        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>()
+                .eq("source_loc_no", locMast.getLocNo())
+                .or().eq("loc_no", locMast.getLocNo()));
+        if(!Cools.isEmpty(wrkMast)){
+            return  R.error("璇ュ簱浣嶆鍦ㄤ綔涓氾紝璇峰厛澶勭悊宸ヤ綔妗�");
+        }
+
         LocMast oldLocMast = locMastService.selectById(locMast.getLocNo());
         if (locMast.getLocSts().equals("F") && (oldLocMast.getLocSts().equals("D") || oldLocMast.getLocSts().equals("O"))) {
             return R.error("褰撳墠鎿嶄綔宸茶闃绘锛岃鑱旂郴绠$悊鍛�");
         }
+        Date now = new Date();
         // 鏈夌墿鏂欐椂淇敼涓虹┖搴撲綅鎴栬�呯┖鏉垮簱浣嶏紝鍒欏垹闄ゅ簱瀛樻槑缁�
-        if (oldLocMast.getLocSts().equals("R") || oldLocMast.getLocSts().equals("F")) {
+        if (oldLocMast.getLocSts().equals("R") || oldLocMast.getLocSts().equals("F") || oldLocMast.getLocSts().equals("S")) {
             if (locMast.getLocSts().equals("O") || locMast.getLocSts().equals("D")) {
-                locDetlService.delete(new EntityWrapper<LocDetl>().eq("loc_no", locMast.getLocNo()));
+                List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", locMast.getLocNo()));
+                for (LocDetl locDetl : locDetls) {
+                    // 淇濆瓨璋冩暣璁板綍
+                    AdjDetl adjDetl = new AdjDetl();
+                    adjDetl.setLocNo(locDetl.getLocNo());
+                    adjDetl.setMatnr(locDetl.getMatnr());
+                    adjDetl.setBatch(locDetl.getBatch());
+                    adjDetl.setOriQty(locDetl.getAnfme());
+                    adjDetl.setAdjQty(0.0D);
+                    adjDetl.setModiTime(now);
+                    adjDetl.setModiUser(getUserId());
+                    adjDetl.setAppeTime(now);
+                    adjDetl.setAppeUser(getUserId());
+                    if (!adjDetlService.insert(adjDetl)) {
+                        throw new CoolException("鏈嶅姟鍣ㄩ敊璇紝璇疯仈绯荤鐞嗗憳");
+                    }
+                }
+                if (!locDetlService.delete(new EntityWrapper<LocDetl>().eq("loc_no", locMast.getLocNo()))) {
+                    throw new CoolException("鏈嶅姟鍣ㄩ敊璇紝璇疯仈绯荤鐞嗗憳");
+                }
+                locMast.setBarcode("");
             }
         }
         locMast.setModiUser(getUserId());
-        locMast.setModiTime(new Date());
-        locMastService.updateById(locMast);
+        locMast.setModiTime(now);
+        AdjDetl adjDetl = new AdjDetl();
+        adjDetl.setLocNo(locMast.getLocNo());
+        adjDetl.setMatnr("鍘熷簱浣嶇姸鎬侊細" + oldLocMast.getLocSts());
+        adjDetl.setBatch("鏇存敼搴撲綅鐘舵�佷负锛�" + locMast.getLocSts());
+        adjDetl.setModiTime(now);
+        adjDetl.setModiUser(getUserId());
+        if (!adjDetlService.insert(adjDetl)) {
+            throw new CoolException("搴撲綅璋冩暣璁板綍澶辫触");
+        }
+        // 搴撲綅鍐荤粨->鍐荤粨鎵�鏈夊簱瀛�
+        if (locMast.getFrozen() == 1 && oldLocMast.getFrozen() == 0 && locMast.getLocSts().equals("F") && oldLocMast.getLocSts().equals("F")) {
+            locDetlMapper.updateDetlFrozenByLocNo(oldLocMast.getLocNo());
+        }
+        if(!locMastService.updateById(locMast)) {
+            throw new CoolException("鏈嶅姟鍣ㄩ敊璇紝璇疯仈绯荤鐞嗗憳");
+        }
         return R.ok();
     }
 
diff --git a/src/main/java/com/zy/asrs/entity/FrozenParam.java b/src/main/java/com/zy/asrs/entity/FrozenParam.java
new file mode 100644
index 0000000..ee51f4a
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/FrozenParam.java
@@ -0,0 +1,28 @@
+package com.zy.asrs.entity;
+
+import lombok.Data;
+
+/**
+ * @author pang.jiabao
+ * @description 搴撳瓨鍐荤粨/瑙e喕 dto
+ * @createDate 2024/12/17 9:24
+ */
+@Data
+public class FrozenParam {
+
+    /**
+     * 搴撲綅鍙�
+     */
+    private String locNo;
+
+    /**
+     * 鍟嗗搧缂栧彿
+     */
+    private String matnr;
+
+    /**
+     * 鎵规
+     */
+    private String batch;
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/LocDetl.java b/src/main/java/com/zy/asrs/entity/LocDetl.java
index 4c47234..58d036c 100644
--- a/src/main/java/com/zy/asrs/entity/LocDetl.java
+++ b/src/main/java/com/zy/asrs/entity/LocDetl.java
@@ -183,6 +183,12 @@
     @ApiModelProperty(value= "澶囩敤3")
     private String standby3;
 
+    /**
+     * 鏄惁鍐荤粨
+     */
+    @ApiModelProperty(value= "鏄惁鍐荤粨,0.鏈喕缁擄紝1.宸插喕缁�")
+    private Integer frozen;
+
     public String getLocNo$(){
         LocMastService service = SpringUtils.getBean(LocMastService.class);
         LocMast locMast = service.selectById(this.locNo);
@@ -295,4 +301,16 @@
         Synchro.Copy(source, this);
     }
 
+    public String getFrozen$() {
+        if (null == this.frozen){ return null; }
+        switch (this.frozen){
+            case 0:
+                return "鏈喕缁�";
+            case 1:
+                return "宸插喕缁�";
+            default:
+                return null;
+        }
+    }
+
 }
diff --git a/src/main/java/com/zy/asrs/entity/LocMast.java b/src/main/java/com/zy/asrs/entity/LocMast.java
index a62b9cd..3103c4b 100644
--- a/src/main/java/com/zy/asrs/entity/LocMast.java
+++ b/src/main/java/com/zy/asrs/entity/LocMast.java
@@ -182,6 +182,19 @@
     @TableField("ctn_no")
     private String ctnNo;
 
+    /**
+     * 鏄惁鍐荤粨
+     */
+    @ApiModelProperty(value= "鏄惁鍐荤粨,0.鏈喕缁擄紝1.宸插喕缁�")
+    private Integer frozen;
+
+    /**
+     * 鍐荤粨澶囨敞
+     */
+    @ApiModelProperty(value= "鍐荤粨澶囨敞")
+    @TableField("frozen_memo")
+    private String frozenMemo;
+
 
     public String getWhsType$(){
         BasWhsService service = SpringUtils.getBean(BasWhsService.class);
@@ -296,4 +309,16 @@
         return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.errorTime);
     }
 
+    public String getFrozen$() {
+        if (null == this.frozen){ return null; }
+        switch (this.frozen){
+            case 0:
+                return "鏈喕缁�";
+            case 1:
+                return "宸插喕缁�";
+            default:
+                return null;
+        }
+    }
+
 }
diff --git a/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java b/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
index a2bcb29..62bb24d 100644
--- a/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
@@ -86,4 +86,18 @@
     List<LocDetl> selectLocDetlUnilateralMoveShuttleY(@Param("matnr")String matnr,@Param("batch")String batch,@Param("grade")String grade);
     List<LocDetl> selectLocDetlUnilateralMoveShuttleN(@Param("matnr")String matnr,@Param("batch")String batch,@Param("grade")String grade);
 
+    /**
+     * 鏍规嵁搴撲綅鍙锋洿鏂板簱瀛樻槑缁嗕负鍐荤粨鐘舵��
+     */
+    void updateDetlFrozenByLocNo(@Param("locNo") String locNo);
+
+    /**
+     * 鍐荤粨/瑙e喕搴撳瓨鏄庣粏
+     * @param locNo 搴撲綅鍙�
+     * @param matnr 鐗╂枡缂栫爜
+     * @param batch 鎵规
+     * @param frozen 0瑙e喕锛�1鍐荤粨
+     */
+    void frozenInventory(@Param("locNo") String locNo, @Param("matnr") String matnr, @Param("batch") String batch, @Param("frozen") int frozen);
+
 }
diff --git a/src/main/java/com/zy/asrs/mapper/LocMastMapper.java b/src/main/java/com/zy/asrs/mapper/LocMastMapper.java
index 14567e7..9e5d84a 100644
--- a/src/main/java/com/zy/asrs/mapper/LocMastMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/LocMastMapper.java
@@ -53,4 +53,11 @@
 //    LocMast selectLocByLocStsPakInO2(@Param("locNos") List<String> locNos,@Param("whsType") Long whsType);
 
     LocMast selectLocByLocStsPakInO2(@Param("crnNo") Integer crnNo,@Param("bay") Integer bay,@Param("lev") Integer lev,@Param("gro") Integer gro,@Param("whsType") Long whsType);
+
+    /**
+     * 鏌ユ壘绗竴涓喕缁撶殑搴撲綅
+     * @param locNoList 搴撲綅鍙烽泦鍚�
+     * @return 搴撲綅鍙�
+     */
+    String findFirstFrozenLocNo(@Param("locNoList") List<String> locNoList);
 }
diff --git a/src/main/java/com/zy/asrs/service/LocDetlService.java b/src/main/java/com/zy/asrs/service/LocDetlService.java
index 98d7293..26a2b1d 100644
--- a/src/main/java/com/zy/asrs/service/LocDetlService.java
+++ b/src/main/java/com/zy/asrs/service/LocDetlService.java
@@ -2,6 +2,8 @@
 
 import com.baomidou.mybatisplus.plugins.Page;
 import com.baomidou.mybatisplus.service.IService;
+import com.core.common.R;
+import com.zy.asrs.entity.FrozenParam;
 import com.zy.asrs.entity.LocDetl;
 import com.zy.asrs.entity.result.LocDetlAll;
 import com.zy.asrs.entity.result.LocDetlDTO;
@@ -78,4 +80,14 @@
     List<Map<String, Object>> selectLocDetlUnilateralMoveShuttleMap(Integer crnNo);
 
     List<LocDetl> selectLocDetlUnilateralMoveShuttle(String matnr,String batch,String grade,Integer crnNo);
+
+    /**
+     * 鍐荤粨搴撳瓨
+     */
+    R frozenInventory(List<FrozenParam> param);
+
+    /**
+     * 搴撳瓨瑙e喕
+     */
+    R unfreezeInventory(List<FrozenParam> param);
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
index d6b3ae7..b8f2da8 100644
--- a/src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
@@ -2,6 +2,8 @@
 
 import com.baomidou.mybatisplus.plugins.Page;
 import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.core.common.R;
+import com.zy.asrs.entity.FrozenParam;
 import com.zy.asrs.entity.LocDetl;
 import com.zy.asrs.entity.result.LocDetlAll;
 import com.zy.asrs.entity.result.LocDetlDTO;
@@ -162,4 +164,24 @@
         }
         return this.baseMapper.selectLocDetlUnilateralMoveShuttleN(matnr,batch,grade);
     }
+
+    @Override
+    public R frozenInventory(List<FrozenParam> param) {
+
+        for(FrozenParam obj : param) {
+            this.baseMapper.frozenInventory(obj.getLocNo(), obj.getMatnr(), obj.getBatch(), 1);
+        }
+
+        return R.ok("鍐荤粨搴撳瓨瀹屾垚!");
+    }
+
+    @Override
+    public R unfreezeInventory(List<FrozenParam> param) {
+
+        for(FrozenParam obj : param) {
+            this.baseMapper.frozenInventory(obj.getLocNo(), obj.getMatnr(), obj.getBatch(), 0);
+        }
+
+        return R.ok("搴撳瓨瑙e喕瀹屾垚!");
+    }
 }
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 2ae5d58..294a624 100644
--- a/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -12,6 +12,7 @@
 import com.zy.asrs.entity.param.FullStoreParam;
 import com.zy.asrs.entity.param.LocDetlAdjustParam;
 import com.zy.asrs.entity.param.StockOutParam;
+import com.zy.asrs.mapper.LocMastMapper;
 import com.zy.asrs.entity.result.FindLocNoAttributeVo;
 import com.zy.asrs.service.*;
 import com.zy.asrs.utils.OrderInAndOutUtil;
@@ -27,6 +28,7 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
@@ -85,6 +87,9 @@
 
     @Autowired
     private ManLocDetlService manLocDetlService;
+
+    @Resource
+    private LocMastMapper locMastMapper;
 
     @Override
     @Transactional
@@ -181,6 +186,12 @@
             }
         }
         if (!locDetlDtos.isEmpty()) {
+            // 搴撲綅鍙烽泦鍚�
+            List<String> locNoList = param.getLocDetls().stream().map(StockOutParam.LocDetl::getLocNo).distinct().collect(Collectors.toList());
+            String firstFrozenLocNo = locMastMapper.findFirstFrozenLocNo(locNoList);
+            if (firstFrozenLocNo != null) {
+                throw new CoolException(firstFrozenLocNo + "搴撲綅宸茶鍐荤粨!");
+            }
             LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetlDtos.get(0).getLocDetl().getLocNo()));
             if (locMast.getLocSts().equals("F") || locMast.getLocSts().equals("D") ){
                 // 鍚姩鍑哄簱寮�濮� 101.鍑哄簱
@@ -522,6 +533,13 @@
         if (Cools.isEmpty(param.getOutSite())) {
             throw new CoolException("绔欑偣涓嶅瓨鍦�");
         }
+
+        // 搴撲綅鍐荤粨涓嶈兘鍑哄簱
+        String firstFrozenLocNo = locMastMapper.findFirstFrozenLocNo(param.getLocNos());
+        if (firstFrozenLocNo != null) {
+            throw new CoolException(firstFrozenLocNo + "搴撲綅宸茶鍐荤粨!");
+        }
+
         for (String locNo : param.getLocNos()) {
             // 鑾峰彇宸ヤ綔鍙�
             int workNo = commonService.getWorkNo(WorkNoType.PAKOUT.type);
@@ -658,6 +676,12 @@
             }
         }
         if (!locDetlDtos.isEmpty()) {
+            // 搴撲綅鍙烽泦鍚�
+            List<String> locNoList = param.getLocDetls().stream().map(StockOutParam.LocDetl::getLocNo).distinct().collect(Collectors.toList());
+            String firstFrozenLocNo = locMastMapper.findFirstFrozenLocNo(locNoList);
+            if (firstFrozenLocNo != null) {
+                throw new CoolException(firstFrozenLocNo + "搴撲綅宸茶鍐荤粨!");
+            }
             LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetlDtos.get(0).getLocDetl().getLocNo()));
             if (locMast.getLocSts().equals("F")){
                 // 鍚姩鍑哄簱寮�濮� 107.鐩樼偣鍑哄簱
@@ -682,6 +706,19 @@
         if (Cools.isEmpty(loc)){
             throw new CoolException("鏈壘鍒板簱浣�");
         }
+        // 鍒ゆ柇搴撲綅鏄惁鍐荤粨
+        String sourceLocFrozen = locMastMapper.findFirstFrozenLocNo(Arrays.asList(sourceLoc.getLocNo(),loc.getLocNo()));
+        if (sourceLocFrozen != null) {
+            throw new CoolException(sourceLocFrozen + "搴撲綅宸茶鍐荤粨!");
+        }
+
+        // 鍒ゆ柇搴撳瓨鏄惁鍐荤粨
+        Optional<LocDetl> first = locDetls.stream().filter(locDetl -> locDetl.getFrozen() == 1).findFirst();
+        if (first.isPresent()) {
+            LocDetl locDetl = first.get();
+            throw new CoolException(locDetl.getLocNo() + "," + locDetl.getMatnr() + "," + locDetl.getBatch() + "搴撳瓨鏄庣粏宸茶鍐荤粨!");
+        }
+
         if (!loc.getLocSts().equals("O") || (!sourceLoc.getLocSts().equals("F") && !sourceLoc.getLocSts().equals("D"))){
             throw new CoolException("搴撲綅鐘舵�佸凡鏀瑰彉");
         }
diff --git a/src/main/resources/mapper/LocDetlMapper.xml b/src/main/resources/mapper/LocDetlMapper.xml
index 53a2bfd..dc9f9e8 100644
--- a/src/main/resources/mapper/LocDetlMapper.xml
+++ b/src/main/resources/mapper/LocDetlMapper.xml
@@ -44,6 +44,7 @@
         <result column="appe_user" property="appeUser" />
         <result column="appe_time" property="appeTime" />
         <result column="memo" property="memo" />
+        <result column="frozen" property="frozen" />
         <result column="standby1" property="standby1" />
         <result column="standby2" property="standby2" />
         <result column="standby3" property="standby3" />
@@ -376,6 +377,12 @@
         FROM asr_loc_detl a
         INNER JOIN man_mat b ON a.matnr=#{matnrOld} AND b.matnr=#{matnr};
     </update>
+    <update id="updateDetlFrozenByLocNo">
+        update asr_loc_detl set frozen = 1 where loc_no = #{locNo} and frozen = 0
+    </update>
+    <update id="frozenInventory">
+        update asr_loc_detl set frozen = #{frozen} where loc_no = #{locNo} and matnr = #{matnr} and batch = #{batch}
+    </update>
 
     <select id="selectSameDetlTodayBatch" resultType="java.lang.String">
         SELECT ld.loc_no FROM asr_loc_detl ld
diff --git a/src/main/resources/mapper/LocMastMapper.xml b/src/main/resources/mapper/LocMastMapper.xml
index 8d918ad..1eb4591 100644
--- a/src/main/resources/mapper/LocMastMapper.xml
+++ b/src/main/resources/mapper/LocMastMapper.xml
@@ -34,7 +34,8 @@
         <result column="mk" property="mk" />
         <result column="barcode" property="barcode" />
         <result column="ctn_no" property="ctnNo" />
-
+        <result column="frozen" property="frozen" />
+        <result column="frozen_memo" property="frozenMemo" />
     </resultMap>
 
     <select id="queryFreeLocMast" resultMap="BaseResultMap">
@@ -192,5 +193,11 @@
         and gro1 = #{gro}
         AND loc_sts in ('O') order by row1
     </select>
+    <select id="findFirstFrozenLocNo" resultType="java.lang.String">
+        select top 1 loc_no  from asr_loc_mast where frozen = 1 and loc_no in 
+        <foreach collection="locNoList" item="item" index="index" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
 
 </mapper>
diff --git a/src/main/webapp/static/js/common.js b/src/main/webapp/static/js/common.js
index 054399e..4769781 100644
--- a/src/main/webapp/static/js/common.js
+++ b/src/main/webapp/static/js/common.js
@@ -255,5 +255,14 @@
     ,{field: 'source$', align: 'center',title: '鍒惰喘', hide: true}
     ,{field: 'check$', align: 'center',title: '瑕佹眰妫�楠�', hide: true}
     ,{field: 'danger$', align: 'center',title: '鍗遍櫓鍝�', hide: true}
+    ,{field: 'frozen$', align: 'center',title: '鍐荤粨鍚�',
+        templet: function(d) {
+            // 鏍规嵁鏉′欢鍒ゆ柇瀛椾綋棰滆壊
+            if (d.frozen$ === '宸插喕缁�') {
+                return '<span style="color: #34a8de;">' +d.frozen$ + '</span>';
+            } else {
+                return '<span">' +d.frozen$ + '</span>';
+            }
+        }}
 ]
 
diff --git a/src/main/webapp/static/js/locDetl/locDetl.js b/src/main/webapp/static/js/locDetl/locDetl.js
index 90e8841..14c17ee 100644
--- a/src/main/webapp/static/js/locDetl/locDetl.js
+++ b/src/main/webapp/static/js/locDetl/locDetl.js
@@ -1,6 +1,7 @@
 var pageCurr;
 function getCol() {
     var cols = [
+        {type: 'checkbox'},
         {field: 'locNo$', align: 'center',title: '搴撲綅鍙�'}
         ,{field: 'storeDate', align: 'center',title: '搴撻緞(澶�)', sort:true}
         ,{field: 'matnr', align: 'center',title: '鍟嗗搧缂栧彿', sort:true}
@@ -35,7 +36,15 @@
         ,{field: 'source$', align: 'center',title: '鍒惰喘', hide: true}
         ,{field: 'check$', align: 'center',title: '瑕佹眰妫�楠�', hide: true}
         ,{field: 'danger$', align: 'center',title: '鍗遍櫓鍝�', hide: true}
-
+        ,{field: 'frozen$', align: 'center',title: '鍐荤粨鍚�',
+            templet: function(d) {
+                // 鏍规嵁鏉′欢鍒ゆ柇瀛椾綋棰滆壊
+                if (d.frozen$ === '宸插喕缁�') {
+                    return '<span style="color: #34a8de;">' +d.frozen$ + '</span>';
+                } else {
+                    return '<span">' +d.frozen$ + '</span>';
+                }
+            }}
     ];
 
     // cols.push.apply(cols, detlCols);
@@ -212,6 +221,78 @@
                     });
                 });
                 break;
+                // 鍐荤粨
+            case 'frozen':
+                let frozenData = checkStatus.data;
+                console.log(frozenData)
+                if (frozenData.length === 0){
+                    layer.msg('璇烽�夋嫨鏁版嵁');
+                } else {
+                    layer.confirm('纭畾鍐荤粨搴撳瓨鍚�?', function(){
+                        let requestData = frozenData.map(obj => ({
+                            locNo: obj.locNo,
+                            matnr: obj.matnr,
+                            batch: obj.batch
+                            })
+                        );
+                        $.ajax({
+                            url: baseUrl+"/locDetl/frozenInventory",
+                            headers: {'token': localStorage.getItem('token')},
+                            data: JSON.stringify(requestData),
+                            dataType:'json',
+                            contentType:'application/json;charset=UTF-8',
+                            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;
+                // 瑙e喕
+            case 'unfreeze':
+                let unfreezeData = checkStatus.data;
+                console.log(unfreezeData)
+                if (unfreezeData.length === 0){
+                    layer.msg('璇烽�夋嫨鏁版嵁');
+                } else {
+                    layer.confirm('纭畾瑙e喕搴撳瓨鍚�?', function(){
+                        let requestData = unfreezeData.map(obj => ({
+                                locNo: obj.locNo,
+                                matnr: obj.matnr,
+                                batch: obj.batch
+                            })
+                        );
+                        $.ajax({
+                            url: baseUrl+"/locDetl/unfreezeInventory",
+                            headers: {'token': localStorage.getItem('token')},
+                            data: JSON.stringify(requestData),
+                            dataType:'json',
+                            contentType:'application/json;charset=UTF-8',
+                            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;
         }
     });
 
diff --git a/src/main/webapp/static/js/locMast/locMast.js b/src/main/webapp/static/js/locMast/locMast.js
index 20e5195..7fc6049 100644
--- a/src/main/webapp/static/js/locMast/locMast.js
+++ b/src/main/webapp/static/js/locMast/locMast.js
@@ -24,6 +24,16 @@
             ,{field: 'locNo', align: 'center',title: '搴撲綅鍙�',sort:true, hide:false}
             ,{field: 'locSts$', align: 'center',title: '搴撲綅鐘舵��',width:200, hide:false}
             ,{field: 'whsType$', align: 'center',title: '搴撲綅绫诲瀷',width:200, hide:false}
+            ,{field: 'frozen$', align: 'center',title: '鍐荤粨鐘舵��',
+                templet: function(d) {
+                    // 鏍规嵁鏉′欢鍒ゆ柇瀛椾綋棰滆壊
+                    if (d.frozen$ === '宸插喕缁�') {
+                        return '<span style="color: #34a8de;">' +d.frozen$ + '</span>';
+                    } else {
+                        return '<span">' +d.frozen$ + '</span>';
+                    }
+                }}
+            ,{field: 'frozenMemo', align: 'center',title: '鍐荤粨鍘熷洜'}
             // ,{field: 'pltType', align: 'center',title: ''}
             // ,{field: 'ctnType', align: 'center',title: ''}
             // ,{field: 'locSts', align: 'center',title: ''}
@@ -461,7 +471,8 @@
             barcode: $('#barcode').val(),
             PdcType: $('#PdcType').val(),
             ctnNo: $('#ctnNo').val(),
-
+            frozen: $('#frozen').val(),
+            frozenMemo: $('#frozenMemo').val()
         };
         $.ajax({
             url: baseUrl+"/locMast/"+name+"/auth",
diff --git a/src/main/webapp/static/js/stoMan/stoQue.js b/src/main/webapp/static/js/stoMan/stoQue.js
index 0352dd9..95d3552 100644
--- a/src/main/webapp/static/js/stoMan/stoQue.js
+++ b/src/main/webapp/static/js/stoMan/stoQue.js
@@ -29,6 +29,16 @@
             ,{field: 'locNo', align: 'center',title: '搴撲綅鍙�', hide:false}
             ,{field: 'locSts$', align: 'center',title: '搴撲綅鐘舵��', width: 180, style: 'color: #8E2323', hide:false}
             ,{field: 'whsType$', align: 'center',title: '搴撲綅绫诲瀷', width: 180, style: 'color: #8E2323', hide:false}
+            ,{field: 'frozen$', align: 'center',title: '鍐荤粨鐘舵��',
+                templet: function(d) {
+                    // 鏍规嵁鏉′欢鍒ゆ柇瀛椾綋棰滆壊
+                    if (d.frozen$ === '宸插喕缁�') {
+                        return '<span style="color: #34a8de;">' +d.frozen$ + '</span>';
+                    } else {
+                        return '<span">' +d.frozen$ + '</span>';
+                    }
+                }}
+            ,{field: 'frozenMemo', align: 'center',title: '鍐荤粨鍘熷洜'}
             ,{field: 'crnNo', align: 'center',title: '鍫嗗灈鏈哄彿', sort:true, hide:false}
             ,{field: 'row1', align: 'center',title: '鎺�', sort:true, hide:true}
             ,{field: 'bay1', align: 'center',title: '鍒�', sort:true, hide:true}
diff --git a/src/main/webapp/views/locDetl/locDetl.html b/src/main/webapp/views/locDetl/locDetl.html
index 174bb0f..29c1502 100644
--- a/src/main/webapp/views/locDetl/locDetl.html
+++ b/src/main/webapp/views/locDetl/locDetl.html
@@ -9,6 +9,14 @@
     <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
     <link rel="stylesheet" href="../../static/css/cool.css" media="all">
     <link rel="stylesheet" href="../../static/css/common.css" media="all">
+    <style>
+        #frozen-btn {
+            display: none;
+        }
+        #unfreeze-btn{
+            display: none;
+        }
+    </style>
 </head>
 <body>
 
@@ -34,6 +42,17 @@
             <input class="layui-input" type="text" name="specs" placeholder="瑙勬牸" autocomplete="off">
         </div>
     </div>
+    <div class="layui-inline">
+        <div class="layui-input-inline">
+            <select name="frozen" class="layui-input" type="text" autocomplete="off">
+                <!--                    <option style="display: none"></option>-->
+                <option value="">鍐荤粨鍚�</option>
+                <option value="0">鏈喕缁�</option>
+                <option value="1">宸插喕缁�</option>
+            </select>
+        </div>
+    </div>
+
 <!--    <div class="layui-inline">-->
 <!--        <div class="layui-input-inline">-->
 <!--            <input class="layui-input" type="text" name="row" placeholder="鎺掓暟" autocomplete="off">-->
@@ -61,7 +80,9 @@
 </div>
 <script type="text/html" id="toolbar">
     <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>
+        <button class="layui-btn layui-btn-primary layui-bg-blue layui-btn-sm" id="frozen-btn" lay-event="frozen" style="margin-top: 1px">鍐荤粨</button>
+        <button class="layui-btn layui-btn-primary layui-btn-sm" id="unfreeze-btn" lay-event="unfreeze" style="margin-top: 1px">瑙e喕</button>
+        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="margin-top: 1px">瀵煎嚭</button>
     </div>
 </script>
 
diff --git a/src/main/webapp/views/locMast/locMast.html b/src/main/webapp/views/locMast/locMast.html
index e95ce3d..59f310c 100644
--- a/src/main/webapp/views/locMast/locMast.html
+++ b/src/main/webapp/views/locMast/locMast.html
@@ -55,7 +55,7 @@
         <div class="layui-input-inline">
             <select name="loc_type1" id="loc_type1" class="layui-input" type="text" placeholder="搴撲綅绫诲瀷" autocomplete="off">
                 <!--                    <option style="display: none"></option>-->
-                <option value=""></option>
+                <option value="">搴撲綅绫诲瀷</option>
                 <option value="1">浣庡簱浣�</option>
                 <option value="2">楂樺簱浣�</option>
             </select>
@@ -76,10 +76,18 @@
             <input class="layui-input" type="text" name="bay1" placeholder="鍒�" autocomplete="off">
         </div>
     </div>
-    <div class="layui-inline">
-        <div class="layui-input-inline">
-            <input class="layui-input" type="text" name="lev1" placeholder="灞�" autocomplete="off">
-        </div>
+<!--    <div class="layui-inline">-->
+<!--        <div class="layui-input-inline">-->
+<!--            <input class="layui-input" type="text" name="lev1" placeholder="灞�" autocomplete="off">-->
+<!--        </div>-->
+<!--    </div>-->
+    <div class="layui-input-inline">
+        <select name="frozen" class="layui-input" type="text" autocomplete="off">
+            <!--                    <option style="display: none"></option>-->
+            <option value="">鍐荤粨鍚�</option>
+            <option value="0">鏈喕缁�</option>
+            <option value="1">宸插喕缁�</option>
+        </select>
     </div>
     <!-- 寰呮坊鍔� -->
     <div id="data-search-btn" class="layui-btn-container layui-form-item" style="display: inline-block">
diff --git a/src/main/webapp/views/locMast/locMast_detail.html b/src/main/webapp/views/locMast/locMast_detail.html
index 27fff5a..cd62adc 100644
--- a/src/main/webapp/views/locMast/locMast_detail.html
+++ b/src/main/webapp/views/locMast/locMast_detail.html
@@ -77,6 +77,23 @@
                 <input id="sheetNo" class="layui-input" type="text">
             </div>
         </div>
+        <!-- 鍐荤粨 -->
+        <div class="layui-inline"  style="width:80%;">
+            <label class="layui-form-label">鍐荤粨</label>
+            <div class="layui-input-inline">
+                <select id="frozen" name="frozen">
+                    <option style="display: none"></option>
+                    <option value="0">鏈喕缁�</option>
+                    <option value="1">宸插喕缁�</option>
+                </select>
+            </div>
+        </div>
+        <div class="layui-inline"  style="width:80%;">
+            <label class="layui-form-label">鍐荤粨鍘熷洜锛�</label>
+            <div class="layui-input-inline">
+                <input id="frozenMemo" class="layui-input" type="text" autocomplete="off">
+            </div>
+        </div>
         <div class="layui-inline"  style="width:80%;">
             <label class="layui-form-label">鍫嗗灈鏈哄彿锛�</label>
             <div class="layui-input-inline">
diff --git a/src/main/webapp/views/pakStore/locDetlCheckQuery.html b/src/main/webapp/views/pakStore/locDetlCheckQuery.html
index 0e71897..dada33b 100644
--- a/src/main/webapp/views/pakStore/locDetlCheckQuery.html
+++ b/src/main/webapp/views/pakStore/locDetlCheckQuery.html
@@ -81,9 +81,18 @@
                 <input class="layui-input" type="text" name="specs" placeholder="瑙勬牸"  autocomplete="off">
             </div>
         </div>
+<!--        <div class="layui-inline">-->
+<!--            <div class="layui-input-inline">-->
+<!--                <input class="layui-input" type="text" name="maktx" placeholder="鐗╂枡鎻忚堪" autocomplete="off">-->
+<!--            </div>-->
+<!--        </div>-->
         <div class="layui-inline">
             <div class="layui-input-inline">
-                <input class="layui-input" type="text" name="maktx" placeholder="鐗╂枡鎻忚堪" autocomplete="off">
+                <select name="frozen" class="layui-input" type="text" autocomplete="off">
+                    <option value="">鍐荤粨鍚�</option>
+                    <option value="0">鏈喕缁�</option>
+                    <option value="1">宸插喕缁�</option>
+                </select>
             </div>
         </div>
         <!-- 鏃ユ湡鑼冨洿 -->
@@ -186,6 +195,11 @@
                         layer.msg("璇烽�夋嫨鏁版嵁", {icon: 2});
                         return;
                     }
+                    if (data.some(obj => obj.frozen === 1)) {
+                        layer.msg("鍐荤粨鐨勫簱瀛樹笉鍏佽鍑哄簱锛�");
+                        return;
+                    }
+
                     let locNos = [];
                     data.forEach(function(elem) {
                         locNos.push(elem.locNo);
diff --git a/src/main/webapp/views/pakStore/locDetlQuery.html b/src/main/webapp/views/pakStore/locDetlQuery.html
index 68f73d3..5086410 100644
--- a/src/main/webapp/views/pakStore/locDetlQuery.html
+++ b/src/main/webapp/views/pakStore/locDetlQuery.html
@@ -77,6 +77,15 @@
                 <input class="layui-input" type="text" name="maktx" placeholder="鐗╂枡鎻忚堪" autocomplete="off">
             </div>
         </div>
+        <div class="layui-inline">
+            <div class="layui-input-inline">
+                <select name="frozen" class="layui-input" type="text" autocomplete="off">
+                    <option value="">鍐荤粨鍚�</option>
+                    <option value="0">鏈喕缁�</option>
+                    <option value="1">宸插喕缁�</option>
+                </select>
+            </div>
+        </div>
         <!-- 鏃ユ湡鑼冨洿 -->
         <div class="layui-inline" style="width: 300px">
             <div class="layui-input-inline">
@@ -177,6 +186,11 @@
                         layer.msg("璇烽�夋嫨鏁版嵁");
                         return;
                     }
+
+                    if (data.some(obj => obj.frozen === 1)) {
+                        layer.msg("鍐荤粨鐨勫簱瀛樹笉鍏佽鍑哄簱锛�");
+                        return;
+                    }
                     parent.addTableData(data);
                     break;
             }
diff --git a/src/main/webapp/views/stoMan/stoQue.html b/src/main/webapp/views/stoMan/stoQue.html
index e3d4d55..698bc72 100644
--- a/src/main/webapp/views/stoMan/stoQue.html
+++ b/src/main/webapp/views/stoMan/stoQue.html
@@ -75,10 +75,18 @@
         </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 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 class="layui-input-inline">
+        <select name="frozen" class="layui-input" type="text" autocomplete="off">
+            <!--                    <option style="display: none"></option>-->
+            <option value="">鍐荤粨鍚�</option>
+            <option value="0">鏈喕缁�</option>
+            <option value="1">宸插喕缁�</option>
+        </select>
     </div>
     <!-- 寰呮坊鍔� -->
     <div id="data-search-btn" class="layui-btn-container layui-form-item" style="display: inline-block">

--
Gitblit v1.9.1