Browse Source

手动新增入库单接口

oyq28 1 year ago
parent
commit
4c337a7889

+ 36 - 0
src/main/java/com/imcs/admin/business/constants/Status.java

@@ -0,0 +1,36 @@
+package com.imcs.admin.business.constants;
+
+public enum Status {
+    UNUSED(1, "未使用"),
+    PRE_RESERVED(2, "预占用"),
+    IN_PROGRESS(3, "作业中"),
+    USED(4, "已使用"),
+    LOCKED(5, "锁定");
+
+    private final int code;
+    private final String description;
+
+    Status(int code, String description) {
+        this.code = code;
+        this.description = description;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    // 通过code获取对应的枚举值
+    public static Status getStatusByCode(int code) {
+        for (Status status : values()) {
+            if (status.code == code) {
+                return status;
+            }
+        }
+        throw new IllegalArgumentException("Invalid Status code: " + code);
+    }
+}
+

+ 7 - 0
src/main/java/com/imcs/admin/business/dao/WInventoryTransactionChildTaskDao.java

@@ -0,0 +1,7 @@
+package com.imcs.admin.business.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.imcs.admin.entity.WInventoryTransactionChildTask;
+
+public interface WInventoryTransactionChildTaskDao extends BaseMapper<WInventoryTransactionChildTask> {
+}

+ 5 - 0
src/main/java/com/imcs/admin/business/dao/WStorageLocationManagementDao.java

@@ -1,6 +1,7 @@
 package com.imcs.admin.business.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.imcs.admin.entity.WInventoryManagement;
 import com.imcs.admin.entity.WShelfManagement;
 import com.imcs.admin.entity.WStorageLocationManagement;
 import org.apache.ibatis.annotations.Param;
@@ -11,4 +12,8 @@ public interface WStorageLocationManagementDao extends BaseMapper<WStorageLocati
     WShelfManagement getShelfManagement(@Param("endPosition") String endPosition);
 
     List<String> getSubStorage(@Param("locationCode") String locationCode);
+
+    void updateByLocationCode(@Param("status") int status, @Param("locationCode") String endPosition);
+
+    List<WStorageLocationManagement> getAllByLocationCode(List<WInventoryManagement> wInventoryManagements);
 }

+ 84 - 0
src/main/java/com/imcs/admin/business/service/impl/BaseServiceImpl.java

@@ -1,9 +1,19 @@
 package com.imcs.admin.business.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.imcs.admin.business.dao.*;
 import com.imcs.admin.common.config.SessionContext;
+import com.imcs.admin.entity.WInventoryManagement;
+import com.imcs.admin.entity.WShelfManagement;
+import com.imcs.admin.entity.WStorageLocationManagement;
 import com.imcs.admin.util.GenerateSerial;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
 
 public class BaseServiceImpl {
     @Autowired
@@ -24,9 +34,83 @@ public class BaseServiceImpl {
     public WShelfManagementDao shelfDao;
     @Autowired
     public WInventoryManagementDao inventoryDao;
+    @Autowired
+    public WInventoryTransactionChildTaskDao childTaskDao;
 
+    /**
+     * 获取登录人信息
+     * @return
+     */
     public Long getUserId(){
         Long userId = SessionContext.getSession().getUserId();
         return userId;
     }
+
+    /**
+     * 修改库位状态
+     * @param status
+     * @param locationCode
+     */
+    @Transactional
+    public void updateStorageStatus(int status,String locationCode){
+        storageLocationDao.updateByLocationCode(status,locationCode);
+    }
+
+
+    /**
+     * 校验 是否需要移库
+     * @param endPosition 目标库位
+     * @return 需要移库
+     */
+    public List<WStorageLocationManagement> checkStorageRelocation(String endPosition) {
+        WShelfManagement shelfManagement = storageLocationDao.getShelfManagement(endPosition);
+        Integer inOut = shelfManagement.getDistanceRoadwayNumber();
+
+        //找到所有需要移库的库位
+        List<WStorageLocationManagement> ykList=new ArrayList<>();
+
+        //外侧可能需要移库
+        if(inOut > 0){
+
+            //find 同一个区域的  endPosition 以内的所有货架
+            LambdaQueryWrapper<WShelfManagement> wrapper = Wrappers.lambdaQuery(WShelfManagement.class)
+                    .eq(WShelfManagement::getArea,shelfManagement.getArea())
+                    .lt(WShelfManagement::getDistanceRoadwayNumber,inOut).orderByAsc(WShelfManagement::getDistanceRoadwayNumber);
+            List<WShelfManagement> wShelfManagements = shelfDao.selectList(wrapper);
+
+            //定位到同 X Z
+            String result = endPosition.substring(endPosition.indexOf("-") + 1);
+
+
+
+            wShelfManagements.forEach(vo->{
+
+                //不确定需要 移库的库位
+                String ykCode = vo.getShelfCode() + "-" + result;
+
+                //找小库位
+                List<String> subStorage = storageLocationDao.getSubStorage(ykCode);
+
+                subStorage.add(ykCode);
+
+                LambdaQueryWrapper<WInventoryManagement> inventoryWrapper = Wrappers.lambdaQuery(WInventoryManagement.class)
+                        .in(WInventoryManagement::getStorageLocationCode,subStorage);
+
+                //查库存
+                //如果目标库位的内侧库位存在托盘阻挡,则需要移库
+                List<WInventoryManagement> wInventoryManagements = inventoryDao.selectList(inventoryWrapper);
+
+                if(CollectionUtil.isNotEmpty(wInventoryManagements)){
+
+                    List<WStorageLocationManagement> allByLocationCode = storageLocationDao.getAllByLocationCode(wInventoryManagements);
+
+                    ykList.addAll(allByLocationCode);
+                }
+
+
+            });
+
+        }
+        return ykList;
+    }
 }

+ 51 - 41
src/main/java/com/imcs/admin/business/service/impl/OrderServiceImpl.java

@@ -3,8 +3,10 @@ package com.imcs.admin.business.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.imcs.admin.business.constants.Status;
 import com.imcs.admin.business.dao.MaterialDao;
 import com.imcs.admin.business.dao.WInventoryTransactionOrdersDao;
 import com.imcs.admin.business.dao.WInventoryTransactionOrdersDetailDao;
@@ -20,6 +22,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
@@ -45,69 +48,77 @@ public class OrderServiceImpl extends BaseServiceImpl implements OrderService {
         saveOrder(orders);
 
         //入库任务 save
-        saveOrderTask(orders);
+        int trTaskId = saveOrderTask(orders);
 
         //获取目标库位
         getEndPosition(orders);
 
+        List<WInventoryTransactionChildTask> subList=new ArrayList<>();
         //生成 移库 子任务
-        createSubTask(orders.getEndPosition());
-    }
-
-    private void createSubTask(String endPosition) {
-        //判断是否需要移库
-        if(checkStorageRelocation(endPosition)){
-
-
+        createSubTask(orders.getEndPosition(),subList,trTaskId);
 
+        //保存移库子任务
+        saveSubTask(subList,null);
+    }
 
+    private void saveSubTask(List<WInventoryTransactionChildTask> subList,String faCode) {
+        if(CollectionUtil.isNotEmpty(subList)){
+            subList.stream().forEach(vo->{
+                String code = generateSerial.generateSerialNumber("childTask");
+                vo.setChildTaskCode(code);
+                saveSubTask(vo.getSuList(),code);
+                childTaskDao.insert(vo);
+                updateStorageStatus(Status.PRE_RESERVED.getCode(),vo.getEndPosition());
+            });
         }
 
     }
 
-    private Boolean checkStorageRelocation(String endPosition) {
-        WShelfManagement shelfManagement = storageLocationDao.getShelfManagement(endPosition);
-        Integer inOut = shelfManagement.getInOut();
-        //内侧不需要移库
-        if(inOut == 1){
-            return false;
-        }else if(inOut == 2){
+    private List<WInventoryTransactionChildTask> createSubTask(String endPosition,List<WInventoryTransactionChildTask> subList,int trTaskId) {
+        //获取endPosition 需要移库的所有库位,获得的顺序为从内侧到外侧(先移动最外侧库位托盘)
+        List<WStorageLocationManagement> wStorageLocationManagements = checkStorageRelocation(endPosition);
+        List<WInventoryTransactionChildTask> faTask=new ArrayList<>();
 
-            //find 同一个区域的货架
-            LambdaQueryWrapper<WShelfManagement> wrapper = Wrappers.lambdaQuery(WShelfManagement.class)
-                    .eq(WShelfManagement::getArea,shelfManagement.getArea())
-                    .ne(WShelfManagement::getShelfCode,shelfManagement.getShelfCode());
-            WShelfManagement wShelfManagement = shelfDao.selectOne(wrapper);
+        //判断是否需要移库
+        if(CollectionUtil.isNotEmpty(wStorageLocationManagements)){
+            wStorageLocationManagements.stream().forEach(vo->{
+                WInventoryTransactionChildTask task=new WInventoryTransactionChildTask();
+                task.setWInventoryTransactionTaskId(Long.valueOf(trTaskId));
+                //保存的时候塞入值
+                //task.getChildTaskCode()
+                task.setStartPosition(vo.getLocationCode());
+                //TODO
+                //task.setEndPosition();
+                task.setVectorCode(vo.getPalletCode());
+                task.setStatus(0);
+                task.setChildTaskType(3);
+                task.setCreatedAt(new Date());
+                task.setCreatedBy(getUserId());
 
-            //定位到同一层 同高度
-            String result = endPosition.substring(endPosition.indexOf("-") + 1);
+                //迭代调用
+                task.setSuList(createSubTask(task.getEndPosition(), subList, trTaskId));
+                faTask.add(task);
+            });
 
-            //不确定需要 移库的库位
-            String other=wShelfManagement.getShelfCode()+"-"+result;
 
-            //找小库位
-            List<String> subStorage = storageLocationDao.getSubStorage(other);
+            subList.addAll(faTask);
+        }
+        return faTask;
 
-            subStorage.add(other);
+    }
 
-            LambdaQueryWrapper<WInventoryManagement> inventoryWrapper = Wrappers.lambdaQuery(WInventoryManagement.class)
-                    .in(WInventoryManagement::getStorageLocationCode,subStorage);
 
-            //如果目标库位的内侧库位存在托盘阻挡,则需要移库
-            List<WInventoryManagement> wInventoryManagements = inventoryDao.selectList(inventoryWrapper);
 
-            if(CollectionUtil.isNotEmpty(wInventoryManagements)){
+    private void getEndPosition(WInventoryTransactionOrders orders) {
 
-            }
-        }
-        return false;
+        //设置为预占用
+        updateStorageStatus(Status.PRE_RESERVED.getCode(),orders.getEndPosition());
     }
 
-    private void getEndPosition(WInventoryTransactionOrders orders) {
 
-    }
 
-    private void saveOrderTask(WInventoryTransactionOrders orders) {
+
+    private int saveOrderTask(WInventoryTransactionOrders orders) {
         //入库任务
 
         WInventoryTransactionTask.WInventoryTransactionTaskBuilder inTask = WInventoryTransactionTask.builder().taskCode(generateSerial.generateSerialNumber("inTask"))
@@ -117,7 +128,6 @@ public class OrderServiceImpl extends BaseServiceImpl implements OrderService {
                 .vectorCode(orders.getVectorCode())
                 .status(0)
                 .taskType(2)
-                .startTime(new Date())
                 .createdAt(new Date())
                 .createdBy(getUserId());
         int insert = taskDao.insert(inTask.build());
@@ -138,7 +148,7 @@ public class OrderServiceImpl extends BaseServiceImpl implements OrderService {
         });
 
         //判断目标库是否需要
-
+        return insert;
     }
 
     private void verifyMaterialCode(WInventoryTransactionOrders orders) {

+ 4 - 0
src/main/java/com/imcs/admin/entity/WInventoryManagement.java

@@ -55,6 +55,10 @@ public class WInventoryManagement implements Serializable {
      */
     private Integer updatedBy;
 
+    /**
+     * 托盘编码
+     */
+     private String palletCode;
 
 }
 

+ 5 - 0
src/main/java/com/imcs/admin/entity/WInventoryTransactionChildTask.java

@@ -2,6 +2,8 @@ package com.imcs.admin.entity;
 
 import java.util.Date;
 import java.io.Serializable;
+import java.util.List;
+
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 /**
@@ -79,6 +81,9 @@ public class WInventoryTransactionChildTask implements Serializable {
      */
     private Long updatedBy;
 
+    //父任务的 子任务编码
+    private String parentChildTaskCode;
 
+    List<WInventoryTransactionChildTask> suList;
 }
 

+ 2 - 1
src/main/java/com/imcs/admin/entity/WShelfManagement.java

@@ -59,6 +59,7 @@ public class WShelfManagement implements Serializable {
      */
     private Integer area;
 
-
+    //巷道距离
+    private Integer distanceRoadwayNumber;
 }
 

+ 2 - 0
src/main/java/com/imcs/admin/entity/WStorageLocationManagement.java

@@ -68,6 +68,8 @@ public class WStorageLocationManagement implements Serializable {
      */
     private Long parentId;
 
+    //载体编码  托盘编码或料箱编码
+    private String palletCode;
 
 }
 

+ 15 - 0
src/main/resources/mapper/WStorageLocationDao.xml

@@ -2,6 +2,7 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.imcs.admin.business.dao.WStorageLocationManagementDao">
 
+
     <select id="getShelfManagement" parameterType="String" resultType="com.imcs.admin.entity.WShelfManagement">
         select shelf.* from w_storage_location_management loca
             left join w_shelf_management shelf on loca.shelf_management_id=shelf.id
@@ -11,4 +12,18 @@
     <select id="getSubStorage" resultType="String">
         select location_code from w_storage_location_management where parent_id=(select id from w_storage_location_management where location_code=#{locationCode})
     </select>
+
+
+    <update id="updateByLocationCode">
+        update w_storage_location_management set storage_location_status=#{status} where location_code=#{locationCode}
+    </update>
+
+    <select id="getAllByLocationCode" resultType="com.imcs.admin.entity.WStorageLocationManagement" parameterType="com.imcs.admin.entity.WInventoryManagement">
+        select loca.*,inv.pallet_code as palletCode from w_storage_location_management loca
+            left join w_inventory_management inv on loca.location_code=inv.storage_location_code
+        where loca.location_code in
+        <foreach close=")" collection="list" item="id" open="(" separator=",">
+            #{id.palletCode}
+        </foreach>
+    </select>
 </mapper>