From 92105c1cb3c4f4d1b9b3eceec2b3735c480dede4 Mon Sep 17 00:00:00 2001 From: liuxy Date: Wed, 15 May 2024 14:01:47 +0800 Subject: [PATCH] =?UTF-8?q?rev=EF=BC=9A1.=E5=87=BA=E5=BA=93=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E4=BC=98=E5=8C=96=EF=BC=9A=E4=BB=BB=E5=8A=A1=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E5=90=8E=E6=9B=B4=E6=96=B0=E4=BB=93=E4=BD=8D=E3=80=81?= =?UTF-8?q?=E5=BA=93=E5=AD=98=E7=AD=89=E4=BF=A1=E6=81=AF=EF=BC=8C=E5=8D=95?= =?UTF-8?q?=E6=8D=AE=E5=AE=8C=E6=88=90=E5=90=8E=E5=88=99=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E6=83=85=E5=86=B5=E6=9B=B4=E6=96=B0=E5=BA=93=E5=AD=98=EF=BC=8C?= =?UTF-8?q?=E6=83=85=E5=86=B51=EF=BC=9A=E8=99=9A=E6=8B=9F=E5=BA=93?= =?UTF-8?q?=EF=BC=8C=E5=AE=8C=E6=88=90=E5=8D=95=E6=8D=AE=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E8=99=9A=E6=8B=9F=E5=8C=BA=E4=BB=93=E4=BD=8D=E3=80=81=E5=BA=93?= =?UTF-8?q?=E5=AD=98=EF=BC=8C=E6=83=85=E5=86=B52=EF=BC=9A=E8=B6=85?= =?UTF-8?q?=E6=9C=9F=E5=8F=91=E8=B4=A7=EF=BC=9A=E5=A6=82=E6=9E=9C=E5=AD=90?= =?UTF-8?q?=E5=8D=B7=E8=B6=85=E6=9C=9F=E4=B8=94=E6=98=AF=E8=B6=85=E6=9C=9F?= =?UTF-8?q?=E5=8F=91=E8=B4=A7=E5=88=99=E6=9B=B4=E6=96=B0=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E3=80=81=E4=BB=93=E4=BD=8D=E4=BF=A1=E6=81=AF=E3=80=822.?= =?UTF-8?q?=E7=A7=BB=E5=BA=93=E4=BB=BB=E5=8A=A1=E4=B8=8B=E5=8F=91=E4=BC=98?= =?UTF-8?q?=E5=8C=96=EF=BC=9A=E5=88=A4=E6=96=AD=E6=98=AF=E4=BB=8E=E5=B7=A6?= =?UTF-8?q?=E8=BE=B9=E5=BC=80=E5=A7=8B=E7=A7=BB=E5=BA=93=E8=BF=98=E6=98=AF?= =?UTF-8?q?=E5=8F=B3=E8=BE=B9=E5=BC=80=E5=A7=8B=E7=A7=BB=E5=BA=93=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mes/service/impl/MesToLmsServiceImpl.java | 4 + .../service/impl/VirtualOutServiceImpl.java | 2 +- .../inbill/service/CheckOutBillService.java | 9 +- .../service/impl/HandMoveStorServiceImpl.java | 3 +- .../outbill/rest/CheckOutBillController.java | 2 +- .../service/impl/CheckOutBillServiceImpl.java | 555 ++++++++++++++++-- .../st/outbill/wql/QST_IVT_CHECKOUTBILL.wql | 18 + 7 files changed, 538 insertions(+), 55 deletions(-) diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java index 33550a3e8..ad8d2dd60 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java @@ -1208,6 +1208,10 @@ public class MesToLmsServiceImpl implements MesToLmsService { String changeinv_id = IdUtil.getSnowflake(1, 1).nextId() + ""; JSONObject jsonStor = WQLObject.getWQLObject("st_ivt_bsrealstorattr").query("stor_code = '" + stor_code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonStor)) { + throw new BadRequestException("仓库不存在:"+stor_code); + } + JSONArray rowsDtl = new JSONArray(); for (int i = 0; i < rows.size(); i++) { diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/VirtualOutServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/VirtualOutServiceImpl.java index fbbbda4c5..d78047aee 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/VirtualOutServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/VirtualOutServiceImpl.java @@ -141,7 +141,7 @@ public class VirtualOutServiceImpl implements VirtualOutService { // 调用强制完成接口 JSONObject param = new JSONObject(); param.put("iostorinv_id", jsonDis.getString("iostorinv_id")); - checkOutBillService.confirm(param); + checkOutBillService.confirmOrder(param); } } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/CheckOutBillService.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/CheckOutBillService.java index 5280312dc..445fb3432 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/CheckOutBillService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/CheckOutBillService.java @@ -183,12 +183,19 @@ public interface CheckOutBillService { void manualDiv(JSONObject whereJson); /** - * 出库单强制确认 + * 出库单强制确认(更新仓位以及库存信息) * * @param whereJson / */ void confirm(JSONObject whereJson); + /** + * 出库单强制确认(只确认单据用-虚拟区的更新库存) + * + * @param whereJson / + */ + void confirmOrder(JSONObject whereJson); + /** * 出库任务下发 * diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/impl/HandMoveStorServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/impl/HandMoveStorServiceImpl.java index ab55d7e6c..fb900a2e7 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/impl/HandMoveStorServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/impl/HandMoveStorServiceImpl.java @@ -1416,8 +1416,7 @@ public class HandMoveStorServiceImpl implements HandMoveStorService { isNumMap.put("flag", "6"); jsonLockArr = WQL.getWO("QST_IVT_HANDMOVESTOR").addParamMap(isNumMap).process().getResultJSONArray(0); - } - if (rightNumArr.size() < leftNumArr.size()) { + } else if (rightNumArr.size() < leftNumArr.size()) { /* * 右边开始 */ diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/CheckOutBillController.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/CheckOutBillController.java index 1070957c1..f761acbd9 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/CheckOutBillController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/CheckOutBillController.java @@ -199,7 +199,7 @@ public class CheckOutBillController { @Log("出库单强制确认") public ResponseEntity confirm(@RequestBody JSONObject whereJson) { - checkOutBillService.confirm(whereJson); + checkOutBillService.confirmOrder(whereJson); return new ResponseEntity<>(HttpStatus.NO_CONTENT); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java index 18bef91d5..ba71db257 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java @@ -5101,6 +5101,373 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { }*/ } + @Override + @Transactional(rollbackFor = Exception.class) + public void confirmOrder(JSONObject form) { + //出库分配表 + WQLObject wo_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); + //出库明细表 + WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); + //出库主表 + WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_IOStorInv"); + // 任务表 + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); + // 子卷包装关系表 + WQLObject subTab = WQLObject.getWQLObject("pdm_bi_subpackagerelation"); + //包装关系出入库记录表 + WQLObject sub_record = WQLObject.getWQLObject("pdm_bi_subpackagerelationrecord"); + + String iostorinv_id = form.getString("iostorinv_id"); + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + //查询主表信息 + JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(jo_mst)) { + throw new BadRequestException("未查到相关出库单"); + } + + //判断分配明细中是否有未生成状态的分配明细 + JSONArray disArr = wo_dis.query("iostorinv_id = '" + iostorinv_id + "' and work_status = '00'").getResultJSONArray(0); + if (ObjectUtil.isNotEmpty(disArr)) { + throw new BadRequestException("有未生成状态的分配明细,不允许强制确认"); + } + + // 查询是否有未完成的任务 + List isTaskEmp = WQL.getWO("QST_IVT_CHECKOUTBILL") + .addParam("flag", "555") + .addParam("iostorinv_id", iostorinv_id) + .process() + .getResultJSONArray(0) + .toJavaList(JSONObject.class); + + if (ObjectUtil.isNotEmpty(isTaskEmp)) { + // 拼接字符串 + String box_no = isTaskEmp.stream() + .map(row -> row.getString("box_no")) + .distinct() + .collect(Collectors.joining(",")); + + throw new BadRequestException("请先完成载具对应的出库任务:" + box_no); + } + + //查询生成和未分配完的明细 + JSONArray dtls = WQL.getWO("QST_IVT_CHECKOUTBILL") + .addParam("flag", "2") + .addParam("bill_status", "50") + .addParam("iostorinv_id", iostorinv_id) + .process() + .getResultJSONArray(0); + + if (dtls.size() != 0) { + for (int i = 0; i < dtls.size(); i++) { + JSONObject dtl = dtls.getJSONObject(i); + HashMap map_dtl = new HashMap<>(); + //更新明细状态 + map_dtl.put("bill_status", "99"); + wo_dtl.update(map_dtl, "iostorinvdtl_id='" + dtl.getString("iostorinvdtl_id") + "'"); + } + } + + HashMap map_mst = new HashMap<>(); + map_mst.put("bill_status", "99"); + map_mst.put("confirm_optid", currentUserId + ""); + map_mst.put("confirm_optname", nickName); + map_mst.put("confirm_time", now); + //更新主表状态 + wo_mst.update(map_mst, "iostorinv_id = '" + iostorinv_id + "'"); + + //查询需要更新库存的分配记录 + JSONArray diss = WQL.getWO("QST_IVT_CHECKOUTBILL") + .addParam("flag", "55") + .addParam("iostorinv_id", iostorinv_id) + .process() + .getResultJSONArray(0); + for (int i = 0; i < diss.size(); i++) { + JSONObject dis = diss.getJSONObject(i); + // 判断是否是主存区的仓位, 是否发超期 + if ("ZC01,ZZ01".contains(dis.getString("sect_code"))) { + + if (jo_mst.getString("is_overdue").equals("1")) { + // 不发超期 + if (!dis.getString("is_overdue").equals("1")) { + continue; + } + } else { + continue; + } + } + + double plan_qty = dis.getDoubleValue("plan_qty"); + double real_qty = dis.getDoubleValue("real_qty"); + //未出部分,按取消分配处理 + if (Double.compare(real_qty, plan_qty) != 0) { + dis.put("change_qty", plan_qty - real_qty); + dis.put("bill_type_scode", jo_mst.getString("bill_type")); + dis.put("inv_id", iostorinv_id); + dis.put("bill_code", jo_mst.getString("bill_code")); + dis.put("bill_table", "ST_IVT_IOStorInv"); + storPublicService.IOStor(dis, "12"); + } + //更新已出库重量 + if (real_qty != 0) { + dis.put("change_qty", real_qty); + dis.put("bill_type_scode", jo_mst.getString("bill_type")); + dis.put("inv_id", iostorinv_id); + dis.put("bill_code", jo_mst.getString("bill_code")); + dis.put("bill_table", "ST_IVT_IOStorInv"); + + if (jo_mst.getString("is_overdue").equals("1")) { + if (dis.getString("is_overdue").equals("1")) { + storPublicService.IOStor(dis, "12"); + } else { + storPublicService.IOStor(dis, "21"); + } + } else { + storPublicService.IOStor(dis, "21"); + } + } + + // 更新分配明细执行状态为 - 99 + JSONObject jsonDis = wo_dis.query("iostorinvdis_id = '" + dis.getString("iostorinvdis_id") + "'").uniqueResult(0); + jsonDis.put("work_status", "99"); + wo_dis.update(jsonDis); + + if (jo_mst.getString("is_overdue").equals("1")) { + if (dis.getString("is_overdue").equals("1")) { + // 解锁起点 + JSONObject from_start = new JSONObject(); + from_start.put("struct_id", dis.getString("struct_id")); + from_start.put("lock_type", "1"); + from_start.put("is_overdue", dis.getString("is_overdue")); + from_start.put("storagevehicle_code", dis.getString("box_no")); + storPublicService.updateStructAndPoint(from_start); + + continue; + } + } + + // 更新子卷包装关系表 状态 - 3 + JSONObject jsonSub = subTab.query("container_name = '" + dis.getString("pcsn") + "' and package_box_sn = '" + dis.getString("box_no") + "' and status = '2'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonSub)) + //查询对应的包装关系出入库记录表 + { + jsonSub = sub_record.query("container_name = '" + dis.getString("pcsn") + "' and package_box_sn = '" + dis.getString("box_no") + "' and status = '2' AND bill_code = '" + jo_mst.getString("bill_code") + "'").uniqueResult(0); + } + if (ObjectUtil.isEmpty(jsonSub)) { + throw new BadRequestException("此子卷不存在或不为入库状态:" + dis.getString("pcsn")); + + } + // 如果是拆分入库则将包装关系改为生成状态 + if ("1005".equals(jo_mst.getString("bill_type")) || ("1009".equals(jo_mst.getString("bill_type")))) { + jsonSub.put("status", "0"); + } else { + jsonSub.put("status", "3"); + } + + if (jo_mst.getString("bill_type").equals("1011")) { + // 更新子卷包装净重 + double net_weight = NumberUtil.sub(jsonSub.getDoubleValue("net_weight"), plan_qty); + jsonSub.put("net_weight",net_weight); + + if (net_weight <= 0) { + jsonSub.put("status","3"); + } else { + jsonSub.put("status","2"); + } + } + + subTab.update(jsonSub); + + // 解锁起点 + JSONObject from_start = new JSONObject(); + from_start.put("struct_id", dis.getString("struct_id")); + from_start.put("lock_type", "1"); + from_start.put("is_overdue", dis.getString("is_overdue")); + + if (jo_mst.getString("is_overdue").equals("1")) { + if (dis.getString("is_overdue").equals("1")) { + from_start.put("storagevehicle_code", dis.getString("box_no")); + } else { + from_start.put("storagevehicle_code", ""); + } + } else { + from_start.put("storagevehicle_code", ""); + } + + if (jo_mst.getString("bill_type").equals("1011")) { + // 判断此木箱下的所有子卷净重是否为0,如果为0则清空载具 + List packageList = subTab.query("package_box_sn = '" + jsonSub.getString("package_box_sn") + "'") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + boolean is_zero = packageList.stream() + .allMatch(row -> row.getDoubleValue("net_weight") <= 0); + + if (is_zero) { + from_start.put("storagevehicle_code", ""); + } else { + from_start.put("bill_type","1011"); + from_start.put("storagevehicle_code", jsonSub.getString("package_box_sn")); + } + } + + storPublicService.updateStructAndPoint(from_start); + + //插入包装关系出入库记录表 + jsonSub.put("bill_code", jo_mst.getString("bill_code")); + jsonSub.put("bill_id", jo_mst.getString("iostorinv_id")); + jsonSub.put("bill_type", jo_mst.getString("bill_type")); + jsonSub.put("io_type", "1"); + jsonSub.put("insert_time", DateUtil.now()); + jsonSub.put("record_id", IdUtil.getSnowflake(1, 1).nextId()); + sub_record.insert(jsonSub); + + // 更新对应任务为完成 + JSONObject jsonTask = taskTab.query("task_id = '" + jsonDis.getString("task_id") + "' and task_status < '07'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonTask)) { + jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskTab.update(jsonTask); + } + + } + + JSONObject out_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); + if ("1004".equals(out_jo.getString("bill_type"))) { + //调拨出库自动生成调拨入库单 + WQLObject dtl_wql = WQLObject.getWQLObject("st_ivt_iostorinvdtl"); + WQLObject mst_wql = WQLObject.getWQLObject("ST_IVT_IOStorInv"); + WQLObject dis_wql = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); + + //校验主表状态为生成 + if (!"99".equals(out_jo.getString("bill_status"))) { + throw new BadRequestException("主表状态必须为完成!"); + } + + JSONObject mst_row = mst_wql.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); + + JSONArray dis_rows = new JSONArray(); + + if (jo_mst.getString("is_overdue").equals("1")) { + dis_rows = dis_wql.query("iostorinv_id = '" + iostorinv_id + "' and is_overdue = '0'").getResultJSONArray(0); + } else { + dis_rows = dis_wql.query("iostorinv_id = '" + iostorinv_id + "'").getResultJSONArray(0); + } + + //生成手工入库单 + String new_iostorinv_id = IdUtil.getSnowflake(1, 1).nextId() + ""; + String bill_code = CodeUtil.getNewCode("IO_CODE"); + jo_mst.put("iostorinv_id", new_iostorinv_id); + jo_mst.put("bill_code", bill_code); + jo_mst.put("io_type", "0"); + jo_mst.put("bill_type", "0004"); + jo_mst.put("buss_type", ((String) jo_mst.get("bill_type")).substring(0, 4)); + //查询移入仓库的信息 + JSONObject in_stor = WQLObject.getWQLObject("st_ivt_bsrealstorattr").query("stor_id = '" + out_jo.getString("out_stor_id") + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(in_stor)) { + throw new BadRequestException("未查询到对应的移入仓库信息!"); + } + jo_mst.put("stor_id", in_stor.getString("stor_id")); + jo_mst.put("stor_code", in_stor.getString("stor_code")); + jo_mst.put("stor_name", in_stor.getString("stor_name")); + jo_mst.put("bill_status", "30"); + jo_mst.put("input_optid", currentUserId + ""); + jo_mst.put("input_optname", nickName); + jo_mst.put("input_time", now); + jo_mst.put("update_optid", currentUserId + ""); + jo_mst.put("update_optname", nickName); + jo_mst.put("update_time", now); + jo_mst.put("out_stor_id", out_jo.getString("stor_id")); + + double total_qty = 0.00; + for (int i = 0; i < dis_rows.size(); i++) { + //插入明细表 + String iostorinvdtl_id = IdUtil.getSnowflake(1, 1).nextId() + ""; + JSONObject dis_row = dis_rows.getJSONObject(i); + //查询对应的出库单明细 + JSONObject dtl_row = dtl_wql.query("iostorinvdtl_id = '" + dis_row.getString("iostorinvdtl_id") + "'").uniqueResult(0); + dis_row.put("iostorinvdtl_id", iostorinvdtl_id); + dis_row.put("iostorinv_id", new_iostorinv_id); + dis_row.put("seq_no", i + 1); + dis_row.put("bill_status", "30"); + dis_row.put("real_qty", "0"); + dis_row.put("vbeln", dtl_row.getString("vbeln")); + dis_row.put("source_billdtl_id", dtl_row.getString("iostorinvdtl_id")); + dis_row.put("source_bill_type", mst_row.getString("bill_type")); + dis_row.put("source_bill_code", dtl_row.getString("source_bill_code")); + dis_row.put("source_bill_table", "ST_IVT_IOStorInvDtl"); + dis_row.put("assign_qty", dis_row.getString("plan_qty")); + dis_row.put("unassign_qty", "0"); + //插入调拨明细表 + dtl_wql.insert(dis_row); + + dis_row.put("iostorinvdis_id", IdUtil.getSnowflake(1, 1).nextId()); + dis_row.put("seq_no", 1); + dis_row.put("sect_id", ""); + dis_row.put("sect_code", ""); + dis_row.put("sect_name", ""); + dis_row.put("struct_id", ""); + dis_row.put("struct_code", ""); + dis_row.put("struct_name", ""); + dis_row.put("work_status", "00"); + dis_row.put("real_qty", "0"); + dis_row.put("point_id", ""); + dis_row.put("task_id", ""); + //插入分配表 + dis_wql.insert(dis_row); + + total_qty = NumberUtil.add(total_qty,dis_row.getDoubleValue("plan_qty")); + + //将包装关系中对应的记录状态改为包装 + HashMap map = new HashMap<>(); + map.put("status", "1"); + WQLObject.getWQLObject("PDM_BI_SubPackageRelation").update(map, "package_box_SN = '" + dis_row.getString("box_no") + "' AND status = '3'"); + } + + // 查询所有明细并计算实际重量 + List dtlList = dtl_wql.query("iostorinv_id = '" + iostorinv_id + "'") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + double assign_qty = dtlList.stream() + .map(row -> row.getDoubleValue("assign_qty")) + .reduce(Double::sum).orElse(0.00); + + jo_mst.put("detail_count", dis_rows.size()); + // jo_mst.put("total_qty", total_qty); + jo_mst.put("total_qty", assign_qty); + mst_wql.insert(jo_mst); + } + + if ("1003".equals(out_jo.getString("bill_type")) || "1006".equals(out_jo.getString("bill_type"))) { + //如果为返检出库或者改切出库删除对应的包装关系 + JSONArray dis_rows = new JSONArray(); + if (jo_mst.getString("is_overdue").equals("1")) { + dis_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinv_id = '" + iostorinv_id + "' and is_overdue = '0'").getResultJSONArray(0); + } else { + dis_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinv_id = '" + iostorinv_id + "'").getResultJSONArray(0); + } + + for (int i = 0; i < dis_rows.size(); i++) { + JSONObject dis_row = dis_rows.getJSONObject(i); + String sect_code = dis_row.getString("sect_code"); + JSONObject sect_jo = WQLObject.getWQLObject("st_ivt_sectattr").query("sect_code = '" + sect_code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(sect_jo)) { + throw new BadRequestException("未查询到对应的库区!"); + } + //如果是虚拟区的出库,直接把包装关系删除;如果为立库的包装关系,将解绑删除标识置为1。当发货区解绑时,删除包装关系 + String pcsn = dis_row.getString("pcsn"); + if ("09".equals(sect_jo.getString("sect_type_attr"))) { + WQLObject.getWQLObject("pdm_bi_subpackagerelation").delete("container_name = '" + pcsn + "'"); + } else { + HashMap map = new HashMap<>(); + map.put("need_delete", "1"); + WQLObject.getWQLObject("pdm_bi_subpackagerelation").update(map, "container_name = '" + pcsn + "'"); + } + + } + } + } + @Override @Transactional(rollbackFor = Exception.class) public void issueTask(JSONObject whereJson) { @@ -5136,75 +5503,163 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { WQLObject wo_mst = WQLObject.getWQLObject("st_ivt_iostorinv"); //任务表 WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); - String task_id = whereJson.getString("task_id"); + //子卷包装关系表 + WQLObject subTab = WQLObject.getWQLObject("pdm_bi_subpackagerelation"); + //包装关系出入库记录表 + WQLObject sub_record = WQLObject.getWQLObject("pdm_bi_subpackagerelationrecord"); - String currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); + // 查询任务对应的分配明细 + JSONArray disJsonArr = WQL.getWO("QST_IVT_CHECKOUTBILL") + .addParam("flag", "55") + .addParam("task_id", whereJson.getString("task_id")) + .process().getResultJSONArray(0); - JSONObject task = wo_Task.query("task_status<>'07' and task_id='" + task_id + "'").uniqueResult(0); + // 查询主表 + JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + disJsonArr.getJSONObject(0).getString("iostorinv_id") + "'").uniqueResult(0); + String iostorinv_id = jo_mst.getString("iostorinv_id"); - if (task == null) { - throw new BadRequestException("查询不到操作的任务记录!"); - } + for (int i = 0; i < disJsonArr.size(); i++) { + JSONObject dis = disJsonArr.getJSONObject(i); - // 判断此任务是否有任务组 - String task_group_id = task.getString("task_group_id"); - if (ObjectUtil.isNotEmpty(task_group_id)) { - // 上一个任务组顺序号 - String sort_seq_last = NumberUtil.sub(task.getString("sort_seq"), "1").toString(); + double plan_qty = dis.getDoubleValue("plan_qty"); + double real_qty = dis.getDoubleValue("real_qty"); - JSONObject jsonTaskLast = wo_Task.query("task_group_id = '" + task_group_id + "' and sort_seq = '" + sort_seq_last + "' and task_status <> '07'").uniqueResult(0); -// if (ObjectUtil.isNotEmpty(jsonTaskLast)) throw new BadRequestException("请先完成" + jsonTaskLast.getString("task_code") + "的任务!"); - } + //未出部分,按取消分配处理 + if (Double.compare(real_qty, plan_qty) != 0) { + dis.put("change_qty", plan_qty - real_qty); + dis.put("bill_type_scode", jo_mst.getString("bill_type")); + dis.put("inv_id", iostorinv_id); + dis.put("bill_code", jo_mst.getString("bill_code")); + dis.put("bill_table", "ST_IVT_IOStorInv"); + storPublicService.IOStor(dis, "12"); + } + //更新已出库重量 + if (real_qty != 0) { + dis.put("change_qty", real_qty); + dis.put("bill_type_scode", jo_mst.getString("bill_type")); + dis.put("inv_id", iostorinv_id); + dis.put("bill_code", jo_mst.getString("bill_code")); + dis.put("bill_table", "ST_IVT_IOStorInv"); - JSONObject dtljo = wo_dis.query("task_id='" + task_id + "'").uniqueResult(0); - whereJson.put("iostorinv_id", dtljo.getString("iostorinv_id")); - - JSONObject mst_jo = wo_mst.query("iostorinv_id = '" + dtljo.getString("iostorinv_id") + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(mst_jo)) { - throw new BadRequestException("未查询到对应的出库单据!"); - } else { - if ("1003".equals(mst_jo.getString("bill_type")) || "1006".equals(mst_jo.getString("bill_type"))) { - HashMap map = new HashMap<>(); - map.put("need_delete", "1"); - WQLObject.getWQLObject("pdm_bi_subpackagerelation").update(map, "package_box_sn = '" + task.getString("vehicle_code") + "'"); - - JSONArray rows = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("package_box_sn = '" + task.getString("vehicle_code") + "'").getResultJSONArray(0); - for (int i = 0; i < rows.size(); i++) { - JSONObject row = rows.getJSONObject(i); - //插入包装关系出入库记录表 - row.put("bill_code", mst_jo.getString("bill_code")); - row.put("bill_id", mst_jo.getString("iostorinv_id")); - row.put("bill_type", mst_jo.getString("bill_type")); - row.put("io_type", "1"); - row.put("insert_time", DateUtil.now()); - row.put("record_id", IdUtil.getSnowflake(1, 1).nextId()); - WQLObject.getWQLObject("pdm_bi_subpackagerelationrecord").insert(row); + if (jo_mst.getString("is_overdue").equals("1")) { + if (dis.getString("is_overdue").equals("1")) { + storPublicService.IOStor(dis, "12"); + } else { + storPublicService.IOStor(dis, "21"); + } + } else { + storPublicService.IOStor(dis, "21"); } } + + // 更新分配明细执行状态为 - 99 + JSONObject jsonDis = wo_dis.query("iostorinvdis_id = '" + dis.getString("iostorinvdis_id") + "'").uniqueResult(0); + jsonDis.put("work_status", "99"); + wo_dis.update(jsonDis); + + if (jo_mst.getString("is_overdue").equals("1")) { + if (dis.getString("is_overdue").equals("1")) { + continue; + } + } + + // 更新子卷包装关系表 状态 - 3 + JSONObject jsonSub = subTab.query("container_name = '" + dis.getString("pcsn") + "' and package_box_sn = '" + dis.getString("box_no") + "' and status = '2'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonSub)) + //查询对应的包装关系出入库记录表 + { + jsonSub = sub_record.query("container_name = '" + dis.getString("pcsn") + "' and package_box_sn = '" + dis.getString("box_no") + "' and status = '2' AND bill_code = '" + jo_mst.getString("bill_code") + "'").uniqueResult(0); + } + if (ObjectUtil.isEmpty(jsonSub)) { + throw new BadRequestException("此子卷不存在或不为入库状态:" + dis.getString("pcsn")); + + } + // 如果是拆分入库则将包装关系改为生成状态 + if ("1005".equals(jo_mst.getString("bill_type")) || ("1009".equals(jo_mst.getString("bill_type")))) { + jsonSub.put("status", "0"); + } else { + jsonSub.put("status", "3"); + } + + if (jo_mst.getString("bill_type").equals("1011")) { + // 更新子卷包装净重 + double net_weight = NumberUtil.sub(jsonSub.getDoubleValue("net_weight"), plan_qty); + jsonSub.put("net_weight",net_weight); + + if (net_weight <= 0) { + jsonSub.put("status","3"); + } else { + jsonSub.put("status","2"); + } + } + + subTab.update(jsonSub); + + // 解锁起点 + JSONObject from_start = new JSONObject(); + from_start.put("struct_id", dis.getString("struct_id")); + from_start.put("lock_type", "1"); + from_start.put("is_overdue", dis.getString("is_overdue")); + + if (jo_mst.getString("is_overdue").equals("1")) { + if (dis.getString("is_overdue").equals("1")) { + from_start.put("storagevehicle_code", dis.getString("box_no")); + } else { + from_start.put("storagevehicle_code", ""); + } + } else { + from_start.put("storagevehicle_code", ""); + } + + if (jo_mst.getString("bill_type").equals("1011")) { + // 判断此木箱下的所有子卷净重是否为0,如果为0则清空载具 + List packageList = subTab.query("package_box_sn = '" + jsonSub.getString("package_box_sn") + "'") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + boolean is_zero = packageList.stream() + .allMatch(row -> row.getDoubleValue("net_weight") <= 0); + + if (is_zero) { + from_start.put("storagevehicle_code", ""); + } else { + from_start.put("bill_type","1011"); + from_start.put("storagevehicle_code", jsonSub.getString("package_box_sn")); + } + } + + storPublicService.updateStructAndPoint(from_start); + + //插入包装关系出入库记录表 + jsonSub.put("bill_code", jo_mst.getString("bill_code")); + jsonSub.put("bill_id", jo_mst.getString("iostorinv_id")); + jsonSub.put("bill_type", jo_mst.getString("bill_type")); + jsonSub.put("io_type", "1"); + jsonSub.put("insert_time", DateUtil.now()); + jsonSub.put("record_id", IdUtil.getSnowflake(1, 1).nextId()); + sub_record.insert(jsonSub); + } HashMap map = new HashMap<>(); map.put("task_status", TaskStatusEnum.FINISHED.getCode()); map.put("finished_type", "01"); - map.put("update_optid", currentUserId + ""); - map.put("update_optname", nickName); - map.put("update_time", now); + map.put("update_optid", SecurityUtils.getCurrentUserId() + ""); + map.put("update_optname", SecurityUtils.getCurrentNickName()); + map.put("update_time", DateUtil.now()); //更新任务为完成 - wo_Task.update(map, "task_id='" + task_id + "'"); + wo_Task.update(map, "task_id='" + whereJson.getString("task_id") + "'"); // 查询此任务下所有的分配明细 - JSONArray disArr = wo_dis.query("task_id='" + task_id + "'").getResultJSONArray(0); + JSONArray disArr = wo_dis.query("task_id='" + whereJson.getString("task_id") + "'").getResultJSONArray(0); for (int i = 0; i < disArr.size(); i++) { - JSONObject jsonDis = disArr.getJSONObject(i); + JSONObject json = disArr.getJSONObject(i); // 更新分配明细为完成 - jsonDis.put("work_status", "99"); - wo_dis.update(jsonDis); + json.put("work_status", "99"); + wo_dis.update(json); // 判断此明细下是否还有未完成的分配明细 - JSONObject jsonDtl = wo_dtl.query("iostorinvdtl_id = '" + jsonDis.getString("iostorinvdtl_id") + "'").uniqueResult(0); + JSONObject jsonDtl = wo_dtl.query("iostorinvdtl_id = '" + json.getString("iostorinvdtl_id") + "'").uniqueResult(0); JSONArray disArr2 = wo_dis.query("iostorinvdtl_id = '" + jsonDtl.getString("iostorinvdtl_id") + "' and work_status <> '99'").getResultJSONArray(0); if (ObjectUtil.isEmpty(disArr2)) { // 更新明细为完成 @@ -5214,9 +5669,9 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { } //判断是否还有未完成的明细 - JSONArray ja = wo_dtl.query("bill_status<>'99' and iostorinv_id='" + whereJson.getString("iostorinv_id") + "'").getResultJSONArray(0); + JSONArray ja = wo_dtl.query("bill_status<>'99' and iostorinv_id='" + disArr.getJSONObject(0).getString("iostorinv_id") + "'").getResultJSONArray(0); if (ja.size() == 0) { - this.confirm(whereJson); + this.confirmOrder(jo_mst); } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/wql/QST_IVT_CHECKOUTBILL.wql b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/wql/QST_IVT_CHECKOUTBILL.wql index def387727..fd30e9c70 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/wql/QST_IVT_CHECKOUTBILL.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/wql/QST_IVT_CHECKOUTBILL.wql @@ -708,6 +708,24 @@ ENDQUERY ENDIF + IF 输入.flag = "555" + QUERY + SELECT + dis.* + FROM + ST_IVT_IOStorInvDis dis + LEFT JOIN SCH_BASE_Task task ON task.task_id = dis.task_id AND task.is_delete = '0' and task.vehicle_code = dis.storagevehicle_code + WHERE + task.task_status <> '07' + + OPTION 输入.iostorinv_id <> "" + dis.iostorinv_id = 输入.iostorinv_id + ENDOPTION + + ENDSELECT + ENDQUERY + ENDIF + IF 输入.flag = "6" QUERY SELECT