diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/ProductOutTwoController.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/ProductOutTwoController.java index f3c5c7786..bb42a7cb1 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/ProductOutTwoController.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/ProductOutTwoController.java @@ -83,4 +83,11 @@ public class ProductOutTwoController { return new ResponseEntity<>(TableDataInfo.build(productOutTwoService.woodenBoxPoint(whereJson)), HttpStatus.OK); } + @PostMapping("/boxOut") + @Log("木箱出库") + @SaIgnore + public ResponseEntity boxOut(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(productOutTwoService.boxOut(whereJson),HttpStatus.OK); + } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/VehicleTwoController.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/VehicleTwoController.java index a22ba2469..0dabf07cc 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/VehicleTwoController.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/VehicleTwoController.java @@ -5,6 +5,7 @@ import cn.dev33.satoken.annotation.SaIgnore; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.nl.b_lms.pda.service.VehicleTwoService; +import org.nl.b_lms.pdm.subpackagerelation.service.IpdmBiSubpackagerelationService; import org.nl.b_lms.sch.point.service.IbstIvtPackageinfoivtService; import org.nl.modules.logging.annotation.Log; import org.springframework.beans.factory.annotation.Autowired; @@ -16,6 +17,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; +import java.util.Map; /** * @author liuxy @@ -29,8 +31,10 @@ public class VehicleTwoController { @Autowired private VehicleTwoService vehicleTwoService; - @Resource + @Autowired private IbstIvtPackageinfoivtService bstIvtPackageInfoIvtService; + @Autowired + private IpdmBiSubpackagerelationService subpackagerelationService; @PostMapping("/vehicleIn") @@ -69,4 +73,11 @@ public class VehicleTwoController { return new ResponseEntity<>(bstIvtPackageInfoIvtService.update(whereJson), HttpStatus.OK); } + @PostMapping("/toEndSub") + @Log("二期子卷包装解绑") + @SaIgnore + public ResponseEntity toEndSub(@RequestBody JSONObject whereJson) { + Map result = subpackagerelationService.toEndSubpackagerelation(whereJson.getString("container_name")); + return new ResponseEntity<>(result, HttpStatus.OK); + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/ProductOutTwoService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/ProductOutTwoService.java index d6e1824aa..59ed6c3ef 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/ProductOutTwoService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/ProductOutTwoService.java @@ -84,4 +84,10 @@ public interface ProductOutTwoService { */ List woodenBoxPoint(JSONObject whereJson); + /** + * 要出库的木箱明细 + * @param whereJson 、 + * @return 、 + */ + JSONObject boxOut(JSONObject whereJson); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/impl/ProductOutTwoServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/impl/ProductOutTwoServiceImpl.java index 0c0d53299..7136e178f 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/impl/ProductOutTwoServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/impl/ProductOutTwoServiceImpl.java @@ -13,11 +13,13 @@ import org.nl.b_lms.storage_manage.database.service.IBstIvtBoxinfoService; import org.nl.b_lms.storage_manage.database.service.IBstIvtBoxlashboundService; import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxlashbound; import org.nl.b_lms.storage_manage.database.service.dao.mapper.BstIvtBoxinfoMapper; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.OutBoxManageService; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.SpringContextHolder; import org.nl.wms.ext.acs.service.WmsToAcsService; import org.nl.wms.pda.st.service.impl.ProductionOutServiceImpl; +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; @@ -46,6 +48,9 @@ public class ProductOutTwoServiceImpl implements ProductOutTwoService { @Autowired private IPdmBiOrderbominfoService iPdmBiOrderbominfoService; + @Autowired + private OutBoxManageService outBoxManageService; + @Override public JSONObject ivtQuery(JSONObject whereJson) { @@ -190,4 +195,24 @@ public class ProductOutTwoServiceImpl implements ProductOutTwoService { } return null; } + + @Override + @Transactional(rollbackFor = Exception.class) + public JSONObject boxOut(JSONObject whereJson) { + // 判断当前是否有正在出库的空托盘任务 + JSONArray resultJSONArray = WQLObject.getWQLObject("sch_base_task") + .query("task_type = '010706' and task_status < '" + TaskStatusEnum.FINISHED.getCode() + "' and is_delete = '0'") + .getResultJSONArray(0); + + if (ObjectUtil.isNotEmpty(resultJSONArray)) { + throw new BadRequestException("当前正在执行空托盘出库任务,请稍后再出库!"); + } + + List data = whereJson.getJSONArray("data").toJavaList(JSONObject.class); + outBoxManageService.publicBoxOut(data); + + JSONObject result = new JSONObject(); + result.put("message", "下发出库成功!"); + return result; + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/service/IpdmBiSubpackagerelationService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/service/IpdmBiSubpackagerelationService.java index 31f6bde5c..1c41a8659 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/service/IpdmBiSubpackagerelationService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/service/IpdmBiSubpackagerelationService.java @@ -115,6 +115,13 @@ public interface IpdmBiSubpackagerelationService extends IService() + .eq("is_delete", "0") + .eq("point_code1", boxAttr.getString("struct_code")) + .lt("task_status", TaskStatusEnum.FINISHED.getCode())); + if (hasTask>0){ + throw new BadRequestException("当前空木箱"+boxSn+"存在正在执行的任务,稍后再操作"); + } + String task_group_id = null; if (boxAttr.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("深"))) { JSONObject 浅Attr = attrTab @@ -380,20 +392,20 @@ public class PdmBiSubpackagerelationServiceImpl extends ServiceImpl() + .eq("is_delete", "0") + .eq("point_code1", 浅Attr.getString("struct_code")) + .lt("task_status", TaskStatusEnum.FINISHED.getCode())); + if (浅Task == 0){ + task_group_id = outBoxManageService.createBoxMove(浅Attr); + } + }else { throw new BadRequestException("当前木箱所在货位"+boxAttr.getString("struct_code")+"对应浅货位存在任务"+浅Attr.getString("task_code")); } } } - int moveTask = taskService.count(new QueryWrapper() - .eq("task_type", "010704") - .eq("is_delete", "0") - .eq("point_code1", boxAttr.getString("struct_code")) - .lt("task_status", TaskStatusEnum.FINISHED.getCode())); - if (moveTask>0){ - throw new BadRequestException("当前子卷已经装箱入库"); - } + // 生成任务 JSONObject jsonTaskParam = new JSONObject(); jsonTaskParam.put("task_type", "010704"); @@ -701,6 +713,27 @@ public class PdmBiSubpackagerelationServiceImpl extends ServiceImpl().eq("container_name", code)); + if (containerName==null){ + throw new BadRequestException("当前子卷"+code+"还未生成子卷包装"); + } + if (SUBEnum.STATUS.code("入库").equals(containerName.getStatus()) + ||SUBEnum.STATUS.code("出库").equals(containerName.getStatus())){ + throw new BadRequestException("当前子卷"+code+"已完成出入库不允许手动解除"); + } + if (StringUtils.isNotEmpty(containerName.getPackage_box_sn())){ + result.put("message", code+"子卷包装解除成功,同时确认MES装箱以解绑定"); + } + this.removeById(containerName.getWorkorder_id()); + return result; + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutBoxExcepTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutBoxExcepTask.java new file mode 100644 index 000000000..cb67893ea --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutBoxExcepTask.java @@ -0,0 +1,198 @@ +package org.nl.b_lms.sch.tasks; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; +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.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +import static org.nl.wms.util.TaskUtil.getRoutePlanCode; + +/** + * 二期空木箱出库任务类(异常口) + * Created by Lxy on 2024/1/19. + */ +@Service +public class TwoOutBoxExcepTask extends AbstractAcsTask { + + /** + * 处理类 + */ + private final String THIS_CLASS = TwoOutBoxExcepTask.class.getName(); + + @Override + public List addTask() { + /* + * 下发给ACS时需要特殊处理 + */ + // 任务表 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONArray arr = taskTab.query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0' AND point_code2 = 'CK2001' order by create_time").getResultJSONArray(0); + + ArrayList resultList = new ArrayList<>(); + + for (int i = 0; i < arr.size(); i++) { + JSONObject json = arr.getJSONObject(i); + char dtl_type = json.getString("task_type").charAt(json.getString("task_type").length() - 1); + AcsTaskDto dto = AcsTaskDto.builder() + .ext_task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .route_plan_code(getRoutePlanCode(json.getString("point_code1"))) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code2")) + .vehicle_code2(json.getString("vehicle_code")) + .interaction_json(json.getJSONObject("request_param")) + .priority(json.getString("priority")) + .class_type(json.getString("task_type")) + .dtl_type(String.valueOf(dtl_type)) + .product_area(IOSEnum.PRODUCT_AREA.code("BLK")) + .remark(json.getString("remark")) + .build(); + resultList.add(dto); + + // 更新任务为下发 + JSONObject paramMap = new JSONObject(); + paramMap.put("task_status", TaskStatusEnum.ISSUE.getCode()); + taskTab.update(paramMap, "task_id ='" + json.getString("task_id") + "'"); + } + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + // 仓位表 + WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); + // 任务表 + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); + // 载具信息表 + WQLObject extTab = WQLObject.getWQLObject("md_pb_storagevehicleext"); + + JSONObject jsonTask = taskTab.query("task_id = '" + taskObj.getString("task_id") + "'").uniqueResult(0); + + // 更新任务的参数 + JSONObject map = new JSONObject(); + + /* + * 1-执行中, 2-完成 ,0-acs取消 + */ + // 执行中 + if (status.equals(TaskStatusEnum.EXECUTING.getCode())) { + + map.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + } + + // 完成 + if (status.equals(TaskStatusEnum.FINISHED.getCode())) { + map.put("task_status", TaskStatusEnum.FINISHED.getCode()); + // 更新仓位 + JSONObject jsonAttr = attrTab.query("struct_code = '" + jsonTask.getString("point_code1") + "'").uniqueResult(0); + jsonAttr.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定")); + jsonAttr.put("storagevehicle_code", ""); + attrTab.update(jsonAttr); + + // 更新载具信息表 + JSONObject param = new JSONObject(); + param.put("pcsn", ""); + extTab.update(param,"pcsn = '"+jsonTask.getString("vehicle_code") +"'"); + + } + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + if (taskObj.getIntValue("task_status") > Integer.valueOf(TaskStatusEnum.ISSUE.getCode())) { + throw new BadRequestException("任务已执行不能取消"); + } + // 更新任务表删除字段 + map.put("is_delete", IOSEnum.IS_NOTANDYES.code("是")); + // 解锁仓位 + JSONObject jsonAttr = attrTab.query("struct_code = '" + jsonTask.getString("point_code1") + "'").uniqueResult(0); + jsonAttr.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定")); + attrTab.update(jsonAttr); + } + map.put("update_optid", SecurityUtils.getCurrentUserId()); + map.put("update_optname", SecurityUtils.getCurrentNickName()); + map.put("update_time", DateUtil.now()); + WQLObject.getWQLObject("SCH_BASE_Task").update(map, "task_id = '" + taskObj.getString("task_id") + "'"); + } + + + @Override + public void findStartPoint() { + + } + + @Override + public void findNextPoint() { + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String createTask(JSONObject form) { + + if (StrUtil.isBlank(form.getString("task_type"))) { + throw new BadRequestException("业务类型不能为空!"); + } + + if (StrUtil.isBlank(form.getString("start_device_code"))) { + throw new BadRequestException("起点不能为空!"); + } + + if (StrUtil.isBlank(form.getString("next_device_code"))) { + throw new BadRequestException("终点不能为空!"); + } + + if (StrUtil.isBlank(form.getString("vehicle_code"))) { + throw new BadRequestException("木箱号不能为空!"); + } + + JSONObject json = new JSONObject(); + json.put("task_id", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_code", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_type", form.getString("task_type")); + json.put("vehicle_code", form.getString("vehicle_code")); + json.put("vehicle_code2", form.getString("vehicle_code2")); + json.put("vehicle_type", form.getString("vehicle_type")); + json.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + json.put("task_group_id", form.getLongValue("task_group_id")); + json.put("point_code1", form.getString("start_device_code")); + json.put("point_code2", form.getString("next_device_code")); + json.put("request_param", form.getString("request_param")); + json.put("handle_class", this.getClass().getName()); + json.put("create_id", SecurityUtils.getCurrentUserId()); + json.put("create_name", SecurityUtils.getCurrentUsername()); + json.put("create_time", DateUtil.now()); + json.put("priority", form.getString("priority")); + json.put("acs_task_type", "7"); + + WQLObject.getWQLObject("SCH_BASE_Task").insert(json); + return json.getString("task_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, IOSEnum.ACS_RESULT.code("取消")); + } +} 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 aa91ef545..929d732c8 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 @@ -16,6 +16,7 @@ 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.util.SlitterTaskUtil; import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; import org.nl.common.utils.SecurityUtils; import org.nl.common.utils.TaskUtils; @@ -111,17 +112,22 @@ public class SlitterDownTrussTask extends AbstractAcsTask { log.info("起点数据:{}", point1); log.info("终点数据:{}", point2); // 更新分切计划 - // 下来的分切计划状态:06 -> 09 - PdmBiSlittingproductionplan p = new PdmBiSlittingproductionplan(); - p.setStatus("09"); - p.setEnd_time(DateUtil.now()); - TaskUtils.updateOptMessageBySlitterPlan(p); + // 下来的分切计划状态:06 -> 09, 设置重量 List downQzzNos = Stream.of(tmpUpQzzNo, tmpDownQzzNo) .filter(value -> value != null && !value.isEmpty()).collect(Collectors.toList()); log.info("即将下卷的上下轴的气胀轴编码数据:{}", downQzzNos); - slittingproductionplanService.update(p, new LambdaQueryWrapper() - .in(PdmBiSlittingproductionplan::getQzzno, downQzzNos)); + List downPlans = slittingproductionplanService.getByQzzNos(downQzzNos); + SlitterTaskUtil.setPaperWeightStr(point1.getRemark(), downPlans); + downPlans.forEach(downPlan -> { + downPlan.setStatus("09"); + downPlan.setEnd_time(DateUtil.now()); + TaskUtils.updateOptMessageBySlitterPlan(downPlan); + }); + slittingproductionplanService.updateBatchById(downPlans); + // 设置完了就清空 + point1.setRemark(""); // 上去的分切计划状态:04 -> 05 + PdmBiSlittingproductionplan p = new PdmBiSlittingproductionplan(); p.setStatus("05"); p.setEnd_time(""); List upQzzNos = Stream.of(point2.getQzz_no1(), point2.getQzz_no2()) @@ -130,6 +136,8 @@ public class SlitterDownTrussTask extends AbstractAcsTask { if (upQzzNos.size() > 0) { List plans = slittingproductionplanService.getByQzzNos(upQzzNos); PdmBiSlittingproductionplan pp = plans.get(0); + // 需要把重量记录到分切机上 + point1.setRemark(SlitterTaskUtil.getPaperWeightStr(plans)); if (pp.getContainer_name().contains("虚拟")) { // 如果是虚拟卷,需要执行删除标记,并且清空数据 // 将分切计划删除,设备禁用 @@ -142,7 +150,6 @@ public class SlitterDownTrussTask extends AbstractAcsTask { }); slittingproductionplanService.updateBatchById(plans); // 设备禁用 - point1.setIs_used("0"); point1.setUp_qzzno(""); point1.setDown_qzzno(""); } else { 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 4226e685a..a8b0c3e37 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 @@ -15,6 +15,7 @@ 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.util.SlitterTaskUtil; import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; import org.nl.common.utils.SecurityUtils; import org.nl.common.utils.TaskUtils; @@ -112,6 +113,7 @@ public class UpShaftTrussTask extends AbstractAcsTask { .filter(value -> value != null && !value.isEmpty()).collect(Collectors.toList()); List plans = slittingproductionplanService.getByQzzNos(collect); PdmBiSlittingproductionplan pp = plans.get(0); + String weightStr = SlitterTaskUtil.getPaperWeightStr(plans); if (pp.getContainer_name().contains("虚拟")) { // 如果是虚拟卷,需要执行删除标记,并且清空数据 // 将分切计划删除,设备禁用 @@ -124,7 +126,6 @@ public class UpShaftTrussTask extends AbstractAcsTask { }); slittingproductionplanService.updateBatchById(plans); // 设备禁用 - point2.setIs_used("0"); point2.setUp_qzzno(""); point2.setDown_qzzno(""); } else { @@ -134,6 +135,7 @@ public class UpShaftTrussTask extends AbstractAcsTask { slittingproductionplanService.update(p, new LambdaQueryWrapper() .in(PdmBiSlittingproductionplan::getQzzno, collect)); } + point2.setRemark(weightStr); cutpointivtService.updateById(point2); point1.setQzz_no1(""); point1.setQzz_no2(""); 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 948367fe2..d965952d2 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 @@ -514,19 +514,19 @@ public class SlitterServiceImpl implements SlitterService { String area = device.getProduct_area(); // 获取当前分切机的下一组分切计划(最多四条分切计划) // 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)); - log.info("获取下一组分切计划(可能存在脏数据):{}", timePlans); +// List timePlans = slittingproductionplanService.list( +// new LambdaQueryWrapper() +// .eq(PdmBiSlittingproductionplan::getResource_name, actualDeviceCode) +// .eq(PdmBiSlittingproductionplan::getStatus, "03") +// .eq(PdmBiSlittingproductionplan::getIs_delete, "0") +// .orderByAsc(PdmBiSlittingproductionplan::getUpdate_time)); +// log.info("获取下一组分切计划(可能存在脏数据):{}", timePlans); // 寻找备好轴的对接点位 - List cutPointList = slitterMapper.getReadyShaftPoint(device.getExt_code()); + List cutPointList = slitterMapper.getReadyShaftPoint(actualDeviceCode); // 任务参数 JSONObject taskParam = new JSONObject(); taskParam.put("containers", containers); - if (timePlans.size() == 0 || cutPointList.size() == 0) { + if (cutPointList.size() == 0) { // 如果没有下一组的分切计划,就只做下卷任务(判断下单/下双) // 获取分切对接位没任务的空位置 List emptyPoints = slitterMapper.getEmptyCutPointNotTask(area, @@ -580,19 +580,16 @@ public class SlitterServiceImpl implements SlitterService { } } } - PdmBiSlittingproductionplan tmpPlan = timePlans.get(0); - // hint: 以第一条为准,过滤和第一条同组同母卷的分切计划 - List nextPlans = timePlans.stream() - .filter(plan -> plan.getParent_container_name().equals(tmpPlan.getParent_container_name()) - && plan.getRestruct_container_name().equals(tmpPlan.getRestruct_container_name()) - && plan.getSplit_group().equals(tmpPlan.getSplit_group())) + // 找到该分切计划的点位 + BstIvtCutpointivt newCutPoint = cutPointList.get(0); + List qzznos = Stream.of(newCutPoint.getQzz_no1(), newCutPoint.getQzz_no2()).filter(ObjectUtil::isNotEmpty) .collect(Collectors.toList()); + // hint: 以第一条为准,过滤和第一条同组同母卷的分切计划 + List nextPlans = slittingproductionplanService.getByQzzNos(qzznos); log.info("获取下一趟分切计划数据:{}", nextPlans); // 筛选上下轴各一条 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); - // 找到该分切计划的点位 - BstIvtCutpointivt newCutPoint = cutPointList.get(0); String binaryExpress = TaskUtils.binaryConvertExpress(currentUpPlan, currentDownPlan, nextUpPlan, nextDownPlan); switch (binaryExpress) { case "00": diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/util/SlitterTaskUtil.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/util/SlitterTaskUtil.java index 502dd496f..1e7be5bc3 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/util/SlitterTaskUtil.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/util/SlitterTaskUtil.java @@ -9,6 +9,8 @@ import org.nl.b_lms.pdm.bi.slittingproductionplan.service.dao.PdmBiSlittingprodu import org.nl.b_lms.sch.tasks.slitter.constant.SlitterConstant; import org.nl.modules.common.exception.BadRequestException; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -308,4 +310,103 @@ public class SlitterTaskUtil { String[] split = paperStr.replaceAll("\\|[\\u4e00-\\u9fa5]+$", "").split("\\|"); return split[split.length - 1]; } + + /** + * 设置重量 + * @param plans 分切计划 + * @return 0,0,0,0 + */ + public static void setPaperWeightStr(String weightStr, List plans) { + // 1. 校验输入格式 + String[] parts = weightStr.split(","); + if (parts.length != 4) { + // 没有数据则不修改 + return; + } + + // 2. 遍历四个位置 + for (int index = 0; index < 4; index++) { + // 解析重量值(自动四舍五入到两位小数) + String strValue = parts[index]; + BigDecimal value; + try { + value = new BigDecimal(strValue).setScale(2, RoundingMode.HALF_UP); + } catch (NumberFormatException e) { + continue; // 跳过无效数值 + } + + // 3. 根据索引确定位置规则 + String expectedUp, expectedLeft; + switch (index) { + case 0: // 上左 + expectedUp = "1"; + expectedLeft = "1"; + break; + case 1: // 上右 + expectedUp = "1"; + expectedLeft = "2"; + break; + case 2: // 下左 + expectedUp = "2"; + expectedLeft = "1"; + break; + case 3: // 下右 + expectedUp = "2"; + expectedLeft = "2"; + break; + default: + throw new IllegalStateException("非法索引: " + index); + } + + // 4. 在集合中查找匹配项并更新 + for (PdmBiSlittingproductionplan plan : plans) { + if (expectedUp.equals(plan.getUp_or_down()) && + expectedLeft.equals(plan.getLeft_or_right())) { + plan.setPaper_weight(value.toString()); + break; // 找到后跳出循环 + } + } + } + } + + /** + * 获取重量 + * @param plans 分切计划 + * @return 0,0,0,0 + */ + public static String getPaperWeightStr(List plans) { + String[] weights = new String[4]; + Arrays.fill(weights, "0"); + + for (PdmBiSlittingproductionplan plan : plans) { + // 1. 获取重量并四舍五入 + String weightStr = plan.getPaper_weight(); + BigDecimal weight; + try { + weight = new BigDecimal(weightStr); + } catch (Exception e) { + continue; + } + BigDecimal rounded = weight.setScale(2, RoundingMode.HALF_UP); + + // 2. 根据位置确定数组索引 + String upDown = plan.getUp_or_down(); + String leftRight = plan.getLeft_or_right(); + int index = -1; + + if ("1".equals(upDown)) { + index = ("1".equals(leftRight)) ? 0 : 1; + } else { + index = ("1".equals(leftRight)) ? 2 : 3; + } + + // 3. 更新对应位置的重量(格式化为两位小数) + if (index >= 0 && index < 4) { + weights[index] = rounded.toString(); + } + } + + // 4. 拼接结果字符串 + return String.join(",", weights); + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutBoxManageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutBoxManageServiceImpl.java index ecefd6d26..131d7a9dd 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutBoxManageServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutBoxManageServiceImpl.java @@ -8,6 +8,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.TwoExcepionalMoveTask; import org.nl.b_lms.sch.tasks.TwoMoveBoxTask; +import org.nl.b_lms.sch.tasks.TwoOutBoxExcepTask; import org.nl.b_lms.sch.tasks.TwoOutBoxTask; import org.nl.b_lms.storage_manage.database.service.IBstIvtBoxinfoService; import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxinfo; @@ -210,7 +211,7 @@ public class OutBoxManageServiceImpl implements OutBoxManageService { throw new BadRequestException("此木箱没有绑定托盘号!"+jsonAttr.getString("storagevehicle_code")); } // 锁定起点 - jsonAttr.put("lock_type", IOSEnum.LOCK_TYPE.code("木箱出库锁")); + jsonAttr.put("lock_type", IOSEnum.LOCK_TYPE.code("验箱出库锁")); attrTab.update(jsonAttr); // 清空缓存 notOutRowList.clear(); @@ -737,4 +738,132 @@ public class OutBoxManageServiceImpl implements OutBoxManageService { return jsonTaskParam.getString("task_group_id"); } + @Override + @Transactional(rollbackFor = Exception.class) + public void publicBoxOut(List list) { + WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); + WQLObject extTab = WQLObject.getWQLObject("md_pb_storagevehicleext"); + + // 查询需要出库的仓位信息 + String struct_code_in = list.stream() + .map(row -> row.getString("struct_code")) + .collect(Collectors.joining("','")); + + List attrList = attrTab.query("struct_code in ('" + struct_code_in + "') AND sect_code = 'BZC01'") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + // 获取这些仓位的每排仓位 + String row_num_in = attrList.stream() + .map(row -> row.getString("row_num")) + .distinct() + .collect(Collectors.joining("','")); + + List allList = attrTab.query("row_num IN ('" + row_num_in + "') AND sect_code = 'BZC01' AND is_delete = '0'") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + // 查询木箱对应的托盘号 + String box_no_in = list.stream() + .map(row -> row.getString("box_no")) + .collect(Collectors.joining("','")); + + List extList = extTab.query("pcsn IN ('" + box_no_in + "')") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + // 需要移库的木箱仓位 + ArrayList moveList = new ArrayList<>(); + + // 创建任务 + for (JSONObject json : attrList) { + // 判断是否是深货位 + if (json.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("深"))) { + // 查询对应的浅货位 + JSONObject jsonShallow = allList.stream() + .filter(row -> row.getString("row_num").equals(json.getString("row_num")) && + row.getString("col_num").equals(json.getString("col_num")) && + row.getString("layer_num").equals(json.getString("layer_num")) && + row.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("浅")) + ) + .findFirst().orElse(null); + if (ObjectUtil.isEmpty(jsonShallow)) { + throw new BadRequestException("仓位【"+json.getString("struct_code")+"】对应的浅货位信息错误!"); + } + + // 判断浅货位是否有空木箱 + if (ObjectUtil.isNotEmpty(jsonShallow.getString("storagevehicle_code"))) { + // 判断是否是当前需要出库的集合当中 + int size = (int) attrList.stream() + .filter(row -> row.getString("struct_code").equals(jsonShallow.getString("struct_code"))).count(); + + // 不在要出库的集合当中 + if (size == 0) { + // 判断是否被锁定 + if (jsonShallow.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) { + // 加入要移库的集合当中 + moveList.add(jsonShallow); + } else if (!jsonShallow.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("木箱出库锁")) + && (!jsonShallow.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("移出锁"))) + ) { + throw new BadRequestException("仓位【"+jsonShallow.getString("struct_code")+"】被锁定,无法生成移库任务!"); + } + } + } + } + // 校验木箱是否绑定了托盘 + JSONObject jsonExt = extList.stream() + .filter(row -> row.getString("pcsn").equals(json.getString("storagevehicle_code"))) + .findFirst().orElse(null); + + if (ObjectUtil.isEmpty(jsonExt)) { + throw new BadRequestException("此木箱【"+json.getString("storagevehicle_code")+"】没有绑定托盘,请核查"); + } + + // 创建任务 + JSONObject jsonTaskParam = new JSONObject(); + jsonTaskParam.put("task_type", "010704"); + jsonTaskParam.put("start_device_code", json.getString("struct_code")); + jsonTaskParam.put("next_device_code", IOSEnum.EXCEP_OUT.code("异常出库口")); + jsonTaskParam.put("vehicle_code", json.getString("storagevehicle_code")); + jsonTaskParam.put("vehicle_code2", jsonExt.getString("storagevehicle_code")); + jsonTaskParam.put("task_group_id", IdUtil.getStringId()); + jsonTaskParam.put("priority", json.getString("zdepth")); + JSONObject request_param = new JSONObject(); + request_param.put("containerType", json.getString("storagevehicle_type")); + jsonTaskParam.put("request_param", request_param.toString()); + TwoOutBoxExcepTask twoOutBoxExcepTask = new TwoOutBoxExcepTask(); + twoOutBoxExcepTask.createTask(jsonTaskParam); + + // 更新仓位锁定状态 + json.put("lock_type", IOSEnum.LOCK_TYPE.code("木箱出库锁")); + attrTab.update(json); + } + + // 查询移库木箱对应的托盘 + String storagevehicle_code_in = moveList.stream() + .map(row -> row.getString("storagevehicle_code")) + .collect(Collectors.joining("','")); + List extMoveList = extTab.query("pcsn IN ('" + storagevehicle_code_in + "')") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + // 此循环为防止下发一部分后报错无法回滚 + moveList.forEach(item -> { + // 校验木箱和托盘是否绑定 + JSONObject jsonExtMove = extMoveList.stream() + .filter(row -> row.getString("pcsn").equals(item.getString("storagevehicle_code"))) + .findFirst().orElse(null); + + if (ObjectUtil.isEmpty(jsonExtMove)) { + throw new BadRequestException("此移库木箱【"+jsonExtMove.getString("storagevehicle_code")+"】没有绑定托盘,请核查"); + } + }); + + // 生成移库任务 + for (JSONObject jsonMove : moveList) { + // 调用接口生成木箱移库任务 + this.createBoxMove(jsonMove); + } + + // 下发木箱出库任务 + new TwoOutBoxExcepTask().immediateNotifyAcs(null); + } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/OutBoxManageService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/OutBoxManageService.java index 3f979a9be..bee2a6954 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/OutBoxManageService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/OutBoxManageService.java @@ -2,6 +2,8 @@ package org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service; import com.alibaba.fastjson.JSONObject; +import java.util.List; + /** *

* 空木箱业务处理 服务类 @@ -52,4 +54,10 @@ public interface OutBoxManageService { */ public String createBoxMove(JSONObject jsonObject); + /** + * 根据木箱号出库公共方法(多条数据) + * @param list 需要出库的木箱集合 + */ + void publicBoxOut(List list); + } diff --git a/lms/nladmin-system/src/main/java/org/nl/system/service/user/dao/mapper/SysUserMapper.xml b/lms/nladmin-system/src/main/java/org/nl/system/service/user/dao/mapper/SysUserMapper.xml index 73cc228e7..e073f6a82 100644 --- a/lms/nladmin-system/src/main/java/org/nl/system/service/user/dao/mapper/SysUserMapper.xml +++ b/lms/nladmin-system/src/main/java/org/nl/system/service/user/dao/mapper/SysUserMapper.xml @@ -25,38 +25,40 @@ sys_user.extuser_id as extuserId - INSERT INTO sys_user_data_permission(user_id, permission_scope_type, permission_id) - VALUES (#{dataPermission.user_id}, #{dataPermission.permission_scope_type}, #{dataPermission.permission_id}) + INSERT INTO sys_user_data_permission(user_id, permission_scope_type, permission_id) VALUES (#{dataPermission.user_id}, #{dataPermission.permission_scope_type}, #{dataPermission.permission_id}) - DELETE - FROM sys_user_data_permission - WHERE user_id = #{userId} + DELETE FROM sys_user_data_permission WHERE user_id = #{userId} - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - +