自动化立体仓库 - WMS系统
pang.jiabao
昨天 203e2664c13883f8bb64f638cb1794c0b4480ec2
src/main/java/com/zy/common/service/CommonService.java
@@ -3,28 +3,25 @@
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.core.common.Arith;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.result.FindLocNoAttributeVo;
import com.zy.asrs.entity.result.KeyValueVo;
import com.zy.asrs.mapper.WrkMastMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.Utils;
import com.zy.asrs.utils.VersionUtils;
import com.zy.common.model.LocTypeDto;
import com.zy.common.model.Shelves;
import com.zy.common.model.StartupDto;
import com.zy.common.properties.SlaveProperties;
import com.zy.common.web.param.SearchLocParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import javax.annotation.Resource;
import java.util.List;
/**
@@ -57,6 +54,14 @@
    private SlaveProperties slaveProperties;
    @Autowired
    private WrkDetlService wrkDetlService;
    @Resource
    private WrkMastMapper wrkMastMapper;
    /**
     * 罐装线号映射目标站点 下标:目标站点
     */
    private static final int[] fillingLineMappingSite = {0,1079,1065,1072};
    /**
     * 生成工作号
@@ -156,6 +161,128 @@
        return null;
    }
    @Transactional(propagation = Propagation.REQUIRED)
    public StartupDto getLocNoNew(Integer staDescId, Integer sourceStaNo, FindLocNoAttributeVo findLocNoAttributeVo, int locArea) {
        // 目标库位
        LocMast locMast;
        // 入空桶库
        if (staDescId == 1 && locArea == 2) {
            String model = findLocNoAttributeVo.getModel(); // 当前桶类型
            List<WrkMast> wrkMastList = wrkMastMapper.selectLastInEmptyLoc(); // 前面入空桶库的任务(未执行堆垛机入库)
            if (wrkMastList.size() == 0) {
                // 取新库位组的第一个库位
                locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", 'O').in("row1", 9, 11).orderBy("lev1").orderBy("bay1").orderBy("row1"));
            } else {
                WrkMast wrkMast = wrkMastList.get(0); // 最后一个入空桶库任务
                // 前一个任务明细
                WrkDetl wrkDetl = wrkDetlService.selectOne(new EntityWrapper<WrkDetl>().eq("wrk_no",wrkMast.getWrkNo()));
                // 前一个任务桶类型
                String oldModel = wrkDetl.getModel();
                // 前一个任务尾托标识
                Integer oldCtnType = wrkMast.getCtnType();
                if(model.equals(oldModel)) { // 当前桶与前桶是一种类型
                    // 当前桶类型的任务有几个
                    long count = wrkMastList.stream().filter(wrkMast1 -> wrkMast1.getPdcType().equals(oldModel)).count();
                    if (count % 2  == 0) { // 偶数,取一组新库位
                        locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", 'O').in("row1", 9, 11).orderBy("lev1").orderBy("bay1").orderBy("row1"));
                    } else { // 奇数,取前一库位对应的空库位
                        String locNo = wrkMast.getLocNo();
                        int row = Integer.parseInt(locNo.substring(0, 2));
                        if(row == 9 || row == 11) {
                            String newLocNo = (row + 1) + locNo.substring(2);
                            locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", newLocNo).eq("loc_sts","O"));
                            if (locMast == null) {
                                log.error("-----与前面桶类型一样,前面该桶类型任务数是奇数,是9,11排,但是对应库位不为空----");
                                throw new CoolException("与前面桶类型一样,前面该桶类型任务数是奇数,是9,11排,但是对应库位不为空");
                            }
                        } else {
                            log.error("-----与前面桶类型一样,前面该桶类型任务数是奇数,但是不是9,11排----");
                            throw new CoolException("与前面桶类型一样,前面该桶类型任务数是奇数,但是不是9,11排");
                        }
                    }
                } else { // 当前桶与前桶不是一种类型
                      if(oldCtnType == 1) { // 前面是尾桶
                          // 取新库位组的第一个库位
                          locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", 'O').in("row1", 9, 11).orderBy("lev1").orderBy("bay1").orderBy("row1"));
                      } else { // 前面不是尾桶
                          // 判断前面入空桶库任务数量(未执行堆垛机入库)
                          long count = wrkMastList.stream().filter(wrkMast1 -> wrkMast1.getPdcType().equals(oldModel)).count();
                          if (count % 2 == 0) { // 偶数,可以入库
                              // 取新库位组的第一个库位
                              locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", 'O').in("row1", 9, 11).orderBy("lev1").orderBy("bay1").orderBy("row1"));
                          } else { // 奇数,不可以入库
                              log.error("-----与前面桶类型不一样,前面桶不是尾桶,前面该桶类型任务数不是偶数,不能入库----");
                              throw new CoolException("与前面桶类型不一样,前面桶不是尾桶,前面该桶类型任务数不是偶数,不能入库");
                          }
                      }
                }
            }
        } else if ((staDescId == 1 && locArea == 1) || staDescId == 10) { // 满板入成品库或者空板入成品库
            // 按层列排顺序获取一个CanningLineInLocParam param库位
            locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", 'O').in("row1", 1, 4, 5, 6, 7, 8).orderBy("lev1").orderBy("bay1").orderBy("row1"));
            // 浅库位没有了则获取一个浅库位
            if (locMast == null) {
                locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", 'O').in("row1", 2, 3).orderBy("lev1").orderBy("bay1").orderBy("row1"));
                if (locMast == null) {
                    log.error("-----库位不足----");
                    throw new CoolException("库位不足");
                } else {
                    int count = locMastService.selectCount(new EntityWrapper<LocMast>().eq("loc_sts", 'O'));
                    if (count <= 10) {
                        log.error("-----库位不足,预留10个库位用来库位转移----");
                        throw new CoolException("库位不足,预留10个库位用来库位转移");
                    }
                }
            }
        } else {
            log.error("入库类型错误,staDescId={}", staDescId);
            throw new CoolException("入库类型错误,staDescId=" + staDescId);
        }
        // 返回dto
        StartupDto startupDto = new StartupDto();
        StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                .eq("type_no", staDescId)
                .eq("stn_no", sourceStaNo)
                .eq("crn_no", locMast.getCrnNo()));
        if (Cools.isEmpty(staDesc)) {
            log.error("type_no={},stn_no={},crn_no={}", staDescId, sourceStaNo, locMast.getCrnNo());
            throw new CoolException("入库路径不存在");
        } else {
            BasDevp staNo = basDevpService.selectById(staDesc.getCrnStn());
            if (!staNo.getAutoing().equals("Y")) {
                log.error("目标站" + staDesc.getCrnStn() + "不可用");
                throw new CoolException("目标站" + staDesc.getCrnStn() + "不可用");
            }
            startupDto.setStaNo(staNo.getDevNo());
        }
        // 生成工作号
        int workNo = getWorkNo(0);
        startupDto.setWorkNo(workNo);
        startupDto.setCrnNo(locMast.getCrnNo());
        startupDto.setSourceStaNo(sourceStaNo);
        startupDto.setLocNo(locMast.getLocNo());
        return startupDto;
    }
    @Transactional(propagation = Propagation.REQUIRED)
    public StartupDto getLocNo(SearchLocParam param, Integer wantBucketFlag) {
        // 返回dto
        StartupDto startupDto = new StartupDto();
        startupDto.setWorkNo(getWorkNo(0)); // 工作号
        startupDto.setSourceStaNo(param.getSourceStaNo()); // 源站点
        startupDto.setStaNo(fillingLineMappingSite[wantBucketFlag]); // 目标站点
        startupDto.setCrnNo(wantBucketFlag); // 记录罐装线号,wcs清除要桶信号
        return startupDto;
    }
    /**
     * 检索库位号
     *