package com.zy.asrs.task;
|
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.mapper.EntityWrapper;
|
import com.core.common.Cools;
|
import com.zy.asrs.entity.AgvBasDevp;
|
import com.zy.asrs.entity.AgvLocMast;
|
import com.zy.asrs.entity.AgvWrkMast;
|
import com.zy.asrs.service.AgvBasDevpService;
|
import com.zy.asrs.service.AgvLocMastService;
|
import com.zy.asrs.service.AgvWrkMastService;
|
import com.zy.asrs.task.core.ProcesTimeData;
|
import com.zy.asrs.task.handler.AutoMoveHandler;
|
import com.zy.asrs.utils.TimeUtils;
|
import com.zy.system.entity.Config;
|
import com.zy.system.service.ConfigService;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.stereotype.Component;
|
|
import java.text.ParseException;
|
import java.text.SimpleDateFormat;
|
import java.util.Date;
|
import java.util.List;
|
|
// 自动移库
|
@Slf4j
|
@Component
|
public class AutoMoveScheduler {
|
|
@Autowired
|
private AgvLocMastService agvLocMastService;
|
@Autowired
|
private AutoMoveHandler autoMoveHandler;
|
@Autowired
|
private AgvWrkMastService agvWrkMastService;
|
@Autowired
|
private AgvBasDevpService agvBasDevpService;
|
@Autowired
|
private ConfigService configService;
|
|
// 调拨出库
|
// @Scheduled(cron = "0/2 * * * * ? ")
|
// private void execute(){
|
// List<AgvLocMast> agvLocMasts = agvLocMastService.selectList(
|
// new EntityWrapper<AgvLocMast>()
|
// .isNotNull("loc_type")
|
// .ne("loc_type", "")
|
// .eq("floor", 1)
|
// .eq("loc_sts","F"));
|
// if (agvLocMasts.isEmpty()) {
|
// return;
|
// }
|
// for (AgvLocMast agvLocMast : agvLocMasts) {
|
// ReturnT<String> returnT = autoMoveHandler.start(agvLocMast);
|
// }
|
//
|
// }
|
|
/**
|
* 自动调拨任务,从1楼调拨到2楼,3楼
|
* wrkSts 22.调拨待分配
|
* ioType 108.自动调拨
|
* crnNo :2目标楼层
|
*/
|
@Scheduled(cron = "0/1 * * * * ? ")
|
private synchronized void execute2() {
|
List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>().eq("wrk_sts", 22).andNew().eq("io_type", 108).andNew().eq("crn_no", 2).or().eq("crn_no", 3).orderBy("io_pri", false).orderBy("appe_time", true));
|
if (agvWrkMastList.isEmpty()) {
|
return;
|
}
|
for (AgvWrkMast agvWrkMast : agvWrkMastList) {
|
try {
|
// TODO 自动回流
|
autoMoveHandler.start2(agvWrkMast);
|
} catch (Exception e) {
|
//log.error("工作号"+agvWrkMast.getWrkNo()+"调拨出库,处理失败:===》异常原因:"+e.getMessage());
|
}
|
}
|
|
}
|
|
// @Scheduled(cron = "0/2 * * * * ? ")
|
// private void execute5(){
|
// List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>()
|
// .eq("wrk_sts", 22)
|
// .andNew().eq("io_type",108)
|
// .eq("crn_no",3)
|
// .orderBy("appe_time",true)
|
// );
|
// if (agvWrkMastList.isEmpty()) {
|
// return;
|
// }
|
// for (AgvWrkMast agvWrkMast : agvWrkMastList) {
|
// try{
|
// autoMoveHandler.start2(agvWrkMast);
|
// } catch (Exception e){
|
// log.error("工作号"+agvWrkMast.getWrkNo()+"调拨出库,处理失败:===》异常原因:"+e.getMessage());
|
// }
|
// }
|
//
|
// }
|
|
|
/**
|
* 手动调拨任务(不走电梯流转,人工搬运),从1楼调拨到2、3楼,
|
* wrkSts 22.调拨待分配
|
* ioType 111.手动调拨
|
*/
|
@Scheduled(cron = "0/2 * * * * ? ")
|
private void execute3() {
|
List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>().eq("wrk_sts", 22).andNew().eq("io_type", 111).orderBy("io_pri", false).orderBy("appe_time", true));
|
if (agvWrkMastList.isEmpty()) {
|
return;
|
}
|
for (AgvWrkMast agvWrkMast : agvWrkMastList) {
|
try {
|
autoMoveHandler.start3(agvWrkMast);
|
} catch (Exception e) {
|
//log.error("工作号"+agvWrkMast.getWrkNo()+"调拨出库,处理失败:===》异常原因:"+e.getMessage());
|
}
|
}
|
|
}
|
|
@Scheduled(cron = "0/2 * * * * ? ")
|
private void execute4() {
|
List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>().eq("wrk_sts", 22).andNew().eq("io_type", 114).orderBy("io_pri", false).orderBy("appe_time", true));
|
if (agvWrkMastList.isEmpty()) {
|
return;
|
}
|
for (AgvWrkMast agvWrkMast : agvWrkMastList) {
|
try {
|
autoMoveHandler.start4(agvWrkMast);
|
} catch (Exception e) {
|
log.error("工作号" + agvWrkMast.getWrkNo() + "调拨出库,处理失败:===》异常原因:" + e.getMessage());
|
}
|
}
|
|
}
|
|
// // 空板自动回库 库位-接驳点
|
// //@Scheduled(cron = "0/2 * * * * ? ")
|
// private void autoEmptyBack(){
|
// // 查询 不为1楼的空货架
|
// List<AgvLocMast> agvLocMasts = agvLocMastService.selectList(
|
// new EntityWrapper<AgvLocMast>()
|
// .ne("floor", 1)
|
// .eq("loc_sts","D")
|
// .eq("loc_type1",3));
|
// if (agvLocMasts.isEmpty()) {
|
// return;
|
// }
|
// for (AgvLocMast agvLocMast : agvLocMasts) {
|
// try{
|
// autoMoveHandler.autoEmptyBack(agvLocMast);
|
// } catch (Exception e){
|
// log.error("库位号"+agvLocMast.getLocNo()+"空板自动回库 库位-接驳点,处理失败:===》异常原因:"+e.getMessage());
|
// }
|
// }
|
// }
|
|
/**
|
* 手工作业不通过电梯时,空板从2、3楼接驳位人工搬运到1楼接驳位以后,
|
* 回流到1楼接驳位,1楼接驳点 - 1楼库位
|
* wrkSts 214.空料架回流待分配
|
* ioType 113.空托盘手动回流
|
*/
|
@Scheduled(cron = "0/2 * * * * ? ")
|
private void autoEmptyBack3() {
|
// 工作档为201 且 入出库类型为109
|
List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>().eq("wrk_sts", 214).eq("loc_no", "").eq("io_type", 113).orderBy("io_pri", false));
|
if (agvWrkMastList.isEmpty()) {
|
return;
|
}
|
for (AgvWrkMast agvWrkMast : agvWrkMastList) {
|
try {
|
autoMoveHandler.autoEmptyBack3(agvWrkMast);
|
} catch (Exception e) {
|
log.error("工作号" + agvWrkMast.getWrkNo() + "空板自动回库 接驳点 - 1楼库位,处理失败:===》异常原因:" + e.getMessage());
|
}
|
}
|
}
|
|
// // 空板自动回库
|
//// @Scheduled(cron = "0/2 * * * * ? ")
|
// private void autoEmptyBack2(){
|
// // 查询 不为1楼的空货架
|
// List<AgvLocMast> agvLocMasts = agvLocMastService.selectList(
|
// new EntityWrapper<AgvLocMast>()
|
// .ne("floor", 1)
|
// .eq("loc_sts","D")
|
// .eq("loc_type1",3));
|
// if (agvLocMasts.isEmpty()) {
|
// return;
|
// }
|
// for (AgvLocMast agvLocMast : agvLocMasts) {
|
// try{
|
// autoMoveHandler.autoEmptyBack2(agvLocMast);
|
// } catch (Exception e){
|
// log.error("库位号"+agvLocMast.getLocNo()+"空板自动回库,处理失败:===》异常原因:"+e.getMessage());
|
// }
|
// }
|
// }
|
|
/**
|
* 空板自动回库(通过电梯),2、3楼库位的箱壳空料架,直接回流到1楼库位
|
* 库位-接驳点 库位-吸塑车间
|
* 每层最大 在 回库数量限制5条
|
* 优先选择先到接驳位(接驳位可入) 后选择直接回库
|
* 2楼或3楼站点可入信号全部没有,代表走电梯自动搬运模式
|
*/
|
@Scheduled(cron = "0/30 * * * * ? ")
|
private void autoEmptyBack4() {
|
// 查询 不为1楼的空货架
|
List<AgvLocMast> agvLocMasts = agvLocMastService.selectList(new EntityWrapper<AgvLocMast>()
|
// TODO 四期
|
.eq("loc_sts", "D").eq("loc_type1", 3)
|
.andNew()
|
.ne("floor", 1).or().ne("lev1", 1));
|
if (agvLocMasts.isEmpty()) {
|
return;
|
}
|
for (AgvLocMast agvLocMast : agvLocMasts) {
|
try {
|
autoMoveHandler.autoEmptyBack4(agvLocMast);
|
} catch (Exception e) {
|
log.error("库位号" + agvLocMast.getLocNo() + "空板自动回库 库位-接驳点 库位-吸塑车间,处理失败:===》异常原因:" + e.getMessage());
|
}
|
}
|
}
|
|
|
/**
|
* 将二厂的6类型的空货架调拨回吸塑二楼
|
*/
|
// TODO 四期
|
@Scheduled(cron = "0/30 * * * * ? ")
|
private void autoEmptyBackSiqi() {
|
// 查询6类型空货架返回的执行时间点
|
Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "RETURN_6_TIME"));
|
if (config != null && !Cools.isEmpty(config.getValue())) {
|
boolean flag = false;
|
try {
|
// 判断是否在执行时间内
|
ProcesTimeData procesTimeData = JSONObject.parseObject(config.getValue(), ProcesTimeData.class);
|
if (procesTimeData != null && config.getStatus() == 1 && TimeUtils.between(procesTimeData)) {
|
flag = true;
|
}
|
} catch (Exception e) {
|
log.error("6类型空货架返回的执行时间点解析异常:===》异常原因:" + e.getMessage());
|
flag = true;
|
}
|
if (flag) {
|
executeLocType6();
|
}
|
}
|
// else {
|
// executeLocType6();
|
// }
|
}
|
|
|
private void executeLocType6() {
|
// 查询 二厂的的半成品箱壳类型的空货架
|
List<AgvLocMast> agvLocMasts = agvLocMastService.selectList(new EntityWrapper<AgvLocMast>().eq("loc_sts", "D").eq("loc_type1", 6).eq("floor", 2));
|
if (agvLocMasts.isEmpty()) {
|
return;
|
}
|
for (AgvLocMast agvLocMast : agvLocMasts) {
|
try {
|
autoMoveHandler.autoEmptyBackSiqi(agvLocMast);
|
} catch (Exception e) {
|
log.error("库位号" + agvLocMast.getLocNo() + "空板自动回库 库位-接驳点 库位-吸塑车间,处理失败:===》异常原因:" + e.getMessage());
|
}
|
}
|
}
|
|
private boolean determineFloorConnection(Integer floor) {
|
try {
|
List<AgvBasDevp> agvBasDevps = agvBasDevpService.selectList(new EntityWrapper<AgvBasDevp>().eq("floor", floor).like("dev_no", "DB_"));
|
if (!agvBasDevps.isEmpty()) {
|
for (AgvBasDevp agvBasDevp : agvBasDevps) {
|
if (agvBasDevp.getInEnable().equals("Y")) {
|
return false;
|
}
|
}
|
return true;
|
}
|
} catch (Exception e) {
|
log.error("判断当前楼层接驳位是否全部关闭,异常" + e.getMessage());
|
}
|
return false;
|
}
|
|
/**
|
* 站点是否自动
|
* 自动: 生成 109 自动回流
|
* 手动: 生成 113 手动回流
|
* 优先选择先到接驳位(接驳位可入) 后选择直接回库
|
*/
|
@Scheduled(cron = "0/2 * * * * ? ")
|
private void autoEmptyBack5() {
|
List<AgvBasDevp> agvBasDevps = agvBasDevpService.selectList(new EntityWrapper<AgvBasDevp>().ne("floor", 1).eq("loc_sts", "F").like("dev_no", "DB"));
|
if (agvBasDevps.isEmpty()) {
|
return;
|
}
|
for (AgvBasDevp agvBasDevp : agvBasDevps) {
|
try {
|
autoMoveHandler.autoEmptyBack5(agvBasDevp);
|
} catch (Exception e) {
|
log.error("站点号" + agvBasDevp.getDevNo() + "站点是否自动 优先选择先到接驳位(接驳位可入) 后选择直接回库,处理失败:===》异常原因:" + e.getMessage());
|
}
|
}
|
}
|
|
/**
|
* 检测1楼接驳点
|
* 手动: 生成 113 手动回流
|
*/
|
@Scheduled(cron = "0/2 * * * * ? ")
|
private void autoEmptyBack6() {
|
List<AgvBasDevp> agvBasDevps = agvBasDevpService.selectList(new EntityWrapper<AgvBasDevp>().eq("floor", 1).eq("loc_sts", "F").like("dev_no", "DB"));
|
if (agvBasDevps.isEmpty()) {
|
return;
|
}
|
for (AgvBasDevp agvBasDevp : agvBasDevps) {
|
try {
|
autoMoveHandler.autoEmptyBack6(agvBasDevp);
|
} catch (Exception e) {
|
log.error("站点号" + agvBasDevp.getDevNo() + "检测1楼接驳点 生成 113 手动回流,处理失败:===》异常原因:" + e.getMessage());
|
}
|
}
|
}
|
|
/**
|
* 跨层自动移库
|
*/
|
@Scheduled(cron = "0/2 * * * * ? ")
|
private void autoEmptyBack7() throws ParseException {
|
Date now = new Date();
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
String currentDay = sdf.format(now);
|
Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "autoTime"));
|
if (Cools.isEmpty(config)) {
|
|
} else {
|
if (config.getStatus().intValue() == 0) {
|
return;
|
}
|
JSONObject jsonObject = JSON.parseObject(config.getValue().toString());
|
Integer maxTansk = jsonObject.getInteger("maxTansk");
|
//Integer startTime = jsonObject.getInteger("startTime");
|
String startTime = jsonObject.getString("startTime");
|
long time1 = new SimpleDateFormat("yyyy-MM-dd HH:mm").parse(currentDay + " " + startTime).getTime();
|
long time = now.getTime();
|
long time3 = time - time1;
|
|
|
if (time3 > 0 && time3 < (1000 * 60 * 10)) {
|
|
List<AgvWrkMast> agvWrkMasts = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>().like("loc_no", "02F1").like("source_loc_no", "F1").eq("io_type", 12));
|
if (maxTansk <= agvWrkMasts.size()) {
|
return;
|
}
|
|
List<AgvLocMast> agvLocMasts = agvLocMastService.selectList(new EntityWrapper<AgvLocMast>().eq("floor", 1).eq("lev1", 1).eq("loc_sts", "F").eq("loc_type1", 3));
|
if (agvLocMasts.isEmpty()) {
|
return;
|
}
|
for (AgvLocMast agvLocMast : agvLocMasts) {
|
try {
|
autoMoveHandler.autoTransfers(agvLocMast, maxTansk);
|
} catch (Exception e) {
|
log.error("库位号" + agvLocMast.getLocNo() + "定时移库任务 吸塑一楼 --> 吸塑二楼,处理失败:===》异常原因:" + e.getMessage());
|
}
|
}
|
}
|
}
|
}
|
|
|
/**
|
* 打标记的库位进行自动移库,四期
|
* 在库位不够的情况下,箱壳入库别的楼层库位的时候,晚上进行跨层移库
|
*/
|
@Scheduled(cron = "0/2 * * * * ? ")
|
private void autoEmptyBack8() throws ParseException {
|
Date now = new Date();
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
String currentDay = sdf.format(now);
|
Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "autoTime2"));
|
if (Cools.isEmpty(config)) {
|
|
} else {
|
if (config.getStatus().intValue() == 0) {
|
return;
|
}
|
JSONObject jsonObject = JSON.parseObject(config.getValue().toString());
|
Integer maxTansk = jsonObject.getInteger("maxTansk");
|
//Integer startTime = jsonObject.getInteger("startTime");
|
String startTime = jsonObject.getString("startTime");
|
long time1 = new SimpleDateFormat("yyyy-MM-dd HH:mm").parse(currentDay + " " + startTime).getTime();
|
long time = now.getTime();
|
long time3 = time - time1;
|
|
|
if (time3 > 0) {
|
|
List<AgvWrkMast> agvWrkMasts = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>().eq("io_type", 12));
|
if (agvWrkMasts != null && maxTansk <= agvWrkMasts.size()) {
|
return;
|
}
|
|
List<AgvLocMast> agvLocMasts = agvLocMastService.selectList(new EntityWrapper<AgvLocMast>().eq("floor", 1).eq("loc_sts", "F").eq("loc_type1", 3).eq("ctn_no", "1"));
|
if (agvLocMasts.isEmpty()) {
|
return;
|
}
|
for (AgvLocMast agvLocMast : agvLocMasts) {
|
try {
|
autoMoveHandler.autoTransfersV2(agvLocMast, maxTansk);
|
} catch (Exception e) {
|
log.error("库位号" + agvLocMast.getLocNo() + "四期定时移库任务 吸塑 --> 吸塑,处理失败:===》异常原因:" + e.getMessage());
|
}
|
}
|
}
|
}
|
}
|
}
|