From 2f79ccca13ea04917fc1164c1a3ca683fded2f8d Mon Sep 17 00:00:00 2001 From: zhouz <> Date: Wed, 24 Sep 2025 17:47:50 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E6=8D=A2=E6=A0=87=E5=87=BA=E5=85=A5?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pda/controller/VehicleTwoController.java | 7 + .../b_lms/pda/service/VehicleTwoService.java | 2 + .../service/impl/VehicleTwoServiceImpl.java | 177 +++++++++++++++--- .../org/nl/b_lms/sch/tasks/TwoOutTask.java | 16 +- .../storage_manage/ios/enums/IOSEnum.java | 4 +- .../impl/StIvtIostorinvOutServiceImpl.java | 15 +- 6 files changed, 187 insertions(+), 34 deletions(-) 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 d0538eeac..0e47b395a 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 @@ -104,4 +104,11 @@ public class VehicleTwoController { .collect(Collectors.toCollection(JSONArray::new)); return new ResponseEntity<>(jsonArray, HttpStatus.OK); } + + @PostMapping("/relabel") + @Log("换标出库") + @SaIgnore + public ResponseEntity Relabel(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(vehicleTwoService.relabel(whereJson), HttpStatus.OK); + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/VehicleTwoService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/VehicleTwoService.java index 92910b437..fdea4676d 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/VehicleTwoService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/VehicleTwoService.java @@ -52,4 +52,6 @@ public interface VehicleTwoService { * @return :JSONObject:返回前端参数~ */ JSONObject reback(JSONObject whereJson); + + JSONObject relabel(JSONObject whereJson); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/impl/VehicleTwoServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/impl/VehicleTwoServiceImpl.java index bbefbee98..5c9a6343a 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/impl/VehicleTwoServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/impl/VehicleTwoServiceImpl.java @@ -1,6 +1,8 @@ package org.nl.b_lms.pda.service.impl; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,30 +17,36 @@ import org.nl.b_lms.sch.point.service.IschBasePointService; 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.TwoInEmpExcepTask; +import org.nl.b_lms.sch.tasks.TwoOutTask; import org.nl.b_lms.storage_manage.database.service.IBstIvtBoxinfoService; import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxinfo; import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvOutService; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.mapper.StIvtIostorinvdisMapper; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.impl.StIvtIostorinvOutServiceImpl; import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.InBoxManageService; import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.InBussManageService; import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.InVehicleManageService; import org.nl.common.enums.SpecEnum; +import org.nl.common.utils.SecurityUtils; 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.system.service.param.dao.Param; import org.nl.system.service.param.impl.SysParamServiceImpl; import org.nl.wms.basedata.st.service.StructattrService; +import org.nl.wms.basedata.st.service.dto.StructattrDto; import org.nl.wms.ext.acs.service.WmsToAcsService; import org.nl.wms.ext.mes.service.LmsToMesService; import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.util.TranUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; +import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; @Service @@ -69,8 +77,6 @@ public class VehicleTwoServiceImpl implements VehicleTwoService { @Autowired private LmsToMesService lmsToMesService; - - /** * 点位服务 */ @@ -82,6 +88,15 @@ public class VehicleTwoServiceImpl implements VehicleTwoService { @Autowired private IPdmBiContainerinboundService iPdmBiContainerinboundService; + @Autowired + private IStIvtIostorinvOutService iStIvtIostorinvOutService; + + @Autowired + private StIvtIostorinvdisMapper stIvtIostorinvdisMapper; + + @Autowired + private StructattrService structattrService; + @Override @Transactional(rollbackFor = Exception.class) public JSONObject vehicleIn(JSONObject whereJson) { @@ -183,9 +198,9 @@ public class VehicleTwoServiceImpl implements VehicleTwoService { public JSONObject boxIn(JSONObject whereJson) { // 调用接口 String startCode = whereJson.getString("point_code"); - if ("MXRKW1".equals(startCode)){ + if ("MXRKW1".equals(startCode)) { inBoxManageService.boxBinVehicle(whereJson); - }else if ("THRKDJW1".equals(startCode)){ + } else if ("THRKDJW1".equals(startCode)) { inBoxManageService.boxBinVehicleByTHRK(whereJson); } JSONObject result = new JSONObject(); @@ -211,10 +226,11 @@ public class VehicleTwoServiceImpl implements VehicleTwoService { String a = JSONObject.toJSONString(msg); List list = JSONObject.parseObject(a, List.class); Optional 称重 = list.stream().filter(m -> m.contains("称重")).findAny(); - if (称重.isPresent()){ + if (称重.isPresent()) { System.out.println(称重.get()); } } + @Override @Transactional(rollbackFor = Exception.class) public JSONObject reback(JSONObject whereJson) { @@ -223,25 +239,25 @@ public class VehicleTwoServiceImpl implements VehicleTwoService { String bill_type = whereJson.getString("bill_type"); whereJson.put("material_barcode", whereJson.getString("box_no")); whereJson.put("device_code", whereJson.getString("point_code")); - if ("RK1002".equals(whereJson.getString("point_code"))){ + if ("RK1002".equals(whereJson.getString("point_code"))) { List list = ischBaseTaskService.list(new QueryWrapper() .select("task_id") .eq("point_code2", "RK1004") .eq("task_type", "010706") .eq("is_delete", "0") .lt("task_status", TaskStatusEnum.FINISHED.getCode())); - if (!CollectionUtils.isEmpty(list)){ - throw new BadRequestException("稍后再试,异常口存在正在执行的任务"+ list.stream().map(SchBaseTask::getTask_id).collect(Collectors.joining(","))); + if (!CollectionUtils.isEmpty(list)) { + throw new BadRequestException("稍后再试,异常口存在正在执行的任务" + list.stream().map(SchBaseTask::getTask_id).collect(Collectors.joining(","))); } Param forceWeight = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("force_weight"); - if (forceWeight!=null && "1".equals(forceWeight.getValue())){ + if (forceWeight != null && "1".equals(forceWeight.getValue())) { PdmBiContainerinbound one = iPdmBiContainerinboundService.getOne(new QueryWrapper() .eq("box", whereJson.getString("box_no"))); - if (one!=null && !StringUtils.isEmpty(one.getRemark())){ + if (one != null && !StringUtils.isEmpty(one.getRemark())) { List remark = JSONObject.parseObject(one.getRemark(), List.class); Optional 称重 = remark.stream().filter(m -> m.contains("称重")).findAny(); - if (称重.isPresent()){ - throw new BadRequestException("开启称重强制校验"+称重.get()); + if (称重.isPresent()) { + throw new BadRequestException("开启称重强制校验" + 称重.get()); } } } @@ -254,12 +270,21 @@ public class VehicleTwoServiceImpl implements VehicleTwoService { whereJson.put("bill_type", IOSEnum.IN_TYPE.code("生产入库")); } else if (bill_type.equals("0009")) { whereJson.put("bill_type", IOSEnum.IN_TYPE.code("手工入库")); + } else if (bill_type.equals("0012")) { + whereJson.put("bill_type", IOSEnum.IN_TYPE.code("换标入库")); } whereJson.put("box_no", whereJson.getString("box_no")); JSONArray resultJSONArray = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("package_box_sn = '" + whereJson.getString("material_barcode") + "' AND status in ('0','1')").getResultJSONArray(0); if (ObjectUtil.isEmpty(resultJSONArray)) { throw new BadRequestException("未查询到子卷包装信息!"); } + String sub_type = resultJSONArray.getJSONObject(0).getString("sub_type"); + if (ObjectUtil.isNotEmpty(sub_type) && sub_type.equals("9") && !bill_type.equals("0012")) { + throw new BadRequestException("当前木箱是换标进行出库的,只能进行换标入库!"); + } + if ((ObjectUtil.isEmpty(sub_type) || !sub_type.equals("9")) && bill_type.equals("0012")) { + throw new BadRequestException("当前木箱不是换标进行出库的,不能进行换标入库!"); + } String material_barcode = ""; List subs = new ArrayList<>(); for (int i = 0; i < resultJSONArray.size(); i++) { @@ -305,30 +330,140 @@ public class VehicleTwoServiceImpl implements VehicleTwoService { // 更新载具对应木箱信息 JSONObject jsonExt = extTab.query("storagevehicle_code = '" + whereJson.getString("vehicle_code") + "'").uniqueResult(0); if (ObjectUtil.isEmpty(jsonExt)) { - throw new BadRequestException("载具不存在!"+whereJson.getString("vehicle_code")); + throw new BadRequestException("载具不存在!" + whereJson.getString("vehicle_code")); } int hasTask = ischBaseTaskService.count(new QueryWrapper() .eq("is_delete", "0") .eq("vehicle_code2", whereJson.getString("vehicle_code")) .lt("task_status", TaskStatusEnum.FINISHED.getCode())); - if (hasTask>0){ - throw new BadRequestException("托盘"+whereJson.getString("vehicle_code")+"存在执行的任务"); + if (hasTask > 0) { + throw new BadRequestException("托盘" + whereJson.getString("vehicle_code") + "存在执行的任务"); } String pcsn = jsonExt.getString("pcsn"); - if (StringUtils.isNotEmpty(pcsn)){ + if (StringUtils.isNotEmpty(pcsn)) { JSONArray stIvtStructattr = WQLObject.getWQLObject("st_ivt_structattr").query("storagevehicle_code = '" + pcsn + "'").getResultJSONArray(0); if (stIvtStructattr != null && stIvtStructattr.size() > 0) { - throw new BadRequestException("当前托盘"+whereJson.getString("vehicle_code")+"已经绑定木箱"+pcsn); + throw new BadRequestException("当前托盘" + whereJson.getString("vehicle_code") + "已经绑定木箱" + pcsn); } } jsonExt.put("pcsn", whereJson.getString("box_no")); extTab.update(jsonExt); inBussManageService.inTask(whereJson); - PdmProductSpecServiceImpl.doRecord(SpecEnum.RK_YC,null,Boolean.TRUE,null,subs); + HashMap sub_map = new HashMap(); + sub_map.put("sub_type", "0"); + WQLObject.getWQLObject("pdm_bi_subpackagerelation").update(sub_map, "package_box_sn = '" + whereJson.getString("box_no")+"'"); + PdmProductSpecServiceImpl.doRecord(SpecEnum.RK_YC, null, Boolean.TRUE, null, subs); JSONObject result = new JSONObject(); result.put("message", "入库成功!"); return result; } + @Override + public JSONObject relabel(JSONObject whereJson) { + String box_no = whereJson.getString("box_no"); + + JSONObject jsonMst = new JSONObject(); + jsonMst.put("detail_count", 1); + jsonMst.put("bill_status", "10"); + jsonMst.put("create_mode", "03"); + jsonMst.put("bill_type", "1012"); + jsonMst.put("biz_date", DateUtil.now()); + jsonMst.put("user", "sap"); + + JSONArray dtls = new JSONArray(); + if (StrUtil.isEmpty("package_box_sn")) { + throw new BadRequestException("输入的木箱号不能为空!"); + } + JSONObject sub_jo = WQLObject.getWQLObject("PDM_BI_SubPackageRelation").query("package_box_sn = '" + box_no + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(sub_jo)) { + throw new BadRequestException("LMS中不存在木箱号为【" + box_no + "】的包装关系"); + } + String container_name = sub_jo.getString("container_name"); + JSONObject struct_ivt = WQLObject.getWQLObject("st_ivt_structivt").query("pcsn = '" + container_name + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(struct_ivt)) { + throw new BadRequestException("子卷号为【" + container_name + "】的成品卷不存在或已经出库!"); + } else { + if (struct_ivt.getDoubleValue("frozen_qty") > 0) { + throw new BadRequestException("子卷号为【" + container_name + "】的成品卷已经被分配或出库中"); + } else { + JSONObject dtl = new JSONObject(); + //查询该物料 + JSONObject mater_jo = WQLObject.getWQLObject("md_me_materialbase").query("material_code = '" + sub_jo.getString("product_name") + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(mater_jo)) { + throw new BadRequestException("未查询到物料:" + sub_jo.getString("product_name") + ",信息!"); + } + dtl.put("material_id", mater_jo.getString("material_id")); + dtl.put("pcsn", container_name); + dtl.put("box_no", sub_jo.getString("package_box_sn")); + JSONObject unit = WQLObject.getWQLObject("md_pb_measureunit").query("measure_unit_id = '" + mater_jo.getString("base_unit_id") + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(unit)) { + throw new BadRequestException("未查询到物料计量单位:" + mater_jo.getString("base_unit_id") + ",信息!"); + } + dtl.put("qty_unit_id", unit.getString("measure_unit_id")); + dtl.put("qty_unit_name", unit.getString("unit_name")); + dtl.put("plan_qty", sub_jo.getString("net_weight")); + dtls.add(dtl); + } + } + + StructattrDto structCode = structattrService.findByCode(struct_ivt.getString("struct_code")); + jsonMst.put("stor_id", structCode.getStor_id()); + jsonMst.put("stor_code", structCode.getStor_code()); + jsonMst.put("stor_name", structCode.getStor_name()); + jsonMst.put("tableData", dtls); + if (!structCode.getSect_code().equals("BZC01")){ + throw new BadRequestException("只能针对兰州二期仓库的木箱进行换标出库!"); + } + String iostorinv_id = iStIvtIostorinvOutService.insertMst(jsonMst); + + //调用自动分配 + JSONObject out_jo = new JSONObject(); + out_jo.put("iostorinv_id", iostorinv_id); + out_jo.put("div_type", "1"); + iStIvtIostorinvOutService.allDiv(out_jo); + whereJson.put("iostorinv_id", iostorinv_id); + StIvtIostorinvOutServiceImpl bean = SpringContextHolder.getBean(StIvtIostorinvOutServiceImpl.class); + //调用下发任务逻辑 + ArrayList arr = new ArrayList<>(); + TranUtil.openTransaction((req, allTransactionConsumer) -> { + // 查询此明细所有未生成的分配明细 + List disDaoList = stIvtIostorinvdisMapper.getNotCreateDis(whereJson); + + if (ObjectUtil.isEmpty(disDaoList)) { + throw new BadRequestException("当前没有可设置的分配明细!"); + } + + /* + * 下发任务 + * 1.根据木箱 长、宽、高、订单号、物料分组 + * 2.相同木箱规格、订单号、物料的木箱一个任务组 + */ + // 定义一个函数,将需要分组的元素映射到一个建的集合里 + Function> compositeKey = row -> + Arrays.asList(row.getString("box_length"), row.getString("box_width"), + row.getString("box_high"), row.getString("sale_order_name"), + row.getString("material_id") + ); + + Map, List> groupingDisMap = + disDaoList.stream().collect(Collectors.groupingBy(compositeKey, Collectors.toList())); + + for (List disLikeList : groupingDisMap.values()) { + // 调用任务生成处理 + List taskMangeList = bean.createTaskMange2(disLikeList, iostorinv_id, allTransactionConsumer); + + // 创建任务并下发一组任务 + bean.createTask2(taskMangeList, disLikeList, "RK1003", allTransactionConsumer); + + allTransactionConsumer.accept("finish"); + } + return arr; + }, new JSONArray()); + SpringContextHolder.getBean(TwoOutTask.class).immediateNotifyAcs(null); + + JSONObject result = new JSONObject(); + result.put("message", "出库成功!"); + return result; + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutTask.java index 3ad577019..ffda475e2 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutTask.java @@ -197,13 +197,15 @@ public class TwoOutTask extends AbstractAcsTask { jsonExt.put("inv_code", ""); attrTab.update(jsonExt); } - JSONObject jsonParam = new JSONObject(); - jsonParam.put("device_code",jsonTask.getString("point_code2")); - jsonParam.put("vehicle_code",jsonTask.getString("vehicle_code")); - jsonParam.put("task_group_id",jsonTask.getString("task_group_id")); - jsonParam.put("vehicle_type",jsonTask.getJSONObject("request_param").getString("containerType")); - LashManageServiceImpl bean1 = SpringContextHolder.getBean(LashManageServiceImpl.class); - bean1.createHeapTask(jsonParam); + if (!jsonTask.getString("point_code2").equals("RK1003")){ + JSONObject jsonParam = new JSONObject(); + jsonParam.put("device_code",jsonTask.getString("point_code2")); + jsonParam.put("vehicle_code",jsonTask.getString("vehicle_code")); + jsonParam.put("task_group_id",jsonTask.getString("task_group_id")); + jsonParam.put("vehicle_type",jsonTask.getJSONObject("request_param").getString("containerType")); + LashManageServiceImpl bean1 = SpringContextHolder.getBean(LashManageServiceImpl.class); + bean1.createHeapTask(jsonParam); + } // 判断此任务组是否全部完成 JSONArray resultJSONArray = taskTab.query("task_group_id = '" + jsonTask.getString("task_group_id") + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "' and handle_class = '"+THIS_CLASS+"'") .getResultJSONArray(0); diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/enums/IOSEnum.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/enums/IOSEnum.java index 6de79e0a5..610ee8ec5 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/enums/IOSEnum.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/enums/IOSEnum.java @@ -37,13 +37,13 @@ public enum IOSEnum { //入库单据类型 IN_TYPE(MapOf.of("生产入库", "0001", "退货入库", "0002", "报废入库", "0003", "调拨入库", "0004", - "拆箱入库", "0005", "返检入库", "0006", "改切入库", "0007", "手工入库", "0009" + "拆箱入库", "0005", "返检入库", "0006", "改切入库", "0007", "手工入库", "0009", "换标入库", "0012" )), //出库单据类型 OUT_TYPE(MapOf.of("发货出库", "1001", "改切出库", "1003", "调拨出库", "1004", "拆箱出库", "1005", "返检出库", "1006", "超期报废", "1007", "退货报废", "1008", "质量问题报废", "1010", "其他报废", "1002", - "手工出库", "1009","管控出库", "1099" + "手工出库", "1009","管控出库", "1099","换标出库", "1012" )), //移库单据类型 diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvOutServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvOutServiceImpl.java index 54775a766..3b3250612 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvOutServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvOutServiceImpl.java @@ -925,12 +925,16 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl 生成任务的集合 */ - private List createTaskMange2(List disLikeList, String iostorinv_id, Consumer allTransactionConsumer) { + public List createTaskMange2(List disLikeList, String iostorinv_id, Consumer allTransactionConsumer) { // 仓位表 WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); @@ -1781,7 +1785,7 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl taskMangeList, List disLikeList, String point_code, Consumer allTransactionConsumer) { + public void createTask2(List taskMangeList, List disLikeList, String point_code, Consumer allTransactionConsumer) { // 任务表 WQLObject taskService = WQLObject.getWQLObject("sch_base_task"); // 点位表 @@ -1875,6 +1879,9 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl