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 1177c7de4..fb0c5f9e2 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 @@ -45,7 +45,7 @@ public interface IBstIvtCutpointivtService extends IService { /** * 获取类型状态,没任务的点位 - * @param type 点位类型:1套轴对接位,2分切缓存位,3分切对接位 + * @param type 点位类型:1套轴对接位,2分切缓存位,3分切对接位,4套轴异常位 * @param pointStatus 点位状态:1空位、2有气涨轴、3有子卷 * @param area 区域(0上1下) * @param sort 0:不排序,1:正序, 2:倒序 @@ -55,7 +55,7 @@ public interface IBstIvtCutpointivtService extends IService { /** * 获取同尺寸的气涨轴 - * @param type 点位类型:1套轴对接位,2分切缓存位,3分切对接位 + * @param type 点位类型:1套轴对接位,2分切缓存位,3分切对接位,4套轴异常位 * @param size 气涨轴尺寸 * @param generation 代数(4:小,5:大) * @return / @@ -86,7 +86,7 @@ public interface IBstIvtCutpointivtService extends IService { /** * 获取一半的点位 - * @param type 点位类型:1套轴对接位,2分切缓存位,3分切对接位 + * @param type 点位类型:1套轴对接位,2分切缓存位,3分切对接位,4套轴异常位 * @param pointStatus 点位状态:1空位、2有气涨轴、3有子卷 * @param location 区域:0上1下 * @return / 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 new file mode 100644 index 000000000..bc7141c77 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/SendNBJExceptionPointTask.java @@ -0,0 +1,142 @@ +package org.nl.b_lms.sch.tasks.slitter; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +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.sch.task.dao.SchBaseTask; +import org.nl.b_lms.sch.task.service.IschBaseTaskService; +import org.nl.b_lms.sch.tasks.slitter.constant.SlitterConstant; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.common.utils.SecurityUtils; +import org.nl.common.utils.TaskUtils; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.sch.AcsTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: lyd + * @Description: 内包间送到异常位置 + * @Date: 2024/6/29 + */ +@Slf4j +@Service +public class SendNBJExceptionPointTask extends AbstractAcsTask { + private final String THIS_CLASS = SendNBJExceptionPointTask.class.getName(); + @Autowired + private IschBaseTaskService taskService; + @Autowired + private IBstIvtCutpointivtService bcutpointivtService; + @Override + public List addTask() { + /* + * 下发给ACS时需要特殊处理 + */ + List taskList = taskService.getIssueTasks(THIS_CLASS); + + ArrayList resultList = new ArrayList<>(); + String agv_system_type = "2"; + for (SchBaseTask task : taskList) { + AcsTaskDto dto = AcsTaskDto.builder() + .ext_task_id(task.getTask_id()) + .task_code(task.getTask_code()) + .task_type(task.getAcs_task_type()) + .start_device_code(task.getPoint_code1()) + .next_device_code(task.getPoint_code2()) + .start_device_code2(task.getPoint_code3()) + .next_device_code2(task.getPoint_code4()) + .vehicle_code(task.getVehicle_code()) + .agv_system_type(agv_system_type) + .priority(task.getPriority()) + .remark(task.getRemark()) + .product_area(task.getProduct_area()) + .build(); + resultList.add(dto); + } + return resultList; + } + + @Override + public void updateTaskStatus(JSONObject taskObj, String status) { + SchBaseTask task = taskService.getById(taskObj.getString("task_id")); + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + // 更新任务状态为执行中 + task.setTask_status(TaskStatusEnum.EXECUTING.getCode()); + } + + if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { + task.setTask_status(TaskStatusEnum.FINISHED.getCode()); + // 互换资源 + // update: 在acs请求取货完成就已经清空点位信息 + String endPoint = task.getPoint_code2(); + BstIvtCutpointivt endPointObj = bcutpointivtService.getPintByAgvCode(endPoint, false); + TaskUtils.pointMaintenanceInventory(task, endPointObj, "2"); + bcutpointivtService.updateById(endPointObj); + } + + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + task.setTask_status(TaskStatusEnum.FINISHED.getCode()); + } + task.setUpdate_time(DateUtil.now()); + taskService.updateById(task); + } + + @Override + public String createTask(JSONObject form) { + String currentUserId = SecurityUtils.getCurrentUserId(); + String currentUsername = SecurityUtils.getCurrentUsername(); + + SchBaseTask task = new SchBaseTask(); + task.setTask_id(IdUtil.getSnowflake(1, 1).nextIdStr()); + task.setTask_code(IdUtil.getSnowflake(1, 1).nextIdStr()); + task.setTask_status(TaskStatusEnum.START_AND_POINT.getCode()); + task.setPoint_code1(form.getString("point_code1")); + task.setPoint_code2(form.getString("point_code2")); + task.setVehicle_code(form.getString("vehicle_code1")); + task.setVehicle_code2(form.getString("vehicle_code2")); + task.setAcs_task_type("3"); + task.setIs_delete(SlitterConstant.SLITTER_NO); + task.setRequest_param(form.toJSONString()); + task.setTask_type(form.getString("task_type")); + task.setProduct_area(form.getString("product_area")); + task.setCreate_id(currentUserId); + task.setCreate_name(currentUsername); + task.setCreate_time(DateUtil.now()); + task.setHandle_class(THIS_CLASS); + //根据类型获取对应的任务优先级 + JSONObject priority_jo = WQL.getWO("PDA_COOLIN").addParam("flag", "3").addParam("task_type", task.getTask_type()).process().uniqueResult(0); + if (ObjectUtil.isEmpty(priority_jo)) { + task.setPriority("1"); + } else { + task.setPriority(priority_jo.getString("value")); + } + taskService.save(task); + this.immediateNotifyAcs(null); + return task.getTask_id(); + } + + @Override + public void forceFinish(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + } + + + @Override + public void cancel(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, "0"); + } +} 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 d9ea066f0..04fd9fd28 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 @@ -12,6 +12,7 @@ import org.nl.b_lms.pdm.bi.slittingproductionplan.service.dao.PdmBiSlittingprodu import org.nl.b_lms.sch.point.dao.StIvtCutpointivt; import org.nl.b_lms.sch.point.service.IstIvtCutpointivtService; import org.nl.b_lms.sch.tasks.slitter.SendAirShaftAgvTask; +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; @@ -47,6 +48,8 @@ public class AutoSendAirShaftAgvTask { private SlitterMapper slitterMapper; @Autowired private RedissonClient redissonClient; + @Autowired + private SendNBJExceptionPointTask sendNBJExceptionPointTask; @SneakyThrows public void run() { @@ -59,9 +62,25 @@ public class AutoSendAirShaftAgvTask { // 最多4条分切计划 List plans = slittingproductionplanService.list(new LambdaQueryWrapper() .in(PdmBiSlittingproductionplan::getQzzno, collect) + .eq(PdmBiSlittingproductionplan::getStatus, "01") .eq(PdmBiSlittingproductionplan::getIs_delete, SlitterConstant.SLITTER_NO)); if (plans.size() == 0) { - throw new BadRequestException("分切计划不存在"); + // 不能抛异常,需要通过通知的形式,并且创建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); + } + continue; } // 获取任意一条 PdmBiSlittingproductionplan demoPlan = plans.get(0); diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoUpShaftTrussTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoUpShaftTrussTask.java index 6d3c220ea..46a0f6120 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoUpShaftTrussTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoUpShaftTrussTask.java @@ -81,8 +81,11 @@ public class AutoUpShaftTrussTask { List qzzNos = Stream.of(newCutPoint.getQzz_no1(), newCutPoint.getQzz_no2()) .filter(value -> value != null && !value.isEmpty()).collect(Collectors.toList()); List nextPlans = slittingproductionplanService.list(new LambdaQueryWrapper() - .in(PdmBiSlittingproductionplan::getQzzno, qzzNos)); + .in(PdmBiSlittingproductionplan::getQzzno, qzzNos) + .eq(PdmBiSlittingproductionplan::getStatus, "03") + .eq(PdmBiSlittingproductionplan::getIs_delete, "0")); if (nextPlans.size() == 0) { + // notice提示分切计划找不到 log.warn("分切机【" + device.getExt_code() + "】未找到套好轴的分切计划"); // 未找到分切计划 return; diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/constant/SlitterEnum.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/constant/SlitterEnum.java index df4d7209b..b19d87520 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/constant/SlitterEnum.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/constant/SlitterEnum.java @@ -21,7 +21,8 @@ public enum SlitterEnum { */ TASK_TYPE(MapOf.of("穿拔轴缓存<>穿拔轴位", "010801", "穿拔轴缓存<>分切对接位", "010802", "穿拔轴位<>气胀轴缓存位", "010803" , "分切机下料AGV任务", "010804", "分切机上气胀轴", "010805", "分切机下气胀轴", "010806", "备货区送载具", "010807" - , "备货区送纸管", "010808", "分切机下料桁架任务", "010809", "分切机下料AGV到内包间", "010810")); + , "备货区送纸管", "010808", "分切机下料桁架任务", "010809", "分切机下料AGV到内包间", "010810", "套轴异常处理AGV任务", "010811" + , "套轴异常处理桁架任务", "010812")); private Map code; public String code(String desc) { 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 e11a6f492..9a9214c2a 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 @@ -109,6 +109,8 @@ public class SlitterServiceImpl implements SlitterService { private SlitterDownAgvTask slitterDownAgvTask; @Autowired private ISysParamService paramService; + @Autowired + private SendNBJExceptionPointTask sendNBJExceptionPointTask; @Override @@ -243,11 +245,43 @@ public class SlitterServiceImpl implements SlitterService { log.error("找不到[{}]对应的分切计划!", deviceCode); throw new BadRequestException("找不到[" + deviceCode + "]对应的分切计划!"); } - List plans = slittingproductionplanService.list(new LambdaQueryWrapper() + List plans = slittingproductionplanService.list( + new LambdaQueryWrapper() .in(PdmBiSlittingproductionplan::getContainer_name, collect) + .eq(PdmBiSlittingproductionplan::getStatus, "01") .eq(PdmBiSlittingproductionplan::getIs_delete, "0")); if (plans.size() == 0) { - log.error("找不到[{}]对应的分切计划!", collect); + log.error("找不到[{}]对应的分切计划,分切计划可能被删除或者拼接!", collect); + // 移动到异常处理位 + List exceptionPoints = bcutpointivtService.getAreaNotTaskPointByStatus("4", "1", "0", "0"); + if (exceptionPoints.size() > 0) { + BstIvtCutpointivt exceptionPoint = exceptionPoints.get(0); + // 枷锁 + RLock lockPointR = redissonClient.getLock(exceptionPoint.getPoint_code()); + boolean tryLockPointR = lockPointR.tryLock(0, TimeUnit.SECONDS); + try { + if (tryLockPointR) { + // 需要枷锁 + JSONObject exParam = new JSONObject(); + exParam.put("point_code1", startPoint.getPoint_code()); + exParam.put("point_code2", exceptionPoint.getPoint_code()); + exParam.put("vehicle_code1", "-"); + exParam.put("vehicle_code2", "-"); + exParam.put("task_type", SlitterEnum.TASK_TYPE.code("套轴异常处理桁架任务")); + exParam.put("product_area", SlitterConstant.SLITTER_TASK_AREA); + sendNBJExceptionPointTask.createTask(exParam); + res.put("status", HttpStatus.HTTP_OK); + res.put("message", "创建送至异常处理位!"); + return res; + } else { + throw new BadRequestException("系统繁忙,稍后在试!"); + } + } finally { + if (tryLockPointR) { + lockPointR.unlock(); + } + } + } throw new BadRequestException("找不到[" + collect + "]对应的分切计划!"); } // 分切计划设置纸卷重量