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<WaitPakin> beBatchs = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("be_batch", 1).orderBy("zpallet ASC"));
|
if (beBatchs.isEmpty()) {
|
return;
|
}
|
List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().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<RowLastno>().eq("wrk_mk", "1"));
|
if(Cools.isEmpty(wrkMk)){
|
RowLastno whsType = rowLastnoService.selectOne(new EntityWrapper<RowLastno>().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<RowLastno>().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<RowLastno>().eq("whs_type", "2"));
|
whsType.setWrkMk("1");
|
rowLastnoService.updateById(whsType);
|
}
|
//检测堆垛机是否正常
|
for(int j=0;j<crns.length;j++){
|
boolean b = basCrnpService.checkSiteError(crns[j], false);
|
if(b){
|
if(crns[j]==2){
|
staNo = "103";
|
}else {
|
staNo = "101";
|
}
|
break;
|
}
|
}
|
}
|
}
|
if (Cools.isEmpty(staNo)) {
|
return;
|
}
|
//AGV目标站点已经在做任务时跳过
|
WaitPakin waitPakin1 = waitPakinService.selectOne(new EntityWrapper<WaitPakin>().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<WaitPakin>().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<WaitPakin> waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>()
|
.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<WaitPakin>().eq("supp_code",waitPakin.getSuppCode()));
|
}
|
}
|
}
|
|
/**
|
* 出库时绑定agv站点
|
* 自动派发出库任务给agv搬运
|
*/
|
@Scheduled(cron = "0/3 * * * * ? ")
|
private synchronized void autoOut(){
|
List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("wrk_sts", 30));
|
if (wrkMasts.isEmpty()) {
|
return;
|
}
|
for (WrkMast wrkMast : wrkMasts) {
|
BasDevp basDevp = basDevpService.selectOne(new EntityWrapper<BasDevp>()
|
.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<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
|
.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);
|
}
|
}
|
}
|
}
|