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 agvLocMasts = agvLocMastService.selectList( // new EntityWrapper() // .isNotNull("loc_type") // .ne("loc_type", "") // .eq("floor", 1) // .eq("loc_sts","F")); // if (agvLocMasts.isEmpty()) { // return; // } // for (AgvLocMast agvLocMast : agvLocMasts) { // ReturnT returnT = autoMoveHandler.start(agvLocMast); // } // // } /** * 自动调拨任务,从1楼调拨到2楼,3楼 * wrkSts 22.调拨待分配 * ioType 108.自动调拨 * crnNo :2目标楼层 */ @Scheduled(cron = "0/10 * * * * ? ") private synchronized void execute2() { List agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper().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 agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper() // .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/10 * * * * ? ") private void execute3() { List agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper().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 agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper().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 agvLocMasts = agvLocMastService.selectList( // new EntityWrapper() // .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 agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper().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 agvLocMasts = agvLocMastService.selectList( // new EntityWrapper() // .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() { List agvLocMasts = agvLocMastService.selectList(new EntityWrapper() // TODO 四期 .eq("loc_sts", "D").eq("loc_type1", 3).andNew().ne("floor", 1).or().ne("lev1", 1)); if (agvLocMasts.isEmpty()) { return; } Config config = configService.selectOne(new EntityWrapper().eq("code", "RETURN_3_TIME")); for (AgvLocMast agvLocMast : agvLocMasts) { if (agvLocMast.getLocNo().contains("02F1")) { boolean flag = false; if (config != null && !Cools.isEmpty(config.getValue())) { 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) { try { autoMoveHandler.autoEmptyBack4(agvLocMast); } catch (Exception e) { //log.error("库位号" + agvLocMast.getLocNo() + "空板自动回库 库位-接驳点 库位-吸塑车间,处理失败:===》异常原因:" + e.getMessage()); } } } else { try { autoMoveHandler.autoEmptyBack4(agvLocMast); } catch (Exception e) { //log.error("库位号" + agvLocMast.getLocNo() + "空板自动回库 库位-接驳点 库位-吸塑车间,处理失败:===》异常原因:" + e.getMessage()); } } } } /** * 将二厂的6类型的空货架调拨回吸塑二楼 */ // TODO 四期 @Scheduled(cron = "0/30 * * * * ? ") private void autoEmptyBackSiqi() { Config config2 = configService.selectOne(new EntityWrapper().eq("code", "RETURN_6_EMPTY")); //先判断空库位数了 List agvLocMasts = agvLocMastService.selectList(new EntityWrapper().eq("loc_type1", 3).eq("floor", 1).eq("lev1", 2).eq("loc_sts", "O")); int size = 0; if (agvLocMasts != null) { size = agvLocMasts.size(); } if (config2 != null && config2.getStatus() == 1 && !Cools.isEmpty(config2.getValue())) { if (size < Integer.parseInt(config2.getValue())) { return; } } else { if (size < 20) { return; } } // 查询6类型空货架返回的执行时间点 Config config = configService.selectOne(new EntityWrapper().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 agvLocMasts = agvLocMastService.selectList(new EntityWrapper().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 agvBasDevps = agvBasDevpService.selectList(new EntityWrapper().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 agvBasDevps = agvBasDevpService.selectList(new EntityWrapper().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/30 * * * * ? ") private void autoEmptyBack6() { List agvBasDevps = agvBasDevpService.selectList(new EntityWrapper().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().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 agvWrkMasts = agvWrkMastService.selectList(new EntityWrapper().like("loc_no", "02F1").like("source_loc_no", "F1").eq("io_type", 12)); if (maxTansk <= agvWrkMasts.size()) { return; } List agvLocMasts = agvLocMastService.selectList(new EntityWrapper().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/30 * * * * ? ") 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().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 agvWrkMasts = agvWrkMastService.selectList(new EntityWrapper().eq("io_type", 12)); if (agvWrkMasts != null && maxTansk <= agvWrkMasts.size()) { return; } List agvLocMasts = agvLocMastService.selectList(new EntityWrapper().eq("floor", 1).eq("loc_sts", "F").eq("loc_type1", 3).isNotNull("ctn_no")); if (agvLocMasts.isEmpty()) { return; } for (AgvLocMast agvLocMast : agvLocMasts) { if (agvLocMast.getLev1() == 1 && agvLocMast.getFloor() == 1 && !Cools.isEmpty(agvLocMast.getCtnNo()) && agvLocMast.getCtnNo().toString().equals("2")) { try { autoMoveHandler.autoTransfersV2(agvLocMast, maxTansk); } catch (Exception e) { log.error("库位号" + agvLocMast.getLocNo() + "四期定时移库任务 吸塑 --> 吸塑,处理失败:===》异常原因:" + e.getMessage()); } } else if (agvLocMast.getLev1() == 2 && agvLocMast.getFloor() == 1 && !Cools.isEmpty(agvLocMast.getCtnNo()) && agvLocMast.getCtnNo().toString().equals("1")) { try { autoMoveHandler.autoTransfersV2(agvLocMast, maxTansk); } catch (Exception e) { log.error("库位号" + agvLocMast.getLocNo() + "四期定时移库任务 吸塑 --> 吸塑,处理失败:===》异常原因:" + e.getMessage()); } } } } } } }