diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/SlitterPdaController.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/SlitterPdaController.java index 877050710..69d9863c6 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/SlitterPdaController.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/SlitterPdaController.java @@ -323,5 +323,11 @@ public class SlitterPdaController { public ResponseEntity getTubeVehicleInfo(@RequestBody JSONObject param) { return new ResponseEntity<>(slitterService.getTubeVehicleInfo(param), HttpStatus.OK); } + @PostMapping("/seeTaskByPoint") + @Log("任务查看") + @SaIgnore + public ResponseEntity seeTaskByPoint(@RequestBody JSONObject param) { + return new ResponseEntity<>(slitterService.seeTaskByPoint(param), HttpStatus.OK); + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoCallAirShaftTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoCallAirShaftTask.java index f31cae110..543d6c427 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoCallAirShaftTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoCallAirShaftTask.java @@ -54,7 +54,6 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.TimeUnit; -import java.util.function.Consumer; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -62,6 +61,7 @@ import static org.nl.b_lms.sch.tasks.slitter.util.SlitterTaskUtil.doSavePaperInf /** * 定时器呼叫套轴任务 + * * @Author: lyd * @Date: 2024/2/1 * @Description: 自动任务 呼叫套轴 根据分切计划来呼叫套轴任务 桁架任务 @@ -107,6 +107,7 @@ public class AutoCallAirShaftTask extends Prun { public final static String IS_ONLY_PULLING = "IS_ONLY_PULLING"; public final static String TZ_DAY = "TZ_DAY"; public final static String USE_XN = "USE_XN"; + public final static String BZ_CHECK_EMPTY = "BZ_CHECK_EMPTY"; public List stepErrorInfo = new ArrayList<>(); @Autowired private RedissonClient redissonClient; @@ -154,6 +155,7 @@ public class AutoCallAirShaftTask extends Prun { } } } + @Transactional(rollbackFor = Exception.class) public void doCallShaft(BstIvtShafttubeivt empty, Param isOnlyPulling, Param tzDay, Param paramObj, Param useXn) { log.info(empty.getPoint_code() + "执行中..."); @@ -310,12 +312,13 @@ public class AutoCallAirShaftTask extends Prun { List qzzPoint = sortByPointEmpty(notTaskPoints); log.info("查找到满足到对应尺寸的点位-{}", qzzPoint); if (qzzPoint.size() == 0) { - stepErrorInfo.add("没有可拔轴的点位。"); + stepErrorInfo.add("没有套轴暂存位没有相同规格的气胀轴来拔轴,直接去气胀轴库获取。"); //若套轴暂存位没有相同规格的气胀轴,直接去气胀轴库找即可 // 调用ACS滚条气涨轴下来 - if (!toAcsOutShaft(needPlans, plans, qzzSize,location, empty)) { + if (!toAcsOutShaft(needPlans, plans, qzzSize, location, empty)) { log.error("呼叫出轴失败-穿拔轴{}不进行套轴,跳过!", empty.getPoint_code()); - stepErrorInfo.add("呼叫出轴失败-穿拔轴" + empty.getPoint_code() + "不进行套轴,跳过!"); + stepErrorInfo.add("呼叫出轴失败-穿拔轴" + empty.getPoint_code() + "不进行套轴,直接做拔轴!"); + makePullShaft(empty, specification); return; } // 保存所需要的分切计划数据到点位上(套轴对接位)更新分切计划 @@ -422,6 +425,7 @@ public class AutoCallAirShaftTask extends Prun { /** * 判断是不是有空位置 + * * @param planD * @return */ @@ -430,7 +434,7 @@ public class AutoCallAirShaftTask extends Prun { String qzzGeneration = planD.getQzz_generation(); String location = empty.getPoint_location(); // 需要区分上下 - List shafttubeivts = bstIvtShafttubeivtService.getByQzzSize(qzzSize ,empty.getPoint_code(), location); + List shafttubeivts = bstIvtShafttubeivtService.getByQzzSize(qzzSize, empty.getPoint_code(), location); if (shafttubeivts.size() == 0) { stepErrorInfo.add("气胀轴库找不到[" + qzzSize + "]规格的气涨轴位,此次不为[" + planD.getResource_name() + "]套轴"); log.error("气胀轴库找不到[" + qzzSize + "]规格的气涨轴位"); @@ -503,6 +507,7 @@ public class AutoCallAirShaftTask extends Prun { /** * 跳过跟当前套轴计划一样的管芯的分切计划 + * * @param needPlans 当前能套轴的计划 */ public void skipTheSameTubePlans(List needPlans) { @@ -540,10 +545,11 @@ public class AutoCallAirShaftTask extends Prun { /** *

呼叫AGV更换纸管

*

默认双管芯尺寸一致 + * * @param needPlans 所需要套轴的分切计划 * @param location 位置 - * @param empty 穿拔轴点位 - * @param plans 总计划 + * @param empty 穿拔轴点位 + * @param plans 总计划 * @return 0: false, 1: true, 2: 只作拔轴 */ public Integer toCallAgvMovePaperTube(List needPlans, String location, BstIvtShafttubeivt empty, List plans) { @@ -608,7 +614,7 @@ public class AutoCallAirShaftTask extends Prun { BigDecimal qty = sumByMaterialCode.get(tubes.get(0)); if (ObjectUtil.isNotEmpty(qty)) { int sumQty = qty.intValue(); - if (sumQty >= needQuantity ) { + if (sumQty >= needQuantity) { stepErrorInfo.add("AGV正在搬运管芯..."); log.info("AGV正在搬运管芯..."); return 1; @@ -774,8 +780,7 @@ public class AutoCallAirShaftTask extends Prun { List list = stockingivtService.getEmptyPointNotTask(location, "0"); if (list.size() == 0) { stepErrorInfo.add("备货区找不到空位置搬运, 请检查备货区点位情况!"); - redisUtils.set("ERROR" + empty.getPoint_code(), stepErrorInfo); - throw new RuntimeException("备货区找不到空位置搬运, 请检查备货区点位情况!"); + return 2; } BstIvtStockingivt endPoint = list.get(0); // 创建任务 -> HINT: 在此任务完成之后会调用搬回来的任务,因此任务中要记录需要搬运的点位放在任务请求参数中。 @@ -803,10 +808,11 @@ public class AutoCallAirShaftTask extends Prun { * @param location 位置:上半部分还是下半部分 * @param empty 套拔轴点位 */ - private Boolean toAcsOutShaft(List needPlans, List plans, String qzzSize, String location, BstIvtShafttubeivt empty) { + private Boolean toAcsOutShaft(List needPlans, List plans, String qzzSize, String location, BstIvtShafttubeivt empty) { Integer movePaperTube = toCallAgvMovePaperTube(needPlans, location, empty, plans); if (movePaperTube == 2) { log.info("跳过,无法更换托盘。"); + stepErrorInfo.add("呼叫AGV更换托盘失败,无法更换托盘。"); return false; } if (movePaperTube != 0) { @@ -814,7 +820,7 @@ public class AutoCallAirShaftTask extends Prun { return false; } // 需要区分上下 - List shafttubeivts = bstIvtShafttubeivtService.getByQzzSize(qzzSize ,empty.getPoint_code(), location); + List shafttubeivts = bstIvtShafttubeivtService.getByQzzSize(qzzSize, empty.getPoint_code(), location); if (shafttubeivts.size() == 0) { log.error("气胀轴库找不到[" + qzzSize + "]规格的气涨轴位"); stepErrorInfo.add("气胀轴库找不到[" + qzzSize + "]规格的气涨轴位"); @@ -851,7 +857,7 @@ public class AutoCallAirShaftTask extends Prun { } if (!judgment1 && !judgment2) { log.warn("没有气胀轴,不给ACS写出轴信息"); - stepErrorInfo.add("呼叫气胀轴失败,(密集库/暂存架)没有"+qzzSize+"寸的气胀轴,不给ACS写出轴信息。请人工补轴或将对应的分切计划点击入站完成"); + stepErrorInfo.add("呼叫气胀轴失败,(密集库/暂存架)没有" + qzzSize + "寸的气胀轴,不给ACS写出轴信息。请人工补轴或将对应的分切计划点击入站完成"); return false; } // 判断气胀轴密集库是否有数据 @@ -978,15 +984,18 @@ public class AutoCallAirShaftTask extends Prun { if (list.size() == 0) { log.warn("气涨轴[{}]对应的分切计划不存在!", qzzNo); bcutpointivtService.update(new UpdateWrapper() - .eq("ivt_id",cutpointivt.getIvt_id()) - .set("is_used","0") - .set("remark","气胀轴" + qzzNo + "的计划不存在,无效点位自动禁用") - .set("update_time",DateUtil.now())); + .eq("ivt_id", cutpointivt.getIvt_id()) + .set("is_used", "0") + .set("remark", "气胀轴" + qzzNo + "的计划不存在,无效点位自动禁用") + .set("update_time", DateUtil.now())); stepErrorInfo.add("气胀轴" + qzzNo + "的计划不存在,无效点位[" + cutpointivt.getPoint_code() + "]自动禁用。"); return; } PdmBiSlittingproductionplan plan = list.get(0); - // todo: 考虑是否有空位(如果气涨轴库和气胀轴暂存架都没有空位,则退出)【暂时不考虑】 + // hint: 考虑是否有空位(如果气涨轴库和气胀轴暂存架都没有空位,则退出) + if (doCheckHaveEmptyPoint(empty, specification, plan)) { + return; + } List collect = list.stream().map(PdmBiSlittingproductionplan::getContainer_name).collect(Collectors.toList()); JSONObject param = new JSONObject(); param.put("point_code1", pointCode1); @@ -1010,8 +1019,69 @@ public class AutoCallAirShaftTask extends Prun { stepErrorInfo.add("只做拔轴,拔轴任务已经创建..."); } + /** + * 检测气胀轴密集库/气胀轴缓存库有没有空位 + * @param empty + * @param specification + * @param plan + * @return + */ + private boolean doCheckHaveEmptyPoint(BstIvtShafttubeivt empty, String specification, PdmBiSlittingproductionplan plan) { + Param bzCheckEmpty = paramService.findByCode(BZ_CHECK_EMPTY); + if (ObjectUtil.isEmpty(bzCheckEmpty)) { + stepErrorInfo.add("参数未配置【BZ_CHECK_EMPTY】,默认拔轴不检验空位!"); + return false; + } + if ("0".equals(bzCheckEmpty.getValue())) { + stepErrorInfo.add("参数配置【BZ_CHECK_EMPTY】拔轴不检验空位!"); + return false; + } + // 需要区分上下 - 气胀轴库(3寸能放7个,6寸能放6个) + List shafttubeivts = bstIvtShafttubeivtService.getByQzzSize(plan.getQzz_size(), empty.getPoint_code(), empty.getPoint_location()); + if (shafttubeivts.size() == 0) { + log.error("气胀轴库找不到[" + plan.getQzz_size() + "]规格的气涨轴位"); + stepErrorInfo.add("拔轴空位校验失败:气胀轴库找不到[" + plan.getQzz_size() + "]规格的气涨轴位"); + } else { + Integer qty = 7; + // 气涨轴库 + BstIvtShafttubeivt shafttubeivt = shafttubeivts.get(0); + qty = "3".equals(shafttubeivt.getQzz_size()) ? 7 : 6; + JSONArray device_rows = new JSONArray(); + JSONObject device_obj = new JSONObject(); + device_rows.add(device_obj); + device_obj.put("device_code", shafttubeivt.getPoint_code()); + // todo: 暂时都是B1 + device_obj.put("product_area", "B1"); + JSONObject pointStatus = wmsToAcsService.getPointStatus(device_rows); + if (ObjectUtil.isEmpty(pointStatus)) { + log.error("获取气胀轴库信息失败"); + stepErrorInfo.add("拔轴空位校验失败:获取ACS气胀轴库信息失败..."); + } else { + boolean judgment1 = true; + boolean judgment2 = true; + // 获取气涨轴缓存没有任务的点位 + List qzzCache = bstIvtShafttubeivtService.getNotTaskShaftCacheEmpty(empty); + if (qzzCache.size() == 0) { + log.warn("未找到气胀轴密集库可以存放气涨轴规格「" + plan.getQzz_size() + "」的暂存位"); + judgment2 = false; + } + JSONObject data2 = pointStatus.getJSONArray("data").getJSONObject(0); + if (ObjectUtil.isNotEmpty(data2.get("qty")) && data2.getInteger("qty") > 0 && (qty - data2.getInteger("qty") <= 0)) { + log.warn("气胀轴库【" + shafttubeivt.getPoint_code() + "】没有空位。"); + judgment1 = false; + } + if (!judgment1 && !judgment2) { + stepErrorInfo.add("拔轴空位校验:密集库/缓存架没有可以存放气涨轴规格「" + plan.getQzz_size() + "-" + specification + "」的暂存位"); + return true; + } + } + } + return false; + } + /** * 排序 + * * @param notTaskPoints * @return */ diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/SlitterService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/SlitterService.java index 2683eeef9..42992099f 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/SlitterService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/SlitterService.java @@ -3,6 +3,7 @@ package org.nl.b_lms.sch.tasks.slitter.service; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import org.nl.b_lms.bst.ivt.cutpointivt.service.dao.BstIvtCutpointivt; +import org.nl.b_lms.sch.task.dao.SchBaseTask; import org.nl.b_lms.sch.tasks.slitter.mapper.dto.CallPlanViewVO; import org.springframework.http.ResponseEntity; @@ -408,4 +409,6 @@ public interface SlitterService { JSONObject taskTubeVehicle(JSONObject param); JSONObject getTubeVehicleInfo(JSONObject param); + + List seeTaskByPoint(JSONObject param); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/impl/SlitterServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/impl/SlitterServiceImpl.java index 593f6c000..6802b29f8 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/impl/SlitterServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/impl/SlitterServiceImpl.java @@ -67,6 +67,7 @@ import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -3275,6 +3276,18 @@ public class SlitterServiceImpl implements SlitterService { return res; } + @Override + public List seeTaskByPoint(JSONObject param) { + String data = param.getString("data"); + return taskService.list(new LambdaQueryWrapper() + .eq(SchBaseTask::getIs_delete, "0") + .lt(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode()) + .and(ObjectUtil.isNotEmpty(data), la2 -> la2.like(SchBaseTask::getPoint_code1, data).or() + .like(SchBaseTask::getPoint_code2, data).or() + .like(SchBaseTask::getPoint_code3, data).or() + .like(SchBaseTask::getPoint_code4, data))); + } + public List getRedisListValue(String key) { List stepTipLogs = (List) redisUtils.get(key); if (CollectionUtil.isEmpty(stepTipLogs)) {