package com.zy.asrs.task; 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.*; import com.zy.asrs.service.BasDevpService; import com.zy.asrs.service.StaDescService; import com.zy.asrs.service.WrkDetlService; import com.zy.asrs.service.WrkMastService; import com.zy.asrs.service.impl.LocDetlServiceImpl; import com.zy.asrs.service.impl.LocMastServiceImpl; import com.zy.asrs.task.handler.AutomaticLibraryTransferHandler; import com.zy.common.model.LocDetlDto; import com.zy.common.model.enums.WorkNoType; import com.zy.common.service.CommonService; import com.zy.system.entity.Config; import com.zy.system.service.ConfigService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.Date; import java.util.List; @Component public class AutomaticOutboundShipment { @Autowired private ConfigService configService; @Autowired private WrkMastService wrkMastService; @Autowired private AutomaticLibraryTransferHandler automaticLibraryTransferHandler; @Autowired private BasDevpService basDevpService; @Autowired private LocDetlServiceImpl locDetlService; @Autowired private LocMastServiceImpl locMastService; @Autowired private StaDescService staDescService; @Autowired private CommonService commonService; @Autowired private WrkDetlService wrkDetlService; /** * 自动出满托 */ @Scheduled(cron = "0/3 * * * * ? ") private void execute(){ Config config = configService.selectConfigByCode("AutomaticOutboundShipment"); if(config.getStatus()==0){ return; } BasDevp basDevp = basDevpService.selectOne(new EntityWrapper().eq("dev_no", 200)); if (Cools.isEmpty(basDevp.getLoading())||basDevp.getLoading().equals("N")) { //找到入库最早的 LocMast locMastIoTime=locMastService.selectOne(new EntityWrapper().eq("loc_sts", "F").orderBy("io_time")); //最早入库的可能不是最靠近出库口的,所以需要再去找这层最靠近出库口的货 LocMast locMast =locMastService.selectOne(new EntityWrapper().eq("loc_sts", "F").eq("lev1",locMastIoTime.getLev1()).orderBy("bay1",false)); boolean res1 = false; List locMasts = locMastService.selectList(new EntityWrapper() .eq("lev1", locMast.getLev1()) .orderBy("bay1", res1)); for (LocMast locMast1 : locMasts) { if (locMast1.getLocNo().equals(locMast.getLocNo())) { break; } if (locMast1.getLocSts().equals("D") || locMast1.getLocSts().equals("F")) { throw new CoolException(locMast.getLocNo() + "库位堵塞,禁止出库"); }else if(!locMast1.getLocSts().equals("O")){ return; } } // 获取源站 Wrapper wrapper = new EntityWrapper() .eq("type_no", 101) .eq("stn_no", 200) .eq("crn_no", locMast.getCrnNo()); StaDesc staDesc = staDescService.selectOne(wrapper); if (Cools.isEmpty(staDesc)) { throw new CoolException("检索源站失败"); } Date now = new Date(); List locDetls=locDetlService.selectList(new EntityWrapper().eq("loc_no", locMast.getLocNo())); if(Cools.isEmpty(locDetls)){ throw new CoolException("库存明细为空---locNo:"+locMast.getLocNo()); } // 生成工作号 int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(101)); // 生成工作档 WrkMast wrkMast = new WrkMast(); wrkMast.setWrkNo(workNo); wrkMast.setIoTime(now); wrkMast.setWrkSts(0L); // 工作状态:0.待接收 wrkMast.setIoType(101); // 入出库状态 wrkMast.setIoPri(15D); // 优先级:15 wrkMast.setCrnNo(locMast.getCrnNo()); wrkMast.setSourceStaNo(staDesc.getCrnStn()); // 源站 wrkMast.setStaNo(staDesc.getStnNo()); // 目标站 wrkMast.setSourceLocNo(locMast.getLocNo()); // 源库位 wrkMast.setFullPlt("Y"); // 满板:Y wrkMast.setPicking("N"); // 拣料 wrkMast.setExitMk("N"); // 退出 wrkMast.setEmptyMk("N"); // 空板 wrkMast.setLinkMis("N"); wrkMast.setBarcode(locMast.getBarcode()); wrkMast.setAppeUser(9945L); // 操作人员数据 wrkMast.setAppeTime(now); wrkMast.setModiUser(9945L); wrkMast.setModiTime(now); if (!wrkMastService.insert(wrkMast)) { throw new CoolException("保存工作档失败,出库库位号:"+locMast.getLocNo()); } // 生成工作档明细 for (LocDetl l : locDetls) { WrkDetl wrkDetl = new WrkDetl(); wrkDetl.sync(l); wrkDetl.setOrderNo(""); // 手动出库不需要带出库存中的单据编号 wrkDetl.setWrkNo(workNo); wrkDetl.setIoTime(now); wrkDetl.setAnfme(l.getAnfme()); // 数量 wrkDetl.setAppeTime(now); wrkDetl.setAppeUser(9945L); wrkDetl.setModiTime(now); wrkDetl.setModiUser(9945L); if (!wrkDetlService.insert(wrkDetl)) { throw new CoolException("保存工作档明细失败"); } } // 修改库位状态: F.在库 ====>>> R.出库预约/P.拣料/盘点/并板出库中 locMast = locMastService.selectById(locMast.getLocNo()); if (locMast.getLocSts().equals("F")) { locMast.setLocSts("R"); locMast.setModiUser(9945L); locMast.setModiTime(now); if (!locMastService.updateById(locMast)) { throw new CoolException("预约库位状态失败,库位号:"+locMast.getLocNo()); } } else { throw new CoolException(locMast.getLocNo() + "库位不是在库状态"); } } } }