| | |
| | | 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.core.exception.CoolException; |
| | | 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.ReturnT; |
| | | import com.zy.asrs.task.handler.AutoMoveHandler; |
| | | 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 { |
| | | |
| | |
| | | private AutoMoveHandler autoMoveHandler; |
| | | @Autowired |
| | | private AgvWrkMastService agvWrkMastService; |
| | | @Autowired |
| | | private AgvBasDevpService agvBasDevpService; |
| | | @Autowired |
| | | private ConfigService configService; |
| | | |
| | | // 调拨出库 |
| | | @Scheduled(cron = "0/2 * * * * ? ") |
| | | // @Scheduled(cron = "0/2 * * * * ? ") |
| | | private void execute(){ |
| | | List<AgvLocMast> agvLocMasts = agvLocMastService.selectList( |
| | | new EntityWrapper<AgvLocMast>() |
| | |
| | | |
| | | } |
| | | |
| | | // 调拨出库 |
| | | @Scheduled(cron = "0/2 * * * * ? ") |
| | | private void execute2(){ |
| | | /** |
| | | * 自动调拨任务,从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) { |
| | | ReturnT<String> returnT = autoMoveHandler.start2(agvWrkMast); |
| | | try{ |
| | | 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) { |
| | | ReturnT<String> returnT = autoMoveHandler.start3(agvWrkMast); |
| | | try{ |
| | | autoMoveHandler.start3(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) { |
| | | ReturnT<String> returnT = autoMoveHandler.autoEmptyBack(agvLocMast); |
| | | } |
| | | } |
| | | // 空板自动回库 接驳点 - 1楼库位 |
| | | @Scheduled(cron = "0/2 * * * * ? ") |
| | | private void autoEmptyBack3(){ |
| | | // 工作档为201 且 入出库类型为109 |
| | | private void execute4(){ |
| | | List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>() |
| | | .eq("wrk_sts", 201) |
| | | .eq("loc_no","") |
| | | .or().eq("io_type",109) |
| | | .or().eq("io_type",112)); |
| | | .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) { |
| | | ReturnT<String> returnT = autoMoveHandler.autoEmptyBack3(agvWrkMast); |
| | | 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(){ |
| | | // // 空板自动回库 |
| | | //// @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/2 * * * * ? ") |
| | | private void autoEmptyBack4(){ |
| | | // 查询 不为1楼的空货架 |
| | | List<AgvLocMast> agvLocMasts = agvLocMastService.selectList( |
| | | new EntityWrapper<AgvLocMast>() |
| | |
| | | return; |
| | | } |
| | | for (AgvLocMast agvLocMast : agvLocMasts) { |
| | | ReturnT<String> returnT = autoMoveHandler.autoEmptyBack2(agvLocMast); |
| | | try{ |
| | | autoMoveHandler.autoEmptyBack4(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()); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |