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 00e027f41..edf45d50b 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 @@ -95,7 +95,6 @@ public class AutoCallAirShaftTask { * 套拔轴缓存位满了、没有分切计划,则触发自动创建套拔轴任务 * update: 24/04/28 内包间只是区分气胀轴大小(即代数),不需要区分锂电/标箔 */ - @Transactional(rollbackFor = Exception.class) public void run() { log.info("自动呼叫套轴开始执行..."); // 判断配置参数是否只做拔轴 @@ -105,163 +104,166 @@ public class AutoCallAirShaftTask { // 1、获取空的插拔轴位(无任务) List emptyPoints = bstIvtShafttubeivtService.getAllShaftPointsByConditions("2", "0", "0"); - emptyPoints.forEach(empty -> { - // 标箔:1,锂电:2 改:大小:4代5代 - String specification = empty.getQzz_generation(); - String location = empty.getPoint_location(); - if (ObjectUtil.isNotEmpty(isOnlyPulling) && SlitterConstant.SLITTER_YES.equals(isOnlyPulling.getValue())) { - // 只做拔轴 - makePullShaft(empty, specification); - return; - } - Integer integer = Integer.valueOf(ObjectUtil.isEmpty(tzDay.getValue()) ? "0" : tzDay.getValue()); - // 2、获取分切计划数据 校验代数 todo: 顺序可能需要考虑 - List planAll = slittingproductionplanService.getAllCutPlan(integer); - String value = paramObj.getValue(); - List prefixList = Arrays.asList(value.split("[,,]")); - List plans = planAll.stream() - .filter(p -> prefixList.stream() - .anyMatch(prefix -> p.getResource_name().startsWith(prefix)) && - checkComputationPoint(p, empty) && checkHasTask(p)) + emptyPoints.forEach(empty -> doCallShaft(empty, isOnlyPulling, tzDay, paramObj)); + } + + @Transactional(rollbackFor = Exception.class) + public void doCallShaft(BstIvtShafttubeivt empty, Param isOnlyPulling, Param tzDay, Param paramObj) { + // 标箔:1,锂电:2 改:大小:4代5代 + String specification = empty.getQzz_generation(); + String location = empty.getPoint_location(); + if (ObjectUtil.isNotEmpty(isOnlyPulling) && SlitterConstant.SLITTER_YES.equals(isOnlyPulling.getValue())) { + // 只做拔轴 + makePullShaft(empty, specification); + return; + } + Integer integer = Integer.valueOf(ObjectUtil.isEmpty(tzDay.getValue()) ? "0" : tzDay.getValue()); + // 2、获取分切计划数据 校验代数 todo: 顺序可能需要考虑 + List planAll = slittingproductionplanService.getAllCutPlan(integer); + String value = paramObj.getValue(); + List prefixList = Arrays.asList(value.split("[,,]")); + List plans = planAll.stream() + .filter(p -> prefixList.stream() + .anyMatch(prefix -> p.getResource_name().startsWith(prefix)) && + checkComputationPoint(p, empty) && checkHasTask(p)) + .collect(Collectors.toList()); + if (plans.size() == 0) { + // 如果不需要套轴,就只做拔轴 + makePullShaft(empty, specification); + return; + } + log.info("获取过滤后的分切计划数据:{}", JSON.toJSONString(plans)); + // 查看套轴对接位是否满了 + // todo: 这里需要注意不要去校验071的任务,不然提前释放货位没意义。 + List emptyShaftPoint = bcutpointivtService.getAreaNotTaskPointByStatus("1", + "1", location, "0"); + // 如果满了就只做拔轴 预留一个货位?,防止套轴直接站满 + if (emptyShaftPoint.size() == 0) { + log.info("暂存位没有空位!正在检测是否存在半个点位!"); + // 校验是否存在半个位置,且有分切计划 + // 获取只有一个位置的点位 + List halfPlacePoint = bcutpointivtService.getAllHalfPlacePoints("1", + "1", location); + List qzzs = halfPlacePoint.stream() + .map(p -> ObjectUtil.isNotEmpty(p.getQzz_no1()) ? p.getQzz_no1() : p.getQzz_no2()) .collect(Collectors.toList()); - if (plans.size() == 0) { + if (qzzs.size() == 0) { + log.info("没有半个点位,或者对应的另一半分切计划没有找到!"); // 如果不需要套轴,就只做拔轴 makePullShaft(empty, specification); return; } - log.info("获取过滤后的分切计划数据:{}", JSON.toJSONString(plans)); - // 查看套轴对接位是否满了 - // todo: 这里需要注意不要去校验071的任务,不然提前释放货位没意义。 - List emptyShaftPoint = bcutpointivtService.getAreaNotTaskPointByStatus("1", - "1", location, "0"); - // 如果满了就只做拔轴 预留一个货位?,防止套轴直接站满 - if (emptyShaftPoint.size() == 0) { - log.info("暂存位没有空位!正在检测是否存在半个点位!"); - // 校验是否存在半个位置,且有分切计划 - // 获取只有一个位置的点位 - List halfPlacePoint = bcutpointivtService.getAllHalfPlacePoints("1", - "1", location); - List qzzs = halfPlacePoint.stream() - .map(p -> ObjectUtil.isNotEmpty(p.getQzz_no1()) ? p.getQzz_no1() : p.getQzz_no2()) - .collect(Collectors.toList()); - if (qzzs.size() == 0) { - log.info("没有半个点位,或者对应的另一半分切计划没有找到!"); - // 如果不需要套轴,就只做拔轴 - makePullShaft(empty, specification); - return; - } - // 从寻查找分切计划,并放在plans, 没有考虑区域问题, 里面会考虑代数 - plans = slittingproductionplanService.getAllHalfPlan(qzzs); - if (plans.size() == 0) { - log.info("没有找到对应的另一半分切计划没有找到"); - // 如果不需要套轴,就只做拔轴 - makePullShaft(empty, specification); - return; - } - log.info("找到对应的另一半的计划 - {}", plans); - } - // 获取一个分切计划的Dto。如果是6寸,可以直接使用、如果是3寸,需要判断当前位置是否满足 - // todo: 需要校验分切设备是在对应的区域中 - SlitterPlanDistinctDto planDto = plans.stream() - .filter(planD -> "6".equals(planD.getQzz_size()) || - ("3".equals(planD.getQzz_size()) && specification.equals(planD.getQzz_generation()))) - .findFirst() - .orElse(null); - if (planDto == null) { - log.warn("过滤3/6寸和代数输出结果为空,跳过此次套轴。此时点位对应代数:{}", specification); + // 从寻查找分切计划,并放在plans, 没有考虑区域问题, 里面会考虑代数 + plans = slittingproductionplanService.getAllHalfPlan(qzzs); + if (plans.size() == 0) { + log.info("没有找到对应的另一半分切计划没有找到"); + // 如果不需要套轴,就只做拔轴 + makePullShaft(empty, specification); return; } - log.info("此时获取的分切计划dto: {}", planDto); - // 获取分切计划dto中对应的需要套轴的分切计划 最多两个计划 - List needPlans = slittingproductionplanService.list(new LambdaQueryWrapper() + log.info("找到对应的另一半的计划 - {}", plans); + } + // 获取一个分切计划的Dto。如果是6寸,可以直接使用、如果是3寸,需要判断当前位置是否满足 + // todo: 需要校验分切设备是在对应的区域中 + SlitterPlanDistinctDto planDto = plans.stream() + .filter(planD -> "6".equals(planD.getQzz_size()) || + ("3".equals(planD.getQzz_size()) && specification.equals(planD.getQzz_generation()))) + .findFirst() + .orElse(null); + if (planDto == null) { + log.warn("过滤3/6寸和代数输出结果为空,跳过此次套轴。此时点位对应代数:{}", specification); + return; + } + log.info("此时获取的分切计划dto: {}", planDto); + // 获取分切计划dto中对应的需要套轴的分切计划 最多两个计划 + List needPlans = slittingproductionplanService.list(new LambdaQueryWrapper() + .eq(PdmBiSlittingproductionplan::getResource_name, planDto.getResource_name()) + .eq(PdmBiSlittingproductionplan::getParent_container_name, planDto.getParent_container_name()) + .eq(PdmBiSlittingproductionplan::getUp_or_down, planDto.getUp_or_down()) + .eq(PdmBiSlittingproductionplan::getSplit_group, planDto.getSplit_group()) + .eq(PdmBiSlittingproductionplan::getIs_delete, SlitterConstant.SLITTER_NO) + .eq(PdmBiSlittingproductionplan::getIs_paper_ok, SlitterConstant.SLITTER_YES)); + if (needPlans.size() == 0) { + // 可能是改切,所以换成restruct_container_name来使用 + needPlans = slittingproductionplanService.list(new LambdaQueryWrapper() .eq(PdmBiSlittingproductionplan::getResource_name, planDto.getResource_name()) - .eq(PdmBiSlittingproductionplan::getParent_container_name, planDto.getParent_container_name()) + .eq(PdmBiSlittingproductionplan::getRestruct_container_name, planDto.getParent_container_name()) .eq(PdmBiSlittingproductionplan::getUp_or_down, planDto.getUp_or_down()) .eq(PdmBiSlittingproductionplan::getSplit_group, planDto.getSplit_group()) .eq(PdmBiSlittingproductionplan::getIs_delete, SlitterConstant.SLITTER_NO) .eq(PdmBiSlittingproductionplan::getIs_paper_ok, SlitterConstant.SLITTER_YES)); - if (needPlans.size() == 0) { - // 可能是改切,所以换成restruct_container_name来使用 - needPlans = slittingproductionplanService.list(new LambdaQueryWrapper() - .eq(PdmBiSlittingproductionplan::getResource_name, planDto.getResource_name()) - .eq(PdmBiSlittingproductionplan::getRestruct_container_name, planDto.getParent_container_name()) - .eq(PdmBiSlittingproductionplan::getUp_or_down, planDto.getUp_or_down()) - .eq(PdmBiSlittingproductionplan::getSplit_group, planDto.getSplit_group()) - .eq(PdmBiSlittingproductionplan::getIs_delete, SlitterConstant.SLITTER_NO) - .eq(PdmBiSlittingproductionplan::getIs_paper_ok, SlitterConstant.SLITTER_YES)); - } - log.info("通过dto获取的分切计划:{}", needPlans); - // 获取其中一条 - PdmBiSlittingproductionplan needPlan = needPlans.get(0); - String qzzSize = needPlan.getQzz_size(); - // 从套轴对接位获取相同气涨轴大小 - // update: 不需要(同标箔或者锂电分开) - // todo: 需要校验区域0/1 - List qzzPoint = bcutpointivtService.getPointByTypeAndShaftSize("1", qzzSize, specification); - if (qzzPoint.size() == 0) { - // 保存所需要的分切计划数据到点位上(套轴对接位)更新分切计划 - saveCutPlanMessage(empty, needPlans, qzzSize); - // 调用ACS滚条气涨轴下来 - toAcsOutShaft(qzzSize, location, empty); - toCallAgvMovePaperTube(needPlans, location, empty); - return; - } - // 查找一条没任务的点位 - BstIvtCutpointivt startPoint = qzzPoint.get(0); - if (ObjectUtil.isEmpty(startPoint)) { - // 保存所需要的分切计划数据到点位上(套轴对接位)更新分切计划 - saveCutPlanMessage(empty, needPlans, qzzSize); - // 如果不存在,则发起信号滚气涨轴 - // 调用ACS滚条气涨轴下来 - toAcsOutShaft(qzzSize, location, empty); - toCallAgvMovePaperTube(needPlans, location, empty); - return; - } - // 创建任务 - JSONObject param = new JSONObject(); - param.put("point_code1", ObjectUtil.isNotEmpty(startPoint.getQzz_no1()) - ? startPoint.getTruss_point_code1() : startPoint.getTruss_point_code2()); - param.put("point_code2", empty.getPoint_code()); - param.put("vehicle_code", ObjectUtil.isNotEmpty(startPoint.getQzz_no1()) - ? startPoint.getQzz_no1() : startPoint.getQzz_no2()); - // 气胀轴号 - param.put("qzz_no", ObjectUtil.isNotEmpty(startPoint.getQzz_no1()) - ? startPoint.getQzz_no1() : startPoint.getQzz_no2()); - param.put("needPlan", planDto); - // 是否拔轴 - param.put("is_pulling", SlitterConstant.SLITTER_YES); - param.put("task_type", SlitterEnum.TASK_TYPE.code("穿拔轴缓存<>穿拔轴位")); - param.put("product_area", SlitterConstant.SLITTER_TASK_AREA); - param.put("qzz_size", needPlan.getQzz_size()); - // 所需的纸管规格 - SlitterTaskUtil.putNeedPaperSpec(param, needPlans); - // 当前纸管的规格信息 - String oldQzzNo = ObjectUtil.isNotEmpty(startPoint.getQzz_no1()) - ? startPoint.getQzz_no1() : startPoint.getQzz_no2(); - if (oldQzzNo == null) { - throw new BadRequestException("当前气胀轴的编码为空!"); - } + } + log.info("通过dto获取的分切计划:{}", needPlans); + // 获取其中一条 + PdmBiSlittingproductionplan needPlan = needPlans.get(0); + String qzzSize = needPlan.getQzz_size(); + // 从套轴对接位获取相同气涨轴大小 + // update: 不需要(同标箔或者锂电分开) + // todo: 需要校验区域0/1 + List qzzPoint = bcutpointivtService.getPointByTypeAndShaftSize("1", qzzSize, specification); + if (qzzPoint.size() == 0) { // 保存所需要的分切计划数据到点位上(套轴对接位)更新分切计划 saveCutPlanMessage(empty, needPlans, qzzSize); - // 设置是否套轴:1:正常套轴,2:待定(到后面还会申请套轴) - setIsSleeveShaft(param); - // 最多两条 - List oldPlans = slittingproductionplanService.getByQzzNo(oldQzzNo); - SlitterTaskUtil.putCurrentPaperSpec(param, oldPlans); - // 套管数量 - param.put("casingCount", needPlans.size()); - // 拔管数量 - param.put("pullCount", oldPlans.size()); - param.put("containers", oldPlans.stream().map(PdmBiSlittingproductionplan::getContainer_name).collect(Collectors.toList())); - trussCallAirShaftTask.createTask(param); + // 调用ACS滚条气涨轴下来 + toAcsOutShaft(qzzSize, location, empty); toCallAgvMovePaperTube(needPlans, location, empty); - // 将分切计划is_paper_ok 1(纸管已经准备好) -> 2(已经套轴) - needPlans.forEach(p -> { - p.setIs_paper_ok("2"); - TaskUtils.updateOptMessageBySlitterPlan(p); - }); - slittingproductionplanService.updateBatchById(needPlans); + return; + } + // 查找一条没任务的点位 + BstIvtCutpointivt startPoint = qzzPoint.get(0); + if (ObjectUtil.isEmpty(startPoint)) { + // 保存所需要的分切计划数据到点位上(套轴对接位)更新分切计划 + saveCutPlanMessage(empty, needPlans, qzzSize); + // 如果不存在,则发起信号滚气涨轴 + // 调用ACS滚条气涨轴下来 + toAcsOutShaft(qzzSize, location, empty); + toCallAgvMovePaperTube(needPlans, location, empty); + return; + } + // 创建任务 + JSONObject param = new JSONObject(); + param.put("point_code1", ObjectUtil.isNotEmpty(startPoint.getQzz_no1()) + ? startPoint.getTruss_point_code1() : startPoint.getTruss_point_code2()); + param.put("point_code2", empty.getPoint_code()); + param.put("vehicle_code", ObjectUtil.isNotEmpty(startPoint.getQzz_no1()) + ? startPoint.getQzz_no1() : startPoint.getQzz_no2()); + // 气胀轴号 + param.put("qzz_no", ObjectUtil.isNotEmpty(startPoint.getQzz_no1()) + ? startPoint.getQzz_no1() : startPoint.getQzz_no2()); + param.put("needPlan", planDto); + // 是否拔轴 + param.put("is_pulling", SlitterConstant.SLITTER_YES); + param.put("task_type", SlitterEnum.TASK_TYPE.code("穿拔轴缓存<>穿拔轴位")); + param.put("product_area", SlitterConstant.SLITTER_TASK_AREA); + param.put("qzz_size", needPlan.getQzz_size()); + // 所需的纸管规格 + SlitterTaskUtil.putNeedPaperSpec(param, needPlans); + // 当前纸管的规格信息 + String oldQzzNo = ObjectUtil.isNotEmpty(startPoint.getQzz_no1()) + ? startPoint.getQzz_no1() : startPoint.getQzz_no2(); + if (oldQzzNo == null) { + throw new BadRequestException("当前气胀轴的编码为空!"); + } + // 保存所需要的分切计划数据到点位上(套轴对接位)更新分切计划 + saveCutPlanMessage(empty, needPlans, qzzSize); + // 设置是否套轴:1:正常套轴,2:待定(到后面还会申请套轴) + setIsSleeveShaft(param); + // 最多两条 + List oldPlans = slittingproductionplanService.getByQzzNo(oldQzzNo); + SlitterTaskUtil.putCurrentPaperSpec(param, oldPlans); + // 套管数量 + param.put("casingCount", needPlans.size()); + // 拔管数量 + param.put("pullCount", oldPlans.size()); + param.put("containers", oldPlans.stream().map(PdmBiSlittingproductionplan::getContainer_name).collect(Collectors.toList())); + trussCallAirShaftTask.createTask(param); + toCallAgvMovePaperTube(needPlans, location, empty); + // 将分切计划is_paper_ok 1(纸管已经准备好) -> 2(已经套轴) + needPlans.forEach(p -> { + p.setIs_paper_ok("2"); + TaskUtils.updateOptMessageBySlitterPlan(p); }); + slittingproductionplanService.updateBatchById(needPlans); } /** 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 a63497329..30f7cf502 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 @@ -409,8 +409,6 @@ public class SlitterServiceImpl implements SlitterService { if (shafttubeivts.size() == 0) { throw new BadRequestException("未找到可存放气涨轴规格「" + qzzSize + "」的空暂存位"); } - // todo: 过滤空位后面是否有轴的位置 - BstIvtShafttubeivt shafttubeivt = shafttubeivts.get(0); RLock lockPoint = redissonClient.getLock(shafttubeivt.getPoint_code()); boolean tryLockPoint = lockPoint.tryLock(0, TimeUnit.SECONDS); @@ -1975,6 +1973,7 @@ public class SlitterServiceImpl implements SlitterService { plan.setIs_parent_ok("0"); plan.setIs_child_tz_ok("0"); plan.setIs_child_ps_ok("0"); + plan.setPaper_weight("0"); plan.setQzzno(""); plan.setIs_delete("0"); plan.setSale_order_name("-");