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/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..4f280fb72 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,6 +13,7 @@ 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; @@ -46,6 +47,9 @@ public class ProductOutTwoServiceImpl implements ProductOutTwoService { @Autowired private IPdmBiOrderbominfoService iPdmBiOrderbominfoService; + @Autowired + private OutBoxManageService outBoxManageService; + @Override public JSONObject ivtQuery(JSONObject whereJson) { @@ -190,4 +194,15 @@ public class ProductOutTwoServiceImpl implements ProductOutTwoService { } return null; } + + @Override + @Transactional(rollbackFor = Exception.class) + public JSONObject boxOut(JSONObject whereJson) { + 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/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/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..3c42fe5be 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; @@ -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); + }