package com.zy.asrs.task.handler; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.mapper.Wrapper; import com.core.common.Cools; import com.core.exception.CoolException; import com.zy.asrs.entity.BasCrnp; import com.zy.asrs.entity.LocMast; import com.zy.asrs.entity.StaDesc; import com.zy.asrs.entity.WrkMast; import com.zy.asrs.entity.param.EmptyPlateOutParam; import com.zy.asrs.service.*; import com.zy.asrs.task.AbstractHandler; import com.zy.asrs.task.core.ReturnT; import com.zy.asrs.utils.CodeDetectionUtil; import com.zy.asrs.utils.Utils; import com.zy.common.model.enums.WorkNoType; import com.zy.common.service.CommonService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * Created by Monkey D. Luffy on 2023.07.24 * 徐工汉云..............以下.............上饶江铜.............自动补空板 */ @Slf4j @Service @Transactional public class BareBoardHandler extends AbstractHandler { @Autowired private WrkMastService wrkMastService; @Autowired private LocMastService locMastService; @Autowired private CommonService commonService; @Autowired private StaDescService staDescService; @Autowired private BasCrnpService basCrnpService; @Autowired private WorkService workService; public ReturnT start(Integer staNo,Integer count) { try { // if (!Cools.isEmpty(wrkMastService.selectOne(new EntityWrapper().eq("io_type", 110).eq("sta_no", staNo)))){ // return null; // } int wrkCount = wrkMastService.selectCount(new EntityWrapper().eq("io_type", 110).eq("sta_no", staNo)); if (wrkCount>count){ return null; } // 获取工作号 int workNo = commonService.getWorkNo(WorkNoType.PAKOUT.type); ArrayList crns =new ArrayList<>(); List basCrnps = basCrnpService.selectList(new EntityWrapper().eq("crn_sts", 3).eq("out_enable", "Y").eq("wrk_no", 0)); for (BasCrnp basCrnp : basCrnps){ crns.add(basCrnp.getCrnNo()); } crns.add(1); crns.add(2); crns.add(3); crns.add(4); crns.add(5); crns.add(6); crns.add(7); boolean sign = true; for (Integer crnNo : crns){ BasCrnp basCrnp = basCrnpService.selectById(crnNo); if (basCrnp.getCrnSts()!=3 || !basCrnp.getOutEnable().equals("Y")){ continue; } sign = true; // 获取库位 LocMast locMast = locMastService.selectOne(new EntityWrapper().eq("loc_sts","D").eq("crn_no",crnNo)); if (Cools.isEmpty(locMast)) { // throw new CoolException("库中无空板!!!"); sign=false; } if (sign && !locMast.getLocSts().equals("D")){ // throw new CoolException("所选库位存在状态不为D的库位,库位号:"+locMast.getLocNo()+" 、当前状态:"+locMast.getLocSts()+"-"+locMast.getLocSts$()); sign=false; } if (sign){ // 获取源站 Wrapper wrapper = new EntityWrapper() .eq("type_no", 110) .eq("stn_no", staNo) .eq("crn_no", locMast.getCrnNo()); StaDesc staDesc = staDescService.selectOne(wrapper); Integer sourceStaNo = staDesc.getCrnStn(); if (Cools.isEmpty(sourceStaNo)) { // throw new CoolException("检索源站失败"); sign = false; } if (sign){ Date now = new Date(); // 保存工作档 WrkMast wrkMast = new WrkMast(); wrkMast.setWrkNo(workNo); wrkMast.setIoTime(now); wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID wrkMast.setIoType(110); // 入出库状态: 110.空板出库 wrkMast.setIoPri(10D); wrkMast.setSourceStaNo(sourceStaNo); // 源站 wrkMast.setStaNo(staNo); // 目标站 wrkMast.setCrnNo(locMast.getCrnNo()); wrkMast.setSourceLocNo(locMast.getLocNo()); // 源库位 wrkMast.setFullPlt("N"); // 满板:Y wrkMast.setPicking("N"); // 拣料 wrkMast.setExitMk("N"); // 退出 wrkMast.setEmptyMk("Y"); // 空板 wrkMast.setLinkMis("N"); wrkMast.setAppeUser(9999L); wrkMast.setAppeTime(now); wrkMast.setModiUser(9999L); wrkMast.setModiTime(now); boolean res = wrkMastService.insert(wrkMast); if (!res) { throw new CoolException("保存工作档失败"); } // 更新库位状态 D.空板 -> R.出库预约 if (locMast.getLocSts().equals("D")){ locMast.setLocSts("R"); locMast.setModiUser(9999L); locMast.setModiTime(now); if (!locMastService.updateById(locMast)) { throw new CoolException("更新库位状态失败"); }else { return SUCCESS; } } } } } if (!sign){ log.error("未查到可出库的空板!!!"); return null; } }catch (Exception e){ log.error("异常!!!"+e); return null; } return SUCCESS; } public ReturnT startYx(Integer staNo,Integer count) { try { // if (!Cools.isEmpty(wrkMastService.selectOne(new EntityWrapper().eq("io_type", 110).eq("sta_no", staNo)))){ // return null; // } int wrkCount = wrkMastService.selectCount(new EntityWrapper().eq("io_type", 110).eq("sta_no", staNo)); if (wrkCount>count){ return null; } ArrayList crns =new ArrayList<>(); ArrayList crnList =new ArrayList<>(); int[] crnCount = new int[7]; crns.add(1); crns.add(2); crns.add(3); crns.add(4); crns.add(5); crns.add(6); crns.add(7); boolean sign = true; for (Integer crnNo : crns){ int crnCountD = locMastService.selectCount(new EntityWrapper().eq("loc_sts", "D").eq("crn_no", crnNo)); crnCount[crnNo-1] = crnCountD; } crnList.add(CodeDetectionUtil.crnCodeDetectionMax(new int[]{crnCount[0],crnCount[1]})[0]+1); crnList.add(CodeDetectionUtil.crnCodeDetectionMax(new int[]{crnCount[2],crnCount[3],crnCount[4]})[0]+3); crnList.add(CodeDetectionUtil.crnCodeDetectionMaxT(new int[]{crnCount[2],crnCount[3],crnCount[4]},crnList.get(1))[0]+3); crnList.add(CodeDetectionUtil.crnCodeDetectionMax(new int[]{crnCount[5],crnCount[6]})[0]+6); crnList.add(1); crnList.add(2); crnList.add(3); crnList.add(4); crnList.add(5); crnList.add(6); crnList.add(7); for (Integer crnNo : crnList){ // 检测路径 Wrapper wrapper = new EntityWrapper() .eq("type_no", 110) .eq("stn_no", staNo) .eq("crn_no", crnNo); StaDesc staDesc = staDescService.selectOne(wrapper); if (Cools.isEmpty(staDesc)){ continue; } BasCrnp basCrnp = basCrnpService.selectById(crnNo); if (basCrnp.getCrnSts()!=3 || !basCrnp.getOutEnable().equals("Y")){ continue; } if (!basCrnpService.checkSiteError(crnNo, false)){ continue; } // 获取库位 List locMasts = locMastService.selectList(new EntityWrapper().eq("loc_sts", "D").eq("crn_no", crnNo).orderBy("lev1",true).orderBy("bay1",true)); for (LocMast locMastS : locMasts){ List locNoList = new ArrayList<>(); sign = true; if (Cools.isEmpty(locMastS)) { // throw new CoolException("库中无空板!!!"); log.error(crnNo+"号堆垛机无空板!"); sign=false; break; } if (sign && !locMastS.getLocSts().equals("D")){ // throw new CoolException("所选库位存在状态不为D的库位,库位号:"+locMast.getLocNo()+" 、当前状态:"+locMast.getLocSts()+"-"+locMast.getLocSts$()); log.error(crnNo+"号堆垛机"+"所选库位存在状态不为D的库位,库位号:"+locMastS.getLocNo()+" 、当前状态:"+locMastS.getLocSts()+"-"+locMastS.getLocSts$()); sign=false; } locNoList.add(locMastS.getLocNo()); //小料箱伴生出库 if (sign && Utils.getRow(locMastS.getLocNo())<=8){ String locNoOther = staNoOther(locMastS.getLocNo()); LocMast locMastOther = locMastService.selectById(locNoOther); if (locMastOther.getLocSts().equals("D") || locMastOther.getLocSts().equals("F") || locMastOther.getLocSts().equals("R")){ if (locMastOther.getLocSts().equals("D")){ locNoList.add(locNoOther); } }else { sign=false; } }else if (sign && Utils.getRow(locMastS.getLocNo())>=21 && Utils.getRow(locMastS.getLocNo())<=27){ String locNoOther = staNoOther(locMastS.getLocNo()); LocMast locMastOther = locMastService.selectById(locNoOther); if (locMastOther.getLocSts().equals("D") || locMastOther.getLocSts().equals("F") || locMastOther.getLocSts().equals("R")){ if (locMastOther.getLocSts().equals("D")){ locNoList.add(locNoOther); } }else { sign=false; } } ArrayList locArrayList = new ArrayList<>(); for (String locNo : locNoList){ if (!locArrayList.contains(locNo)){ locArrayList.add(locNo); } } if (sign) { EmptyPlateOutParam param = new EmptyPlateOutParam(); param.setOutSite(staNo); param.setLocNos(locArrayList); try{ workService.emptyPlateOut(param, 9999L); }catch (Exception e){ log.error(staNo+"自动补空板失败!!异常原因:"+e); } return SUCCESS; } } } if (!sign){ log.error("未查到可出库的空板!!!"); return null; } }catch (Exception e){ log.error("异常!!!"+e); return null; } return SUCCESS; } public String staNoOther(String locNo){ int row = Utils.getRow(locNo); if (row<=8){ if (row%4==0 || row%4==1){ return getDeepLoc2(locNo,row); }else { return getDeepLoc(locNo,row); } }else if (row>=21 && row<=27){ if (row==21 || row==24 || row==27){ return getDeepLoc2(locNo,row); }else { return locNo; } }else { return locNo; } } /** * 获取 深库位对应的浅库位号 */ public static String getDeepLoc2(String shallowLoc,int row) { if (row == 1 || row == 5 || row==21) { return Utils.zerofill(String.valueOf(row+1), 2) + shallowLoc.substring(2); } else if (row == 4 || row == 8 || row == 24 || row == 27) { return Utils.zerofill(String.valueOf(row-1), 2) + shallowLoc.substring(2); }else { return null; } } /** * 获取 浅库位对应的深库位号 */ public static String getDeepLoc(String shallowLoc,int row) { if (row == 2 || row == 6) { return Utils.zerofill(String.valueOf(row-1), 2) + shallowLoc.substring(2); } else if (row == 3 || row == 7) { return Utils.zerofill(String.valueOf(row+1), 2) + shallowLoc.substring(2); }else { return shallowLoc; } } }