From e8f015bbcdbba96bc532aa305f2d035eec593478 Mon Sep 17 00:00:00 2001 From: liyongde <1419499670@qq.com> Date: Fri, 8 Mar 2024 16:34:30 +0800 Subject: [PATCH] =?UTF-8?q?opt:=20=E5=88=86=E5=88=87=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E3=80=81=E6=B0=94=E8=83=80=E8=BD=B4=E7=BC=93=E5=AD=98=E5=BA=93?= =?UTF-8?q?=E5=88=86=E9=85=8D=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/IBstIvtShafttubeivtService.java | 16 + .../dao/mapper/BstIvtShafttubeivtMapper.java | 4 + .../dao/mapper/BstIvtShafttubeivtMapper.xml | 24 ++ .../impl/BstIvtShafttubeivtServiceImpl.java | 10 + .../IPdmBiSlittingproductionplanService.java | 7 + ...dmBiSlittingproductionplanServiceImpl.java | 10 + .../SendCopperFoilSubRollTrussTask.java | 1 + .../slitter/TrussCallShaftCacheTask.java | 141 +++++++++ .../slitter/TrussSendShaftCacheTask.java | 148 +++++++++ .../slitter/auto/AutoCallAirShaftTask.java | 76 +++-- .../slitter/auto/AutoSendAirShaftAgvTask.java | 37 ++- .../tasks/slitter/service/SlitterService.java | 7 + .../service/impl/SlitterServiceImpl.java | 294 ++++++++++++------ 13 files changed, 647 insertions(+), 128 deletions(-) create mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/TrussCallShaftCacheTask.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/TrussSendShaftCacheTask.java diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/shafttubeivt/service/IBstIvtShafttubeivtService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/shafttubeivt/service/IBstIvtShafttubeivtService.java index 2b2f22a7e..27cc5651d 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/shafttubeivt/service/IBstIvtShafttubeivtService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/shafttubeivt/service/IBstIvtShafttubeivtService.java @@ -68,4 +68,20 @@ public interface IBstIvtShafttubeivtService extends IService * @return */ List getByQzzSize(String qzzSize, String specification, String location); + + /** + * 获取没任务的气涨轴缓存位 + * @param qzzSize + * @param specification + * @param location + * @return + */ + List getNotTaskShaftCache(String qzzSize, String specification, String location); + + /** + * 获取没任务的空的位置 + * @param startPoint + * @return + */ + List getNotTaskShaftCacheEmpty(BstIvtShafttubeivt startPoint); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/shafttubeivt/service/dao/mapper/BstIvtShafttubeivtMapper.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/shafttubeivt/service/dao/mapper/BstIvtShafttubeivtMapper.java index ec8e250d5..5880ecb9b 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/shafttubeivt/service/dao/mapper/BstIvtShafttubeivtMapper.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/shafttubeivt/service/dao/mapper/BstIvtShafttubeivtMapper.java @@ -14,4 +14,8 @@ public interface BstIvtShafttubeivtMapper extends BaseMapper List getAllShaftPointsByConditions(String type, String location, String have); List getByQzzSize(String qzzSize, String specification, String location); + + List getNotTaskShaftCache(String qzzSize, String specification, String location); + + List getNotTaskShaftCacheEmpty(BstIvtShafttubeivt startPoint); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/shafttubeivt/service/dao/mapper/BstIvtShafttubeivtMapper.xml b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/shafttubeivt/service/dao/mapper/BstIvtShafttubeivtMapper.xml index ead319d37..13d272a00 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/shafttubeivt/service/dao/mapper/BstIvtShafttubeivtMapper.xml +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/shafttubeivt/service/dao/mapper/BstIvtShafttubeivtMapper.xml @@ -21,4 +21,28 @@ WHERE bsf.is_used = '1' AND bsf.qzz_size = #{qzzSize} AND bsf.point_type = '1' AND bsf.qzz_generation = #{specification} AND bsf.point_location = #{location} + + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/shafttubeivt/service/impl/BstIvtShafttubeivtServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/shafttubeivt/service/impl/BstIvtShafttubeivtServiceImpl.java index e44e46e29..fe3a37313 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/shafttubeivt/service/impl/BstIvtShafttubeivtServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/shafttubeivt/service/impl/BstIvtShafttubeivtServiceImpl.java @@ -106,4 +106,14 @@ public class BstIvtShafttubeivtServiceImpl extends ServiceImpl getNotTaskShaftCache(String qzzSize, String specification, String location) { + return bstIvtShafttubeivtMapper.getNotTaskShaftCache(qzzSize, specification, location); + } + + @Override + public List getNotTaskShaftCacheEmpty(BstIvtShafttubeivt startPoint) { + return bstIvtShafttubeivtMapper.getNotTaskShaftCacheEmpty(startPoint); + } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/IPdmBiSlittingproductionplanService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/IPdmBiSlittingproductionplanService.java index b0a8d9192..e8a9c81ea 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/IPdmBiSlittingproductionplanService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/IPdmBiSlittingproductionplanService.java @@ -49,4 +49,11 @@ public interface IPdmBiSlittingproductionplanService extends IService getAllCutPlan(String area); + + /** + * 通过气涨轴编码获取分切计划 + * @param qzzNo 气胀轴尺寸 + * @return 最多两个 + */ + List getByQzzNo(String qzzNo); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/impl/PdmBiSlittingproductionplanServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/impl/PdmBiSlittingproductionplanServiceImpl.java index 98da14719..4da1d8cd7 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/impl/PdmBiSlittingproductionplanServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/impl/PdmBiSlittingproductionplanServiceImpl.java @@ -3,6 +3,7 @@ package org.nl.b_lms.pdm.bi.slittingproductionplan.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -80,4 +81,13 @@ public class PdmBiSlittingproductionplanServiceImpl extends ServiceImpl getByQzzNo(String qzzNo) { + LambdaQueryWrapper lam = new QueryWrapper().lambda(); + lam.eq(PdmBiSlittingproductionplan::getQzzno, qzzNo) + .eq(PdmBiSlittingproductionplan::getIs_delete, "0") + .eq(PdmBiSlittingproductionplan::getStatus, "09"); + return pdmBiSlittingproductionplanMapper.selectList(lam); + } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/SendCopperFoilSubRollTrussTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/SendCopperFoilSubRollTrussTask.java index 90f886f80..03e7421a8 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/SendCopperFoilSubRollTrussTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/SendCopperFoilSubRollTrussTask.java @@ -92,6 +92,7 @@ public class SendCopperFoilSubRollTrussTask extends AbstractAcsTask { } @Override + @Transactional(rollbackFor = Exception.class) public String createTask(JSONObject form) { String currentUserId = SecurityUtils.getCurrentUserId(); String currentUsername = SecurityUtils.getCurrentUsername(); diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/TrussCallShaftCacheTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/TrussCallShaftCacheTask.java new file mode 100644 index 000000000..30bb25c49 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/TrussCallShaftCacheTask.java @@ -0,0 +1,141 @@ +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.shafttubeivt.service.IBstIvtShafttubeivtService; +import org.nl.b_lms.bst.ivt.shafttubeivt.service.dao.BstIvtShafttubeivt; +import org.nl.b_lms.sch.task.dao.SchBaseTask; +import org.nl.b_lms.sch.task.service.IschBaseTaskService; +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 org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: lyd + * @Description: 桁架从气涨轴缓存位送气涨轴到套拔轴位 + * @Date: 2024/3/8 + */ +@Slf4j +@Service +public class TrussCallShaftCacheTask extends AbstractAcsTask { + private final String THIS_CLASS = TrussCallShaftCacheTask.class.getName(); + @Autowired + private IschBaseTaskService taskService; + @Autowired + private IBstIvtShafttubeivtService shafttubeivtService; + @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()); + String startPoint = task.getPoint_code1(); + BstIvtShafttubeivt startPointObj = shafttubeivtService.getByPointCode(startPoint, false); + // 起点清空 + startPointObj.setHave_qzz("0"); + TaskUtils.updateOptMessageByBShaftPoint(startPointObj); + shafttubeivtService.updateById(startPointObj); + } + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + task.setTask_status(TaskStatusEnum.FINISHED.getCode()); + } + TaskUtils.updateOptMessageByTask(task); + 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.setAcs_task_type("6"); + task.setIs_delete("0"); + 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 + @Transactional(rollbackFor = Exception.class) + 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/TrussSendShaftCacheTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/TrussSendShaftCacheTask.java new file mode 100644 index 000000000..0e6fd8678 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/TrussSendShaftCacheTask.java @@ -0,0 +1,148 @@ +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.shafttubeivt.service.IBstIvtShafttubeivtService; +import org.nl.b_lms.bst.ivt.shafttubeivt.service.dao.BstIvtShafttubeivt; +import org.nl.b_lms.sch.task.dao.SchBaseTask; +import org.nl.b_lms.sch.task.service.IschBaseTaskService; +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 org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: lyd + * @Description: 桁架送气涨轴到缓存区 + * @Date: 2024/3/8 + */ +@Slf4j +@Service +public class TrussSendShaftCacheTask extends AbstractAcsTask { + private final String THIS_CLASS = TrussSendShaftCacheTask.class.getName(); + @Autowired + private IschBaseTaskService taskService; + @Autowired + private IBstIvtShafttubeivtService shafttubeivtService; + + @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()); + String startPoint = task.getPoint_code1(); + String endPoint = task.getPoint_code2(); + BstIvtShafttubeivt startPointObj = shafttubeivtService.getByPointCode(startPoint, false); + BstIvtShafttubeivt endPointObj = shafttubeivtService.getByPointCode(endPoint, false); + // 起点清空 + startPointObj.setHave_qzz("0"); + TaskUtils.updateOptMessageByBShaftPoint(startPointObj); + shafttubeivtService.updateById(startPointObj); + // 终点设置值 + endPointObj.setHave_qzz("1"); + TaskUtils.updateOptMessageByBShaftPoint(endPointObj); + shafttubeivtService.updateById(endPointObj); + } + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + task.setTask_status(TaskStatusEnum.FINISHED.getCode()); + } + TaskUtils.updateOptMessageByTask(task); + 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.setAcs_task_type("6"); + task.setIs_delete("0"); + 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 + @Transactional(rollbackFor = Exception.class) + 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/AutoCallAirShaftTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoCallAirShaftTask.java index fc86e35c1..51f0fc5ea 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 @@ -5,7 +5,6 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; 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; @@ -13,9 +12,9 @@ import org.nl.b_lms.bst.ivt.shafttubeivt.service.IBstIvtShafttubeivtService; import org.nl.b_lms.bst.ivt.shafttubeivt.service.dao.BstIvtShafttubeivt; import org.nl.b_lms.pdm.bi.slittingproductionplan.service.IPdmBiSlittingproductionplanService; import org.nl.b_lms.pdm.bi.slittingproductionplan.service.dao.PdmBiSlittingproductionplan; -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.TrussCallAirShaftTask; +import org.nl.b_lms.sch.tasks.slitter.TrussCallShaftCacheTask; import org.nl.b_lms.sch.tasks.slitter.constant.SlitterConstant; import org.nl.b_lms.sch.tasks.slitter.mapper.dto.SlitterPlanDistinctDto; import org.nl.common.utils.SecurityUtils; @@ -28,8 +27,6 @@ import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; /** * @Author: lyd @@ -53,8 +50,10 @@ public class AutoCallAirShaftTask { private TrussCallAirShaftTask trussCallAirShaftTask; @Autowired private WmsToAcsService wmsToAcsService; + @Autowired + private TrussCallShaftCacheTask trussCallShaftCacheTask; - @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_UNCOMMITTED) + @Transactional(rollbackFor = Exception.class) public void run() { // 1、获取空的插拔轴位(无任务) todo:(目前都是上区域,下区域未考虑) List emptyPoints = bstIvtShafttubeivtService.getAllShaftPointsByConditions("2","0","0"); @@ -109,7 +108,7 @@ public class AutoCallAirShaftTask { List qzzPoint = bcutpointivtService.getPointByTypeAndShaftSize("1", qzzSize, area); if (qzzPoint.size() == 0) { // 调用ACS滚条气涨轴下来 - toAcsOutShaft(qzzSize, specification, location); + toAcsOutShaft(qzzSize, specification, location, empty); // 保存所需要的分切计划数据到点位上(套轴对接位)更新分切计划 saveCutPlanMessage(empty, needPlans, qzzSize); return; @@ -119,7 +118,7 @@ public class AutoCallAirShaftTask { if (ObjectUtil.isEmpty(startPoint)) { // 如果不存在,则发起信号滚气涨轴 // 调用ACS滚条气涨轴下来 - toAcsOutShaft(qzzSize, specification, location); + toAcsOutShaft(qzzSize, specification, location, empty); // 保存所需要的分切计划数据到点位上(套轴对接位)更新分切计划 saveCutPlanMessage(empty, needPlans, qzzSize); return; @@ -159,27 +158,64 @@ public class AutoCallAirShaftTask { /** * 获取对应的气胀轴库1 * @param qzzSize 气涨轴尺寸 - * @param specification 标箔、锂电 + * @param specification 标箔、锂电(1,2) * @param location 位置:上半部分还是下半部分 + * @param empty 套拔轴点位 */ - private void toAcsOutShaft(String qzzSize, String specification, String location) { - // todo: 访问acs判断是否有无气涨轴 + private void toAcsOutShaft(String qzzSize, String specification, String location, BstIvtShafttubeivt empty) { // 需要区分上下 List shafttubeivts = bstIvtShafttubeivtService.getByQzzSize(qzzSize, specification, location); if (shafttubeivts.size() == 0) { throw new BadRequestException("气胀轴库找不到[" + qzzSize + "]规格的气涨轴"); } BstIvtShafttubeivt shafttubeivt = shafttubeivts.get(0); - JSONArray acsParam = new JSONArray(); - JSONObject acsQzz = new JSONObject(); - acsQzz.put("device_code", shafttubeivt.getPoint_code()); - acsQzz.put("code", "to_command"); - acsQzz.put("value", "1"); - acsQzz.put("product_area", SlitterConstant.SLITTER_TASK_AREA); - acsParam.add(acsQzz); - wmsToAcsService.action(acsParam); + // todo: 访问acs判断是否有无气涨轴 + boolean flag = true; + if (!flag) { + // 气涨轴库没有对应的气涨轴,就到气涨轴暂存区获取 + toCreatShaftCacheTask(qzzSize, specification, location, empty); + } else { + JSONArray acsParam = new JSONArray(); + JSONObject acsQzz = new JSONObject(); + acsQzz.put("device_code", shafttubeivt.getPoint_code()); + acsQzz.put("code", "to_command"); + acsQzz.put("value", "1"); + acsQzz.put("product_area", SlitterConstant.SLITTER_TASK_AREA); + acsParam.add(acsQzz); + wmsToAcsService.action(acsParam); + } } + /** + * 创建气涨轴缓存的桁架任务 + * @param qzzSize 气涨轴尺寸 + * @param specification 标箔、锂电(1,2) + * @param location 位置:上半部分还是下半部分 + * @param empty 套拔轴点位 + */ + private void toCreatShaftCacheTask(String qzzSize, String specification, String location, BstIvtShafttubeivt empty) { + // 获取气涨轴缓存没有任务的点位 + List shafttubeivts = bstIvtShafttubeivtService.getNotTaskShaftCache(qzzSize, specification, location); + if (shafttubeivts.size() == 0) { + throw new BadRequestException("未找到气涨轴规格「" + qzzSize + "」的暂存位"); + } + BstIvtShafttubeivt shafttubeivt = shafttubeivts.get(0); + JSONObject param = new JSONObject(); + param.put("point_code1", shafttubeivt.getPoint_code()); + param.put("point_code2", empty.getPoint_code()); + param.put("is_bushing", "1"); + param.put("task_type", "6"); + param.put("product_area", SlitterConstant.SLITTER_TASK_AREA); + param.put("qzz_size", qzzSize); + trussCallShaftCacheTask.createTask(param); + } + + /** + * 保存信息到点位上 + * @param empty 套拔轴机位置 + * @param needPlans 需要的分切计划 + * @param qzzSize 气涨轴尺寸 + */ private void saveCutPlanMessage(BstIvtShafttubeivt empty, List needPlans, String qzzSize) { empty.setHave_qzz("1"); empty.setQzz_size(qzzSize); @@ -219,6 +255,10 @@ public class AutoCallAirShaftTask { slittingproductionplanService.updateBatchById(needPlans); } + /** + * 不需要套轴,就只做拔轴 + * @param empty 空的插拔轴点位 + */ private void makePullShaft(BstIvtShafttubeivt empty) { List notTaskPoints = bcutpointivtService.getAreaNotTaskPointByStatus("1", "3", "0"); if (notTaskPoints.size() == 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 9f38af6fc..fb35334d1 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 @@ -3,6 +3,7 @@ package org.nl.b_lms.sch.tasks.slitter.auto; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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; @@ -14,10 +15,13 @@ import org.nl.b_lms.sch.tasks.slitter.SendAirShaftAgvTask; import org.nl.b_lms.sch.tasks.slitter.constant.SlitterConstant; 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; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -39,7 +43,10 @@ public class AutoSendAirShaftAgvTask { private SendAirShaftAgvTask sendAirShaftAgvTask; @Autowired private SlitterMapper slitterMapper; + @Autowired + private RedissonClient redissonClient; + @SneakyThrows public void run() { // 获取套轴对接位有气涨轴没任务的点位 List cutPoints = bcutpointivtService.getAreaNotTaskPointByStatus("1", "2", "0"); @@ -74,22 +81,34 @@ public class AutoSendAirShaftAgvTask { } // 如果两个气涨轴编码则表示一组满了 // 查找分切对接没任务的空位 - // todo:枷锁 List emptyPoint = slitterMapper.getEmptyCutPointNotTask(deviceCut.getSort_seq()); if (emptyPoint.size() == 0) { log.warn("找不到对应的位置!"); return; } // 创建任务 + // 枷锁 BstIvtCutpointivt endPoint = emptyPoint.get(0); - JSONObject param = new JSONObject(); - param.put("point_code1", cutPoint.getPoint_code()); - param.put("point_code2", endPoint.getPoint_code()); - param.put("vehicle_code1", cutPoint.getQzz_no1()); - param.put("vehicle_code2", cutPoint.getQzz_no2()); - param.put("task_type", "3"); - param.put("product_area", SlitterConstant.SLITTER_TASK_AREA); - sendAirShaftAgvTask.createTask(param); + RLock lock = redissonClient.getLock(endPoint.getPoint_code()); + boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); + try { + if (tryLock) { + JSONObject param = new JSONObject(); + param.put("point_code1", cutPoint.getPoint_code()); + param.put("point_code2", endPoint.getPoint_code()); + param.put("vehicle_code1", cutPoint.getQzz_no1()); + param.put("vehicle_code2", cutPoint.getQzz_no2()); + param.put("task_type", "3"); + param.put("product_area", SlitterConstant.SLITTER_TASK_AREA); + sendAirShaftAgvTask.createTask(param); + } else { + throw new BadRequestException("系统繁忙,稍后在试"); + } + } finally { + if (tryLock) { + lock.unlock(); + } + } } } 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 1480cd60e..9a7a03e6f 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 @@ -35,6 +35,13 @@ public interface SlitterService { */ JSONObject acsFinishLoadShaft(JSONObject param); + /** + * ACS申请送气涨轴到气涨轴暂存位 + * @param param + * @return + */ + JSONObject acsSendShaftToCache(JSONObject param); + /** * 分切机下料 * @param 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 c133929fa..2ed1e3743 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 @@ -1,6 +1,5 @@ package org.nl.b_lms.sch.tasks.slitter.service.impl; -import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.http.HttpStatus; @@ -68,90 +67,122 @@ public class SlitterServiceImpl implements SlitterService { @Autowired private RedissonClient redissonClient; + @SneakyThrows @Override public JSONObject acsRequestShaftLoadTube(JSONObject param) { JSONObject res = new JSONObject(); JSONObject con = new JSONObject(); String deviceCode = param.getString("device_code"); - String size = param.getString("size"); - BstIvtShafttubeivt point = shafttubeivtService.getByPointCode(deviceCode, false); - res.put("code", HttpStatus.HTTP_OK); - res.put("device_code", deviceCode); - res.put("data", con); - con.put("left", point.getTube_code1()); - con.put("right", point.getTube_code2()); - return res; - } - - @Override - public JSONObject acsFinishShaftPluckTube(JSONObject param) { - JSONObject res = new JSONObject(); - String deviceCode = param.getString("device_code"); - // 气涨轴编码 - String taskId = param.getString("task_id"); - // 获取上一个桁架任务 - SchBaseTask previousTask = taskService.getById(taskId); - String requestParam = previousTask.getRequest_param(); - JSONObject requestParamObj = JSONObject.parseObject(requestParam); - List collect = Stream.of(requestParamObj.getString("left"), requestParamObj.getString("right")) - .filter(value -> value != null && !value.isEmpty()).collect(Collectors.toList()); - // hint: 使用子卷号 - List plans = slittingproductionplanService.list(new LambdaQueryWrapper() - .eq(PdmBiSlittingproductionplan::getContainer_name, collect) - .eq(PdmBiSlittingproductionplan::getStatus, "09")); - PdmBiSlittingproductionplan plan; - if ("1".equals(deviceCode.substring(deviceCode.length() - 1))) { - plan = plans.stream().filter(p -> "1".equals(p.getLeft_or_right())).findFirst().orElse(null); - } else { - plan = plans.stream().filter(p -> "2".equals(p.getLeft_or_right())).findFirst().orElse(null); + RLock lock = redissonClient.getLock(deviceCode); + boolean tryLock = lock.tryLock(10, TimeUnit.SECONDS); + try { + if (tryLock) { + String size = param.getString("size"); + BstIvtShafttubeivt point = shafttubeivtService.getByPointCode(deviceCode, false); + res.put("device_code", deviceCode); + res.put("data", con); + con.put("left", point.getTube_code1()); + con.put("right", point.getTube_code2()); + } else { + throw new BadRequestException("系统繁忙,稍后在试"); + } + } finally { + if (tryLock) { + lock.unlock(); + } } - // 查找终点 todo: 如何确认是废箔还是成品 - // todo: 暂时写死去成品称重 -// BstIvtShafttubeivt one = shafttubeivtService.getOne(new LambdaQueryWrapper() -// .eq(BstIvtShafttubeivt::getPoint_type, "4").eq(BstIvtShafttubeivt::getPoint_location, "0")); - JSONObject taskParam = new JSONObject(); - taskParam.put("point_code1", deviceCode); - taskParam.put("point_code2", "B_CZW01"); - taskParam.put("material_code", plan.getContainer_name()); - taskParam.put("task_type", "6"); - taskParam.put("product_area", SlitterConstant.SLITTER_TASK_AREA); - sendCopperFoilSubRollTrussTask.createTask(taskParam); res.put("code", HttpStatus.HTTP_OK); res.put("message", "任务请求成功!"); return res; } + @SneakyThrows @Override - public JSONObject acsRequestShaftPluckTube(JSONObject param) { - // 参数:设备号,type,插拔轴位,task_id + public JSONObject acsFinishShaftPluckTube(JSONObject param) { JSONObject res = new JSONObject(); String deviceCode = param.getString("device_code"); - String taskId = param.getString("task_id"); - if (ObjectUtil.isEmpty(taskId)) { - throw new BadRequestException("任务id不能为空!"); + RLock lock = redissonClient.getLock(deviceCode); + boolean tryLock = lock.tryLock(10, TimeUnit.SECONDS); + try { + if (tryLock) { + // 气涨轴编码 + String qzzNo = param.getString("qzz_no"); + List plans = slittingproductionplanService.getByQzzNo(qzzNo); + if (plans.size() == 0) { + throw new BadRequestException("查询不到气胀轴编码「" + qzzNo + "」对应的子卷信息!"); + } + PdmBiSlittingproductionplan plan; + if ("1".equals(deviceCode.substring(deviceCode.length() - 1))) { + plan = plans.stream().filter(p -> "1".equals(p.getLeft_or_right())).findFirst().orElse(null); + } else { + plan = plans.stream().filter(p -> "2".equals(p.getLeft_or_right())).findFirst().orElse(null); + } + // 查找终点 todo: 如何确认是废箔还是成品 + // todo: 暂时写死去成品称重 +// BstIvtShafttubeivt one = shafttubeivtService.getOne(new LambdaQueryWrapper() +// .eq(BstIvtShafttubeivt::getPoint_type, "4").eq(BstIvtShafttubeivt::getPoint_location, "0")); + JSONObject taskParam = new JSONObject(); + taskParam.put("point_code1", deviceCode); + taskParam.put("point_code2", "B_CZW01"); + taskParam.put("material_code", plan.getContainer_name()); + taskParam.put("task_type", "6"); + taskParam.put("product_area", SlitterConstant.SLITTER_TASK_AREA); + sendCopperFoilSubRollTrussTask.createTask(taskParam); + } else { + throw new BadRequestException("系统繁忙,稍后在试"); + } + } finally { + if (tryLock) { + lock.unlock(); + } } - SchBaseTask previousTask = taskService.getById(taskId); - // 反馈 纸管尺寸 - String requestParam = previousTask.getRequest_param(); - JSONObject requestParamObj = JSONObject.parseObject(requestParam); - List collect = Stream.of(requestParamObj.getString("left"), requestParamObj.getString("right")) - .filter(value -> value != null && !value.isEmpty()).collect(Collectors.toList()); - // hint: 使用子卷号 - List plans = slittingproductionplanService.list(new LambdaQueryWrapper() - .eq(PdmBiSlittingproductionplan::getContainer_name, collect) - .eq(PdmBiSlittingproductionplan::getStatus, "09")); - if (plans.size() == 0) { - throw new BadRequestException("查询不到对应的子卷信息!"); - } - PdmBiSlittingproductionplan plan = plans.get(0); - - String s = String.valueOf("1".equals(plan.getPaper_tube_or_FRP()) - ? plan.getPaper_tube_model() - : plan.getFRP_model().split("\\|")[2].charAt(0)); - JSONObject r = new JSONObject(); res.put("code", HttpStatus.HTTP_OK); - res.put("data", r); - r.put("size", s); + res.put("message", "任务请求成功!"); + return res; + } + + @SneakyThrows + @Override + public JSONObject acsRequestShaftPluckTube(JSONObject param) { + // 参数:设备号,type,插拔轴位,qzzSize + JSONObject res = new JSONObject(); + String deviceCode = param.getString("device_code"); + RLock lock = redissonClient.getLock(deviceCode); + boolean tryLock = lock.tryLock(10, TimeUnit.SECONDS); + try { + if (tryLock) { + String qzzNo = param.getString("qzz_no"); + if (ObjectUtil.isEmpty(qzzNo)) { + throw new BadRequestException("气涨轴编码不能为空!"); + } + List plans = slittingproductionplanService.getByQzzNo(qzzNo); + if (plans.size() == 0) { + throw new BadRequestException("查询不到气胀轴编码「" + qzzNo + "」对应的子卷信息!"); + } + // 反馈 纸管尺寸 + JSONObject r = new JSONObject(); + res.put("data", r); + r.put("device_code", deviceCode); + for (PdmBiSlittingproductionplan plan : plans) { + String s = String.valueOf("1".equals(plan.getPaper_tube_or_FRP()) + ? plan.getPaper_tube_model() + : plan.getFRP_model().split("\\|")[2].charAt(0)); + if ("1".equals(plan.getLeft_or_right())) { + r.put("left_size", s); + } else { + r.put("right_size", s); + } + } + } else { + throw new BadRequestException("系统繁忙,稍后在试"); + } + } finally { + if (tryLock) { + lock.unlock(); + } + } + res.put("code", HttpStatus.HTTP_OK); + res.put("message", "请求成功"); return res; } @@ -162,7 +193,7 @@ public class SlitterServiceImpl implements SlitterService { JSONObject res = new JSONObject(); String deviceCode = param.getString("device_code"); RLock lock = redissonClient.getLock(deviceCode); - boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); + boolean tryLock = lock.tryLock(10, TimeUnit.SECONDS); try { if (tryLock) { String taskCode = param.getString("task_code"); @@ -212,7 +243,7 @@ public class SlitterServiceImpl implements SlitterService { } // 枷锁 RLock lockPoint = redissonClient.getLock(cutPoint.getPoint_code()); - boolean tryLockPoint = lockPoint.tryLock(0, TimeUnit.SECONDS); + boolean tryLockPoint = lockPoint.tryLock(5, TimeUnit.SECONDS); try { if (tryLockPoint) { // 分切计划设置套轴完成 @@ -254,12 +285,58 @@ public class SlitterServiceImpl implements SlitterService { return res; } + @SneakyThrows + @Override + public JSONObject acsSendShaftToCache(JSONObject param) { + JSONObject res = new JSONObject(); + String deviceCode = param.getString("device_code"); + RLock lock = redissonClient.getLock(deviceCode); + boolean tryLock = lock.tryLock(10, TimeUnit.SECONDS); + try { + if (tryLock) { + String qzzSize = param.getString("qzz_size"); + // 判断是否有未完成的任务 + List list = taskService.list(new LambdaQueryWrapper() + .eq(SchBaseTask::getPoint_code1, deviceCode) + .lt(SchBaseTask::getTask_status, "07")); + if (list.size() > 0) { + throw new BadRequestException("点位[" + deviceCode + "]存在未完成得任务!"); + } + BstIvtShafttubeivt startPoint = shafttubeivtService.getByPointCode(deviceCode, false); + // 临时存放气涨轴尺寸 + startPoint.setQzz_size(qzzSize); + // 获取空位 + List shafttubeivts = shafttubeivtService.getNotTaskShaftCacheEmpty(startPoint); + if (shafttubeivts.size() == 0) { + throw new BadRequestException("未找到可存放气涨轴规格「" + qzzSize + "」的空暂存位"); + } + BstIvtShafttubeivt shafttubeivt = shafttubeivts.get(0); + // 创建任务 + param.put("point_code1", deviceCode); + param.put("point_code2", shafttubeivt.getPoint_code()); + // hint: 当前分切计划的气涨轴尺寸 + param.put("qzz_size", qzzSize); + param.put("task_type", "6"); + param.put("product_area", SlitterConstant.SLITTER_TASK_AREA); + param.put("is_bushing", "0"); + } else { + throw new BadRequestException("系统繁忙,稍后在试"); + } + } finally { + if (tryLock) { + lock.unlock(); + } + } + res.put("code", HttpStatus.HTTP_OK); + res.put("message", "请求成功"); + return res; + } + + @SneakyThrows @Override @Transactional(rollbackFor = Exception.class) public JSONObject mesSlittingMachineSendMaterial(JSONObject param) { JSONObject res = new JSONObject(); - res.put("status", HttpStatus.HTTP_OK); - res.put("message", "子卷出站任务生成成功!"); // todo: 获取子卷号数组 JSONArray containers = param.getJSONArray("container"); List containerList = containers.toJavaList(String.class); @@ -269,6 +346,7 @@ public class SlitterServiceImpl implements SlitterService { // 获取分切计划,最多4个需要出站的任务 List currentPlans = slittingproductionplanService.list(new LambdaQueryWrapper() .in(PdmBiSlittingproductionplan::getContainer_name, containerList) + .eq(PdmBiSlittingproductionplan::getIs_delete, "0") .eq(PdmBiSlittingproductionplan::getStatus, "05")); if (currentPlans.size() == 0) { throw new BadRequestException("当前子卷已经出卷或者不存在!"); @@ -298,36 +376,48 @@ public class SlitterServiceImpl implements SlitterService { if (emptyPoints.size() == 0) { throw new BadRequestException("分切机【" + device.getExt_code() + "】找不到对应的对接位!"); } - // todo: 枷锁 + // 枷锁 BstIvtCutpointivt emptyPoint = emptyPoints.get(0); - // 创建任务 - if (currentUpPlan != null && currentDownPlan != null) { - // 双轴任务 下双 - taskParam.put("point_code1", device.getUp_point_code()); - taskParam.put("point_code2", emptyPoint.getTruss_point_code2()); - taskParam.put("point_code3", device.getDown_point_code()); - taskParam.put("point_code4", emptyPoint.getTruss_point_code1()); - taskParam.put("truss_type", "1"); - taskParam.put("empty_site", "0"); - } else { - // 单轴任务 下单 - taskParam.put("point_code1", currentUpPlan == null - ? device.getDown_point_code() : device.getUp_point_code()); - taskParam.put("point_code2", currentUpPlan == null - ? emptyPoint.getTruss_point_code1() : emptyPoint.getTruss_point_code2()); - taskParam.put("truss_type", "1"); - taskParam.put("empty_site", "0"); + RLock lock = redissonClient.getLock(emptyPoint.getPoint_code()); + boolean tryLock = lock.tryLock(5, TimeUnit.SECONDS); + try { + if (tryLock) { + // 创建任务 + if (currentUpPlan != null && currentDownPlan != null) { + // 双轴任务 下双 + taskParam.put("point_code1", device.getUp_point_code()); + taskParam.put("point_code2", emptyPoint.getTruss_point_code2()); + taskParam.put("point_code3", device.getDown_point_code()); + taskParam.put("point_code4", emptyPoint.getTruss_point_code1()); + taskParam.put("truss_type", "1"); + taskParam.put("empty_site", "0"); + } else { + // 单轴任务 下单 + taskParam.put("point_code1", currentUpPlan == null + ? device.getDown_point_code() : device.getUp_point_code()); + taskParam.put("point_code2", currentUpPlan == null + ? emptyPoint.getTruss_point_code1() : emptyPoint.getTruss_point_code2()); + taskParam.put("truss_type", "1"); + taskParam.put("empty_site", "0"); + } + taskParam.put("product_area", SlitterConstant.SLITTER_TASK_AREA); + // 分切计划修改状态 05 -> 06 + currentPlans.forEach(plan -> { + plan.setStatus("06"); + TaskUtils.updateOptMessageBySlitterPlan(plan); + }); + // 创建任务 + slitterDownTrussTask.createTask(taskParam); + slittingproductionplanService.updateBatchById(currentPlans); + return res; + } else { + throw new BadRequestException("系统繁忙,稍后在试"); + } + } finally { + if (tryLock) { + lock.unlock(); + } } - taskParam.put("product_area", SlitterConstant.SLITTER_TASK_AREA); - // 分切计划修改状态 05 -> 06 - currentPlans.forEach(plan -> { - plan.setStatus("06"); - TaskUtils.updateOptMessageBySlitterPlan(plan); - }); - // 创建任务 - slitterDownTrussTask.createTask(taskParam); - slittingproductionplanService.updateBatchById(currentPlans); - return res; } PdmBiSlittingproductionplan tmpPlan = timePlans.get(0); // hint: 以第一条为准,过滤和第一条同组同母卷的分切计划 @@ -414,6 +504,8 @@ public class SlitterServiceImpl implements SlitterService { mergedList.addAll(currentPlans); mergedList.addAll(nextPlans); slittingproductionplanService.updateBatchById(mergedList); + res.put("status", HttpStatus.HTTP_OK); + res.put("message", "子卷出站任务生成成功!"); return res; } }