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 a6f7ab4b3..f78358e95 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 @@ -43,7 +43,7 @@ public interface IBstIvtShafttubeivtService extends IService void deleteAll(Set ids); /** - * 获取启用的 类型 区域 有无轴的点位 + * 获取启用的 类型 区域 有无轴的点位 (无任务) * @param type * @param location * @param have diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/IstIvtCutpointivtService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/IstIvtCutpointivtService.java index 258504552..300a7ba71 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/IstIvtCutpointivtService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/IstIvtCutpointivtService.java @@ -58,6 +58,13 @@ public interface IstIvtCutpointivtService extends IService { * @return / */ StIvtCutpointivt getPintByPointCode(String code, boolean flag); + /** + * 根据点位编码获取分切机上下轴 + * @param code 点位编码 + * @param flag 是否判断启用 + * @return / + */ + StIvtCutpointivt getPintByUpOrDownCode(String code, boolean flag); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/StIvtCutpointivtServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/StIvtCutpointivtServiceImpl.java index 678c94def..e6c28cac9 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/StIvtCutpointivtServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/StIvtCutpointivtServiceImpl.java @@ -16,6 +16,7 @@ import org.nl.common.domain.query.PageQuery; import javax.annotation.Resource; import java.util.Map; import java.util.Set; +import java.util.function.Consumer; /** @@ -90,6 +91,14 @@ public class StIvtCutpointivtServiceImpl extends ServiceImpl lam = new LambdaQueryWrapper<>(); + lam.eq(flag, StIvtCutpointivt::getIs_used, "1") + .and(la -> la.eq(StIvtCutpointivt::getUp_point_code, code).or() + .eq(StIvtCutpointivt::getDown_point_code, code)); + return stIvtCutpointivtMapper.selectOne(lam); + } /** * 获取实体基础信息 diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/SlitterDownTrussTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/SlitterDownTrussTask.java index 381742890..8249b6674 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/SlitterDownTrussTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/SlitterDownTrussTask.java @@ -1,12 +1,35 @@ 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 com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.pdm.bi.slittingproductionplan.service.dao.PdmBiSlittingproductionplan; +import org.nl.b_lms.sch.point.dao.StIvtCutpointivt; +import org.nl.b_lms.sch.point.service.IstIvtCutpointivtService; +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.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; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * @Author: lyd @@ -16,29 +39,148 @@ import java.util.List; @Slf4j @Service public class SlitterDownTrussTask extends AbstractAcsTask { + private final String THIS_CLASS = SlitterDownTrussTask.class.getName(); + @Autowired + private IschBaseTaskService taskService; + @Autowired + private IPdmBiSlittingproductionplanService slittingproductionplanService; + @Autowired + private IBstIvtCutpointivtService bcutpointivtService; + @Autowired + private IstIvtCutpointivtService cutpointivtService; @Override public List addTask() { - return null; + /* + * 下发给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 + @Transactional(rollbackFor = Exception.class) 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 pointCode1 = task.getPoint_code1(); + StIvtCutpointivt point1 = cutpointivtService.getPintByUpOrDownCode(pointCode1, false); + String pointCode2 = task.getPoint_code2(); + BstIvtCutpointivt point2 = bcutpointivtService.getPintByTrussCode(pointCode2, false); + String tmpUpQzzNo = point1.getUp_qzzno(); + String tmpDownQzzNo = point1.getDown_qzzno(); + // 更新分切计划 + // 下来的分切计划状态:06 -> 09 + PdmBiSlittingproductionplan p = new PdmBiSlittingproductionplan(); + p.setStatus("09"); + p.setUpdate_optid("3"); + p.setUpdate_optname("ACS"); + p.setUpdate_time(DateUtil.now()); + List downQzzNos = Stream.of(tmpUpQzzNo, tmpDownQzzNo) + .filter(value -> value != null && !value.isEmpty()).collect(Collectors.toList()); + slittingproductionplanService.update(p, new LambdaQueryWrapper() + .in(PdmBiSlittingproductionplan::getQzzno, downQzzNos)); + // 上去的分切计划状态:04 -> 05 + p.setStatus("05"); + List upQzzNos = Stream.of(point2.getQzz_no1(), point2.getQzz_no2()) + .filter(value -> value != null && !value.isEmpty()).collect(Collectors.toList()); + slittingproductionplanService.update(p, new LambdaQueryWrapper() + .in(PdmBiSlittingproductionplan::getQzzno, upQzzNos)); + // 点位数据更新 + point1.setUp_qzzno(point2.getQzz_no1()); + point1.setDown_qzzno(point2.getQzz_no2()); + point1.setUpdate_optid(3L); + point1.setUpdate_optname("ACS"); + point1.setUpdate_time(DateUtil.now()); + point2.setQzz_no1(tmpUpQzzNo); + point2.setQzz_no2(tmpDownQzzNo); + point2.setPoint_status("3"); + point2.setUpdate_optid("3"); + point2.setUpdate_optname("ACS"); + point2.setUpdate_time(DateUtil.now()); + cutpointivtService.updateById(point1); + bcutpointivtService.updateById(point2); + } + + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + task.setTask_status(TaskStatusEnum.FINISHED.getCode()); + // todo: 分切计划回退? + } + task.setUpdate_time(DateUtil.now()); + taskService.updateById(task); } @Override public String createTask(JSONObject form) { - return null; + 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.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/UpShaftTrussTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/UpShaftTrussTask.java index 6ad30f92b..da7d05f27 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/UpShaftTrussTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/UpShaftTrussTask.java @@ -94,7 +94,7 @@ public class UpShaftTrussTask extends AbstractAcsTask { String pointCode1 = task.getPoint_code1(); BstIvtCutpointivt point1 = bcutpointivtService.getPintByTrussCode(pointCode1, false); String pointCode2 = task.getPoint_code2(); - StIvtCutpointivt point2 = cutpointivtService.getPintByPointCode(pointCode2, false); + StIvtCutpointivt point2 = cutpointivtService.getPintByUpOrDownCode(pointCode2, false); // 交换数据 point2.setUp_qzzno(point1.getQzz_no1()); point2.setDown_qzzno(point1.getQzz_no2()); 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 0498ae74a..3b63731be 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 @@ -15,6 +15,7 @@ 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.mapper.dto.SlitterPlanDistinctDto; +import org.nl.common.utils.TaskUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -115,9 +116,7 @@ public class AutoCallAirShaftTask { // 将分切计划is_paper_ok 1 -> 2 needPlans.forEach(p -> { p.setIs_paper_ok("2"); - p.setUpdate_optid("3"); - p.setUpdate_optname("ACS"); - p.setUpdate_time(DateUtil.now()); + TaskUtils.updateOptMessageBySlitterPlan(p); }); slittingproductionplanService.updateBatchById(needPlans); }); 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 a036454d2..aa1efb684 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 @@ -67,7 +67,7 @@ public class AutoSendAirShaftAgvTask { } } // 如果两个气涨轴编码则表示一组满了 - // 查找分切对接的空位 + // 查找分切对接的空位 todo: (校验任务) List emptyPoint = bcutpointivtService.list(new LambdaQueryWrapper() .eq(BstIvtCutpointivt::getPoint_type, "3") .eq(BstIvtCutpointivt::getPoint_status, "1") 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 40bc41ca1..4d8ab0469 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 @@ -61,8 +61,7 @@ public class AutoUpShaftTrussTask { List nextPlans = slittingproductionplanService.list(new LambdaQueryWrapper() .eq(PdmBiSlittingproductionplan::getResource_name, device.getExt_code()) .eq(PdmBiSlittingproductionplan::getStatus, "03") - .eq(PdmBiSlittingproductionplan::getIs_delete, "0") - .orderByAsc(PdmBiSlittingproductionplan::getUpdate_time)); + .eq(PdmBiSlittingproductionplan::getIs_delete, "0")); if (nextPlans.size() == 0) { log.warn("分切机【" + device.getExt_code() + "】未找到套好轴的分切计划"); // 下个分切机 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 de65ab0f0..9502b7e81 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 @@ -21,4 +21,11 @@ public interface SlitterService { * @return */ JSONObject acsFinishLoadShaft(JSONObject param); + + /** + * 分切机下料 + * @param param + * @return + */ + JSONObject mesSlittingMachineSendMaterial(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 6f985cc0b..8aa3bd33c 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 @@ -4,20 +4,25 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.http.HttpStatus; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 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.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.point.dao.StIvtCutpointivt; import org.nl.b_lms.sch.point.service.IstIvtCutpointivtService; 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.SlitterDownTrussTask; import org.nl.b_lms.sch.tasks.slitter.TrussSendAirShaftTask; import org.nl.b_lms.sch.tasks.slitter.mapper.SlitterMapper; import org.nl.b_lms.sch.tasks.slitter.service.SlitterService; +import org.nl.common.utils.TaskUtils; import org.nl.modules.common.exception.BadRequestException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -49,6 +54,8 @@ public class SlitterServiceImpl implements SlitterService { private SlitterMapper slitterMapper; @Autowired private TrussSendAirShaftTask trussSendAirShaftTask; + @Autowired + private SlitterDownTrussTask slitterDownTrussTask; @Override public JSONObject acsFinishShaftPluckTube(JSONObject param) { @@ -144,4 +151,166 @@ public class SlitterServiceImpl implements SlitterService { res.put("message", "请求成功"); return res; } + + @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); + if (containerList.size() == 0) { + throw new BadRequestException("子卷参数不能为空!"); + } + // 获取分切计划,最多4个需要出站的任务 + List currentPlans = slittingproductionplanService.list(new LambdaQueryWrapper() + .in(PdmBiSlittingproductionplan::getContainer_name, containerList)); + // 获取上轴分切计划和下轴分切计划,各一条 + PdmBiSlittingproductionplan currentUpPlan = currentPlans.stream().filter(p -> "1".equals(p.getUp_or_down())).findFirst().orElse(null); + PdmBiSlittingproductionplan currentDownPlan = currentPlans.stream().filter(p -> "2".equals(p.getUp_or_down())).findFirst().orElse(null); + + // 获取其中一条分切计划 + PdmBiSlittingproductionplan demoPlan = currentPlans.get(0); + // 获得设备 + StIvtCutpointivt device = cutpointivtService.getOne(new LambdaQueryWrapper() + .eq(StIvtCutpointivt::getExt_code, demoPlan.getResource_name())); + // 获取当前分切机的下一组分切计划(最多四条分切计划) + // hint: 获取到的分切可能是不同组的但具有一定时间顺序 + List timePlans = slittingproductionplanService.list(new LambdaQueryWrapper() + .eq(PdmBiSlittingproductionplan::getResource_name, device.getExt_code()) + .eq(PdmBiSlittingproductionplan::getStatus, "03") + .eq(PdmBiSlittingproductionplan::getIs_delete, "0") + .orderByAsc(PdmBiSlittingproductionplan::getUpdate_time)); + // 任务参数 + JSONObject taskParam = new JSONObject(); + if (timePlans.size() == 0) { + // 如果没有下一组分切计划,就只做下卷任务(判断下单/下双) + // 获取分切对接位没任务的空位置 todo: 校验任务未作 + List emptyPoints = bcutpointivtService.list(new LambdaQueryWrapper() + .eq(BstIvtCutpointivt::getPoint_type, "3") + .eq(BstIvtCutpointivt::getPoint_status, "1") + .eq(BstIvtCutpointivt::getIs_used, "1") + .last("ORDER BY ABS(sort_seq - " + device.getSort_seq() + ")")); + if (emptyPoints.size() == 0) { + throw new BadRequestException("分切机【" + device.getExt_code() + "】找不到对应的对接位!"); + } + 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"); + } + taskParam.put("product_area", "Test"); + // 分切计划修改状态 05 -> 06 + currentPlans.forEach(plan -> { + plan.setStatus("06"); + plan.setUpdate_optid("3"); + plan.setUpdate_optname("ACS"); + plan.setUpdate_time(DateUtil.now()); + }); + slittingproductionplanService.updateBatchById(currentPlans); + return res; + } + PdmBiSlittingproductionplan tmpPlan = timePlans.get(0); + // hint: 以第一条为准,过滤和第一条同组同母卷的分切计划 + List nextPlans = timePlans.stream() + .filter(plan -> plan.getParent_container_name().equals(tmpPlan.getParent_container_name()) && plan.getSplit_group().equals(tmpPlan.getSplit_group())) + .collect(Collectors.toList()); + // 筛选上下轴各一条 + PdmBiSlittingproductionplan nextUpPlan = nextPlans.stream().filter(p -> "1".equals(p.getUp_or_down())).findFirst().orElse(null); + PdmBiSlittingproductionplan nextDownPlan = nextPlans.stream().filter(p -> "2".equals(p.getUp_or_down())).findFirst().orElse(null); + // 找到该分切计划的点位 todo: 应该校验没任务 + LambdaQueryWrapper newCutLam = new QueryWrapper().lambda(); + newCutLam.eq(BstIvtCutpointivt::getPoint_type, "3").eq(BstIvtCutpointivt::getPoint_status, "1") + .eq(BstIvtCutpointivt::getIs_used, "1"); + if (nextUpPlan != null) { + newCutLam.eq(BstIvtCutpointivt::getQzz_no1, nextUpPlan.getQzzno()); + } + if (nextDownPlan != null) { + newCutLam.eq(BstIvtCutpointivt::getQzz_no2, nextDownPlan.getQzzno()); + } + BstIvtCutpointivt newCutPoint = bcutpointivtService.getOne(newCutLam, false); + if (ObjectUtil.isEmpty(newCutPoint)) { + throw new BadRequestException("分切机【" + device.getExt_code() + "】的下一组分切计划未配送完毕!"); + } + String binaryExpress = TaskUtils.binaryConvertExpress(currentUpPlan, currentDownPlan, nextUpPlan, nextDownPlan); + switch (binaryExpress) { + case "00": + // 下单上单 + taskParam.put("point_code1", currentUpPlan != null + ? device.getUp_point_code() : device.getDown_point_code()); + taskParam.put("point_code2", currentUpPlan != null + ? newCutPoint.getTruss_point_code2() : newCutPoint.getTruss_point_code1()); + taskParam.put("point_code3", nextUpPlan != null + ? device.getUp_point_code() : device.getDown_point_code()); + taskParam.put("point_code4", nextUpPlan != null + ? newCutPoint.getTruss_point_code1() : newCutPoint.getTruss_point_code2()); + taskParam.put("truss_type", "1"); + taskParam.put("empty_site", "0"); + break; + case "01": + // 下单上双 + taskParam.put("point_code1", currentUpPlan != null + ? device.getUp_point_code() : device.getDown_point_code()); + taskParam.put("point_code2", currentUpPlan != null + ? newCutPoint.getTruss_point_code1() : newCutPoint.getTruss_point_code2()); + taskParam.put("truss_type", "3"); + taskParam.put("empty_site", "3"); + break; + case "10": + // 下双上单 + taskParam.put("point_code1", device.getUp_point_code()); + taskParam.put("point_code2", newCutPoint.getTruss_point_code2()); + taskParam.put("point_code3", device.getDown_point_code()); + taskParam.put("point_code4", newCutPoint.getTruss_point_code1()); + taskParam.put("truss_type", "4"); + taskParam.put("empty_site", nextUpPlan == null ? "1" : "2"); + break; + case "11": + // 下双上双 + taskParam.put("point_code1", device.getUp_point_code()); + taskParam.put("point_code2", newCutPoint.getTruss_point_code2()); + taskParam.put("point_code3", device.getDown_point_code()); + taskParam.put("point_code4", newCutPoint.getTruss_point_code1()); + taskParam.put("truss_type", "3"); + taskParam.put("empty_site", "3"); + break; + default: + throw new BadRequestException("错误表达式"); + } + // 创建任务 + slitterDownTrussTask.createTask(taskParam); + // 下来的分切计划修改状态:05 -> 06 + currentPlans.forEach(plan -> { + plan.setStatus("06"); + plan.setUpdate_optid("3"); + plan.setUpdate_optname("ACS"); + plan.setUpdate_time(DateUtil.now()); + }); + slittingproductionplanService.updateBatchById(currentPlans); + // 上去的分切计划修改状态:03 -> 04 + nextPlans.forEach(plan -> { + plan.setStatus("04"); + plan.setUpdate_optid("3"); + plan.setUpdate_optname("ACS"); + plan.setUpdate_time(DateUtil.now()); + }); + slittingproductionplanService.updateBatchById(nextPlans); + return res; + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/common/utils/TaskUtils.java b/lms/nladmin-system/src/main/java/org/nl/common/utils/TaskUtils.java index 0d13c2d2a..92eac9641 100644 --- a/lms/nladmin-system/src/main/java/org/nl/common/utils/TaskUtils.java +++ b/lms/nladmin-system/src/main/java/org/nl/common/utils/TaskUtils.java @@ -1,8 +1,11 @@ package org.nl.common.utils; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; import lombok.extern.slf4j.Slf4j; import org.nl.b_lms.bst.ivt.cutpointivt.service.dao.BstIvtCutpointivt; +import org.nl.b_lms.pdm.bi.slittingproductionplan.service.dao.PdmBiSlittingproductionplan; +import org.nl.b_lms.sch.task.dao.SchBaseTask; /** * @author: lyd @@ -32,4 +35,47 @@ public class TaskUtils { source.setUpdate_optname("ACS"); source.setUpdate_time(DateUtil.now()); } + + /** + * 用0,1,2,3四个的二进制字符表示是下单(双)上单(双) + * @param currentUpPlan 要下来的上轴 + * @param currentDownPlan 要下来的下轴 + * @param nextUpPlan 要上去的上轴 + * @param nextDownPlan 要上去的下轴 + * @return 二进制表示字符串 + */ + public static String binaryConvertExpress(PdmBiSlittingproductionplan currentUpPlan, PdmBiSlittingproductionplan currentDownPlan,PdmBiSlittingproductionplan nextUpPlan,PdmBiSlittingproductionplan nextDownPlan) { + String binary = ""; + if (ObjectUtil.isNotEmpty(currentUpPlan) && ObjectUtil.isNotEmpty(currentDownPlan)) { + binary += "1"; + } else { + binary += "0"; + } + if (ObjectUtil.isNotEmpty(nextUpPlan) && ObjectUtil.isNotEmpty(nextDownPlan)) { + binary += "1"; + } else { + binary += "0"; + } + return binary; + } + + /** + * 赋值分切计划的修改时间、人等信息 + * @param plan 分切计划 + */ + public static void updateOptMessageBySlitterPlan(PdmBiSlittingproductionplan plan) { + plan.setUpdate_optid(SecurityUtils.getCurrentUserId()); + plan.setUpdate_optname(SecurityUtils.getCurrentUsername()); + plan.setUpdate_time(DateUtil.now()); + } + + /** + * 赋值任务的修改时间、人等信息 + * @param task 任务 + */ + public static void updateOptMessageByTask(SchBaseTask task) { + task.setUpdate_optid(SecurityUtils.getCurrentUserId()); + task.setUpdate_optname(SecurityUtils.getCurrentUsername()); + task.setUpdate_time(DateUtil.now()); + } }