From d4f47a3c09e994f896dc358df93656751a812e49 Mon Sep 17 00:00:00 2001
From: Junjie <540245094@qq.com>
Date: 星期五, 16 八月 2024 10:17:01 +0800
Subject: [PATCH] #

---
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LanewayRuleService.java          |    3 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/ViewLocDetlMapper.java            |    2 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/MatFieldServiceImpl.java    |    7 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocTypeBindServiceImpl.java |   26 +
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/OrderDetl.java                    |   15 +
 zy-asrs-wms/src/main/resources/mapper/asrs/LocTypeBindMapper.xml                        |    5 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/TaskDetl.java                     |    6 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/LocTypeBindMapper.java            |    4 
 zy-asrs-wms/src/main/resources/mapper/asrs/ViewOrderDetlMapper.xml                      |    5 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/LocUtils.java                           |  316 +++++++++++++++++++++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/ViewOrderDetlMapper.java          |   12 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/enums/LocTypeHeightType.java      |   33 ++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/GeneratePakInParam.java     |    3 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/WorkController.java           |    6 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/MatFieldMapper.java               |   66 ++++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LocTypeBindService.java          |    7 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/ViewTaskDetlMapper.java           |   20 +
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java        |  253 ++++++++++++----
 zy-asrs-wms/src/main/resources/mapper/asrs/ViewTaskDetlMapper.xml                       |   25 +
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LanewayRuleServiceImpl.java |   17 +
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/WorkService.java                 |   12 
 zy-asrs-wms/src/main/resources/mapper/asrs/ViewLocDetlMapper.xml                        |   15 +
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LanewayRule.java                  |   20 +
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocDetlServiceImpl.java     |    2 
 24 files changed, 809 insertions(+), 71 deletions(-)

diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/WorkController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/WorkController.java
index 3aeb2ca..17d3e81 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/WorkController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/WorkController.java
@@ -22,7 +22,11 @@
     @PostMapping("/rpc/generatePakIn")
     public R generatePakIn(@RequestBody GeneratePakInParam param) {
         try {
-            workService.generatePakIn(param);
+            if (param.getTaskType() == 10) {
+                workService.generateEmptyPakIn(param);//绌烘墭鐩�
+            }else {
+                workService.generatePakIn(param);//婊℃墭鐩�
+            }
             return R.ok("娣诲姞鎴愬姛");
         } catch (Exception e) {
             return R.error(e.getMessage());
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LanewayRule.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LanewayRule.java
index 40b77e8..2939aae 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LanewayRule.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LanewayRule.java
@@ -1,5 +1,6 @@
 package com.zy.asrs.wms.asrs.entity;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import java.text.SimpleDateFormat;
 import java.util.Date;
@@ -25,6 +26,7 @@
 
 import java.io.Serializable;
 import java.util.Date;
+import java.util.List;
 
 @Data
 @TableName("strategy_laneway_rule")
@@ -136,6 +138,24 @@
 //            null    // 澶囨敞
 //    );
 
+    public List<Integer> getLaneX$() {
+        if (null == this.laneX){ return null; }
+        List<Integer> list = JSON.parseArray(this.laneX, Integer.class);
+        if (list.isEmpty()) {
+            return null;
+        }
+        return list;
+    }
+
+    public List<Integer> getLaneY$() {
+        if (null == this.laneY){ return null; }
+        List<Integer> list = JSON.parseArray(this.laneY, Integer.class);
+        if (list.isEmpty()) {
+            return null;
+        }
+        return list;
+    }
+
     public String getHostId$(){
         HostService service = SpringUtils.getBean(HostService.class);
         Host host = service.getById(this.hostId);
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/OrderDetl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/OrderDetl.java
index 2bcb924..06b1630 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/OrderDetl.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/OrderDetl.java
@@ -9,6 +9,8 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.fasterxml.jackson.annotation.JsonAnyGetter;
 import com.zy.asrs.common.utils.Synchro;
+import com.zy.asrs.wms.asrs.entity.param.FieldParam;
+import com.zy.asrs.wms.asrs.service.MatFieldService;
 import com.zy.asrs.wms.asrs.service.MatService;
 import com.zy.asrs.wms.asrs.service.OrderService;
 import com.zy.asrs.wms.asrs.service.WaitPakinService;
@@ -333,5 +335,18 @@
         dynamicFields.put(key, value);
     }
 
+    //鑾峰彇绱㈠紩瀛楁
+    public List<FieldParam> getUniqueField() {
+        MatFieldService service = SpringUtils.getBean(MatFieldService.class);
+
+        List<FieldParam> list = new ArrayList<>();
+        for (MatField matField : service.list(new LambdaQueryWrapper<MatField>().eq(MatField::getUnique, 1))) {
+            FieldParam param = new FieldParam();
+            param.setName(matField.getName());
+            param.setValue(dynamicFields.get(matField.getName()));
+            list.add(param);
+        }
+        return list;
+    }
 
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/TaskDetl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/TaskDetl.java
index ccca36a..1b6f769 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/TaskDetl.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/TaskDetl.java
@@ -103,6 +103,12 @@
     private Long matId;
 
     /**
+     * 鍟嗗搧缂栧彿
+     */
+    @ApiModelProperty(value= "鍟嗗搧缂栧彿")
+    private String matnr;
+
+    /**
      * 鎵�灞炴満鏋�
      */
     @ApiModelProperty(value= "鎵�灞炴満鏋�")
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/enums/LocTypeHeightType.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/enums/LocTypeHeightType.java
new file mode 100644
index 0000000..a93ffab
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/enums/LocTypeHeightType.java
@@ -0,0 +1,33 @@
+package com.zy.asrs.wms.asrs.entity.enums;
+
+/**
+ * 搴撲綅楂樺害绫诲瀷
+ */
+public enum LocTypeHeightType {
+
+    LOW(1, "low", "浣庡簱浣�"),
+    MIDDLE(2, "middle", "涓簱浣�"),
+    HEIGHT(3, "height", "楂樺簱浣�"),
+    ;
+
+
+    public Integer id;
+    public String flag;
+    public String desc;
+
+    LocTypeHeightType(Integer id, String flag, String desc) {
+        this.id = id;
+        this.flag = flag;
+        this.desc = desc;
+    }
+
+    public static LocTypeHeightType get(Integer id) {
+        for (LocTypeHeightType value : LocTypeHeightType.values()) {
+            if (value.id.equals(id)) {
+                return value;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/GeneratePakInParam.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/GeneratePakInParam.java
index 7987ce5..a331938 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/GeneratePakInParam.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/GeneratePakInParam.java
@@ -14,4 +14,7 @@
     //婧愮珯鐐�
     private String originSite;
 
+    //搴撲綅楂樺害{LocTypeHeightType}
+    private Integer locTypeHeight;
+
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/LocTypeBindMapper.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/LocTypeBindMapper.java
index f5471f9..0a19a71 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/LocTypeBindMapper.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/LocTypeBindMapper.java
@@ -5,8 +5,12 @@
 import org.apache.ibatis.annotations.Mapper;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 @Mapper
 @Repository
 public interface LocTypeBindMapper extends BaseMapper<LocTypeBind> {
 
+    List<Long> getLocIdListByTypeId(Long typeId);
+
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/MatFieldMapper.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/MatFieldMapper.java
index 133a840..a4a3d44 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/MatFieldMapper.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/MatFieldMapper.java
@@ -1,6 +1,5 @@
 package com.zy.asrs.wms.asrs.mapper;
 
-import com.zy.asrs.wms.asrs.entity.LocDetlField;
 import com.zy.asrs.wms.asrs.entity.MatField;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
@@ -18,9 +17,20 @@
     @SelectProvider(type = SqlProvider.class, method = "createViewSql")
     void createView(@Param("list") List<MatField> list);
 
-
     @SelectProvider(type = SqlProvider.class, method = "createLocDetlView")
     void createLocDetlView();
+
+    @SelectProvider(type = SqlProvider.class, method = "createTaskDetlFieldSql")
+    void createTaskDetlFieldView(@Param("list") List<MatField> list);
+
+    @SelectProvider(type = SqlProvider.class, method = "createViewTaskDetlSql")
+    void createViewTaskDetlView();
+
+    @SelectProvider(type = SqlProvider.class, method = "createOrderDetlFieldSql")
+    void createOrderDetlFieldView(@Param("list") List<MatField> list);
+
+    @SelectProvider(type = SqlProvider.class, method = "createViewOrderDetlSql")
+    void createViewOrderDetlView();
 
     class SqlProvider {
         public String createViewSql(Map<String, Object> params) {
@@ -48,6 +58,58 @@
 
             return sql.toString();
         }
+
+        public String createTaskDetlFieldSql(Map<String, Object> params) {
+            List<MatField> list = (List<MatField>) params.get("list");
+            StringBuilder sql = new StringBuilder();
+
+            sql.append(" CREATE OR REPLACE VIEW view_man_task_detl_field AS \n");
+            sql.append(" SELECT detl_id as _detl_id ");
+            for (MatField matField : list) {
+                sql.append(", MAX(CASE WHEN name = '").append(matField.getName()).append("' THEN value END) AS ").append(matField.getName());
+            }
+            sql.append(" FROM man_task_detl_field ");
+            sql.append(" GROUP BY _detl_id ");
+
+            return sql.toString();
+        }
+
+        public String createViewTaskDetlSql() {
+            StringBuilder sql = new StringBuilder();
+
+            sql.append(" CREATE OR REPLACE VIEW view_man_task_detl AS \n");
+            sql.append(" select * from man_task_detl td ");
+            sql.append(" left join view_man_task_detl_field tdf ");
+            sql.append(" on td.id = tdf._detl_id ");
+
+            return sql.toString();
+        }
+
+        public String createOrderDetlFieldSql(Map<String, Object> params) {
+            List<MatField> list = (List<MatField>) params.get("list");
+            StringBuilder sql = new StringBuilder();
+
+            sql.append(" CREATE OR REPLACE VIEW view_man_order_detl_field AS \n");
+            sql.append(" SELECT detl_id as _detl_id ");
+            for (MatField matField : list) {
+                sql.append(", MAX(CASE WHEN name = '").append(matField.getName()).append("' THEN value END) AS ").append(matField.getName());
+            }
+            sql.append(" FROM man_order_detl_field ");
+            sql.append(" GROUP BY _detl_id ");
+
+            return sql.toString();
+        }
+
+        public String createViewOrderDetlSql() {
+            StringBuilder sql = new StringBuilder();
+
+            sql.append(" CREATE OR REPLACE VIEW view_man_order_detl AS \n");
+            sql.append(" select * from man_order_detl od ");
+            sql.append(" left join view_man_order_detl_field odf ");
+            sql.append(" on od.id = odf._detl_id ");
+
+            return sql.toString();
+        }
     }
 
 }
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 5cd1984..026c55a 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
@@ -15,6 +15,8 @@
 
     List<Map<String,Object>> getList(String matnr, String batch, List<FieldParam> param);
 
+    List<Map<String,Object>> getListLike(String matnr, String batch, List<FieldParam> param);
+
     Map<String,Object> getById(Long id);
 
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/ViewOrderDetlMapper.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/ViewOrderDetlMapper.java
new file mode 100644
index 0000000..4c00e3f
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/ViewOrderDetlMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.wms.asrs.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zy.asrs.wms.asrs.entity.ViewLocDetl;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface ViewOrderDetlMapper extends BaseMapper<ViewLocDetl> {
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/ViewTaskDetlMapper.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/ViewTaskDetlMapper.java
new file mode 100644
index 0000000..6c0cad6
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/ViewTaskDetlMapper.java
@@ -0,0 +1,20 @@
+package com.zy.asrs.wms.asrs.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zy.asrs.wms.asrs.entity.ViewLocDetl;
+import com.zy.asrs.wms.asrs.entity.param.FieldParam;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Map;
+
+@Mapper
+@Repository
+public interface ViewTaskDetlMapper extends BaseMapper<ViewLocDetl> {
+
+    List<Map<String,Object>> getList(String matnr, String batch, List<FieldParam> param);
+
+    Map<String,Object> getById(Long id);
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LanewayRuleService.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LanewayRuleService.java
index bd1873f..7f2ec0e 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LanewayRuleService.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LanewayRuleService.java
@@ -2,7 +2,10 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zy.asrs.wms.asrs.entity.LanewayRule;
+import com.zy.asrs.wms.asrs.entity.Loc;
 
 public interface LanewayRuleService extends IService<LanewayRule> {
 
+    LanewayRule getLaneByLoc(Loc loc);
+
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LocTypeBindService.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LocTypeBindService.java
index e9df8a4..b0f7bbc 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LocTypeBindService.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LocTypeBindService.java
@@ -1,8 +1,15 @@
 package com.zy.asrs.wms.asrs.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.zy.asrs.wms.asrs.entity.LocType;
 import com.zy.asrs.wms.asrs.entity.LocTypeBind;
 
+import java.util.List;
+
 public interface LocTypeBindService extends IService<LocTypeBind> {
 
+    List<Long> getLocIdListByTypeId(Long typeId);
+
+    List<Long> getLocIdListByType(LocType locType);
+
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/WorkService.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/WorkService.java
index 8c478bc..1d613f3 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/WorkService.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/WorkService.java
@@ -11,12 +11,18 @@
     //鐢熸垚浼樺厛绾�
     Integer generateIoPri(Long taskType);
 
-    //鐢熸垚鍙敤搴撲綅鍙�
-    Loc generateLoc(Long taskType);
+    //鐢熸垚绌烘墭鐩樺彲鐢ㄥ簱浣嶅彿
+    Loc generateEmptyLoc(Long taskType, Integer locTypeHeight);
 
-    //鐢熸垚鍏ュ簱浠诲姟
+    //鐢熸垚鍙敤搴撲綅鍙�
+    Loc generateLoc(Long taskType, String barcode, Integer locTypeHeight);
+
+    //鐢熸垚鍏ュ簱浠诲姟(婊℃墭鐩�)
     boolean generatePakIn(GeneratePakInParam param);
 
+    //鐢熸垚鍏ュ簱浠诲姟(绌烘墭鐩�)
+    boolean generateEmptyPakIn(GeneratePakInParam param);
+
     //瀹屾垚浠诲姟
     boolean completeTask(Long taskId);
 
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LanewayRuleServiceImpl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LanewayRuleServiceImpl.java
index 0a764cf..6c5523d 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LanewayRuleServiceImpl.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LanewayRuleServiceImpl.java
@@ -1,12 +1,29 @@
 package com.zy.asrs.wms.asrs.service.impl;
 
+import com.zy.asrs.wms.asrs.entity.Loc;
 import com.zy.asrs.wms.asrs.mapper.LanewayRuleMapper;
 import com.zy.asrs.wms.asrs.entity.LanewayRule;
 import com.zy.asrs.wms.asrs.service.LanewayRuleService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 @Service("lanewayRuleService")
 public class LanewayRuleServiceImpl extends ServiceImpl<LanewayRuleMapper, LanewayRule> implements LanewayRuleService {
 
+    @Override
+    public LanewayRule getLaneByLoc(Loc loc) {
+        List<LanewayRule> list = this.list();
+        for (LanewayRule rule : list) {
+            List<Integer> laneX = rule.getLaneX$();
+            List<Integer> laneY = rule.getLaneY$();
+            laneX.addAll(laneY);
+
+            if (laneX.contains(loc.getRow1())) {
+                return rule;
+            }
+        }
+        return null;
+    }
 }
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 b24d130..8457aec 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
@@ -66,7 +66,7 @@
             param.add(fieldParam);
         }
 
-        List<Map<String, Object>> list2 = viewLocDetlMapper.getList(matnr, batch, param);
+        List<Map<String, Object>> list2 = viewLocDetlMapper.getListLike(matnr, batch, param);
         List<LocDetl> locDetls = new ArrayList<>();
         for (Map<String, Object> objectMap : list2) {
             LocDetl locDetl = JSON.parseObject(JSON.toJSONString(objectMap), LocDetl.class);
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocTypeBindServiceImpl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocTypeBindServiceImpl.java
index 601ed30..0976615 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocTypeBindServiceImpl.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocTypeBindServiceImpl.java
@@ -1,12 +1,38 @@
 package com.zy.asrs.wms.asrs.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.zy.asrs.framework.common.Cools;
+import com.zy.asrs.wms.asrs.entity.LocType;
 import com.zy.asrs.wms.asrs.mapper.LocTypeBindMapper;
 import com.zy.asrs.wms.asrs.entity.LocTypeBind;
 import com.zy.asrs.wms.asrs.service.LocTypeBindService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
+import java.util.Collections;
+import java.util.List;
+
 @Service("locTypeBindService")
 public class LocTypeBindServiceImpl extends ServiceImpl<LocTypeBindMapper, LocTypeBind> implements LocTypeBindService {
 
+    @Override
+    public List<Long> getLocIdListByTypeId(Long typeId) {
+        return this.baseMapper.getLocIdListByTypeId(typeId);
+    }
+
+    @Override
+    public List<Long> getLocIdListByType(LocType locType) {
+        List<Long> locIdList = this.getLocIdListByTypeId(locType.getId());
+
+        if (!Cools.isEmpty(locType.getContain())) {
+            List<Long> list = JSON.parseArray(locType.getContain(), Long.class);
+            for (Long id : list) {
+                List<Long> longs = this.getLocIdListByTypeId(id);
+                if (!longs.isEmpty()) {
+                    locIdList.addAll(longs);
+                }
+            }
+        }
+        return locIdList;
+    }
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/MatFieldServiceImpl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/MatFieldServiceImpl.java
index c598c3d..4cced4e 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/MatFieldServiceImpl.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/MatFieldServiceImpl.java
@@ -19,6 +19,13 @@
         List<MatField> list = this.list();
         this.baseMapper.createView(list);
         this.baseMapper.createLocDetlView();
+
+        this.baseMapper.createTaskDetlFieldView(list);
+        this.baseMapper.createViewTaskDetlView();
+
+        this.baseMapper.createOrderDetlFieldView(list);
+        this.baseMapper.createViewOrderDetlView();
+
     }
 
     @Override
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java
index 5d793ba..1c6c199 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java
@@ -7,13 +7,12 @@
 import com.zy.asrs.wms.asrs.entity.enums.OrderSettleType;
 import com.zy.asrs.wms.asrs.entity.param.GeneratePakInParam;
 import com.zy.asrs.wms.asrs.service.*;
+import com.zy.asrs.wms.utils.LocUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Date;
-import java.util.List;
-import java.util.Random;
+import java.util.*;
 
 @Service("workService")
 public class WorkServiceImpl implements WorkService {
@@ -44,6 +43,8 @@
     private TaskDetlLogService taskDetlLogService;
     @Autowired
     private TaskDetlFieldLogService taskDetlFieldLogService;
+    @Autowired
+    private LocUtils locUtils;
 
     @Override
     public String generateTaskNo(Long taskType) {
@@ -58,20 +59,92 @@
     }
 
     @Override
-    public Loc generateLoc(Long taskType) {
-        LocSts locSts = locStsService.getOne(new LambdaQueryWrapper<LocSts>().eq(LocSts::getLocSts, String.valueOf(LocStsType.O)));
-        List<Loc> list = locService.list(new LambdaQueryWrapper<Loc>().eq(Loc::getLocStsId, locSts.getId()));
-        if (list.isEmpty()) {
-            throw new CoolException("娌℃湁绌哄簱浣�");
+    public Loc generateEmptyLoc(Long taskType, Integer locTypeHeight) {
+        Loc defaultLoc = null;
+
+        //1.浠庡簱瀛樻垨浠诲姟涓尮閰嶇浉閭诲簱浣�
+        defaultLoc = locUtils.getNeighborEmptyLoc(taskType, locTypeHeight);
+        if (defaultLoc != null) {
+            return defaultLoc;
         }
-        return list.get(0);
+
+        //2.鑾峰彇鎺ㄨ崘搴撲綅
+        List<Loc> suggestLoc = locUtils.getSuggestEmptyLoc(taskType, locTypeHeight);
+        //鑾峰彇搴撲綅
+        if (!suggestLoc.isEmpty()) {
+            defaultLoc = locUtils.filterLoc(taskType, suggestLoc);
+            if(defaultLoc != null) {
+                return defaultLoc;
+            }
+        }
+
+        //3.浠庡叏灞�搴撲綅涓幏鍙�(瀹屾暣宸烽亾)
+        List<Loc> globalLoc = locUtils.getGlobalEmptyLoc(taskType, locTypeHeight);
+        //鑾峰彇搴撲綅
+        if (!globalLoc.isEmpty()) {
+            defaultLoc = locUtils.filterAllLoc(globalLoc);
+            if(defaultLoc != null) {
+                return defaultLoc;
+            }
+        }
+
+        return defaultLoc;
+    }
+
+    @Override
+    public Loc generateLoc(Long taskType, String barcode, Integer locTypeHeight) {
+        List<WaitPakin> waitPakins = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getBarcode, barcode));
+        if (taskType != 10 && waitPakins.isEmpty()) {
+            throw new CoolException("鎵樼洏鏈粍鎵�");
+        }
+
+        WaitPakin waitPakin = waitPakins.get(0);
+        OrderDetl detl = waitPakin.getDetl$();
+        if (detl == null) {
+            throw new CoolException("璁㈠崟鏄庣粏涓嶅瓨鍦�");
+        }
+
+        Mat mat = detl.getMat$();
+        if (mat == null) {
+            throw new CoolException("鍟嗗搧涓嶅瓨鍦�");
+        }
+
+        Loc defaultLoc = null;
+
+        //1.浠庡簱瀛樻垨浠诲姟涓尮閰嶇浉閭诲簱浣�
+        defaultLoc = locUtils.getNeighborLoc(taskType, detl, locTypeHeight);
+        if (defaultLoc != null) {
+            return defaultLoc;
+        }
+
+        //2.鑾峰彇鎺ㄨ崘搴撲綅
+        List<Loc> suggestLoc = locUtils.getSuggestLoc(taskType, mat.getId(), detl.getBatch(), locTypeHeight);
+        //鑾峰彇搴撲綅
+        if (!suggestLoc.isEmpty()) {
+            defaultLoc = locUtils.filterLoc(taskType, suggestLoc);
+            if(defaultLoc != null) {
+                return defaultLoc;
+            }
+        }
+
+        //3.浠庡叏灞�搴撲綅涓幏鍙�(瀹屾暣宸烽亾)
+        List<Loc> globalLoc = locUtils.getGlobalLoc(taskType, locTypeHeight);
+        //鑾峰彇搴撲綅
+        if (!globalLoc.isEmpty()) {
+            defaultLoc = locUtils.filterAllLoc(globalLoc);
+            if(defaultLoc != null) {
+                return defaultLoc;
+            }
+        }
+
+        return defaultLoc;
     }
 
     @Override
     @Transactional
     public boolean generatePakIn(GeneratePakInParam param) {
         List<WaitPakin> waitPakins = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getBarcode, param.getBarcode()));
-        if (waitPakins.isEmpty()) {
+        if (param.getTaskType() != 10 && waitPakins.isEmpty()) {
             throw new CoolException("鎵樼洏鏈粍鎵�");
         }
 
@@ -80,8 +153,16 @@
             throw new CoolException("浠诲姟绫诲瀷涓嶅瓨鍦�");
         }
 
+        Task one = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, param.getBarcode()));
+        if (one != null) {
+            throw new CoolException("浠诲姟宸茬粡鍒涘缓锛岃鍕块噸澶嶈姹�");
+        }
+
         //鐢熸垚搴撲綅
-        Loc loc = this.generateLoc(param.getTaskType());
+        Loc loc = this.generateLoc(param.getTaskType(), param.getBarcode(), param.getLocTypeHeight());
+        if(loc == null) {
+            throw new CoolException("娌℃湁绌哄簱浣�");
+        }
 
         Task task = new Task();
         task.setTaskNo(this.generateTaskNo(taskType.getId()));//浠诲姟鍙�
@@ -111,6 +192,7 @@
             taskDetl.setOrderNo(waitPakin.getOrderNo());
             taskDetl.setDetlId(waitPakin.getDetlId());
             taskDetl.setMatId(waitPakin.getDetl$().getMatId());
+            taskDetl.setMatnr(waitPakin.getDetl$().getMat$().getMatnr());
             boolean taskDetlSave = taskDetlService.save(taskDetl);
             if(!taskDetlSave){
                 throw new CoolException("浠诲姟鏄庣粏鐢熸垚澶辫触");
@@ -179,6 +261,45 @@
     }
 
     @Override
+    public boolean generateEmptyPakIn(GeneratePakInParam param) {
+        TaskType taskType = taskTypeService.getById(param.getTaskType());
+        if (taskType == null) {
+            throw new CoolException("浠诲姟绫诲瀷涓嶅瓨鍦�");
+        }
+
+        //鐢熸垚搴撲綅
+        Loc loc = this.generateEmptyLoc(param.getTaskType(), param.getLocTypeHeight());
+        if(loc == null) {
+            throw new CoolException("娌℃湁绌哄簱浣�");
+        }
+
+        Task task = new Task();
+        task.setTaskNo(this.generateTaskNo(taskType.getId()));//浠诲姟鍙�
+        task.setTaskSts(1L);//1.鐢熸垚鍏ュ簱浠诲姟
+        task.setTaskType(taskType.getId());//浠诲姟绫诲瀷
+        task.setIoPri(this.generateIoPri(taskType.getId()));//浼樺厛绾�
+        task.setOriginLoc(null);
+        task.setTargetLoc(loc.getLocNo());
+        task.setOriginSite(param.getOriginSite());
+        task.setTargetSite(null);
+        task.setBarcode(null);//鎵樼洏鐮�
+        boolean taskSave = taskService.save(task);
+        if (!taskSave) {
+            throw new CoolException("浠诲姟鐢熸垚澶辫触");
+        }
+
+        //搴撲綅O => S
+        loc.setLocStsId(LocStsType.S.val());
+        loc.setUpdateTime(new Date());
+        boolean locUpdate = locService.updateById(loc);
+        if(!locUpdate){
+            throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�");
+        }
+
+        return true;
+    }
+
+    @Override
     public boolean completeTask(Long taskId) {
         Task task = taskService.getById(taskId);
         if(task == null){
@@ -214,15 +335,11 @@
             throw new CoolException("浠诲姟涓嶅瓨鍦�");
         }
 
-        List<TaskDetl> taskDetls = taskDetlService.getTaskDetlByTaskId(taskId);
-        if (taskDetls.isEmpty()) {
-            throw new CoolException("浠诲姟鏄庣粏涓嶅瓨鍦�");
-        }
-
         //鏇存柊搴撲綅鐘舵��
         Loc loc = null;
         switch (task.getTaskType().intValue()) {
             case 1://鍏ュ簱
+            case 10://绌烘澘
             case 53://鎷f枡
             case 54://骞舵澘
             case 57://鐩樼偣
@@ -243,6 +360,7 @@
             case 103://鎷f枡
             case 104://骞舵澘
             case 107://鐩樼偣
+            case 110://绌烘澘
                 loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, task.getOriginLoc()));
                 if(loc == null){
                     throw new CoolException("搴撲綅涓嶅瓨鍦�");
@@ -258,64 +376,71 @@
                 break;
         }
 
-        //鍥炴粴璁㈠崟
-        for (TaskDetl taskDetl : taskDetls) {
-            OrderDetl orderDetl = orderDetlService.getById(taskDetl.getDetlId());
-            if(orderDetl == null){
-                throw new CoolException("璁㈠崟鏄庣粏涓嶅瓨鍦�");
+        if (task.getTaskType() != 10) {
+            List<TaskDetl> taskDetls = taskDetlService.getTaskDetlByTaskId(taskId);
+            if (taskDetls.isEmpty()) {
+                throw new CoolException("浠诲姟鏄庣粏涓嶅瓨鍦�");
             }
 
-            //鍥炴粴宸ヤ綔鏁伴噺
-            orderDetl.setWorkQty(orderDetl.getWorkQty() - taskDetl.getAnfme());
-            orderDetl.setUpdateTime(new Date());
-            boolean orderDetlUpdate = orderDetlService.updateById(orderDetl);
-            if(!orderDetlUpdate){
-                throw new CoolException("宸ヤ綔鏁伴噺鍥炴粴澶辫触");
-            }
-
-            //鍏ュ簱鍥炴粴缁勬墭閫氱煡妗�
-            if (task.getTaskType() == 1) {
-                WaitPakin waitPakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getDetlId, taskDetl.getDetlId()).eq(WaitPakin::getBarcode, task.getBarcode()));
-                if(waitPakin == null){
-                    throw new CoolException("缁勬墭閫氱煡妗d笉瀛樺湪");
+            //鍥炴粴璁㈠崟
+            for (TaskDetl taskDetl : taskDetls) {
+                OrderDetl orderDetl = orderDetlService.getById(taskDetl.getDetlId());
+                if(orderDetl == null){
+                    throw new CoolException("璁㈠崟鏄庣粏涓嶅瓨鍦�");
                 }
 
-                waitPakin.setIoStatus(0);
-                waitPakin.setUpdateTime(new Date());
-                boolean updateWaitPakin = waitPakinService.updateById(waitPakin);
-                if(!updateWaitPakin){
-                    throw new CoolException("缁勬墭閫氱煡妗e洖婊氬け璐�");
-                }
-            }
-
-            List<TaskDetlField> detlFields = taskDetlFieldService.list(new LambdaQueryWrapper<TaskDetlField>().eq(TaskDetlField::getDetlId, taskDetl.getId()));
-            for (TaskDetlField detlField : detlFields) {
-                //鏄庣粏鎵╁睍瀛楁鏁版嵁淇濆瓨鑷冲巻鍙叉。
-                TaskDetlFieldLog taskDetlFieldLog = new TaskDetlFieldLog();
-                taskDetlFieldLog.sync(detlField);
-                if (!taskDetlFieldLogService.save(taskDetlFieldLog)) {
-                    throw new CoolException("鏄庣粏鎵╁睍瀛楁杞巻鍙叉。妗堝け璐�");
+                //鍥炴粴宸ヤ綔鏁伴噺
+                orderDetl.setWorkQty(orderDetl.getWorkQty() - taskDetl.getAnfme());
+                orderDetl.setUpdateTime(new Date());
+                boolean orderDetlUpdate = orderDetlService.updateById(orderDetl);
+                if(!orderDetlUpdate){
+                    throw new CoolException("宸ヤ綔鏁伴噺鍥炴粴澶辫触");
                 }
 
-                //鍒犻櫎鏄庣粏鎵╁睍
-                boolean removeField = taskDetlFieldService.removeById(detlField.getId());
-                if(!removeField){
-                    throw new CoolException("鍥炴粴鎵╁睍鏄庣粏澶辫触");
+                //鍏ュ簱鍥炴粴缁勬墭閫氱煡妗�
+                if (task.getTaskType() == 1) {
+                    WaitPakin waitPakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getDetlId, taskDetl.getDetlId()).eq(WaitPakin::getBarcode, task.getBarcode()));
+                    if(waitPakin == null){
+                        throw new CoolException("缁勬墭閫氱煡妗d笉瀛樺湪");
+                    }
+
+                    waitPakin.setIoStatus(0);
+                    waitPakin.setUpdateTime(new Date());
+                    boolean updateWaitPakin = waitPakinService.updateById(waitPakin);
+                    if(!updateWaitPakin){
+                        throw new CoolException("缁勬墭閫氱煡妗e洖婊氬け璐�");
+                    }
                 }
-            }
+
+                List<TaskDetlField> detlFields = taskDetlFieldService.list(new LambdaQueryWrapper<TaskDetlField>().eq(TaskDetlField::getDetlId, taskDetl.getId()));
+                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("鍥炴粴鎵╁睍鏄庣粏澶辫触");
+                    }
+                }
 
 
-            //鏄庣粏鏁版嵁淇濆瓨鑷冲巻鍙叉。
-            TaskDetlLog taskDetlLog = new TaskDetlLog();
-            taskDetlLog.sync(taskDetl);
-            if (!taskDetlLogService.save(taskDetlLog)) {
-                throw new CoolException("鏄庣粏鏁版嵁杞巻鍙叉。妗堝け璐�");
-            }
+                //鏄庣粏鏁版嵁淇濆瓨鑷冲巻鍙叉。
+                TaskDetlLog taskDetlLog = new TaskDetlLog();
+                taskDetlLog.sync(taskDetl);
+                if (!taskDetlLogService.save(taskDetlLog)) {
+                    throw new CoolException("鏄庣粏鏁版嵁杞巻鍙叉。妗堝け璐�");
+                }
 
-            //鍒犻櫎鏄庣粏
-            boolean removeDetl = taskDetlService.removeById(taskDetl.getId());
-            if(!removeDetl){
-                throw new CoolException("鍥炴粴鏄庣粏澶辫触");
+                //鍒犻櫎鏄庣粏
+                boolean removeDetl = taskDetlService.removeById(taskDetl.getId());
+                if(!removeDetl){
+                    throw new CoolException("鍥炴粴鏄庣粏澶辫触");
+                }
             }
         }
 
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/LocUtils.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/LocUtils.java
new file mode 100644
index 0000000..06d9e13
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/LocUtils.java
@@ -0,0 +1,316 @@
+package com.zy.asrs.wms.utils;
+
+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.*;
+import com.zy.asrs.wms.asrs.entity.enums.LocStsType;
+import com.zy.asrs.wms.asrs.entity.enums.LocTypeHeightType;
+import com.zy.asrs.wms.asrs.mapper.ViewLocDetlMapper;
+import com.zy.asrs.wms.asrs.mapper.ViewTaskDetlMapper;
+import com.zy.asrs.wms.asrs.service.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@Component
+public class LocUtils {
+
+    @Autowired
+    private TaskService taskService;
+    @Autowired
+    private LocService locService;
+    @Autowired
+    private SuggestLocRuleService suggestLocRuleService;
+    @Autowired
+    private LanewayRuleService lanewayRuleService;
+    @Autowired
+    private LocTypeService locTypeService;
+    @Autowired
+    private LocTypeBindService locTypeBindService;
+    @Autowired
+    private ViewLocDetlMapper viewLocDetlMapper;
+    @Autowired
+    private ViewTaskDetlMapper viewTaskDetlMapper;
+
+    //浠庡簱瀛樻垨浠诲姟涓尮閰嶇浉閭诲簱浣�(婊℃墭鐩�)
+    public Loc getNeighborLoc(Long taskType, OrderDetl orderDetl, Integer locTypeHeight) {
+        //婊℃墭鐩�
+        //浠庝换鍔′腑杩涜鍖归厤
+        List<Loc> locs = new ArrayList<>();
+        List<Map<String, Object>> list = viewTaskDetlMapper.getList(orderDetl.getMat$().getMatnr(), orderDetl.getBatch(), orderDetl.getUniqueField());
+        for (Map<String, Object> map : list) {
+            Task task = taskService.getById(map.get("taskId").toString());
+            if(task == null) {
+                continue;
+            }
+
+            String targetLoc = task.getTargetLoc();
+            Loc one = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, targetLoc));
+            if(one == null) {
+                continue;
+            }
+            locs.add(one);
+        }
+
+        Loc loc = filterLoc(taskType, locs);
+        if (loc != null) {
+            return loc;
+        }
+
+        //浠庡簱瀛樹腑杩涜鍖归厤
+        List<Loc> locs2 = new ArrayList<>();
+        List<Map<String, Object>> list2 = viewLocDetlMapper.getList(orderDetl.getMat$().getMatnr(), orderDetl.getBatch(), orderDetl.getUniqueField());
+        for (Map<String, Object> map : list2) {
+            Loc one = locService.getById(map.get("locId").toString());
+            if(one == null) {
+                continue;
+            }
+            locs2.add(one);
+        }
+
+        Loc loc2 = filterLoc(taskType, locs2);
+        if (loc2 != null) {
+            return loc2;
+        }
+        return null;
+    }
+
+    //鑾峰彇鎺ㄨ崘搴撲綅(婊℃墭鐩�)
+    public List<Loc> getSuggestLoc(Long taskType, Long matId, String batch, Integer locTypeHeight) {
+        //婊℃墭鐩�
+        List<Loc> locs = new ArrayList<>();
+        LocTypeHeightType locTypeHeightType = LocTypeHeightType.get(locTypeHeight);
+        if (locTypeHeightType == null) {
+            throw new CoolException("搴撲綅楂樺害绫诲瀷寮傚父");
+        }
+        //鑾峰彇搴撲綅楂樺害
+        LocType locType = locTypeService.getOne(new LambdaQueryWrapper<LocType>().eq(LocType::getFlag, locTypeHeightType.flag));
+        //绗﹀悎搴撲綅楂樺害鐨勫簱浣嶉泦鍚�
+        List<Long> locIdList = locTypeBindService.getLocIdListByType(locType);
+
+        LambdaQueryWrapper<SuggestLocRule> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SuggestLocRule::getLocType, 1);
+        wrapper.eq(SuggestLocRule::getMatId, matId);
+        if (!Cools.isEmpty(batch)) {
+            wrapper.eq(SuggestLocRule::getBatch, batch);
+        }
+        List<SuggestLocRule> suggestLocRules = suggestLocRuleService.list(wrapper);
+        for (SuggestLocRule suggestLocRule : suggestLocRules) {
+            LambdaQueryWrapper<Loc> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.ge(Loc::getRow1, suggestLocRule.getStartRow());
+            queryWrapper.le(Loc::getRow1, suggestLocRule.getTargetRow());
+            queryWrapper.ge(Loc::getBay1, suggestLocRule.getStartBay());
+            queryWrapper.le(Loc::getBay1, suggestLocRule.getTargetBay());
+            queryWrapper.ge(Loc::getLev1, suggestLocRule.getStartLev());
+            queryWrapper.le(Loc::getLev1, suggestLocRule.getTargetLev());
+            queryWrapper.eq(Loc::getLocStsId, LocStsType.O.val());
+            queryWrapper.in(Loc::getId, locIdList);
+            List<Loc> list = locService.list(queryWrapper);
+            if (!list.isEmpty()) {
+                locs.addAll(list);
+            }
+        }
+        return locs;
+    }
+
+    //鑾峰彇鍏ㄥ眬搴撲綅(瀹屾暣宸烽亾)
+    public List<Loc> getGlobalLoc(Long taskType, Integer locTypeHeight) {
+        List<Loc> locs = new ArrayList<>();
+        LocTypeHeightType locTypeHeightType = LocTypeHeightType.get(locTypeHeight);
+        if (locTypeHeightType == null) {
+            throw new CoolException("搴撲綅楂樺害绫诲瀷寮傚父");
+        }
+        //鑾峰彇搴撲綅楂樺害
+        LocType locType = locTypeService.getOne(new LambdaQueryWrapper<LocType>().eq(LocType::getFlag, locTypeHeightType.flag));
+        //绗﹀悎搴撲綅楂樺害鐨勫簱浣嶉泦鍚�
+        List<Long> locIdList = locTypeBindService.getLocIdListByType(locType);
+
+        LambdaQueryWrapper<Loc> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Loc::getLocStsId, LocStsType.O.val());
+        queryWrapper.in(Loc::getId, locIdList);
+        List<Loc> list = locService.list(queryWrapper);
+        if (!list.isEmpty()) {
+            locs.addAll(list);
+        }
+        return locs;
+    }
+
+    //浠庡簱浣嶉泦鍚堜腑鑾峰彇绗﹀悎娣辨祬鐨勫簱浣�
+    public Loc filterLoc(Long taskType, List<Loc> locs) {
+        if (locs == null || locs.isEmpty()) {
+            return null;
+        }
+
+        Loc defaultLoc = null;
+        for (Loc loc : locs) {
+            //鑾峰彇搴撲綅鎵�鍦ㄥ贩閬�
+            LanewayRule lanewayRule = lanewayRuleService.getLaneByLoc(loc);
+            if(lanewayRule == null) {
+                throw new CoolException("搴撲綅鏈厤缃贩閬�");
+            }
+
+            //鑾峰彇搴撲綅鏂瑰悜
+            List<Integer> direction = null;
+            if (lanewayRule.getLaneX$().contains(loc.getRow1())) {
+                direction = lanewayRule.getLaneX$();
+            }else {
+                direction = lanewayRule.getLaneY$();
+            }
+
+            for (Integer row : direction) {
+                Loc one = locService.getOne(new LambdaQueryWrapper<Loc>()
+                        .eq(Loc::getRow1, row)
+                        .eq(Loc::getBay1, loc.getBay1())
+                        .eq(Loc::getLev1, loc.getLev1()));
+                if (one == null) {
+                    continue;
+                }
+
+                if(one.getLocStsId() != LocStsType.O.val()) {
+                    continue;
+                }
+
+                //褰撳墠搴撲綅鏄┖搴撲綅
+                defaultLoc = one;
+                break;
+            }
+
+            if (defaultLoc != null) {
+                break;
+            }
+        }
+
+        return defaultLoc;
+    }
+
+    //浠庡簱浣嶉泦鍚堜腑鑾峰彇瀹屾暣绌哄贩閬�
+    public Loc filterAllLoc(List<Loc> locs) {
+        if (locs == null || locs.isEmpty()) {
+            return null;
+        }
+
+        Loc defaultLoc = null;
+        for (Loc loc : locs) {
+            //鑾峰彇搴撲綅鎵�鍦ㄥ贩閬�
+            LanewayRule lanewayRule = lanewayRuleService.getLaneByLoc(loc);
+            if(lanewayRule == null) {
+                throw new CoolException("搴撲綅鏈厤缃贩閬�");
+            }
+
+            //鑾峰彇搴撲綅鏂瑰悜
+            List<Integer> direction = null;
+            if (lanewayRule.getLaneX$().contains(loc.getRow1())) {
+                direction = lanewayRule.getLaneX$();
+            }else {
+                direction = lanewayRule.getLaneY$();
+            }
+
+            boolean flag = false;
+            List<Loc> allLocs = new ArrayList<>();
+            for (Integer row : direction) {
+                Loc one = locService.getOne(new LambdaQueryWrapper<Loc>()
+                        .eq(Loc::getRow1, row)
+                        .eq(Loc::getBay1, loc.getBay1())
+                        .eq(Loc::getLev1, loc.getLev1()));
+                if (one == null) {
+                    continue;
+                }
+
+                if(one.getLocStsId() != LocStsType.O.val()) {
+                    flag = true;
+                    break;
+                }
+
+                allLocs.add(one);
+            }
+
+            if (flag) {
+                continue;
+            }
+
+            if (!allLocs.isEmpty()) {
+                defaultLoc = allLocs.get(0);
+                break;//鎵惧埌涓�涓畬鏁寸┖宸烽亾
+            }
+        }
+
+        return defaultLoc;
+    }
+
+    //浠庡簱瀛樻垨浠诲姟涓尮閰嶇浉閭诲簱浣�(绌烘墭鐩�)
+    public Loc getNeighborEmptyLoc(Long taskType, Integer locTypeHeight) {
+        //浠庝换鍔′腑杩涜鍖归厤
+        List<Loc> locs = new ArrayList<>();
+        List<Task> list = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskType, 10));
+        for (Task task : list) {
+            String targetLoc = task.getTargetLoc();
+            Loc one = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, targetLoc));
+            if(one == null) {
+                continue;
+            }
+            locs.add(one);
+        }
+
+        Loc loc = filterLoc(taskType, locs);
+        if (loc != null) {
+            return loc;
+        }
+
+        //浠庡簱瀛樹腑杩涜鍖归厤
+        List<Loc> locs2 = locService.list(new LambdaQueryWrapper<Loc>().eq(Loc::getLocStsId, LocStsType.D.val()));
+        Loc loc2 = filterLoc(taskType, locs2);
+        if (loc2 != null) {
+            return loc2;
+        }
+        return null;
+    }
+
+    //鑾峰彇鎺ㄨ崘搴撲綅(绌烘墭鐩�)
+    public List<Loc> getSuggestEmptyLoc(Long taskType, Integer locTypeHeight) {
+        List<Loc> locs = new ArrayList<>();
+        //绌烘墭鐩�
+        List<SuggestLocRule> suggestLocRules = suggestLocRuleService.list(new LambdaQueryWrapper<SuggestLocRule>().eq(SuggestLocRule::getLocType, 0));
+        for (SuggestLocRule suggestLocRule : suggestLocRules) {
+            LambdaQueryWrapper<Loc> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.ge(Loc::getRow1, suggestLocRule.getStartRow());
+            queryWrapper.le(Loc::getRow1, suggestLocRule.getTargetRow());
+            queryWrapper.ge(Loc::getBay1, suggestLocRule.getStartBay());
+            queryWrapper.le(Loc::getBay1, suggestLocRule.getTargetBay());
+            queryWrapper.ge(Loc::getLev1, suggestLocRule.getStartLev());
+            queryWrapper.le(Loc::getLev1, suggestLocRule.getTargetLev());
+            queryWrapper.eq(Loc::getLocStsId, LocStsType.O.val());
+            List<Loc> list = locService.list(queryWrapper);
+            if (!list.isEmpty()) {
+                locs.addAll(list);
+            }
+        }
+        return locs;
+    }
+
+    //鑾峰彇鍏ㄥ眬搴撲綅(瀹屾暣宸烽亾)
+    public List<Loc> getGlobalEmptyLoc(Long taskType, Integer locTypeHeight) {
+        List<Loc> locs = new ArrayList<>();
+        LocTypeHeightType locTypeHeightType = LocTypeHeightType.get(locTypeHeight);
+        if (locTypeHeightType == null) {
+            throw new CoolException("搴撲綅楂樺害绫诲瀷寮傚父");
+        }
+        //鑾峰彇搴撲綅楂樺害
+        LocType locType = locTypeService.getOne(new LambdaQueryWrapper<LocType>().eq(LocType::getFlag, locTypeHeightType.flag));
+        //绗﹀悎搴撲綅楂樺害鐨勫簱浣嶉泦鍚�
+        List<Long> locIdList = locTypeBindService.getLocIdListByType(locType);
+
+        LambdaQueryWrapper<Loc> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Loc::getLocStsId, LocStsType.O.val());
+        queryWrapper.in(Loc::getId, locIdList);
+        List<Loc> list = locService.list(queryWrapper);
+        if (!list.isEmpty()) {
+            locs.addAll(list);
+        }
+        return locs;
+    }
+
+}
diff --git a/zy-asrs-wms/src/main/resources/mapper/asrs/LocTypeBindMapper.xml b/zy-asrs-wms/src/main/resources/mapper/asrs/LocTypeBindMapper.xml
index b568f0c..a91f9ae 100644
--- a/zy-asrs-wms/src/main/resources/mapper/asrs/LocTypeBindMapper.xml
+++ b/zy-asrs-wms/src/main/resources/mapper/asrs/LocTypeBindMapper.xml
@@ -2,4 +2,9 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.zy.asrs.wms.asrs.mapper.LocTypeBindMapper">
 
+    <select id="getLocIdListByTypeId" resultType="long">
+        select distinct loc_id from  man_loc_type_bind
+        where type_id = #{typeId}
+    </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 b5edcf0..e5d0179 100644
--- a/zy-asrs-wms/src/main/resources/mapper/asrs/ViewLocDetlMapper.xml
+++ b/zy-asrs-wms/src/main/resources/mapper/asrs/ViewLocDetlMapper.xml
@@ -10,6 +10,21 @@
         </if>
         <if test="param!=null and param.size()>0">
             <foreach item="item" collection="param" index="index">
+                <if test="item.value!=null">
+                    and ${item.name} = #{item.value}
+                </if>
+            </foreach>
+        </if>
+    </select>
+
+    <select id="getListLike" resultType="map">
+        select * from view_man_loc_detl ld
+        where matnr = #{matnr}
+        <if test="batch!=null">
+            and batch = #{batch}
+        </if>
+        <if test="param!=null and param.size()>0">
+            <foreach item="item" collection="param" index="index">
                 and ${item.name} like CONCAT('%',#{item.value},'%')
             </foreach>
         </if>
diff --git a/zy-asrs-wms/src/main/resources/mapper/asrs/ViewOrderDetlMapper.xml b/zy-asrs-wms/src/main/resources/mapper/asrs/ViewOrderDetlMapper.xml
new file mode 100644
index 0000000..3f7836c
--- /dev/null
+++ b/zy-asrs-wms/src/main/resources/mapper/asrs/ViewOrderDetlMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.asrs.wms.asrs.mapper.ViewOrderDetlMapper">
+
+</mapper>
diff --git a/zy-asrs-wms/src/main/resources/mapper/asrs/ViewTaskDetlMapper.xml b/zy-asrs-wms/src/main/resources/mapper/asrs/ViewTaskDetlMapper.xml
new file mode 100644
index 0000000..7687fd4
--- /dev/null
+++ b/zy-asrs-wms/src/main/resources/mapper/asrs/ViewTaskDetlMapper.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.asrs.wms.asrs.mapper.ViewTaskDetlMapper">
+
+    <select id="getList" resultType="map">
+        select * from view_man_task_detl td
+        where matnr = #{matnr}
+        <if test="batch!=null">
+            and batch = #{batch}
+        </if>
+        <if test="param!=null and param.size()>0">
+            <foreach item="item" collection="param" index="index">
+                <if test="item.value!=null">
+                    and ${item.name} = #{item.value}
+                </if>
+            </foreach>
+        </if>
+    </select>
+
+    <select id="getById" resultType="map">
+        select * from view_man_task_detl
+        where id = #{id}
+    </select>
+
+</mapper>

--
Gitblit v1.9.1