diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/cutpointivt/service/IBstIvtCutpointivtService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/cutpointivt/service/IBstIvtCutpointivtService.java index 6e27853d2..4920c32d3 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/cutpointivt/service/IBstIvtCutpointivtService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/cutpointivt/service/IBstIvtCutpointivtService.java @@ -54,6 +54,15 @@ public interface IBstIvtCutpointivtService extends IService { * @return / */ List getAreaNotTaskPointByStatus(String type, String pointStatus, String area, String sort); + + /** + * + * @param type 点位类型:1套轴对接位,2分切缓存位,3分切对接位,4套轴异常位 + * @param area 区域(0上1下) + * @return + */ + List getCanUseMinPointByShelf(String type, String area); + List getCanUseMinPointByShelfSpecial(String type, String area); /** * 获取类型状态,没任务的点位,不校验取货完成的任务 * @param type 点位类型:1套轴对接位,2分切缓存位,3分切对接位,4套轴异常位 diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/cutpointivt/service/dao/mapper/BstIvtCutpointivtMapper.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/cutpointivt/service/dao/mapper/BstIvtCutpointivtMapper.java index 0a1e42765..27b75a71e 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/cutpointivt/service/dao/mapper/BstIvtCutpointivtMapper.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/cutpointivt/service/dao/mapper/BstIvtCutpointivtMapper.java @@ -32,4 +32,7 @@ public interface BstIvtCutpointivtMapper extends BaseMapper { List getNBJCanUsePoint(String type, String pointStatus, String area, String sort); List getNBJAreaNotTaskPointByStatus(String type, String pointStatus, String area, String sort); + + List getCanUseMinPointByShelf(String type, String area); + List getCanUseMinPointByShelfSpecial(String type, String area); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/cutpointivt/service/dao/mapper/BstIvtCutpointivtMapper.xml b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/cutpointivt/service/dao/mapper/BstIvtCutpointivtMapper.xml index be5fe4937..13bd48f6d 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/cutpointivt/service/dao/mapper/BstIvtCutpointivtMapper.xml +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/cutpointivt/service/dao/mapper/BstIvtCutpointivtMapper.xml @@ -241,4 +241,76 @@ AND t.is_delete = '0' AND (t.point_code1 = bic.truss_point_code2 oR t.point_code2 = bic.truss_point_code2)); + + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/cutpointivt/service/impl/BstIvtCutpointivtServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/cutpointivt/service/impl/BstIvtCutpointivtServiceImpl.java index ad873b347..2d0f80778 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/cutpointivt/service/impl/BstIvtCutpointivtServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/cutpointivt/service/impl/BstIvtCutpointivtServiceImpl.java @@ -96,6 +96,15 @@ public class BstIvtCutpointivtServiceImpl extends ServiceImpl getCanUseMinPointByShelf(String type, String area) { + return bstIvtCutpointivtMapper.getCanUseMinPointByShelf(type, area); + } + @Override + public List getCanUseMinPointByShelfSpecial(String type, String area) { + return bstIvtCutpointivtMapper.getCanUseMinPointByShelfSpecial(type, area); + } + @Override public List getAreaNotTaskPointByStatusNotCheckPickUpCompleted(String type, String pointStatus, String area, String sort) { return bstIvtCutpointivtMapper.getAreaNotTaskPointByStatusNotCheckPickUpCompleted(type, pointStatus, area, sort); diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/SendNBJExceptionPointTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/SendNBJExceptionPointTask.java index 11ff574cf..305c2ceb6 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/SendNBJExceptionPointTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/SendNBJExceptionPointTask.java @@ -87,20 +87,37 @@ public class SendNBJExceptionPointTask extends AbstractAcsTask { // update: 在acs请求取货完成就已经清空点位信息 String endPoint = task.getPoint_code2(); BstIvtCutpointivt endPointObj = bcutpointivtService.getPointByTrussOrAgvCode(endPoint, false); - TaskUtils.pointMaintenanceInventory(task, endPointObj, "2"); + // 设置有异常 + TaskUtils.pointMaintenanceInventory(task, endPointObj, "4"); // (桁架任务的时候)起点要清空 if (task.getPoint_code2().equals(endPointObj.getTruss_point_code1()) || task.getPoint_code2().equals(endPointObj.getTruss_point_code2())) { BstIvtShafttubeivt shafttubeivt = shaftivtService.getByPointCode(task.getPoint_code1(), false); - shafttubeivt.setQzz_size(""); - shafttubeivt.setHave_qzz("0"); - shafttubeivt.setTube_code1(""); - shafttubeivt.setTube_code2(""); - shafttubeivt.setTube_name1(""); - shafttubeivt.setTube_name2(""); - shafttubeivt.setContainer_name1(""); - shafttubeivt.setContainer_name2(""); - shaftivtService.updateById(shafttubeivt); + if (ObjectUtil.isNotEmpty(shafttubeivt)) { + shafttubeivt.setQzz_size(""); + shafttubeivt.setHave_qzz("0"); + shafttubeivt.setTube_code1(""); + shafttubeivt.setTube_code2(""); + shafttubeivt.setTube_name1(""); + shafttubeivt.setTube_name2(""); + shafttubeivt.setContainer_name1(""); + shafttubeivt.setContainer_name2(""); + shafttubeivt.setUpdate_time(DateUtil.now()); + shaftivtService.updateById(shafttubeivt); + } else { + BstIvtCutpointivt trussCode = bcutpointivtService.getPintByTrussCode(task.getPoint_code1(), false); + if (trussCode.getTruss_point_code1().equals(task.getPoint_code1())) { + trussCode.setQzz_no1(""); + } else { + trussCode.setQzz_no2(""); + } + if (ObjectUtil.isEmpty(trussCode.getQzz_no1()) && ObjectUtil.isEmpty(trussCode.getQzz_no2())) { + trussCode.setPoint_status("1"); + trussCode.setRemark(""); + } + trussCode.setUpdate_time(DateUtil.now()); + bcutpointivtService.updateById(trussCode); + } } bcutpointivtService.updateById(endPointObj); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoExceptionTrussTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoExceptionTrussTask.java new file mode 100644 index 000000000..c8e189487 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoExceptionTrussTask.java @@ -0,0 +1,84 @@ +package org.nl.b_lms.sch.tasks.slitter.auto; + +import com.alibaba.fastjson.JSONObject; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.nl.b_lms.bst.ivt.cutpointivt.service.IBstIvtCutpointivtService; +import org.nl.b_lms.bst.ivt.cutpointivt.service.dao.BstIvtCutpointivt; +import org.nl.b_lms.pdm.bi.slittingproductionplan.service.IPdmBiSlittingproductionplanService; +import org.nl.b_lms.sch.point.service.IstIvtCutpointivtService; +import org.nl.b_lms.sch.tasks.slitter.SendNBJExceptionPointTask; +import org.nl.b_lms.sch.tasks.slitter.constant.SlitterConstant; +import org.nl.b_lms.sch.tasks.slitter.constant.SlitterEnum; +import org.nl.b_lms.sch.tasks.slitter.mapper.SlitterMapper; +import org.nl.modules.common.exception.BadRequestException; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * 自动创建异常任务 + * + * @Author: lyd + * @Date: 2025/9/4 + */ +@Slf4j +@Component +public class AutoExceptionTrussTask { + @Autowired + private IBstIvtCutpointivtService bcutpointivtService; + @Autowired + private IstIvtCutpointivtService cutpointivtService; + @Autowired + private IPdmBiSlittingproductionplanService slittingproductionplanService; + @Autowired + private SlitterMapper slitterMapper; + @Autowired + private SendNBJExceptionPointTask sendNBJExceptionPointTask; + @Autowired + private RedissonClient redissonClient; + + @SneakyThrows + public void run() { + log.info("正在执行异常轴补偿机制..."); + RLock lock = redissonClient.getLock("doAcsFinishLoadShaft"); + boolean tryLock = lock.tryLock(10, TimeUnit.SECONDS); + try { + if (tryLock) { + // 获取能够拉走的点位 + List needMoves = slitterMapper.getMoveTzdjwExceptionPoint(); + for (String needMove : needMoves) { + List exceptionPointCodes = bcutpointivtService.getCanUseMinPointByShelf("4", "0"); + if (exceptionPointCodes.size() == 0) { + log.info("没有可用的异常处理位..."); + return; + } + BstIvtCutpointivt cutpointivt = bcutpointivtService.getPintByTrussCode(needMove, false); + // 创建任务 + JSONObject exParam = new JSONObject(); + exParam.put("point_code1", needMove); + exParam.put("point_code2", exceptionPointCodes.get(0)); + if (needMove.endsWith("A")) { + exParam.put("vehicle_code1", cutpointivt.getQzz_no1()); + } else { + exParam.put("vehicle_code2", cutpointivt.getQzz_no2()); + } + exParam.put("task_type", SlitterEnum.TASK_TYPE.code("套轴异常处理桁架任务")); + exParam.put("product_area", SlitterConstant.SLITTER_TASK_AREA); + exParam.put("acs_task_type", "6"); + sendNBJExceptionPointTask.createTask(exParam); + } + } else { + log.info("系统繁忙,稍后在试..."); + } + } finally { + if (tryLock) { + lock.unlock(); + } + } + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoSendAirShaftAgvTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoSendAirShaftAgvTask.java index 9320b3b5f..297f8a0d0 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoSendAirShaftAgvTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoSendAirShaftAgvTask.java @@ -79,28 +79,34 @@ public class AutoSendAirShaftAgvTask { .eq(PdmBiSlittingproductionplan::getIs_delete, SlitterConstant.SLITTER_NO)); if (plans.size() == 0) { log.info("找不到状态01的分切计划,送到异常处理位置!"); + // hint: 搬运到异常处理位不在使用AGV,用新的定时器执行,此处只是改点位状态 // 不能抛异常,需要通过通知的形式,并且创建agv搬到异常处理位(4)。 // 判断套轴暂存位异常点位是否含有任务 - List exceptionPoints = bcutpointivtService.getAreaNotTaskPointByStatus("4", "1", "0", "0"); - if (exceptionPoints.size() > 0) { - BstIvtCutpointivt exceptionPoint = exceptionPoints.get(0); - // 需要枷锁 - JSONObject exParam = new JSONObject(); - exParam.put("point_code1", cutPoint.getPoint_code()); - exParam.put("point_code2", exceptionPoint.getPoint_code()); - exParam.put("vehicle_code1", cutPoint.getQzz_no1()); - exParam.put("vehicle_code2", cutPoint.getQzz_no2()); - exParam.put("task_type", SlitterEnum.TASK_TYPE.code("套轴异常处理AGV任务")); - exParam.put("product_area", SlitterConstant.SLITTER_TASK_AREA); - sendNBJExceptionPointTask.createTask(exParam); - } else { - log.info("异常处理位无空位!"); - // 点位禁用 - cutPoint.setRemark("计划状态已被改变!"); - cutPoint.setIs_used("0"); - cutPoint.setUpdate_time(DateUtil.now()); - bcutpointivtService.updateById(cutPoint); - } +// List exceptionPoints = bcutpointivtService.getAreaNotTaskPointByStatus("4", "1", "0", "0"); +// if (exceptionPoints.size() > 0) { +// BstIvtCutpointivt exceptionPoint = exceptionPoints.get(0); +// // 需要枷锁 +// JSONObject exParam = new JSONObject(); +// exParam.put("point_code1", cutPoint.getPoint_code()); +// exParam.put("point_code2", exceptionPoint.getPoint_code()); +// exParam.put("vehicle_code1", cutPoint.getQzz_no1()); +// exParam.put("vehicle_code2", cutPoint.getQzz_no2()); +// exParam.put("task_type", SlitterEnum.TASK_TYPE.code("套轴异常处理AGV任务")); +// exParam.put("product_area", SlitterConstant.SLITTER_TASK_AREA); +// sendNBJExceptionPointTask.createTask(exParam); +// } else { +// log.info("异常处理位无空位!"); +// // 点位禁用 +// cutPoint.setRemark("计划状态已被改变!"); +// cutPoint.setIs_used("0"); +// cutPoint.setUpdate_time(DateUtil.now()); +// bcutpointivtService.updateById(cutPoint); +// } + // 点位禁用 + cutPoint.setRemark("计划状态已被改变, 等待搬运到异常处理位..."); + cutPoint.setPoint_status("4"); + cutPoint.setUpdate_time(DateUtil.now()); + bcutpointivtService.updateById(cutPoint); continue; } // 获取任意一条 diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/SlitterMapper.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/SlitterMapper.java index 32c7546d7..9f5d88912 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/SlitterMapper.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/SlitterMapper.java @@ -66,4 +66,10 @@ public interface SlitterMapper { List showManualViewNoXn(); List showManualCall(Integer days); + + /** + * 套轴对接位异常位搬运到异常处理架子 + * @return + */ + List getMoveTzdjwExceptionPoint(); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/SlitterMapper.xml b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/SlitterMapper.xml index 84ed79a1d..136b17715 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/SlitterMapper.xml +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/SlitterMapper.xml @@ -282,4 +282,52 @@ manufacture_sort desc, start_time + 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 a5762b2dd..2df88396b 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 @@ -349,14 +349,14 @@ public class SlitterServiceImpl implements SlitterService { if (plans.size() == 0) { log.error("找不到[{}]对应的分切计划,分切计划可能被删除或者拼接!", collect); // 移动到异常处理位(随机一个点位,在送到B2对面的位置) - List exceptionPoints = bcutpointivtService.getAreaNotTaskPointByStatus("1", "1", "0", "0"); - if (exceptionPoints.size() > 0) { - BstIvtCutpointivt exceptionPoint = exceptionPoints.get(0); +// List exceptionPoints = bcutpointivtService.getAreaNotTaskPointByStatus("4", "1", "0", "0"); + List exceptionPointCodes = bcutpointivtService.getCanUseMinPointByShelf("4", "0"); + if (exceptionPointCodes.size() > 0) { + String exceptionPoint = exceptionPointCodes.get(0); JSONObject exParam = new JSONObject(); exParam.put("point_code1", startPoint.getPoint_code()); - exParam.put("point_code2", ObjectUtil.isEmpty(exceptionPoint.getQzz_no1()) - ? exceptionPoint.getTruss_point_code1() : exceptionPoint.getTruss_point_code2()); - if (ObjectUtil.isEmpty(exceptionPoint.getQzz_no1())) { + exParam.put("point_code2", exceptionPoint); + if (exceptionPoint.endsWith("A")) { exParam.put("vehicle_code1", collect); } else { exParam.put("vehicle_code2", collect); @@ -369,24 +369,46 @@ public class SlitterServiceImpl implements SlitterService { res.put("status", HttpStatus.HTTP_OK); res.put("message", "创建送至异常处理位!"); return res; - } else { - stepTipLogs.add("套轴完成->[" + collect + "]对应的分切计划状态已更改,无暂存位置,创建任务失败!"); - redisUtils.set("ERROR" + deviceCode, stepTipLogs); + } + // 找套轴对接位(任取一个空点) + exceptionPointCodes = bcutpointivtService.getCanUseMinPointByShelfSpecial("1", "0"); + if (exceptionPointCodes.size() > 0) { + String exceptionPoint = exceptionPointCodes.get(0); JSONObject exParam = new JSONObject(); exParam.put("point_code1", startPoint.getPoint_code()); - exParam.put("point_code2", "-"); - exParam.put("vehicle_code1", collect); + exParam.put("point_code2", exceptionPoint); + if (exceptionPoint.endsWith("A")) { + exParam.put("vehicle_code1", collect); + } else { + exParam.put("vehicle_code2", collect); + } exParam.put("task_type", SlitterEnum.TASK_TYPE.code("套轴异常处理桁架任务")); exParam.put("product_area", SlitterConstant.SLITTER_TASK_AREA); - exParam.put("task_status", TaskStatusEnum.SURE_START.getCode()); exParam.put("acs_task_type", "6"); exParam.put("containers", collect); sendNBJExceptionPointTask.createTask(exParam); res.put("status", HttpStatus.HTTP_OK); - res.put("message", "请求成功"); - res.put("msg", msg); + res.put("message", "创建送至对接位等待异常处理位!"); return res; } + + // 半条任务等待补齐 + stepTipLogs.add("套轴完成->[" + collect + "]对应的分切计划状态已更改,无暂存位置,创建任务失败!"); + redisUtils.set("ERROR" + deviceCode, stepTipLogs); + JSONObject exParam = new JSONObject(); + exParam.put("point_code1", startPoint.getPoint_code()); + exParam.put("point_code2", "-"); + exParam.put("vehicle_code1", collect); + exParam.put("task_type", SlitterEnum.TASK_TYPE.code("套轴异常处理桁架任务")); + exParam.put("product_area", SlitterConstant.SLITTER_TASK_AREA); + exParam.put("task_status", TaskStatusEnum.SURE_START.getCode()); + exParam.put("acs_task_type", "6"); + exParam.put("containers", collect); + sendNBJExceptionPointTask.createTask(exParam); + res.put("status", HttpStatus.HTTP_OK); + res.put("message", "请求成功"); + res.put("msg", msg); + return res; } // 分切计划设置纸卷重量 for (PdmBiSlittingproductionplan plan : plans) { @@ -1265,7 +1287,7 @@ public class SlitterServiceImpl implements SlitterService { taskParam.put("product_area", SlitterConstant.SLITTER_TASK_AREA); slitterDownAgvTask.createTask(taskParam); } else { - throw new BadRequestException("系统繁忙,稍后在试!!"); + throw new BadRequestException("内包间正在分配点位,请重试!"); } } finally { if (lock.isLocked() && lock.isHeldByCurrentThread()) {