package com.zy.asrs.task; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.core.common.R; import com.core.exception.CoolException; import com.zy.asrs.controller.MobileController; import com.zy.asrs.entity.BasDevp; import com.zy.asrs.entity.RowLastno; import com.zy.asrs.entity.WaitPakin; import com.zy.asrs.entity.WrkMast; import com.zy.asrs.service.*; import com.zy.asrs.task.core.ReturnT; import com.zy.common.service.CommonService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; /** * 自动派发任务给AGV */ @Component public class AutoAssignAGVTasks { private static final Logger log = LoggerFactory.getLogger(WorkMastScheduler.class); @Autowired private WaitPakinService waitPakinService; @Autowired private MobileController mobileController; @Autowired private RowLastnoService rowLastnoService; @Autowired private BasCrnpService basCrnpService; @Autowired private CommonService commonService; @Autowired private WrkMastService wrkMastService; @Autowired private BasDevpService basDevpService; /** * 自动派发入库任务给AGV */ @Scheduled(cron = "0/3 * * * * ? ") private synchronized void execute(){ /** * agv状态 * be_batch * 0:无需调用AGV * 1:等待调用AGV * 2:AGV任务下发成功 * 3:AGV任务完成 * 4:给输送线下发入库指令 */ List beBatchs = waitPakinService.selectList(new EntityWrapper().eq("be_batch", 1).orderBy("zpallet ASC")); if (beBatchs.isEmpty()) { return; } List wrkMasts = wrkMastService.selectList(new EntityWrapper().in("io_type", 101, 103, 110, 107).le("wrk_sts",14)); if(!Cools.isEmpty(wrkMasts)){ log.info("当前有出库任务数={},正在进行无法呼叫agv入库",wrkMasts.size()); return; } //对相同托盘号进行跳过 String zpallet=""; for (WaitPakin waitPakin : beBatchs) { if(Cools.isEmpty(zpallet)){ zpallet=waitPakin.getZpallet(); }else if(zpallet.equals(waitPakin.getZpallet())){ continue; } if(Cools.isEmpty(waitPakin.getMemo())){ log.error("入库通知档托盘码={},源站点[memo]为空",waitPakin.getZpallet()); continue; } String i= waitPakin.getZpallet().substring(0,1); String staNo = ""; //大托盘入库目标站点105 if(i.equals("9")){ staNo = "105"; }else { //小托盘入库则按入库规则交替入库 //将堆垛机排序 //检测堆垛机是否正常,跳过不正常的堆垛机 Integer[] crns=new Integer[2]; RowLastno wrkMk = rowLastnoService.selectOne(new EntityWrapper().eq("wrk_mk", "1")); if(Cools.isEmpty(wrkMk)){ RowLastno whsType = rowLastnoService.selectOne(new EntityWrapper().eq("whs_type", "2")); whsType.setWrkMk("1"); rowLastnoService.updateById(whsType); crns[0]=2; crns[1]=3; }else { if(wrkMk.getWhsType()==2){ crns[0]=2; crns[1]=3; wrkMk.setWrkMk("0"); rowLastnoService.updateById(wrkMk); RowLastno whsType = rowLastnoService.selectOne(new EntityWrapper().eq("whs_type", "3")); whsType.setWrkMk("1"); rowLastnoService.updateById(whsType); }else { crns[0]=3; crns[1]=2; wrkMk.setWrkMk("0"); rowLastnoService.updateById(wrkMk); RowLastno whsType = rowLastnoService.selectOne(new EntityWrapper().eq("whs_type", "2")); whsType.setWrkMk("1"); rowLastnoService.updateById(whsType); } //检测堆垛机是否正常 for(int j=0;j wrkMasts1 = wrkMastService.selectList(new EntityWrapper().eq("sta_no", staNo).lt("wrk_sts",33)); if(!Cools.isEmpty(wrkMasts1)){ continue; } if (Cools.isEmpty(staNo)) { return; } //AGV目标站点已经在做任务时跳过 WaitPakin waitPakin1 = waitPakinService.selectOne(new EntityWrapper().eq("sku", staNo).in("be_batch", 2,3)); if (!Cools.isEmpty(waitPakin1)) { continue; } R bind = mobileController.siteBindAndUnbind(waitPakin.getMemo(),waitPakin.getZpallet(), "BIND"); // if (bind.get("code").equals(200)) { // }else { // log.info("WMS绑定agv站点={},任务号为={}------------失败",wrkMast.getStaNo(),wrkMast.getWrkNo()); // } int workNo = commonService.getWorkNo(0); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String format = sdf.format(new Date()); String s = format+"-" + workNo; log.info("给agv下发入库搬运任务={}",waitPakin); R r = mobileController.SITESITEAGVMove(waitPakin.getMemo(), staNo,s); if (r.get("code").equals(200)) { waitPakin.setSupp(s);//发给agv的任务号 waitPakin.setSku(staNo);//目标站点 waitPakin.setBeBatch(2);//2:AGV任务下发成功 waitPakinService.update(waitPakin,new EntityWrapper().eq("supp_code",waitPakin.getSuppCode())); } } } /** * 自动派发补空板任务给AGV */ @Scheduled(cron = "0/3 * * * * ? ") private synchronized void autoFillEmptyPallets(){ /** * 该字段是组托入库自动出发补空托盘标记 * item_num * 0:不需要补空托盘 * 1:小托盘 * 2:大托盘 * 10:小托盘AGV任务下发成功 * 20:大托盘AGV任务下发成功 * ---------------------------------------------------------------------- * 下面的暂时用不到 * 100:小托盘放货完成 * 200:大托盘放货完成 */ List waitPakins = waitPakinService.selectList(new EntityWrapper() .in("item_num", 1,2) .ge("be_batch",3) .orderBy("zpallet ASC")); if (waitPakins.isEmpty()) { return; } String zpallet=""; for (WaitPakin waitPakin : waitPakins) { if(Cools.isEmpty(zpallet)){ zpallet=waitPakin.getZpallet(); }else if(zpallet.equals(waitPakin.getZpallet())){ continue; } if (Cools.isEmpty(waitPakin.getMemo())) { log.error("入库通知档托盘码={},源站点[memo]为空",waitPakin.getZpallet()); continue; } log.info("WMS自动下发给AGV下发补空托盘任务={}",waitPakin); R r = mobileController.FillEmptyPallets(waitPakin.getMemo(), waitPakin.getItemNum()); if (r.get("code").equals(200)) { waitPakin.setItemNum(waitPakin.getItemNum().equals("1")?"10":"20"); waitPakinService.update(waitPakin,new EntityWrapper().eq("supp_code",waitPakin.getSuppCode())); } } } /** * 出库时绑定agv站点 * 自动派发出库任务给agv搬运 */ @Scheduled(cron = "0/3 * * * * ? ") private synchronized void autoOut(){ List wrkMasts = wrkMastService.selectList(new EntityWrapper().eq("wrk_sts", 30)); if (wrkMasts.isEmpty()) { return; } for (WrkMast wrkMast : wrkMasts) { BasDevp basDevp = basDevpService.selectOne(new EntityWrapper() .eq("wrk_no", wrkMast.getWrkNo()) .eq("dev_no", wrkMast.getStaNo()) .eq("autoing", "Y") .eq("loading","Y")); if(Cools.isEmpty(basDevp)){ continue; } if (Cools.isEmpty(wrkMast.getMemo())) { log.error("入库通知档托盘码={},源站点[memo]为空",wrkMast.getBarcode()); continue; } log.info("WMS自动下发给AGV下发出库任务={}",wrkMast); log.info("WMS开始自动绑定agv站点={},任务号为={}",wrkMast.getStaNo(),wrkMast.getWrkNo()); R bind = mobileController.siteBindAndUnbind(wrkMast.getStaNo() + "",wrkMast.getBarcode(), "BIND"); if (bind.get("code").equals(200)) { }else { log.info("WMS绑定agv站点={},任务号为={}------------失败",wrkMast.getStaNo(),wrkMast.getWrkNo()); } //生成agv工作号 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String format = sdf.format(new Date()); String s = format+"-" + wrkMast.getWrkNo(); log.info("WMS完成绑定agv站点={},AGV任务号为={}",wrkMast.getStaNo(),s); R r = mobileController.SITEZONEAGVMove(wrkMast.getStaNo()+"", wrkMast.getMemo(),s); if (r.get("code").equals(200)) { wrkMast.setPdcType(s); wrkMast.setWrkSts(31L); //从30等待给AGV下发出库任务-----》31AGV出库任务下发成功 wrkMast.setModiTime(new Date()); wrkMastService.updateById(wrkMast); } } } /** * 入库任务自动解绑agv站点 */ @Scheduled(cron = "0/3 * * * * ? ") private synchronized void UnbindTheSite(){ List wrkMasts = wrkMastService.selectList(new EntityWrapper() .in("io_type",1,53) .ge("wrk_sts", 2) .isNull("ctn_kind")); if (wrkMasts.isEmpty()) { return; } for (WrkMast wrkMast : wrkMasts) { String staNo=""; if(wrkMast.getSourceStaNo()==102){ staNo="101"; }else if(wrkMast.getSourceStaNo()==104){ staNo="103"; }else if(wrkMast.getSourceStaNo()==106){ staNo="105"; } log.info("WMS入库解绑AGV站点={},托盘码为={}",staNo,wrkMast.getBarcode()); R r = mobileController.siteBindAndUnbind(staNo,wrkMast.getBarcode(),"UNBIND"); if (r.get("code").equals(200)) { wrkMast.setCtnKind(1);//任务解绑标记 wrkMastService.updateById(wrkMast); } } } }