自动化立体仓库 - WMS系统
pang.jiabao
2024-09-24 0329286b3ba1ddbdcad4769b9ccd4d5b3f5d1e64
src/main/java/com/zy/asrs/task/handler/GhjtHandler.java
@@ -4,12 +4,13 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.LocDetl;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.WrkDetl;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.mapper.OrderDetlMapper;
import com.zy.asrs.mapper.OrderMapper;
import com.zy.asrs.mapper.WrkMastMapper;
import com.zy.asrs.mapper.*;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.WorkService;
import com.zy.asrs.service.WrkDetlService;
import com.zy.common.constant.MesConstant;
import com.zy.common.utils.HttpHandler;
@@ -19,10 +20,7 @@
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -48,6 +46,15 @@
    @Resource
    private OrderDetlMapper orderDetlMapper;
    @Resource
    private LocDetlMapper locDetlMapper;
    @Resource
    private LocMastMapper locMastMapper;
    @Resource
    private WorkService workService;
    @Transactional
    public void startCkrwPushGwcs(WrkMast wrkMast) {
@@ -158,4 +165,96 @@
        return flag;
    }
    /**
     * 自动备货处理
     */
    public void autoStockUpHandler(List<String> list,int columnNum) {
        // 根据包装组号获取所在库位
        List<LocDetl> locDetls = locDetlMapper.selectLocNoByGroupNo(list);
        if (locDetls.isEmpty()) {
            return;
        }
        // 相同则合并,一个库位两个包装组号
        Map<String,List<String>> map = new HashMap<>();
        for(LocDetl locDetl : locDetls) {
            List<String> brand = map.get(locDetl.getLocNo());
            if (brand == null) {
                map.put(locDetl.getLocNo(),new ArrayList<String>(){{add(locDetl.getBrand());}});
            } else {
                brand.add(locDetl.getBrand());
                map.put(locDetl.getLocNo(),brand);
            }
        }
        // 遍历堆垛机并且判断是否存在任务
        for (int i = 1; i <= 6; i++) {
            // 要备货的库位
            String sourceLocNo = null;
            // 备货目标库位
            String staLocNo = null;
            Integer wrkCount = wrkMastMapper.selectCount(new EntityWrapper<WrkMast>().eq("crn_no", i));
            if(wrkCount > 0) {
                log.warn("{}号堆垛机已存在任务",i);
                continue;
            }
            // 根据堆垛机号查询到对应的深库位和浅库位  深库位4*n-3和4*n 浅库位4*n-2和4*n-1
            int s1 = 4*i-3;
            int s2 = 4*i;
            int q1 = 4 * i - 2;
            int q2 = 4 * i -1;
            // 根据堆垛机号获取一个浅库位
            for(String key : map.keySet()) {
                int row = Integer.parseInt(key.substring(0, 2));
                if (row == q1 || row == q2) {
                    sourceLocNo = key;
                    break;
                }
            }
            // 浅库位没有则找一个深库位
            if (sourceLocNo == null) {
                for(String key : map.keySet()) {
                    int row = Integer.parseInt(key.substring(0, 2));
                    if (row == s1 || row == s2) {
                        sourceLocNo = key;
                        break;
                    }
                }
            }
            // 没有找到源库位
            if (sourceLocNo == null) {
                log.warn("没有找到源库位,堆垛机:{}",i);
                continue;
            }
            // 寻找一个备货的目标库位,先深后浅
            List<LocMast> locMasts1 = locMastMapper.selectList(new EntityWrapper<LocMast>().eq("loc_sts", "O").eq("crn_no", i).in("row1", s1, s2)
                    .le("bay1", columnNum));
            if (locMasts1.isEmpty()) {
                // 深库位为空了,取浅库位
                List<LocMast> locMasts2 = locMastMapper.selectList(new EntityWrapper<LocMast>().eq("loc_sts", "O").eq("crn_no", i).in("row1", q1, q2)
                        .le("bay1", columnNum));
                if (!locMasts2.isEmpty()) {
                    staLocNo = locMasts2.get(0).getLocNo();
                }
            } else {
                staLocNo = locMasts1.get(0).getLocNo();
            }
            if(staLocNo == null) {
                log.warn("{}号堆垛机备货区满了",i);
                continue;
            }
            // 备货的源库位,目标库位都获取到了,生成移库任务
            workService.locMove(sourceLocNo,staLocNo,29L);
            // 订单明细改成备货中,在任务完成时候改成备货完成,并判断整个订单是否完成
            orderDetlMapper.updateOrderDetlStatusByPackageNo(map.get(sourceLocNo), 1);
            // 移除已生成备货库位
            map.remove(sourceLocNo);
        }
    }
}