From 7178ac3731005f2829fa9cca16dc125fc34ec12e Mon Sep 17 00:00:00 2001
From: ZY <zc857179121@qq.com>
Date: 星期五, 16 八月 2024 17:09:40 +0800
Subject: [PATCH] 出库代码提交和部分别的基础代码

---
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/ViewLocDetlMapper.java           |    6 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/TaskManage.java                  |   24 +
 zy-asrs-wms/src/main/resources/mapper/asrs/LocDetlMapper.xml                           |   14 +
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/FieldSortParam.java        |   16 +
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/interceptor/StockSortInterceptor.java |   68 ++++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocDetlController.java       |    3 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/LocManage.java                   |  110 +++++++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskLogTimer.java                 |  101 ++++++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/config/MybatisPlusConfig.java         |    3 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/event/OrderBatchEvent.java            |   17 +
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/req/OutReq.java              |   32 ++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/interceptor/MyMetaObjectHandler.java  |   42 +++
 zy-asrs-wms/src/main/resources/mapper/asrs/ViewLocDetlMapper.xml                       |   19 +
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/event/OrderBatchListener.java         |   18 +
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LocDetlService.java             |    3 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/strategy/FIFOWithdrawalStrategy.java    |   15 +
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/strategy/WithdrawalService.java         |   16 +
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/strategy/WithdrawalStrategy.java        |    8 
 zy-asrs-wms/pom.xml                                                                    |   10 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocServiceImpl.java        |    3 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/po/OutStrategyPO.java            |   10 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OutController.java           |   52 +++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/FieldParam.java            |   13 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java                   |  106 +++++++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/LocDetlMapper.java               |    6 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskTimer.java                    |   81 +++++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocDetlServiceImpl.java    |   28 +
 27 files changed, 805 insertions(+), 19 deletions(-)

diff --git a/zy-asrs-wms/pom.xml b/zy-asrs-wms/pom.xml
index 00d3847..de2fc7f 100644
--- a/zy-asrs-wms/pom.xml
+++ b/zy-asrs-wms/pom.xml
@@ -62,6 +62,16 @@
             <version>5.2.5.RELEASE</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocDetlController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocDetlController.java
index c9b7b0a..94ebbef 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocDetlController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocDetlController.java
@@ -7,6 +7,7 @@
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
 import com.zy.asrs.wms.asrs.entity.*;
+import com.zy.asrs.wms.asrs.mapper.LocDetlMapper;
 import com.zy.asrs.wms.asrs.service.LocDetlFieldService;
 import com.zy.asrs.wms.asrs.service.MatFieldService;
 import com.zy.asrs.wms.common.annotation.OperationLog;
@@ -34,6 +35,8 @@
     @Autowired
     private LocDetlFieldService locDetlFieldService;
 
+
+
     @PreAuthorize("hasAuthority('asrs:locDetl:list')")
     @PostMapping("/locDetl/page")
     public R page(@RequestBody Map<String, Object> map) {
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OutController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OutController.java
new file mode 100644
index 0000000..a2b6d08
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OutController.java
@@ -0,0 +1,52 @@
+package com.zy.asrs.wms.asrs.controller;
+
+import com.zy.asrs.framework.common.R;
+import com.zy.asrs.wms.asrs.controller.req.OutReq;
+import com.zy.asrs.wms.asrs.entity.LocDetl;
+import com.zy.asrs.wms.asrs.manage.OutManage;
+import com.zy.asrs.wms.system.controller.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 杩欓噷澶勭悊鎵�鏈夌殑鍑哄簱娴佺▼鐨勬帴鍙�
+ */
+@RestController
+@RequestMapping("/api")
+public class OutController extends BaseController {
+
+    @Autowired
+    private OutManage outManage;
+
+
+    /**
+     * 鑾峰彇搴撳瓨
+     *
+     * @param map
+     * @return
+     */
+    @PostMapping("/out/getStock")
+    public R page(@RequestBody Map<String, Object> map) {
+        List<LocDetl> suitableMat = outManage.getSuitableMat(map);
+        return R.ok(suitableMat);
+    }
+
+
+    /**
+     * 鍑哄簱
+     *
+     * @param outReq 鍑哄簱鍒楄〃
+     * @return
+     */
+    @PostMapping("/out/start")
+    public R page(@RequestBody OutReq outReq) {
+        outManage.out(outReq);
+        return R.ok();
+    }
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/req/OutReq.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/req/OutReq.java
new file mode 100644
index 0000000..ef7b080
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/req/OutReq.java
@@ -0,0 +1,32 @@
+package com.zy.asrs.wms.asrs.controller.req;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class OutReq implements Serializable {
+    /**
+     * 搴撲綅鏄庣粏
+     */
+    private List<Detl> detls;
+    /**
+     * 鐩爣绔欑偣
+     */
+    private String targetSite;
+
+    @Data
+    public class Detl {
+        /**
+         * 搴撳瓨鏄庣粏ID
+         */
+        private Long locDetlId;
+        /**
+         * 鏁伴噺
+         */
+        private Double anfme;
+    }
+
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/FieldParam.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/FieldParam.java
index 6c845e9..c617e68 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/FieldParam.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/FieldParam.java
@@ -4,9 +4,18 @@
 
 @Data
 public class FieldParam {
-
+    /**
+     * 瀛楁鍚�
+     */
     private String name;
-
+    /**
+     * 姣旇緝绫诲瀷锛屽父瑙佺殑 =,>,<,>=,<=,like,in,between,is null,is not null
+     * 娉細鏈変簺闇�瑕佽浆涔�
+     */
+    private String type;
+    /**
+     * 瀛楁鍊�
+     */
     private Object value;
 
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/FieldSortParam.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/FieldSortParam.java
new file mode 100644
index 0000000..9638885
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/FieldSortParam.java
@@ -0,0 +1,16 @@
+package com.zy.asrs.wms.asrs.entity.param;
+
+import lombok.Data;
+
+@Data
+public class FieldSortParam {
+    /**
+     * 瀛楁鍚�
+     */
+    private String name;
+    /**
+     * desc鍜宎sc
+     */
+    private String value;
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/po/OutStrategyPO.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/po/OutStrategyPO.java
new file mode 100644
index 0000000..5eeaf82
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/po/OutStrategyPO.java
@@ -0,0 +1,10 @@
+package com.zy.asrs.wms.asrs.entity.po;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class OutStrategyPO implements Serializable {
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/LocManage.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/LocManage.java
new file mode 100644
index 0000000..f457313
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/LocManage.java
@@ -0,0 +1,110 @@
+package com.zy.asrs.wms.asrs.manage;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zy.asrs.framework.common.Cools;
+import com.zy.asrs.framework.exception.CoolException;
+import com.zy.asrs.wms.asrs.entity.Loc;
+import com.zy.asrs.wms.asrs.entity.LocDetl;
+import com.zy.asrs.wms.asrs.entity.Task;
+import com.zy.asrs.wms.asrs.entity.TaskDetl;
+import com.zy.asrs.wms.asrs.entity.enums.LocStsType;
+import com.zy.asrs.wms.asrs.service.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+@Service
+public class LocManage {
+
+    private static Logger logger = LoggerFactory.getLogger(LocManage.class);
+
+    @Autowired
+    private LocService locService;
+
+    @Autowired
+    private LocDetlService locDetlService;
+
+    @Autowired
+    private WorkService workService;
+
+
+    @Autowired
+    private TaskService taskService;
+
+
+    @Autowired
+    private TaskDetlService taskDetlService;
+
+
+    /**
+     * 绉诲簱鏂规硶
+     *
+     * @param sourceLocId 婧愬簱浣�
+     * @param locId       鐩爣搴撲綅
+     */
+    @Transactional
+    public void locMove(Long sourceLocId, Long locId) {
+        logger.info("绉诲簱鎿嶄綔锛屾簮搴撲綅锛歿}锛岀洰鏍囧簱浣嶏細{}", sourceLocId, locId);
+        if (Cools.isEmpty(sourceLocId) || Cools.isEmpty(locId)) {
+            throw new CoolException("婧愬簱浣嶆垨鐩爣涓虹┖");
+        }
+        Loc sourceLoc = locService.getById(sourceLocId);
+        Loc loc = locService.getById(locId);
+        if (Cools.isEmpty(sourceLoc) || Cools.isEmpty(loc)) {
+            throw new CoolException("婧愬簱浣嶆垨鐩爣涓虹┖");
+        }
+        List<LocDetl> locDetls = locDetlService.list(new LambdaQueryWrapper<LocDetl>().eq(LocDetl::getLocId, sourceLoc.getId()));
+        //TODO 鏍规嵁涓嶅悓鐨勮澶囷紝鍙兘鏈変笉鍚岀殑绉诲簱瑙勫垯
+
+        // 淇濆瓨宸ヤ綔妗�
+        Task task = new Task();
+        task.setTaskNo(workService.generateTaskNo(1L));
+        // 浠诲姟鐘舵��
+        task.setTaskSts(11L);
+        // 浠诲姟绫诲瀷
+        task.setTaskType(11L);
+        // 浼樺厛绾�
+        task.setIoPri(1);
+        // 婧愬簱浣�
+        task.setOriginLoc(sourceLoc.getLocNo());
+        // 鐩爣搴撲綅
+        task.setTargetLoc(loc.getLocNo());
+        // 鎵樼洏鐮�
+        task.setBarcode(loc.getBarcode());
+        boolean res = taskService.save(task);
+        if (!res) {
+            throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐�");
+        }
+        // 宸ヤ綔妗f槑缁嗕繚瀛�
+        for (LocDetl locDetl : locDetls) {
+            TaskDetl taskDetl = new TaskDetl();
+            taskDetl.sync(locDetl);
+            taskDetl.setTaskId(task.getId());
+            if (!taskDetlService.save(taskDetl)) {
+                throw new CoolException("淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
+            }
+        }
+        // 淇敼婧愬簱浣嶇姸鎬�
+        if (sourceLoc.getLocStsId$().equals("D") || sourceLoc.getLocStsId$().equals("F")) {
+            sourceLoc.setLocStsId(LocStsType.R.val()); // R.鍑哄簱棰勭害
+            if (!locService.updateById(sourceLoc)) {
+                throw new CoolException("鏇存柊婧愬簱浣嶇姸鎬佸け璐�");
+            }
+        } else {
+            throw new CoolException("婧愬簱浣嶅嚭搴撳け璐ワ紝鐘舵�侊細" + sourceLoc.getLocStsId$());
+        }
+        // 淇敼鐩爣搴撲綅鐘舵��
+        if (loc.getLocStsId$().equals("O")) {
+            loc.setLocStsId(LocStsType.S.val()); // S.鍏ュ簱棰勭害
+            if (!locService.updateById(loc)) {
+                throw new CoolException("鏇存柊鐩爣搴撲綅鐘舵�佸け璐�");
+            }
+        } else {
+            throw new CoolException("绉昏浆澶辫触锛岀洰鏍囧簱浣嶇姸鎬侊細" + loc.getLocStsId$());
+        }
+    }
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java
new file mode 100644
index 0000000..6773409
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java
@@ -0,0 +1,106 @@
+package com.zy.asrs.wms.asrs.manage;
+
+import com.zy.asrs.framework.exception.CoolException;
+import com.zy.asrs.wms.asrs.controller.req.OutReq;
+import com.zy.asrs.wms.asrs.entity.Loc;
+import com.zy.asrs.wms.asrs.entity.LocDetl;
+import com.zy.asrs.wms.asrs.entity.Task;
+import com.zy.asrs.wms.asrs.entity.TaskDetl;
+import com.zy.asrs.wms.asrs.entity.param.FieldParam;
+import com.zy.asrs.wms.asrs.service.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 鍑哄簱绠$悊
+ */
+@Service
+public class OutManage {
+
+    @Autowired
+    private TaskService taskService;
+
+
+    @Autowired
+    private TaskDetlService taskDetlService;
+
+    @Autowired
+    private LocService locService;
+
+    @Autowired
+    private LocDetlService locDetlService;
+
+
+    @Autowired
+    private WorkService workService;
+
+
+    /**
+     * 鑾峰彇搴撳瓨
+     *
+     * @param map
+     */
+    public List<LocDetl> getSuitableMat(Map<String, Object> map) {
+        List<FieldParam> param = new ArrayList<>();
+        map.entrySet().stream().filter(entry -> entry.getValue() != null).forEach(entry -> {
+            FieldParam fieldParam = new FieldParam();
+            fieldParam.setName(entry.getKey());
+            fieldParam.setValue(entry.getValue());
+            param.add(fieldParam);
+        });
+        //TODO 杩欓噷鍔犱笂鍑哄簱瑙勫垯
+        List<LocDetl> stock = locDetlService.getSuitableMat(param, null);
+        return stock;
+    }
+
+    /**
+     * 鍑哄簱
+     *
+     * @param outReq
+     */
+    public void out(OutReq outReq) {
+        Map<Long, List<OutReq.Detl>> map = outReq.getDetls().stream().collect(Collectors.groupingBy(OutReq.Detl::getLocDetlId));
+        map.forEach((k, v) -> {
+            Loc loc = locService.getById(k);
+            processTask(loc, v, outReq.getTargetSite());
+        });
+    }
+
+
+    private void processTask(Loc loc, List<OutReq.Detl> detls, String targetSite) {
+        // 淇濆瓨宸ヤ綔妗�
+        Task task = new Task();
+        task.setTaskNo(workService.generateTaskNo(1L));
+        // 浠诲姟鐘舵��
+        task.setTaskSts(101L);
+        // 浠诲姟绫诲瀷
+        task.setTaskType(101L);
+        // 浼樺厛绾�
+        task.setIoPri(1);
+        // 婧愬簱浣�
+        task.setOriginLoc(loc.getLocNo());
+        // 鐩爣绔欑偣
+        task.setTargetSite(targetSite);
+        // 鎵樼洏鐮�
+        task.setBarcode(loc.getBarcode());
+        boolean res = taskService.save(task);
+        if (!res) {
+            throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐�");
+        }
+        // 宸ヤ綔妗f槑缁嗕繚瀛�
+        for (OutReq.Detl detl : detls) {
+            LocDetl locDetl = locDetlService.getById(detl.getLocDetlId());
+            TaskDetl taskDetl = new TaskDetl();
+            taskDetl.sync(locDetl);
+            taskDetl.setTaskId(task.getId());
+            if (!taskDetlService.save(taskDetl)) {
+                throw new CoolException("淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
+            }
+        }
+    }
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/TaskManage.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/TaskManage.java
new file mode 100644
index 0000000..478767d
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/TaskManage.java
@@ -0,0 +1,24 @@
+package com.zy.asrs.wms.asrs.manage;
+
+import com.zy.asrs.wms.asrs.mapper.ViewLocDetlMapper;
+import com.zy.asrs.wms.asrs.service.TaskDetlService;
+import com.zy.asrs.wms.asrs.service.TaskService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+public class TaskManage {
+
+    @Autowired
+    private TaskService taskService;
+
+
+    @Autowired
+    private TaskDetlService taskDetlService;
+
+    @Autowired
+    private ViewLocDetlMapper viewLocDetlMapper;
+
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/LocDetlMapper.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/LocDetlMapper.java
index 7dcada8..c35c124 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/LocDetlMapper.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/LocDetlMapper.java
@@ -3,6 +3,10 @@
 import com.zy.asrs.wms.asrs.entity.LocDetl;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.executor.Executor;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.plugin.Intercepts;
+import org.apache.ibatis.plugin.Signature;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
@@ -13,4 +17,6 @@
 
     List<LocDetl> getList(String matnr, String batch, List<Long> ids);
 
+
+    List<LocDetl> getStock(String matnr, String batch, List<Long> ids);
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/ViewLocDetlMapper.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/ViewLocDetlMapper.java
index 026c55a..ed0c5b5 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/ViewLocDetlMapper.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/ViewLocDetlMapper.java
@@ -1,9 +1,12 @@
 package com.zy.asrs.wms.asrs.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zy.asrs.wms.asrs.entity.LocDetl;
 import com.zy.asrs.wms.asrs.entity.ViewLocDetl;
 import com.zy.asrs.wms.asrs.entity.param.FieldParam;
+import com.zy.asrs.wms.asrs.entity.param.FieldSortParam;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
@@ -19,4 +22,7 @@
 
     Map<String,Object> getById(Long id);
 
+
+    List<Map<String,Object>> getSuitableMat( @Param("param") List<FieldParam> param, @Param("sortParam") List<FieldSortParam> sortParam);
+
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LocDetlService.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LocDetlService.java
index 9c98799..c569982 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LocDetlService.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LocDetlService.java
@@ -5,6 +5,7 @@
 import com.zy.asrs.wms.asrs.entity.LocDetl;
 import com.zy.asrs.wms.asrs.entity.ViewLocDetl;
 import com.zy.asrs.wms.asrs.entity.param.FieldParam;
+import com.zy.asrs.wms.asrs.entity.param.FieldSortParam;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.PageParam;
 import org.apache.poi.ss.formula.functions.T;
@@ -20,4 +21,6 @@
 
     List<LocDetl> parseLocDetl(List<LocDetl> list);
 
+    List<LocDetl> getSuitableMat( List<FieldParam> param, List<FieldSortParam> sortParam);
+
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocDetlServiceImpl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocDetlServiceImpl.java
index 8457aec..d8aaacc 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocDetlServiceImpl.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocDetlServiceImpl.java
@@ -4,21 +4,24 @@
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zy.asrs.wms.asrs.entity.LocDetl;
 import com.zy.asrs.wms.asrs.entity.LocDetlField;
 import com.zy.asrs.wms.asrs.entity.ViewLocDetl;
 import com.zy.asrs.wms.asrs.entity.param.FieldParam;
+import com.zy.asrs.wms.asrs.entity.param.FieldSortParam;
 import com.zy.asrs.wms.asrs.mapper.LocDetlMapper;
-import com.zy.asrs.wms.asrs.entity.LocDetl;
 import com.zy.asrs.wms.asrs.mapper.ViewLocDetlMapper;
 import com.zy.asrs.wms.asrs.service.LocDetlFieldService;
 import com.zy.asrs.wms.asrs.service.LocDetlService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.PageParam;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
 
 @Service("locDetlService")
 public class LocDetlServiceImpl extends ServiceImpl<LocDetlMapper, LocDetl> implements LocDetlService {
@@ -84,4 +87,23 @@
         }
         return list;
     }
+
+    /**
+     * 鏍规嵁鍑哄簱鏉′欢鏌ヨ绗﹀悎鐨勫簱瀛�
+     * @param param 鏌ヨ鏉′欢
+     * @param sortParam 鎺掑簭瀛楁
+     * @return
+     */
+    @Override
+    public List<LocDetl> getSuitableMat( List<FieldParam> param, List<FieldSortParam> sortParam) {
+        List<Map<String, Object>> stock = viewLocDetlMapper.getSuitableMat(param, sortParam);
+        List<LocDetl> locDetls = new ArrayList<>();
+        for (Map<String, Object> objectMap : stock) {
+            LocDetl detl = JSON.parseObject(JSON.toJSONString(objectMap), LocDetl.class);
+            detl.syncFieldMap(objectMap);
+            locDetls.add(detl);
+        }
+        return locDetls;
+    }
+
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocServiceImpl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocServiceImpl.java
index efa64fd..c70fd26 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocServiceImpl.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocServiceImpl.java
@@ -1,5 +1,6 @@
 package com.zy.asrs.wms.asrs.service.impl;
 
+import com.zy.asrs.wms.asrs.entity.enums.LocStsType;
 import com.zy.asrs.wms.asrs.mapper.LocMapper;
 import com.zy.asrs.wms.asrs.entity.Loc;
 import com.zy.asrs.wms.asrs.service.LocService;
@@ -9,4 +10,6 @@
 @Service("locService")
 public class LocServiceImpl extends ServiceImpl<LocMapper, Loc> implements LocService {
 
+
+
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/strategy/FIFOWithdrawalStrategy.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/strategy/FIFOWithdrawalStrategy.java
new file mode 100644
index 0000000..b0584be
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/strategy/FIFOWithdrawalStrategy.java
@@ -0,0 +1,15 @@
+package com.zy.asrs.wms.asrs.strategy;
+
+import com.zy.asrs.wms.asrs.entity.LocDetl;
+import com.zy.asrs.wms.asrs.entity.Mat;
+
+/**
+ * 鍏堣繘鍏堝嚭
+ */
+public class FIFOWithdrawalStrategy implements WithdrawalStrategy {
+    @Override
+    public Mat selectMatStrategy(LocDetl storageLocation) {
+
+        return null;
+    }
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/strategy/WithdrawalService.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/strategy/WithdrawalService.java
new file mode 100644
index 0000000..4ae95b6
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/strategy/WithdrawalService.java
@@ -0,0 +1,16 @@
+package com.zy.asrs.wms.asrs.strategy;
+
+import com.zy.asrs.wms.asrs.entity.LocDetl;
+import com.zy.asrs.wms.asrs.entity.Mat;
+
+public class WithdrawalService {
+    private WithdrawalStrategy strategy;
+
+    public WithdrawalService(WithdrawalStrategy strategy) {
+        this.strategy = strategy;
+    }
+
+    public Mat withdrawProduct(LocDetl storageLocation) {
+        return strategy.selectMatStrategy(storageLocation);
+    }
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/strategy/WithdrawalStrategy.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/strategy/WithdrawalStrategy.java
new file mode 100644
index 0000000..7de3ed3
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/strategy/WithdrawalStrategy.java
@@ -0,0 +1,8 @@
+package com.zy.asrs.wms.asrs.strategy;
+
+import com.zy.asrs.wms.asrs.entity.LocDetl;
+import com.zy.asrs.wms.asrs.entity.Mat;
+
+public interface WithdrawalStrategy {
+    Mat selectMatStrategy(LocDetl locDetl);
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskLogTimer.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskLogTimer.java
index 2ede7d5..8962a76 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskLogTimer.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskLogTimer.java
@@ -64,7 +64,7 @@
 
                 //淇濆瓨浠诲姟鏄庣粏鍘嗗彶妗�
                 List<TaskDetl> taskDetls = taskDetlService.getTaskDetlByTaskId(task.getId());
-                if(taskDetls.isEmpty()) {
+                if (taskDetls.isEmpty()) {
                     throw new CoolException("浠诲姟鏄庣粏涓嶅瓨鍦�");
                 }
                 for (TaskDetl taskDetl : taskDetls) {
@@ -86,14 +86,14 @@
 
                         //鍒犻櫎鏄庣粏鎵╁睍
                         boolean removeField = taskDetlFieldService.removeById(detlField.getId());
-                        if(!removeField){
+                        if (!removeField) {
                             throw new CoolException("鍒犻櫎鏄庣粏鎵╁睍澶辫触");
                         }
                     }
 
                     //鍒犻櫎鏄庣粏
                     boolean removeDetl = taskDetlService.removeById(taskDetl.getId());
-                    if(!removeDetl){
+                    if (!removeDetl) {
                         throw new CoolException("鏄庣粏鍒犻櫎澶辫触");
                     }
                 }
@@ -117,7 +117,7 @@
                     if (checkOrderComplete) {
                         //璁㈠崟宸茬粡瀹屾垚
                         Order order = orderService.getById(orderDetl.getOrderId());
-                        if(order == null) {
+                        if (order == null) {
                             throw new CoolException("璁㈠崟涓嶅瓨鍦�");
                         }
 
@@ -135,7 +135,7 @@
         } catch (Exception e) {
             e.printStackTrace();
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-        }finally {
+        } finally {
             InterceptorIgnoreHelper.clearIgnoreStrategy();
         }
     }
@@ -145,11 +145,100 @@
     public void outExecute() {
         InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build());
         try {
+            //鑾峰彇鍏ュ簱瀹屾垚浠诲姟
+            List<Task> list = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, 200));
+            if (list.isEmpty()) {
+                return;
+            }
 
+            for (Task task : list) {
+                Long hostId = task.getHostId();
+
+                //淇濆瓨浠诲姟鍘嗗彶妗�
+                TaskLog taskLog = new TaskLog();
+                taskLog.sync(task);
+                if (!taskLogService.save(taskLog)) {
+                    throw new CoolException("淇濆瓨浠诲姟鍘嗗彶妗eけ璐�");
+                }
+
+                //鍒犻櫎浠诲姟鍘嗗彶妗f
+                if (!taskService.removeById(task.getId())) {
+                    throw new CoolException("鍒犻櫎浠诲姟妗eけ璐�");
+                }
+
+                //淇濆瓨浠诲姟鏄庣粏鍘嗗彶妗�
+                List<TaskDetl> taskDetls = taskDetlService.getTaskDetlByTaskId(task.getId());
+                if (taskDetls.isEmpty()) {
+                    throw new CoolException("浠诲姟鏄庣粏涓嶅瓨鍦�");
+                }
+                for (TaskDetl taskDetl : taskDetls) {
+                    TaskDetlLog taskDetlLog = new TaskDetlLog();
+                    taskDetlLog.sync(taskDetl);
+                    if (!taskDetlLogService.save(taskDetlLog)) {
+                        throw new CoolException("淇濆瓨浠诲姟鏄庣粏鍘嗗彶妗eけ璐�");
+                    }
+
+                    //淇濆瓨鏄庣粏鎵╁睍瀛楁鍘嗗彶妗�
+                    List<TaskDetlField> detlFields = taskDetlFieldService.list(new LambdaQueryWrapper<TaskDetlField>().eq(TaskDetlField::getDetlId, taskDetl.getId()).eq(TaskDetlField::getHostId, hostId));
+                    for (TaskDetlField detlField : detlFields) {
+                        //鏄庣粏鎵╁睍瀛楁鏁版嵁淇濆瓨鑷冲巻鍙叉。
+                        TaskDetlFieldLog taskDetlFieldLog = new TaskDetlFieldLog();
+                        taskDetlFieldLog.sync(detlField);
+                        if (!taskDetlFieldLogService.save(taskDetlFieldLog)) {
+                            throw new CoolException("鏄庣粏鎵╁睍瀛楁杞巻鍙叉。妗堝け璐�");
+                        }
+
+                        //鍒犻櫎鏄庣粏鎵╁睍
+                        boolean removeField = taskDetlFieldService.removeById(detlField.getId());
+                        if (!removeField) {
+                            throw new CoolException("鍒犻櫎鏄庣粏鎵╁睍澶辫触");
+                        }
+                    }
+
+                    //鍒犻櫎鏄庣粏
+                    boolean removeDetl = taskDetlService.removeById(taskDetl.getId());
+                    if (!removeDetl) {
+                        throw new CoolException("鏄庣粏鍒犻櫎澶辫触");
+                    }
+                }
+
+                //鏇存柊璁㈠崟淇℃伅
+                for (TaskDetl taskDetl : taskDetls) {
+                    OrderDetl orderDetl = orderDetlService.getById(taskDetl.getDetlId());
+                    if (orderDetl == null) {
+                        throw new CoolException("璁㈠崟鏄庣粏涓嶅瓨鍦�");
+                    }
+
+                    orderDetl.setWorkQty(orderDetl.getWorkQty() - taskDetl.getAnfme());//宸ヤ綔涓暟閲忓噺灏�
+                    orderDetl.setQty(orderDetl.getQty() + taskDetl.getAnfme());//宸插畬鎴愭暟閲忓鍔�
+                    orderDetl.setUpdateTime(new Date());
+                    if (!orderDetlService.updateById(orderDetl)) {
+                        throw new CoolException("鏇存柊璁㈠崟鏄庣粏澶辫触");
+                    }
+
+                    //妫�娴嬭鍗曟槸鍚﹀畬鎴�
+                    boolean checkOrderComplete = orderService.checkOrderComplete(orderDetl.getOrderId());
+                    if (checkOrderComplete) {
+                        //璁㈠崟宸茬粡瀹屾垚
+                        Order order = orderService.getById(orderDetl.getOrderId());
+                        if (order == null) {
+                            throw new CoolException("璁㈠崟涓嶅瓨鍦�");
+                        }
+
+                        order.setOrderSettle(OrderSettleType.COMPLETE.val());
+                        order.setUpdateTime(new Date());
+                        if (!orderService.updateById(order)) {
+                            throw new CoolException("璁㈠崟鏇存柊澶辫触");
+                        }
+                    }
+                }
+
+
+            }
         } catch (Exception e) {
             e.printStackTrace();
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-        }finally {
+        } finally {
             InterceptorIgnoreHelper.clearIgnoreStrategy();
         }
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskTimer.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskTimer.java
index e9a0f64..4b78bed 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskTimer.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskTimer.java
@@ -21,20 +21,40 @@
 
     @Autowired
     private TaskService taskService;
+
     @Autowired
     private TaskDetlService taskDetlService;
+
     @Autowired
     private TaskDetlFieldService taskDetlFieldService;
+
     @Autowired
     private LocService locService;
+
     @Autowired
     private LocDetlService locDetlService;
+
     @Autowired
     private LocDetlFieldService locDetlFieldService;
+
     @Autowired
     private WaitPakinService waitPakinService;
+
     @Autowired
     private WaitPakinLogService waitPakinLogService;
+
+    @Autowired
+    private TaskDetlLogService taskDetlLogService;
+
+    @Autowired
+    private TaskDetlFieldLogService taskDetlFieldLogService;
+
+    @Autowired
+    private OrderService orderService;
+
+    @Autowired
+    private OrderDetlService orderDetlService;
+
 
     @Scheduled(cron = "0/3 * * * * ? ")
     @Transactional
@@ -53,11 +73,11 @@
                 switch (task.getTaskType().intValue()) {
                     case 1://鍏ュ簱
                         Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, task.getTargetLoc()).eq(Loc::getHostId, hostId));
-                        if(loc == null) {
+                        if (loc == null) {
                             throw new CoolException("搴撲綅涓嶅瓨鍦�");
                         }
 
-                        if(loc.getLocStsId() != LocStsType.S.val()){
+                        if (loc.getLocStsId() != LocStsType.S.val()) {
                             throw new CoolException("搴撲綅鐘舵�佷笉澶勪簬S.鍏ュ簱棰勭害");
                         }
 
@@ -70,7 +90,7 @@
 
 
                         List<TaskDetl> taskDetls = taskDetlService.getTaskDetlByTaskId(task.getId());
-                        if(taskDetls.isEmpty()) {
+                        if (taskDetls.isEmpty()) {
                             throw new CoolException("浠诲姟鏄庣粏涓嶅瓨鍦�");
                         }
 
@@ -106,7 +126,7 @@
 
                         //缁勬墭閫氱煡妗h浆鍘嗗彶妗�
                         List<WaitPakin> waitPakins = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getBarcode, task.getBarcode()).eq(WaitPakin::getHostId, hostId));
-                        if(waitPakins.isEmpty()) {
+                        if (waitPakins.isEmpty()) {
                             throw new CoolException("缁勬墭閫氱煡妗d笉瀛樺湪");
                         }
                         for (WaitPakin waitPakin : waitPakins) {
@@ -132,7 +152,7 @@
         } catch (Exception e) {
             e.printStackTrace();
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-        }finally {
+        } finally {
             InterceptorIgnoreHelper.clearIgnoreStrategy();
         }
     }
@@ -142,11 +162,60 @@
     public void outExecute() {
         InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build());
         try {
+            //鑾峰彇鍑哄簱瀹屾垚浠诲姟
+            List<Task> list = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, 199));
+            if (list.isEmpty()) {
+                return;
+            }
+            for (Task task : list) {
+                //鍚屾鏁版嵁
+                Long hostId = task.getHostId();
+                Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, task.getOriginLoc()).eq(Loc::getHostId, hostId));
+                if (loc == null) {
+                    throw new CoolException("搴撲綅涓嶅瓨鍦�");
+                }
+                if (loc.getLocStsId() != LocStsType.R.val()) {
+                    throw new CoolException("搴撲綅鐘舵�佷笉澶勪簬R.鍑哄簱棰勭害");
+                }
+                List<TaskDetl> taskDetls = taskDetlService.getTaskDetlByTaskId(task.getId());
+                if (taskDetls.isEmpty()) {
+                    throw new CoolException("浠诲姟鏄庣粏涓嶅瓨鍦�");
+                }
+                switch (task.getTaskType().intValue()) {
+                    //鍑哄簱
+                    case 101:
+                        loc.setLocStsId(LocStsType.O.val());
+                        loc.setBarcode("");
+                        if (!locService.updateById(loc)) {
+                            throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�");
+                        }
+                        List<LocDetl> detlList = locDetlService.list(new LambdaQueryWrapper<LocDetl>().eq(LocDetl::getLocNo, loc.getId()).eq(LocDetl::getHostId, hostId));
+                        //鍒犻櫎搴撳瓨鏄庣粏
+                        for (LocDetl locDetl : detlList) {
+                            if (!locDetlService.removeById(locDetl)) {
+                                throw new CoolException("鍒犻櫎搴撳瓨鏄庣粏澶辫触");
+                            }
+                            List<LocDetlField> detlFields = locDetlFieldService.list(new LambdaQueryWrapper<LocDetlField>().eq(LocDetlField::getDetlId, locDetl.getId()).eq(LocDetlField::getHostId, hostId));
+                            for (LocDetlField detlField : detlFields) {
+                                if (!locDetlFieldService.removeById(detlField)) {
+                                    throw new CoolException("鍒犻櫎鏄庣粏鎵╁睍瀛楁澶辫触");
+                                }
+                            }
+                        }
+                        break;
+
+                }
+
+                task.setTaskSts(200L);//200.搴撳瓨鏇存柊瀹屾垚
+                if (!taskService.updateById(task)) {
+                    throw new CoolException("搴撳瓨鏇存柊澶辫触");
+                }
+            }
 
         } catch (Exception e) {
             e.printStackTrace();
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-        }finally {
+        } finally {
             InterceptorIgnoreHelper.clearIgnoreStrategy();
         }
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/config/MybatisPlusConfig.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/config/MybatisPlusConfig.java
index 7f50413..7a5bf23 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/config/MybatisPlusConfig.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/config/MybatisPlusConfig.java
@@ -65,6 +65,7 @@
         PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
         interceptor.addInnerInterceptor(paginationInnerInterceptor);
 
+
         return interceptor;
     }
 
@@ -92,7 +93,7 @@
     }
 
     @Bean
-    public ConfigurationCustomizer mybatisConfigurationCustomizer(){
+    public ConfigurationCustomizer mybatisConfigurationCustomizer() {
         return configuration -> configuration.setObjectWrapperFactory(new MybatisMapWrapperFactory());
     }
 
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/event/OrderBatchEvent.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/event/OrderBatchEvent.java
new file mode 100644
index 0000000..33ff054
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/event/OrderBatchEvent.java
@@ -0,0 +1,17 @@
+package com.zy.asrs.wms.common.event;
+
+import org.springframework.context.ApplicationEvent;
+
+
+public class OrderBatchEvent extends ApplicationEvent {
+    private String orderId;
+
+    public OrderBatchEvent(Object source, String orderId) {
+        super(source);
+        this.orderId = orderId;
+    }
+
+    public String getOrderId() {
+        return orderId;
+    }
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/event/OrderBatchListener.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/event/OrderBatchListener.java
new file mode 100644
index 0000000..5d4b5e9
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/event/OrderBatchListener.java
@@ -0,0 +1,18 @@
+package com.zy.asrs.wms.common.event;
+
+import org.springframework.context.ApplicationListener;
+import org.springframework.stereotype.Component;
+
+//瀹炵幇ApplicationListener鎺ュ彛锛屽苟鎸囧畾鐩戝惉鐨勪簨浠剁被鍨�
+@Component
+public class OrderBatchListener implements ApplicationListener<OrderBatchEvent> {
+
+    @Override
+    public void onApplicationEvent(OrderBatchEvent event) {
+        //浣跨敤onApplicationEvent鏂规硶瀵规秷鎭繘琛屾帴鍙楀鐞�
+        String orderId = event.getOrderId();
+        System.out.println("DemoListener鑾峰彇鍒颁簡鐩戝惉娑堟伅:" + orderId);
+
+    }
+}
+
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/interceptor/MyMetaObjectHandler.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/interceptor/MyMetaObjectHandler.java
new file mode 100644
index 0000000..17b1423
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/interceptor/MyMetaObjectHandler.java
@@ -0,0 +1,42 @@
+package com.zy.asrs.wms.common.interceptor;
+
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import org.apache.ibatis.reflection.MetaObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+
+/**
+ * 瀹炵幇mybatisplus鐨勬帴鍙o紝瀵逛竴浜涘瓧娈电殑鑷姩濉粠
+ */
+@Component
+public class MyMetaObjectHandler implements MetaObjectHandler {
+
+    private static final Logger log = LoggerFactory.getLogger(MyMetaObjectHandler.class);
+
+    @Override
+    public void insertFill(MetaObject metaObject) {
+        log.info("323434323211221");
+//        String username = SecurityUtils.getUsername();
+//        if (StrUtil.isNotBlank(username)) {
+//            this.setFieldValByName("createName", username, metaObject);
+//        }
+//        this.setFieldValByName("createId", SecurityUtils.getUserId(), metaObject);
+        this.setFieldValByName("createTime", new Date(), metaObject);
+        this.setFieldValByName("status", 1, metaObject);
+        this.setFieldValByName("isDeleted", 0, metaObject);
+    }
+
+    @Override
+    public void updateFill(MetaObject metaObject) {
+        log.info("ceshishsihsshiisis");
+//        String username = SecurityUtils.getUsername();
+//        if (StrUtil.isNotBlank(username)) {
+//            this.setFieldValByName("updateName", username, metaObject);
+//        }
+//        this.setFieldValByName("updateId", SecurityUtils.getUserId(), metaObject);
+        this.setFieldValByName("updateTime", new Date(), metaObject);
+    }
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/interceptor/StockSortInterceptor.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/interceptor/StockSortInterceptor.java
new file mode 100644
index 0000000..f05da9e
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/interceptor/StockSortInterceptor.java
@@ -0,0 +1,68 @@
+//package com.zy.asrs.wms.common.interceptor;
+//
+//import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
+//import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
+//import org.apache.ibatis.executor.Executor;
+//import org.apache.ibatis.mapping.BoundSql;
+//import org.apache.ibatis.mapping.MappedStatement;
+//import org.apache.ibatis.session.ResultHandler;
+//import org.apache.ibatis.session.RowBounds;
+//
+//import java.sql.SQLException;
+//
+//
+//public class StockSortInterceptor implements InnerInterceptor {
+//
+//    @Override
+//    public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
+//        // 鑾峰彇鍘熷SQL璇彞
+//        String originalSql = boundSql.getSql();
+//        // 鍒ゆ柇鏂规硶鏄惁涓虹壒瀹氱殑鏌ヨ鏂规硶
+//        if (isSpecificQueryMethod(ms)) {
+//            // 娣诲姞鎺掑簭閫昏緫
+//            String sql = addSort(originalSql);
+//            // 淇敼瀹屾垚鐨剆ql 鍐嶈缃洖鍘�
+//            PluginUtils.MPBoundSql mpBoundSql = PluginUtils.mpBoundSql(boundSql);
+//            mpBoundSql.sql(sql);
+//        }
+//    }
+//
+//    private boolean isSpecificQueryMethod(MappedStatement ms) {
+//        // 妫�鏌appedStatement鐨処D浠ュ垽鏂槸鍚︿负鐗瑰畾鐨勬煡璇㈡柟娉�
+//        String statementId = ms.getId();
+//        return statementId.equals("com.zy.asrs.wms.asrs.mapper.LocDetlMapper.getStock");
+//    }
+//
+//    private String addSort(String originalSql) {
+//        // 鏍规嵁闇�瑕佹坊鍔犳帓搴忛�昏緫
+//        return originalSql + " ORDER BY" + isQueue();
+//    }
+//
+//    private String isQueue() {
+//        //鍏堣繘鍏堝嚭锛氬湪鏌ヨ搴撳瓨璁板綍鏃讹紝鎺掑簭瀛楁鎸夌収man_loc_detl琛ㄧ殑createTime鍗囧簭鎺掑簭
+//        return " create_time ASC";
+//    }
+//
+//    private String isFree() {
+//        //璁惧绌洪棽鎯呭喌锛氫紭鍏堟煡璇㈢┖闂茬殑璁惧锛屽湪鏈夌┖闂茬殑璁惧鏃讹紝浠庣┖闂茬殑璁惧瀵瑰簲鐨勮揣鏋朵笂鏌ヨ
+//        //TODO
+//        return " create_time ASC";
+//    }
+//
+//    private String isBarcodeDesc() {
+//        //鎵樼洏鏈�澶у�奸檷搴忥細灏辨槸鎸夌収鎵樼洏鍙烽檷搴�
+//        return " barcode DESC";
+//    }
+//
+//    private String isBarcodeAsc() {
+//        //鎵樼洏鏈�澶у�煎崌搴忥細灏辨槸鎸夌収鎵樼洏鍙峰崌搴�
+//        return " barcode ASC";
+//    }
+//
+//    private String isEven() {
+//        // 妤煎眰鍧囧寑鍒嗗竷锛�
+//        //TODO
+//        return " barcode ASC";
+//    }
+//
+//}
diff --git a/zy-asrs-wms/src/main/resources/mapper/asrs/LocDetlMapper.xml b/zy-asrs-wms/src/main/resources/mapper/asrs/LocDetlMapper.xml
index fac81f9..60952f9 100644
--- a/zy-asrs-wms/src/main/resources/mapper/asrs/LocDetlMapper.xml
+++ b/zy-asrs-wms/src/main/resources/mapper/asrs/LocDetlMapper.xml
@@ -15,5 +15,19 @@
             </foreach>
         </if>
     </select>
+
+    <select id="getStock" resultType="com.zy.asrs.wms.asrs.entity.LocDetl">
+        select * from man_loc_detl
+        where matnr = #{matnr}
+        <if test="batch!=null">
+            and batch = #{batch}
+        </if>
+        <if test="ids!=null and ids.size()>0">
+            and id in
+            <foreach item="item" collection="ids" index="index"  separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+    </select>
     
 </mapper>
diff --git a/zy-asrs-wms/src/main/resources/mapper/asrs/ViewLocDetlMapper.xml b/zy-asrs-wms/src/main/resources/mapper/asrs/ViewLocDetlMapper.xml
index e5d0179..505c629 100644
--- a/zy-asrs-wms/src/main/resources/mapper/asrs/ViewLocDetlMapper.xml
+++ b/zy-asrs-wms/src/main/resources/mapper/asrs/ViewLocDetlMapper.xml
@@ -31,8 +31,25 @@
     </select>
 
     <select id="getById" resultType="map">
-        select * from view_man_loc_detl
+        select *
+        from view_man_loc_detl
         where id = #{id}
     </select>
 
+
+
+    <select id="getSuitableMat" resultType="map">
+        select * from view_man_loc_detl ld
+        where 1=1
+        <if test="param!=null and param.size()>0">
+            <foreach item="item" collection="param" index="index">
+                and ${item.name} ${type} #{item.value}
+            </foreach>
+        </if>
+        <if test="sortParam!=null and sortParam.size()>0">
+            <foreach collection="sortParam" item="order" open="order by " separator="," close="  ">
+                ${item.name} #{item.value}
+            </foreach>
+        </if>
+    </select>
 </mapper>

--
Gitblit v1.9.1