From b3da793a4ce11205138523a3381d3b74adb63657 Mon Sep 17 00:00:00 2001 From: liuxy Date: Wed, 24 Jan 2024 14:01:54 +0800 Subject: [PATCH] =?UTF-8?q?add=EF=BC=9A=E4=BA=8C=E6=9C=9F=E5=87=BA?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/nl/b_lms/sch/tasks/TwoOutTask.java | 187 +++ .../storage_manage/ios/enums/IOSEnum.java | 20 +- .../iostorInv/IStIvtIostorinvOutService.java | 106 ++ .../iostorInv/IStIvtIostorinvService.java | 2 +- .../iostorInv/IStIvtIostorinvdtlService.java | 27 +- .../dao/mapper/StIvtIostorinvOutMapper.java | 4 + .../dao/mapper/StIvtIostorinvdisMapper.java | 33 + .../dao/mapper/StIvtIostorinvdisMapper.xml | 126 ++ .../impl/StIvtIostorinvOutServiceImpl.java | 1061 +++++++++++++++++ .../impl/StIvtIostorinvServiceImpl.java | 68 +- .../impl/StIvtIostorinvdtlServiceImpl.java | 113 ++ .../util/impl/InBussManageServiceImpl.java | 12 +- .../util/impl/OutBussManageServiceImpl.java | 438 +++++++ .../util/service/OutBussManageService.java | 68 ++ .../service/iostorInv/util/wql/BST_OUTDIV.wql | 85 ++ .../nl/wms/pda/mps/eum/RegionTypeEnum.java | 3 +- .../st/instor/task/HandMoveStorAcsTask.java | 27 +- .../outbill/rest/CheckOutBillController.java | 67 +- .../src/views/wms/st/outbill/DivDialog.vue | 21 +- .../src/views/wms/st/outbill/StructIvt.vue | 6 +- .../src/views/wms/st/outbill/index.vue | 2 +- 21 files changed, 2442 insertions(+), 34 deletions(-) create mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutTask.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutBussManageServiceImpl.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/OutBussManageService.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/wql/BST_OUTDIV.wql 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 new file mode 100644 index 000000000..3034cdb94 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutTask.java @@ -0,0 +1,187 @@ +package org.nl.b_lms.sch.tasks; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +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.wms.sch.AcsTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.st.inbill.service.CheckOutBillService; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Lxy on 2021/12/22. + */ +@Component +@RequiredArgsConstructor +public class TwoOutTask extends AbstractAcsTask { + private final String THIS_CLASS = TwoOutTask.class.getName(); + + @Override + public List addTask() { + /* + * 下发给ACS时需要特殊处理 + */ + //任务表 + WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); + + JSONObject map = new JSONObject(); + map.put("flag", "1"); + map.put("handle_class", THIS_CLASS); + JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").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")) + .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_code")) + .priority(json.getString("priority")) + .class_type(json.getString("task_type")) + .dtl_type(String.valueOf(dtl_type)) + .remark(json.getString("remark")) + .build(); + resultList.add(dto); + + // 更新任务为下发 + JSONObject paramMap = new JSONObject(); + paramMap.put("task_status", TaskStatusEnum.ISSUE.getCode()); + wo_Task.update(paramMap, "task_id ='" + json.getString("task_id") + "'"); + } + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 + WQLObject disTab = WQLObject.getWQLObject("st_ivt_iostorinvdis"); // 出入库分配表 + + String task_id = taskObj.getString("task_id"); + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "' and task_status < '07'").uniqueResult(0); + + if (ObjectUtil.isNotEmpty(jsonTask)) { + if (StrUtil.equals(status, "0")) { + // 任务为执行之后就不允许取消 + if (jsonTask.getIntValue("task_status") > Integer.valueOf(TaskStatusEnum.ISSUE.getCode())) { + throw new BadRequestException("任务:" + jsonTask.getString("task_code") + "已执行,不可取消"); + } + + // 更新删除字段 + jsonTask.put("is_delete", "1"); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + + // 更新分配明细为:未生成 + JSONObject map = new JSONObject(); + map.put("work_status", "00"); + map.put("point_id", ""); + + disTab.update(map, "task_id = '" + task_id + "'"); + + } + + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + // 更新任务状态为执行中 + jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + + } + + if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { + String currentUserId = SecurityUtils.getCurrentUserId(); + String currentUsername = SecurityUtils.getCurrentUsername(); + + // 判断此任务是否有任务组 + String task_group_id = jsonTask.getString("task_group_id"); + if (ObjectUtil.isNotEmpty(task_group_id)) { + // 上一个任务组顺序号 + String sort_seq_last = NumberUtil.sub(jsonTask.getString("sort_seq"), "1").toString(); + } + + // 调用标识完成 + CheckOutBillService checkOutBillService = SpringContextHolder.getBean(CheckOutBillService.class); + checkOutBillService.finishTask(jsonTask); + + // 更改任务状态为完成 + jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("update_optid", currentUserId); + jsonTask.put("update_optname", currentUsername); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + } + } + + } + + @Override + public void findStartPoint() { + + } + + @Override + public void findNextPoint() { + + } + + @Override + public String createTask(JSONObject form) { + String currentUserId = SecurityUtils.getCurrentUserId(); + String currentUsername = SecurityUtils.getCurrentUsername(); + + 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("task_name", form.getString("task_name")); + json.put("point_code1", form.getString("point_code1")); + json.put("point_code2", form.getString("point_code2")); + json.put("material_id", form.getString("material_id")); + json.put("task_group_id", form.getString("task_group_id")); + json.put("sort_seq", form.getString("sort_seq")); + + json.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + json.put("handle_class", THIS_CLASS); + json.put("create_id", currentUserId); + json.put("create_name", currentUsername); + json.put("create_time", DateUtil.now()); + 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, "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 d6c09d91b..87abb2156 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 @@ -46,6 +46,18 @@ public enum IOSEnum { "手工出库", "1009" )), + //移库单据类型 + MOVE_TYPE(MapOf.of("出库移库", "21")), + + //移库单据装填 + MOVE_STATUS(MapOf.of("生成", "10","提交","20","执行中","30","完成","99")), + + //出库单分配类型 + OUT_DIV_TYPE(MapOf.of("全部分配", "1","自动分配","2")), + + //出库单取消分配类型 + OUT_CANCEL_TYPE(MapOf.of("全部取消", "1","自动取消","2","删除一个","3")), + //仓位锁定类型 LOCK_TYPE(MapOf.of("未锁定", "1", "入库锁", "2", "出库锁", "3", "空托盘出库锁", "4", "空托盘入库锁", "5", "移出锁", "6", "移入锁", "7", "其它", "99" @@ -57,14 +69,20 @@ public enum IOSEnum { //仓位锁定类型 LOCK_OPERATE(MapOf.of("入库锁定", "1","入库取消","2")), + //库存品质类型 + QUALITY_SCODE(MapOf.of("待检品", "00","合格品","01","不合格","02")), + //库区类型 SECT_TYPE(MapOf.of("主存区", "00","暂存区","01","虚拟区","09")), //库存变动类型 - IVT_CHANGE(MapOf.of("加待入", "31","加库存","33","减待入","32")), + IVT_CHANGE(MapOf.of("加待入", "31","加库存","33","减待入","32","加冻结","11","减冻结","12","减库存","21")), //仓位伸位 ZDEPTH_STRUCT(MapOf.of("浅", "1","深","2","无","3")), + + //外部系统 + EXT_SYSTEM(MapOf.of("mes", "mes","sap","sap","crm","crm")), ; private Map code; diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/IStIvtIostorinvOutService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/IStIvtIostorinvOutService.java index 9ebdeff87..7e75b7624 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/IStIvtIostorinvOutService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/IStIvtIostorinvOutService.java @@ -1,8 +1,12 @@ package org.nl.b_lms.storage_manage.ios.service.iostorInv; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.service.IService; import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinv; +import org.springframework.data.domain.Pageable; + +import java.util.Map; /** *

@@ -13,4 +17,106 @@ import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinv; * @since 2023-11-10 */ public interface IStIvtIostorinvOutService extends IService { + + /** + * 新增出库单 + * @param whereJson { + * biz_date: 业务日期 + * stor_code: 仓库编码 + * stor_id: 仓库标识 + * stor_name: 仓库名称 + * total_qty: 总数量 + * remark: 备注 + * bill_status: 单据状态 + * detail_count: 明细数 + * create_mode: 创建方式 + * bill_type: 业务类型 + * out_stor_id: 移出仓库标识 + * tableData[ + * { + * qty_unit_id: 计量单位标识 + * qty_unit_name: 计量单位名称 + * plan_qty: 计划数量 + * canuse_qty: 可用数量 + * stockrecord_id: 库存记录标识 + * instorage_time: 入库时间 + * quality_scode: 品质类型 + * struct_id: 仓位标识 + * struct_name: 仓位名称 + * struct_code: 仓位编码 + * material_id: 物料标识 + * material_name: 物料名称 + * material_code: 物料编码 + * pcsn: 批次 + * box_no: 箱号 + * sap_pcsn: sap批次 + * 外部系统: + * } + * ] + * } + * @return iostorinv_id 主表标识 + */ + String insertMst(JSONObject whereJson); + + /** + * 出库单修改 + * @param whereJson: { + * 参数桶入库新增 + * } + */ + void update(JSONObject whereJson); + + /** + * 删除出库单 + * @param ids:[主表标识] + */ + void deleteAll(Long[] ids); + + /** + * 全部分配 || 自动分配 + * @param whereJson:{ + * 全部分配: 主表对象 + * 自动分配: 明细对象 + * } + */ + void allDiv(JSONObject whereJson); + + + /** + * 手工分配 + * @param whereJson:{ + * row:明细对象 + * ros:[库存对象] + * } + */ + void manualDiv(JSONObject whereJson); + + /** + * 取消分配:全部取消 || 自动取消 || 删除分配明细 + * @param whereJson : { + * 全部取消:主表对象 + * 自动取消:明细对象 + * 删除分配明细:分配明细对象 + * } + */ + void cancelDiv(JSONObject whereJson); + + /** + * 全部设置站点 + * @param whereJson { + * iostorinv_id: 单据标识 + * bill_code:单据编码 + * checked:是否异常出库 + * point_code:终点编码 + * } + */ + void allSetPoint(JSONObject whereJson); + + /** + * 出库强制确认 + * @param whereJson { + * iostorinv_id: 主表标识 + * } + */ + void confirm(JSONObject whereJson); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/IStIvtIostorinvService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/IStIvtIostorinvService.java index 7f30d6ca1..c38deadeb 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/IStIvtIostorinvService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/IStIvtIostorinvService.java @@ -65,7 +65,7 @@ public interface IStIvtIostorinvService extends IService { void update(Map whereJson); /** - * 删除出库单 + * 删除入库单 * @param ids:[主表标识] */ void deleteAll(Long[] ids); diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/IStIvtIostorinvdtlService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/IStIvtIostorinvdtlService.java index a396bfb13..82812fd9e 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/IStIvtIostorinvdtlService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/IStIvtIostorinvdtlService.java @@ -19,7 +19,7 @@ import java.util.List; public interface IStIvtIostorinvdtlService extends IService { /** - * 新增出入库明细 + * 新增入库明细 * * @param rows: { * package_box_sn:木箱号 @@ -44,6 +44,31 @@ public interface IStIvtIostorinvdtlService extends IService { */ HashMap> insertDtl(List rows, Long iostorinv_id); + /** + * 新增入出库明细 + * + * @param rows: { + * qty_unit_id: 计量单位标识 + * qty_unit_name: 计量单位名称 + * plan_qty: 计划数量 + * canuse_qty: 可用数量 + * stockrecord_id: 库存记录标识 + * instorage_time: 入库时间 + * quality_scode: 品质类型 + * struct_id: 仓位标识 + * struct_name: 仓位名称 + * struct_code: 仓位编码 + * material_id: 物料标识 + * material_name: 物料名称 + * material_code: 物料编码 + * pcsn: 批次 + * box_no: 箱号 + * sap_pcsn: sap批次 + * } + * @param iostorinv_id: 主表标识 + */ + void insertOutDtl(List rows, Long iostorinv_id); + /** * 更新明细状态 * diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/dao/mapper/StIvtIostorinvOutMapper.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/dao/mapper/StIvtIostorinvOutMapper.java index 19e9f8293..5b0d18f5f 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/dao/mapper/StIvtIostorinvOutMapper.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/dao/mapper/StIvtIostorinvOutMapper.java @@ -3,6 +3,10 @@ package org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinv; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; /** *

diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/dao/mapper/StIvtIostorinvdisMapper.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/dao/mapper/StIvtIostorinvdisMapper.java index 43851d255..551a55894 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/dao/mapper/StIvtIostorinvdisMapper.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/dao/mapper/StIvtIostorinvdisMapper.java @@ -1,8 +1,11 @@ package org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.mapper; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdis; +import java.util.List; + /** *

* 出入库单分配表 Mapper 接口 @@ -13,4 +16,34 @@ import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdis; */ public interface StIvtIostorinvdisMapper extends BaseMapper { + /** + * 获取全部已分配未下发的分配明细 + * @param whereJson :{ + * iostorinvdtl_id: 明细标识 (自动取消时传) + * box_no: 箱号 (自动取消时传) + * iostorinv_id: 单据标识 + * bill_status: 明细状态 + * is_issued: 是否已下发 + * } + * @return List 分配明细实体类集合 + */ + List getDivIosDisAll(JSONObject whereJson); + + /** + * + * @param list [明细标识] + * @return List 分配明细集合 + */ + List getDivTaskDis(List list); + + /** + * 获取此单据下/此明细下 所有未生成的分配明细 + * @param whereJson :{ + * iostorinvdtl_id: 明细标识 + * iostorinv_id: 单据标识 + * } + * @return List 分配明细实体类集合 + */ + List getNotCreateDis(JSONObject whereJson); + } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/dao/mapper/StIvtIostorinvdisMapper.xml b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/dao/mapper/StIvtIostorinvdisMapper.xml index 671e02ee7..acfd2a780 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/dao/mapper/StIvtIostorinvdisMapper.xml +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/dao/mapper/StIvtIostorinvdisMapper.xml @@ -2,4 +2,130 @@ + + + + + + + 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 a7bb8586a..237013860 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 @@ -1,9 +1,44 @@ package org.nl.b_lms.storage_manage.ios.service.iostorInv.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.nl.b_lms.pdm_manage.enums.SUBEnum; +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.IStIvtIostorinvService; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvdisService; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvdtlService; import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinv; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdis; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdtl; import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.mapper.StIvtIostorinvOutMapper; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.mapper.StIvtIostorinvdisMapper; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.OutBussManageService; +import org.nl.common.utils.IdUtil; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.basedata.st.service.StorattrService; +import org.nl.wms.basedata.st.service.dto.StorattrDto; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; /** *

@@ -15,4 +50,1030 @@ import org.springframework.stereotype.Service; */ @Service public class StIvtIostorinvOutServiceImpl extends ServiceImpl implements IStIvtIostorinvOutService { + + /** + * 仓库服务 + */ + @Autowired + private StorattrService storattrService; + + /** + * 出入库明细服务 + */ + @Autowired + private IStIvtIostorinvdtlService iStIvtIostorinvdtlService; + + /** + * 出库业务处理服务 + */ + @Autowired + private OutBussManageService outBussManageService; + + /** + * 出入库分配明细服务 + */ + @Autowired + private IStIvtIostorinvdisService iStIvtIostorinvdisService; + + /** + * 出入库分配明细mapper + */ + @Autowired + private StIvtIostorinvdisMapper stIvtIostorinvdisMapper; + + /** + * 入库服务 + */ + @Autowired + private IStIvtIostorinvService iStIvtIostorinvService; + + @Override + @Transactional + public String insertMst(JSONObject whereJson) { + + // 插入主表 + String input_optid = SecurityUtils.getCurrentUserId(); + String input_optname = SecurityUtils.getCurrentNickName(); + String user = whereJson.getString("user"); + + if (ObjectUtil.isNotEmpty(user)) { + if (IOSEnum.EXT_SYSTEM.code("mes").equals(user)) { + input_optid = "2"; + input_optname = "mes用户"; + } + if (IOSEnum.EXT_SYSTEM.code("sap").equals(user)) { + input_optid = "3"; + input_optname = "sap用户"; + } + } + + whereJson.put("input_optid", input_optid); + whereJson.put("input_optname", input_optname); + + StIvtIostorinv mstDao = updataMst(whereJson, null); + this.save(mstDao); + + // 插入明细 + JSONArray tableData = whereJson.getJSONArray("tableData"); + + List rows = tableData.stream() + .map(row -> JSONObject.parseObject(JSON.toJSONString(row))) + .collect(Collectors.toList()); + + iStIvtIostorinvdtlService.insertOutDtl(rows, mstDao.getIostorinv_id()); + + return mstDao.getIostorinv_id().toString(); + } + + @Override + @Transactional + public void update(JSONObject whereJson) { + // 修改主表 + StIvtIostorinv mstDao = updataMst(whereJson, this.getById(whereJson.getLongValue("iostorinv_id"))); + this.updateById(mstDao); + + // 插入明细 + JSONArray tableData = whereJson.getJSONArray("tableData"); + + List rows = tableData.stream() + .map(row -> JSONObject.parseObject(JSON.toJSONString(row))) + .collect(Collectors.toList()); + + iStIvtIostorinvdtlService.insertOutDtl(rows, mstDao.getIostorinv_id()); + } + + @Override + @Transactional + public void deleteAll(Long[] ids) { + + List listId = Arrays.asList(ids); + + // 更新主表 + this.update( + new UpdateWrapper().lambda() + .set(StIvtIostorinv::getIs_delete, IOSEnum.IS_NOTANDYES.code("是")) + .set(StIvtIostorinv::getUpdate_optid, Long.parseLong(SecurityUtils.getCurrentUserId())) + .set(StIvtIostorinv::getUpdate_optname, SecurityUtils.getCurrentNickName()) + .set(StIvtIostorinv::getUpdate_optname, DateUtil.now()) + .in(StIvtIostorinv::getIostorinv_id, listId) + ); + } + + @Override + @Transactional + public void allDiv(JSONObject whereJson) { + /* + * 分配规则: + * 1.有销售订单号:用销售订单号、物料去找这批物料最早入库的木箱 + * 2.没有销售订单号,有子卷号:固定出某个木箱 + */ + StIvtIostorinv mstDao = this.getById(whereJson.getLongValue("iostorinv_id")); + + // 如果是发货出库则判断运费和物流公司不能为空 + if (mstDao.getBill_type().equals(IOSEnum.OUT_TYPE.code("发货出库"))) { + + if (ObjectUtil.isEmpty(mstDao.getTrans_code())) { + throw new BadRequestException("物流公司不能为空!"); + } + + if (ObjectUtil.isEmpty(mstDao.getEstimated_freight())) { + throw new BadRequestException("预估运费不能为空!"); + } + + } + + /* + * 查询生成和未分配完的明细, 条件:明细状态小于等于分配中、未分配数大于0 + */ + // 查询条件 + LambdaQueryWrapper dtlQuery = new QueryWrapper().lambda(); + dtlQuery.eq(StIvtIostorinvdtl::getIostorinv_id, mstDao.getIostorinv_id()) + .le(StIvtIostorinvdtl::getBill_status, IOSEnum.BILL_STATUS.code("分配中")) + .gt(StIvtIostorinvdtl::getUnassign_qty, 0) + .orderByAsc(StIvtIostorinvdtl::getSeq_no); + + // 判断是哪种类型: 全部分配-1,自动分配-2 + if (whereJson.getString("div_type").equals(IOSEnum.OUT_DIV_TYPE.code("自动分配"))) { + // 判断是否有箱号 + if (ObjectUtil.isEmpty(whereJson.getString("box_no"))) { + dtlQuery.eq(StIvtIostorinvdtl::getIostorinvdtl_id, whereJson.getString("iostorinvdtl_id")); + } else { + dtlQuery.eq(StIvtIostorinvdtl::getBox_no, whereJson.getString("box_no")); + } + } + + List dtlDaoList = iStIvtIostorinvdtlService.list(dtlQuery); + + if (ObjectUtil.isEmpty(dtlDaoList)) { + throw new BadRequestException("当前单据无可分配出库明细!"); + } + + // 查找此仓库/库区的所有库存 (库区:前端没有选择库区就默认仓库) + List ivtList = WQL.getWO("BST_OUTDIV").addParam("flag", "1").addParam("stor_id", mstDao.getStor_id().toString()) + .addParam("sect_id", whereJson.getString("sect_id")) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + if (ObjectUtil.isEmpty(ivtList)) { + throw new BadRequestException("库存不足!"); + } + + // 用于插入分配明细的集合 + List disDaoList = new ArrayList<>(); + + for (int i = 0; i < dtlDaoList.size(); i++) { + StIvtIostorinvdtl dtlDao = dtlDaoList.get(i); + + // 调用分配库存公共方法 + List disArr = outBussManageService.divIvt(dtlDao,ivtList); + + disDaoList.addAll(disArr); + } + + // 更新仓位 + List paramLockList = disDaoList.stream() + .map(StIvtIostorinvdis::getStruct_code) + .distinct() + .collect(Collectors.toList()); + + JSONObject jsonLockParam = new JSONObject(); + jsonLockParam.put("inv_type", mstDao.getBill_type()); + jsonLockParam.put("inv_id", mstDao.getIostorinv_id()); + jsonLockParam.put("inv_code", mstDao.getBill_code()); + jsonLockParam.put("lock_type", IOSEnum.LOCK_TYPE.code("出库锁")); + jsonLockParam.put("operate", IOSEnum.IO_TYPE.code("出库")); + + outBussManageService.lockStruct(paramLockList,jsonLockParam); + + // 插入分配明细 + iStIvtIostorinvdisService.saveBatch(disDaoList); + + // 更新主表状态 + updateMstStatus(mstDao.getIostorinv_id()); + + } + + @Override + @Transactional + public void manualDiv(JSONObject whereJson) { + StIvtIostorinv mstDao = this.getById(whereJson.getJSONObject("row").getString("iostorinv_id")); + + // 如果是发货出库则判断运费和物流公司不能为空 + if (mstDao.getBill_type().equals(IOSEnum.OUT_TYPE.code("发货出库"))) { + + if (ObjectUtil.isEmpty(mstDao.getTrans_code())) { + throw new BadRequestException("物流公司不能为空!"); + } + + if (ObjectUtil.isEmpty(mstDao.getEstimated_freight())) { + throw new BadRequestException("预估运费不能为空!"); + } + } + + /* + * 查询生成和未分配完的明细, 条件:明细状态小于等于分配中、未分配数大于0 + */ + JSONObject jsonDtl = whereJson.getJSONObject("row"); + + List dtlDaoList = iStIvtIostorinvdtlService.list( + new QueryWrapper().lambda() + .eq(StIvtIostorinvdtl::getIostorinv_id, mstDao.getIostorinv_id()) + .eq(StIvtIostorinvdtl::getIostorinvdtl_id,jsonDtl.getString("iostorinvdtl_id")) + .le(StIvtIostorinvdtl::getBill_status, IOSEnum.BILL_STATUS.code("分配中")) + .gt(StIvtIostorinvdtl::getUnassign_qty, 0) + .orderByAsc(StIvtIostorinvdtl::getSeq_no) + ); + + if (ObjectUtil.isEmpty(dtlDaoList)) { + throw new BadRequestException("未查询到对应明细,请检查数据!"); + } + + // 根据前端传过来的库存参数查询库存 + String box_in = whereJson.getJSONArray("rows").toJavaList(JSONObject.class).stream() + .map(row -> row.getString("storagevehicle_code")) + .collect(Collectors.joining("','")); + + List ivtList = WQL.getWO("BST_OUTDIV").addParam("flag", "1").addParam("stor_id", mstDao.getStor_id().toString()) + .addParam("box_in", "('"+box_in+"')") + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + if (ObjectUtil.isEmpty(ivtList)) { + throw new BadRequestException("未查询到对应库存,请检查数据!"); + } + + // 需要插入的分配集合 + List disDaoList = new ArrayList<>(); + + // 判断是否有子卷 + if (ObjectUtil.isNotEmpty(dtlDaoList.get(0).getPcsn())) { + // 查询此单据下相同木箱号的明细 + List dtlLikeBoxList = iStIvtIostorinvdtlService.list( + new QueryWrapper().lambda() + .eq(StIvtIostorinvdtl::getIostorinv_id, mstDao.getIostorinv_id()) + .eq(StIvtIostorinvdtl::getBox_no, dtlDaoList.get(0).getBox_no()) + .orderByAsc(StIvtIostorinvdtl::getSeq_no) + ); + + // 调用分配库存公共方法 + for (int i = 0; i < dtlLikeBoxList.size(); i++) { + StIvtIostorinvdtl dtlDao = dtlLikeBoxList.get(i); + + List pcsnList = ivtList.stream() + .filter(row -> row.getString("pcsn").equals(dtlDao.getPcsn())) + .collect(Collectors.toList()); + + disDaoList.addAll(outBussManageService.manualDivIvt(dtlDao, pcsnList)); + } + } else { + // 调用分配库存公共方法 + disDaoList = outBussManageService.manualDivIvt(dtlDaoList.get(0),ivtList); + } + + // 更新仓位 + List lockList = disDaoList.stream() + .map(StIvtIostorinvdis::getStruct_code) + .distinct() + .collect(Collectors.toList()); + + JSONObject jsonLockParam = new JSONObject(); + jsonLockParam.put("inv_type", mstDao.getBill_type()); + jsonLockParam.put("inv_id", mstDao.getIostorinv_id()); + jsonLockParam.put("inv_code", mstDao.getBill_code()); + jsonLockParam.put("lock_type", IOSEnum.LOCK_TYPE.code("出库锁")); + jsonLockParam.put("operate", IOSEnum.IO_TYPE.code("出库")); + + outBussManageService.lockStruct(lockList,jsonLockParam); + + // 插入分配明细 + iStIvtIostorinvdisService.saveBatch(disDaoList); + + // 更新主表状态 + updateMstStatus(mstDao.getIostorinv_id()); + } + + @Override + @Transactional + public void cancelDiv(JSONObject whereJson) { + // 任务表 + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); + + StIvtIostorinv mstDao = this.getById(whereJson.getLongValue("iostorinv_id")); + + /* + * 查询明细: + * 全部取消:查询此单据下所有分配明细 + * 自动取消:查询此明细下的相同木箱的分配明细 + * 删除分配明细:查询此明细下的相同木箱的分配明细 + */ + // 判断是什么类型 全部取消-0,自动取消-1,删除分配明细-3 + List disList; + + JSONObject jsonDisParam = new JSONObject(); + jsonDisParam.put("work_status", IOSEnum.WORK_STATUS.code("生成")); + jsonDisParam.put("is_issued", IOSEnum.IS_NOTANDYES.code("否")); + jsonDisParam.put("iostorinv_id", whereJson.getString("iostorinv_id")); + + // 自动取消 + if (whereJson.getString("cancel_type").equals(IOSEnum.OUT_CANCEL_TYPE.code("自动取消"))) { + // 判断是否有箱号 + if (ObjectUtil.isEmpty(whereJson.getString("box_no"))) { + jsonDisParam.put("iostorinvdtl_id", whereJson.getString("iostorinvdtl_id")); + } else { + jsonDisParam.put("box_no", whereJson.getString("box_no")); + } + } + + // 删除分配明细 + if (whereJson.getString("cancel_type").equals(IOSEnum.OUT_CANCEL_TYPE.code("删除一个"))) { + jsonDisParam.put("box_no", whereJson.getString("box_no")); + } + + disList = stIvtIostorinvdisMapper.getDivIosDisAll(jsonDisParam); + + if (ObjectUtil.isEmpty(disList)) { + throw new BadRequestException("不存在可以取消的出库分配明细"); + } + + //查询分配明细执行状态大于等于执行中,或任务状态大于等于下发时的记录 + List dtl_id_in = disList.stream() + .map(row -> row.getString("iostorinvdtl_id")) + .distinct() + .collect(Collectors.toList()); + + List disNumList = stIvtIostorinvdisMapper.getDivTaskDis(dtl_id_in); + + if (ObjectUtil.isNotEmpty(disNumList)) { + throw new BadRequestException("存在出库明细对应任务下发、执行中或完成,不可取消!"); + } + + /*删除分配记录*/ + List dis_id_in = disList.stream() + .map(row -> row.getLongValue("iostorinvdis_id")) + .collect(Collectors.toList()); + + iStIvtIostorinvdisService.remove( + new QueryWrapper().lambda() + .in(StIvtIostorinvdis::getIostorinvdis_id, dis_id_in) + ); + + /*更新库存*/ + outBussManageService.upateIvt(disList,mstDao,IOSEnum.IVT_CHANGE.code("减冻结")); + + /* + * 更新明细、主单据 + */ + // 明细集合 + List dtlDaoList = iStIvtIostorinvdtlService.list( + new QueryWrapper().lambda() + .eq(StIvtIostorinvdtl::getIostorinv_id, mstDao.getIostorinv_id()) + ); + + // 需要更新的明细集合 + List needUpdateList = new ArrayList<>(); + + // 根据明细分组 + Map> disListMap = disList.stream() + .collect(Collectors.groupingBy(row -> row.getString("iostorinvdtl_id"))); + + for (String iostorinvdtl_id : disListMap.keySet()) { + List disDaoList = disListMap.get(iostorinvdtl_id); + + // 过滤当前明细 + StIvtIostorinvdtl dtlDao = dtlDaoList.stream() + .filter(row -> row.getIostorinvdtl_id().toString().equals(iostorinvdtl_id)) + .collect(Collectors.toList()).get(0); + + // 需要减掉的数量 + double sub_qty = disDaoList.stream() + .map(row -> row.getBigDecimal("plan_qty")) + .reduce(BigDecimal.ZERO, BigDecimal::add) + .doubleValue(); + + dtlDao.setAssign_qty(NumberUtil.sub(dtlDao.getAssign_qty(), sub_qty)); + dtlDao.setUnassign_qty(NumberUtil.add(dtlDao.getUnassign_qty(), sub_qty)); + + // 已分配数量 > 0 则 = 0 + if (dtlDao.getAssign_qty().doubleValue() < 0) { + dtlDao.setAssign_qty(BigDecimal.valueOf(0)); + } + + // 未分配数量 > 计划数量 则 = 计划数量 + if (dtlDao.getUnassign_qty().doubleValue() > dtlDao.getPlan_qty().doubleValue()) { + dtlDao.setUnassign_qty(dtlDao.getPlan_qty()); + } + + // 未分配重量 = 计划重量 则 明细状态为生成 否则 为分配中 + if (dtlDao.getUnassign_qty().doubleValue() == dtlDao.getPlan_qty().doubleValue()){ + dtlDao.setBill_status(IOSEnum.BILL_STATUS.code("生成")); + } else { + dtlDao.setBill_status(IOSEnum.BILL_STATUS.code("分配中")); + } + + needUpdateList.add(dtlDao); + } + + // 更新明细 + iStIvtIostorinvdtlService.updateBatchById(needUpdateList); + + // 更新主表 + this.updateMstStatus(mstDao.getIostorinv_id()); + + /*删除出库任务*/ + String task_id_in = disList.stream() + .map(row -> row.getString("task_id")) + .distinct() + .collect(Collectors.joining("','")); + + + if (task_id_in.equals("null")) { + task_id_in = ""; + } + + JSONObject taskParam = new JSONObject(); + taskParam.put("is_delete", IOSEnum.IS_NOTANDYES.code("是")); + + taskTab.update(taskParam,"task_id IN ('"+task_id_in+"')"); + + /* + * 删除移库单、移库任务 + */ + // TODO 调用移库服务处理 + + /* + * 更新仓位 + */ + // 更新仓位 + List paramLockList = disList.stream() + .map(row -> row.getString("struct_code")) + .distinct() + .collect(Collectors.toList()); + + JSONObject jsonLockParam = new JSONObject(); + jsonLockParam.put("inv_type", mstDao.getBill_type()); + jsonLockParam.put("inv_id", mstDao.getIostorinv_id()); + jsonLockParam.put("inv_code", mstDao.getBill_code()); + jsonLockParam.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定")); + jsonLockParam.put("operate", IOSEnum.IO_TYPE.code("出库")); + + outBussManageService.lockStruct(paramLockList,jsonLockParam); + } + + @Override + @Transactional + public void allSetPoint(JSONObject whereJson) { + + StIvtIostorinv mstDao = this.getById(whereJson.getLongValue("iostorinv_id")); + + // 查询此明细所有未生成的分配明细 + 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 = createTaskMange(disLikeList,mstDao.getIostorinv_id().toString()); + } + + } + + @Override + @Transactional + public void confirm(JSONObject whereJson) { + // 子卷包装关系表 + WQLObject subTab = WQLObject.getWQLObject("pdm_bi_subpackagerelation"); + // 包装关系出入库记录表 + WQLObject subRecordTab = WQLObject.getWQLObject("pdm_bi_subpackagerelationrecord"); + // 任务表 + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); + // 库区表 + WQLObject sectTab = WQLObject.getWQLObject("st_ivt_sectattr"); + + StIvtIostorinv mstDao = this.getById(whereJson.getLongValue("iostorinv_id")); + + /* + * 更新明细 + */ + // 查询所有明细 + List dtlDaoList = iStIvtIostorinvdtlService.list( + new QueryWrapper().lambda() + .eq(StIvtIostorinvdtl::getIostorinv_id, mstDao.getIostorinv_id().toString()) + ); + + // 判断是否有生成状态的 + boolean is_createDtl = dtlDaoList.stream() + .anyMatch(row -> row.getBill_status().equals(IOSEnum.BILL_STATUS.code("生成"))); + + if (is_createDtl) { + throw new BadRequestException("请先分配完所有明细在进行确认!"); + } + + // 更新明细为完成 + iStIvtIostorinvdtlService.update( + new UpdateWrapper().lambda() + .set(StIvtIostorinvdtl::getBill_status, IOSEnum.WORK_STATUS.code("完成")) + .eq(StIvtIostorinvdtl::getIostorinv_id, mstDao.getIostorinv_id().toString()) + ); + + /* + * 更新分配明细、单据、仓位、库存 + */ + // 查询此单据下所有分配明细 + List disDaoList = iStIvtIostorinvdisService.list( + new QueryWrapper().lambda() + .eq(StIvtIostorinvdis::getIostorinv_id, mstDao.getIostorinv_id().toString()) + ); + + //判断分配明细中是否有未生成状态的分配明细 + boolean is_createTask = disDaoList.stream() + .anyMatch(row -> row.getWork_status().equals(IOSEnum.WORK_STATUS.code("未生成"))); + + if (is_createTask) { + throw new BadRequestException("有未生成状态的分配明细,不允许强制确认!"); + } + + // 需要更新的库存集合 + List needUpdateIvtList = new ArrayList<>(); + + // 需要更新的任务 + List needUpdateTaskList = new ArrayList<>(); + + + for (int i = 0; i < disDaoList.size(); i++) { + StIvtIostorinvdis disDao = disDaoList.get(i); + + JSONObject jsonIvt = new JSONObject(); + jsonIvt.put("struct_id", disDao.getStruct_id()); + jsonIvt.put("material_id", disDao.getMaterial_id()); + jsonIvt.put("pcsn", disDao.getPcsn()); + jsonIvt.put("canuse_qty", disDao.getPlan_qty()); + needUpdateIvtList.add(jsonIvt); + + if (disDao.getTask_id() != null) { + + needUpdateTaskList.add(disDao.getTask_id().toString()); + } + } + + // 更新库存 + outBussManageService.upateIvt(needUpdateIvtList,mstDao,IOSEnum.IVT_CHANGE.code("减库存")); + + // 更新仓位 + List paramLockList = disDaoList.stream() + .map(StIvtIostorinvdis::getStruct_code) + .distinct() + .collect(Collectors.toList()); + + JSONObject jsonLockParam = new JSONObject(); + jsonLockParam.put("inv_type", ""); + jsonLockParam.put("inv_id", ""); + jsonLockParam.put("inv_code", ""); + jsonLockParam.put("storagevehicle_code", ""); + jsonLockParam.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定")); + jsonLockParam.put("operate", IOSEnum.IO_TYPE.code("出库")); + + outBussManageService.lockStruct(paramLockList,jsonLockParam); + + // 更新单据 + mstDao.setBill_status(IOSEnum.BILL_STATUS.code("完成")); + this.updateById(mstDao); + + /* + * 插入子卷包装关系出入记录 + */ + String pcsn_in = disDaoList.stream() + .map(StIvtIostorinvdis::getPcsn) + .collect(Collectors.joining("','")); + + // 子卷包装集合 + List subList = subTab.query("container_name IN ('" + pcsn_in + "') AND status = '"+SUBEnum.STATUS.code("入库")+"'") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + // 子卷包装出入记录集合 + List suRebList = subRecordTab.query("container_name IN ('" + pcsn_in + "') AND status = '"+SUBEnum.STATUS.code("入库")+"' AND bill_code = '"+mstDao.getBill_code()+"'") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + for (int i = 0; i < disDaoList.size(); i++) { + StIvtIostorinvdis disDao = disDaoList.get(i); + + List subJoList = subList.stream() + .filter(row -> row.getString("container_name").equals(disDao.getPcsn())) + .collect(Collectors.toList()); + + JSONObject jsonSub = new JSONObject(); + if (ObjectUtil.isEmpty(subJoList)) { + // 查询对应的包装关系出入库记录表 + + List subReList = suRebList.stream() + .filter(row -> row.getString("container_name").equals(disDao.getPcsn()) && + row.getString("package_box_sn").equals(disDao.getBox_no())) + .collect(Collectors.toList()); + + if (ObjectUtil.isNotEmpty(subReList)) { + jsonSub = subReList.get(0); + } + } else { + jsonSub = subJoList.get(0); + } + + if (ObjectUtil.isEmpty(jsonSub)) { + throw new BadRequestException("此子卷不存在或不为入库状态:" + disDao.getPcsn()); + } + + //插入包装关系出入库记录表 + jsonSub.put("bill_code", mstDao.getBill_code()); + jsonSub.put("bill_id", mstDao.getIostorinv_id()); + jsonSub.put("bill_type", mstDao.getBill_type()); + jsonSub.put("io_type", IOSEnum.IO_TYPE.code("出库")); + jsonSub.put("insert_time", DateUtil.now()); + jsonSub.put("record_id", cn.hutool.core.util.IdUtil.getSnowflake(1, 1).nextId()); + subRecordTab.insert(jsonSub); + } + + /* + * 更新子卷包装关系 + */ + JSONObject jsonSubParam = new JSONObject(); + // 如果是拆箱出库和手工出库则为生成状态,否则为出库状态 + if (mstDao.getBill_type().equals(IOSEnum.OUT_TYPE.code("拆箱出库")) || mstDao.getBill_type().equals(IOSEnum.OUT_TYPE.code("手工出库"))) { + jsonSubParam.put("status", SUBEnum.STATUS.code("生成")); + } else { + jsonSubParam.put("status", SUBEnum.STATUS.code("出库")); + } + + subTab.update(jsonSubParam,"container_name IN ('"+pcsn_in+"')"); + + /* + * 更新任务为完成 + */ + JSONObject jsonTaskParam = new JSONObject(); + jsonTaskParam.put("task_status", TaskStatusEnum.FINISHED.getCode()); + + taskTab.update(jsonTaskParam,"task_id IN ('"+String.join("','", needUpdateTaskList)+"')"); + + /* + * 如果是调拨出库则生成调拨入库单 + */ + if (mstDao.getBill_type().equals(IOSEnum.OUT_TYPE.code("调拨出库"))) { + createOutIos(disDaoList,mstDao); + } + + /* + * 如果为返检出库或者改切出库删除对应的包装关系 + */ + if (mstDao.getBill_type().equals(IOSEnum.OUT_TYPE.code("返检出库")) || mstDao.getBill_type().equals(IOSEnum.OUT_TYPE.code("改切出库"))) { + + // 查询库区 + String sect_in = disDaoList.stream() + .map(row -> row.getSect_id().toString()) + .collect(Collectors.joining("','")); + + List sectList = sectTab.query("sect_id IN ('" + sect_in + "')") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + for (int i = 0; i < disDaoList.size(); i++) { + StIvtIostorinvdis disDao = disDaoList.get(i); + + JSONObject jsonSect = sectList.stream() + .filter(row -> row.getString("sect_id").equals(disDao.getSect_id().toString())) + .collect(Collectors.toList()).get(0); + + //如果是虚拟区的出库,直接把包装关系删除;如果为立库的包装关系,将解绑删除标识置为1。当发货区解绑时,删除包装关系 + if (jsonSect.getString("sect_type_attr").equals(IOSEnum.SECT_TYPE.code("虚拟区"))) { + subTab.delete("container_name = '" + disDao.getPcsn() + "'"); + } else { + HashMap map = new HashMap<>(); + map.put("need_delete", "1"); + + subTab.update(map, "container_name = '" + disDao.getPcsn() + "'"); + } + } + } + } + + /** + * 创建调拨入库单 + * @param disDaoList:出库分配明细集合 + * @param mstDao: 出库单据对象 + */ + private void createOutIos(List disDaoList, StIvtIostorinv mstDao) { + // 仓库表 + WQLObject attrTab = WQLObject.getWQLObject("st_ivt_bsrealstorattr"); + + // 子卷包装表 + WQLObject subTab = WQLObject.getWQLObject("pdm_bi_subpackagerelation"); + + // 插入调拨入库单参数 + Map paramMap = new HashMap<>(); + + /* + * 准备数据 + */ + // 查询移入仓库 + JSONObject jsonAttr = attrTab.query("stor_id = '" + mstDao.getOut_stor_id().toString() + "'").uniqueResult(0); + + if (ObjectUtil.isEmpty(jsonAttr)) { + throw new BadRequestException("未查询到对应的移入仓库信息!"); + } + + // 计算总数量 + BigDecimal total_qty = disDaoList.stream() + .map(row -> BigDecimal.valueOf(row.getPlan_qty().doubleValue())) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + paramMap.put("stor_id",jsonAttr.getString("stor_id")); + paramMap.put("bill_status",IOSEnum.BILL_STATUS.code("分配中")); + paramMap.put("total_qty",total_qty); + paramMap.put("detail_count",disDaoList.size()); + paramMap.put("bill_type",IOSEnum.IN_TYPE.code("调拨入库")); + paramMap.put("biz_date",DateUtil.today()); + paramMap.put("remark", ""); + + // 明细数据 + String pcsn_in = disDaoList.stream() + .map(StIvtIostorinvdis::getPcsn) + .collect(Collectors.joining("','")); + + List subList = subTab.query("container_name IN ('" + pcsn_in + "')") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + // 明细集合 + ArrayList tableData = new ArrayList<>(); + + for (int i = 0; i < disDaoList.size(); i++) { + StIvtIostorinvdis disDao = disDaoList.get(i); + + List suJobList = subList.stream() + .filter(row -> row.getString("container_name").equals(disDao.getPcsn())) + .collect(Collectors.toList()); + + LinkedHashMap jsonDtl = new LinkedHashMap<>(); + jsonDtl.put("package_box_sn", disDao.getBox_no()); + jsonDtl.put("thickness", suJobList.get(0).getString("thickness")); + jsonDtl.put("plan_qty", disDao.getPlan_qty().toString()); + jsonDtl.put("customer_description", suJobList.get(0).getString("customer_description")); + jsonDtl.put("quanlity_in_box", suJobList.get(0).getString("quanlity_in_box")); + jsonDtl.put("product_name", suJobList.get(0).getString("product_name")); + jsonDtl.put("net_weight", suJobList.get(0).getString("net_weight")); + jsonDtl.put("container_name", suJobList.get(0).getString("container_name")); + jsonDtl.put("width", suJobList.get(0).getString("width")); + jsonDtl.put("sap_pcsn", suJobList.get(0).getString("sap_pcsn")); + jsonDtl.put("customer_name", suJobList.get(0).getString("customer_name")); + jsonDtl.put("sale_order_name", suJobList.get(0).getString("sale_order_name")); + jsonDtl.put("product_description", suJobList.get(0).getString("product_description")); + jsonDtl.put("quality_scode", IOSEnum.QUALITY_SCODE.code("合格品")); + jsonDtl.put("ivt_level", IOSEnum.CREATE_MODE.code("PC产生")); + jsonDtl.put("is_active", IOSEnum.IS_NOTANDYES.code("是")); + tableData.add(jsonDtl); + } + + paramMap.put("tableData",tableData); + + // 调用入库服务插入入库 + iStIvtIostorinvService.insertMst(paramMap); + + // 更新子卷包装关系为包装 + JSONObject jsonSub = new JSONObject(); + jsonSub.put("status", SUBEnum.STATUS.code("包装")); + subTab.update(jsonSub,"container_name IN ('" + pcsn_in + "')"); + } + + /** + * 生成任务前处理 + * @param disLikeList: 相同规格木箱、订单、物料的分配明细集合 + * @param iostorinv_id: 单据标识 + * @return List 生成任务的集合 + */ + private List createTaskMange(List disLikeList, String iostorinv_id) { + // 仓位表 + WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); + + // 获取仓位集合 + String structCodeIn = disLikeList.stream() + .map(row -> row.getString("struct_code")) + .distinct().collect(Collectors.joining("','")); + + List attrList = attrTab.query("struct_code IN ('" + structCodeIn + "')") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + /* + * 判断是否被阻挡 + */ + // 获取所在排所有仓位 + String rowIn = attrList.stream() + .map(row -> row.getString("row_num")) + .distinct().collect(Collectors.joining("','")); + + List attrRowList = attrTab.query("stor_id = '" + IOSEnum.STOR_ID.code("二期") + "' AND row_num IN ('" + rowIn + "')") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + // 需生成出库任务的仓位集合 + List needMoveAttrList = new ArrayList<>(); + + // 需移库仓位集合 + List needCreateAttrList = new ArrayList<>(); + + // 循环准备任务参数 + for (int i = 0; i < attrList.size(); i++) { + JSONObject jsonAttr = attrList.get(i); + + // 判断是深位还是浅位 + if (jsonAttr.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("深"))) { + // 深位,判断对应浅位是否阻挡 + JSONObject jsonBoxStop = ifBoxStop(jsonAttr,attrRowList,iostorinv_id); + + if (ObjectUtil.isNotEmpty(jsonBoxStop)) { + // 加入需要移库的集合 + needMoveAttrList.add(jsonBoxStop); + } + + // 加入需生成任务的集合 + needCreateAttrList.add(jsonAttr); + } + } + return needMoveAttrList; + } + + /** + * 判断是否阻挡 + * @param jsonAttr 要出库的仓位 + * @param attrRowList 相同规格所在排所有仓位 + * @param iostorinv_id 单据标识 + * @return JSONObject 需要移库的仓位 + */ + private JSONObject ifBoxStop(JSONObject jsonAttr, List attrRowList, String iostorinv_id) { + + JSONObject result = new JSONObject(); + + // 获取要出库仓位所对应的浅货位 + List lowAttrList = attrRowList.stream() + .filter(row -> row.getString("row_num").equals(jsonAttr.getString("row_num")) && + row.getString("layer_num").equals(jsonAttr.getString("layer_num")) && + row.getString("col_num").equals(jsonAttr.getString("col_num")) && + row.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("浅")) + ) + .collect(Collectors.toList()); + + if (ObjectUtil.isEmpty(lowAttrList)) { + throw new BadRequestException("仓位数据错误,请检查!"); + } + + // 判断是否有货 + JSONObject jsonLow = lowAttrList.get(0); + + if (ObjectUtil.isNotEmpty(jsonLow.getString("storagevehicle_code"))) { + + // 未锁定说明可以移库 + if (jsonLow.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) { + result = jsonLow; + } else { + // 锁定 + // TODO 判断是否是此单据下的木箱 || 不同单据下的(在分配时做限制只允许一个单据的任务做完才能分配) + } + + } + return result; + } + + + /** + * 更新主表状态 + * @param iostorinv_id 主表标识 + */ + public void updateMstStatus(Long iostorinv_id) { + StIvtIostorinv mstDao = this.getById(iostorinv_id); + + mstDao.setUpdate_optid(Long.parseLong(SecurityUtils.getCurrentUserId())); + mstDao.setUpdate_optname(SecurityUtils.getCurrentNickName()); + mstDao.setUpdate_time(DateUtil.now()); + + // 查询所有明细 + List dtlDaoList = iStIvtIostorinvdtlService.list( + new QueryWrapper().lambda() + .eq(StIvtIostorinvdtl::getIostorinv_id, iostorinv_id) + ); + + boolean all_create = dtlDaoList.stream() + .allMatch(row -> row.getBill_status().equals(IOSEnum.BILL_STATUS.code("生成"))); + + boolean one_create = dtlDaoList.stream() + .anyMatch(row -> row.getBill_status().equals(IOSEnum.BILL_STATUS.code("分配中")) || + row.getBill_status().equals(IOSEnum.BILL_STATUS.code("分配完")) || + row.getBill_status().equals(IOSEnum.BILL_STATUS.code("完成")) + ); + + boolean div_create = dtlDaoList.stream() + .allMatch(row -> row.getBill_status().equals(IOSEnum.BILL_STATUS.code("分配完")) || + row.getBill_status().equals(IOSEnum.BILL_STATUS.code("完成")) + ); + + boolean confirm_create = dtlDaoList.stream() + .allMatch(row -> row.getBill_status().equals(IOSEnum.BILL_STATUS.code("完成"))); + + if (all_create) { + // 全生成状态 + mstDao.setBill_status(IOSEnum.BILL_STATUS.code("生成")); + } + + if (one_create) { + // 至少一个别的状态 + mstDao.setBill_status(IOSEnum.BILL_STATUS.code("分配中")); + } + + if (div_create) { + // 分配完状态 + mstDao.setBill_status(IOSEnum.BILL_STATUS.code("分配完")); + } + + if (confirm_create) { + // 完成状态 + mstDao.setBill_status(IOSEnum.BILL_STATUS.code("完成")); + mstDao.setConfirm_optid(Long.parseLong(SecurityUtils.getCurrentUserId())); + mstDao.setConfirm_optname(SecurityUtils.getCurrentNickName()); + mstDao.setConfirm_time(DateUtil.now()); + + // 调用单据确认 + } + + this.updateById(mstDao); + } + + /** + * 组织主表数据 + * + * @param whereJson {} + * @return StIvtIostorinv + */ + private StIvtIostorinv updataMst(JSONObject whereJson, StIvtIostorinv mstDao) { + + // 仓库信息 + StorattrDto storattrDto = storattrService.findById(Long.parseLong((String) whereJson.get("stor_id"))); + + if (ObjectUtil.isEmpty(mstDao)) { + // 新增 + mstDao = StIvtIostorinv.builder() + .iostorinv_id(IdUtil.getLongId()) + .bill_code(CodeUtil.getNewCode("IO_CODE")) + .buss_type(whereJson.getString("bill_type").substring(0, 4)) + .io_type(IOSEnum.IO_TYPE.code("出库")) + .bill_type(whereJson.getString("bill_type")) + .biz_date(whereJson.getString("biz_date").substring(0, 10)) + .stor_id(storattrDto.getStor_id()) + .stor_code(storattrDto.getStor_code()) + .stor_name(storattrDto.getStor_name()) + .detail_count(BigDecimal.valueOf(whereJson.getJSONArray("tableData").size())) + .remark(whereJson.getString("remark")) + .bill_status(whereJson.getString("bill_status")) + .total_qty(whereJson.getBigDecimal("total_qty")) + .create_mode(IOSEnum.CREATE_MODE.code("PC产生")) + .input_optid(whereJson.getLongValue("input_optid")) + .input_optname(whereJson.getString("input_optname")) + .input_time(DateUtil.now()) + .update_optid(whereJson.getLongValue("input_optid")) + .update_optname(whereJson.getString("input_optname")) + .update_time(DateUtil.now()) + .is_delete(IOSEnum.IS_NOTANDYES.code("否")) + .is_upload(IOSEnum.IS_NOTANDYES.code("否")) + .syscompanyid(SecurityUtils.getDeptId()) + .sysdeptid(SecurityUtils.getDeptId()) + .build(); + + if (ObjectUtil.isNotEmpty(whereJson.getString("out_stor_id"))) { + mstDao.setOut_stor_id(whereJson.getLongValue("out_stor_id")); + } + + } else { + // 修改 + mstDao.setBiz_date(whereJson.get("biz_date").toString().substring(0, 10)); + mstDao.setStor_id(storattrDto.getStor_id()); + mstDao.setStor_code(storattrDto.getStor_code()); + mstDao.setStor_name(storattrDto.getStor_name()); + mstDao.setDetail_count(BigDecimal.valueOf(whereJson.getJSONArray("tableData").size())); + mstDao.setRemark(whereJson.getString("remark")); + mstDao.setTotal_qty(whereJson.getBigDecimal("total_qty")); + mstDao.setUpdate_optid(Long.parseLong(SecurityUtils.getCurrentUserId())); + mstDao.setUpdate_optname(SecurityUtils.getCurrentNickName()); + mstDao.setUpdate_time(DateUtil.now()); + + if (ObjectUtil.isNotEmpty(whereJson.getString("out_stor_id"))) { + mstDao.setOut_stor_id(whereJson.getLongValue("out_stor_id")); + } + } + return mstDao; + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvServiceImpl.java index 68ebf8dbb..63866d33f 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvServiceImpl.java @@ -279,15 +279,16 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl disDaoList = iStIvtIostorinvdisService.list( new QueryWrapper().lambda() @@ -782,6 +795,47 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl '"+TaskStatusEnum.FINISHED.getCode()+"'"); + // 更新子卷包装关系 + String pcsn_in = disDaoList.stream() + .map(StIvtIostorinvdis::getPcsn) + .collect(Collectors.joining("','")); + + JSONObject jsonSubParam = new JSONObject(); + jsonSubParam.put("status", SUBEnum.STATUS.code("入库")); + + subTab.update(jsonSubParam,"container_name IN ('"+pcsn_in+"')"); + + /* + * 插入子卷包装关系出入记录 + */ + // 子卷包装集合 + List subList = subTab.query("container_name IN ('" + pcsn_in + "')") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + for (int i = 0; i < disDaoList.size(); i++) { + StIvtIostorinvdis disDao = disDaoList.get(i); + + List subJoList = subList.stream() + .filter(row -> row.getString("container_name").equals(disDao.getPcsn())) + .collect(Collectors.toList()); + + JSONObject jsonSub; + if (ObjectUtil.isNotEmpty(subJoList)) { + jsonSub = subJoList.get(0); + } else { + throw new BadRequestException("未查询到子卷号为:" + disDao.getPcsn() + "对应的包装关系!"); + } + + //插入包装关系出入库记录表 + jsonSub.put("bill_code", mstDao.getBill_code()); + jsonSub.put("bill_id", mstDao.getIostorinv_id()); + jsonSub.put("bill_type", mstDao.getBill_type()); + jsonSub.put("io_type", IOSEnum.IO_TYPE.code("入库")); + jsonSub.put("insert_time", DateUtil.now()); + jsonSub.put("record_id", cn.hutool.core.util.IdUtil.getSnowflake(1, 1).nextId()); + subRecordTab.insert(jsonSub); + } + //返检入库,将回传字段改为1 if (mstDao.getBill_type().equals(IOSEnum.IN_TYPE.code("返检入库"))) { mstDao.setIs_upload(IOSEnum.IS_NOTANDYES.code("是")); diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvdtlServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvdtlServiceImpl.java index 3a2833d01..2bcc294ff 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvdtlServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvdtlServiceImpl.java @@ -7,8 +7,10 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.nl.b_lms.pdm_manage.enums.SUBEnum; import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvService; import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvdisService; import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvdtlService; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinv; import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdis; import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdtl; import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.mapper.StIvtIostorinvdtlMapper; @@ -41,8 +43,16 @@ public class StIvtIostorinvdtlServiceImpl extends ServiceImpl>insertDtl(List rows, Long iostorinv_id) { + StIvtIostorinv mstDao = iStIvtIostorinvService.getById(iostorinv_id); + // 先删除所有明细并更新子卷包装关系 updateSub(iostorinv_id); @@ -130,6 +140,12 @@ public class StIvtIostorinvdtlServiceImpl extends ServiceImpl rows, Long iostorinv_id) { + + // 删除明细 + this.remove( + new QueryWrapper().lambda() + .eq(StIvtIostorinvdtl::getIostorinv_id, iostorinv_id) + ); + + // 查询所有对应物料集合 + String materialIdIn = rows.stream() + .map(row -> JSONObject.parseObject(JSON.toJSONString(row)).getString("material_id")) + .distinct() + .collect(Collectors.joining("','")); + + List materList = WQLObject.getWQLObject("md_me_materialbase") + .query("material_id in ('" + materialIdIn + "')") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + // 查询所有物料对应的计量单位 + String unitIdIn = materList.stream() + .map(row -> row.getString("base_unit_id")) + .distinct() + .collect(Collectors.joining("','")); + + List unitList = WQLObject.getWQLObject("md_pb_measureunit") + .query("measure_unit_id in ('" + unitIdIn + "')") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + // 明细批量插入集合 + ArrayList dtlDaoList = new ArrayList<>(); + + for (int i = 0; i < rows.size(); i++) { + JSONObject row = rows.get(i); + + // 匹配对应物料 + List materDaoList = materList.stream() + .filter(item -> item.getString("material_id").equals(row.getString("material_id"))) + .collect(Collectors.toList()); + + if (ObjectUtil.isEmpty(materDaoList)) { + throw new BadRequestException("物料:"+row.getString("product_name")+"不存在,请检查数据!"); + } + + JSONObject materDao = materDaoList.get(0); + + // 匹配物料对应的计量单位 + List unitDaoList = unitList.stream() + .filter(item -> item.getString("measure_unit_id").equals(materDao.getString("base_unit_id"))) + .collect(Collectors.toList()); + + if (ObjectUtil.isEmpty(unitDaoList)) { + throw new BadRequestException("物料:"+row.getString("product_name")+"的计量单位不存在,请检查数据!"); + } + + JSONObject unitDao = unitDaoList.get(0); + + StIvtIostorinvdtl dtlDao = StIvtIostorinvdtl.builder() + .iostorinvdtl_id(IdUtil.getLongId()) + .iostorinv_id(iostorinv_id) + .seq_no(BigDecimal.valueOf(i+1)) + .material_id(materDao.getLongValue("material_id")) + .pcsn(row.getString("pcsn")) + .quality_scode(row.getString("quality_scode")) + .bill_status(IOSEnum.BILL_STATUS.code("生成")) + .qty_unit_id(unitDao.getLongValue("measure_unit_id")) + .qty_unit_name(unitDao.getString("unit_name")) + .plan_qty(row.getBigDecimal("plan_qty")) + .source_bill_type(row.getString("source_bill_type")) + .source_bill_code(row.getString("source_bill_code")) + .source_bill_table(row.getString("source_bill_table")) + .base_bill_type(row.getString("base_bill_type")) + .base_bill_code(row.getString("base_bill_code")) + .base_bill_table(row.getString("base_bill_table")) + .remark(row.getString("remark")) + .assign_qty(BigDecimal.valueOf(0)) + .unassign_qty(row.getBigDecimal("plan_qty")) + .box_no(row.getString("box_no")) + .vbeln(row.getString("vbeln")) + .posnr(row.getString("posnr")) + .width(row.getString("width")).build(); + + if (ObjectUtil.isNotEmpty(row.getString("source_billdtl_id"))) { + dtlDao.setSource_billdtl_id(row.getLongValue("source_billdtl_id")); + } + + if (ObjectUtil.isNotEmpty(row.getString("base_billdtl_id"))) { + dtlDao.setBase_billdtl_id(row.getLongValue("base_billdtl_id")); + } + + dtlDaoList.add(dtlDao); + + } + + this.saveBatch(dtlDaoList); + } + @Override public void updateStatus(Long iostorinvdtl_id) { diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InBussManageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InBussManageServiceImpl.java index e911cd0f6..c91e6c4a7 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InBussManageServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InBussManageServiceImpl.java @@ -446,10 +446,16 @@ public class InBussManageServiceImpl implements InBussManageService { // 判断是否有木箱 JSONObject jsonAttrDark = darkAttr.get(0); - if (ObjectUtil.isNotEmpty(jsonAttrDark.getString("storagevehicle_code")) && jsonAttrDark.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) { - jsonAttr = json; + if (ObjectUtil.isNotEmpty(jsonAttrDark.getString("storagevehicle_code"))) { + + if (jsonAttrDark.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) { + jsonAttr = json; + } + } else { - jsonAttr = jsonAttrDark; + if (jsonAttrDark.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) { + jsonAttr = jsonAttrDark; + } } } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutBussManageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutBussManageServiceImpl.java new file mode 100644 index 000000000..56ede66d0 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutBussManageServiceImpl.java @@ -0,0 +1,438 @@ +package org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.b_lms.sch.tasks.TwoOutTask; +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.IStIvtIostorinvdtlService; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinv; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdis; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdtl; +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.OutBussManageService; +import org.nl.common.utils.IdUtil; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.pda.mps.eum.RegionTypeEnum; +import org.nl.wms.st.inbill.service.StorPublicService; +import org.nl.wms.st.instor.service.HandMoveStorService; +import org.nl.wms.st.instor.task.HandMoveStorAcsTask; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + *

+ * 出库业务处理 服务实现类 + *

+ * + * @author generator + * @since 2023-11-10 + */ +@Service +public class OutBussManageServiceImpl implements OutBussManageService { + + /** + * 出库主表服务 + */ + @Autowired + private IStIvtIostorinvOutService stIvtIostorinvOutService; + + /** + * 出入库明细服务 + */ + @Autowired + private IStIvtIostorinvdtlService iStIvtIostorinvdtlService; + + /** + * 仓位库存服务 + */ + @Autowired + private StorPublicService storPublicService; + + /** + * 入库业务处理服务 + */ + @Autowired + private InBussManageService inBussManageService; + + /** + * 移库服务 + */ + @Autowired + private HandMoveStorService handMoveStorService; + + @Override + @Transactional + public void lockStruct(List param, JSONObject json) { + + if (ObjectUtil.isEmpty(param)) { + throw new BadRequestException("锁定或解锁仓位不能为空!"); + } + + // 仓位表 + WQLObject attrTab = WQLObject.getWQLObject("ST_IVT_StructAttr"); + + String operate = json.getString("operate"); + if (operate.equals(IOSEnum.IO_TYPE.code("出库"))) { + + attrTab.update(json, "struct_code IN ('" + String.join("','", param) + "')"); + } + } + + @Override + public List divIvt(StIvtIostorinvdtl dtlDao, List ivtList) { + + StIvtIostorinv mstDao = stIvtIostorinvOutService.getById(dtlDao.getIostorinv_id()); + + // 需要返回的分配明细对象集合 + List resultDisList = new ArrayList<>(); + + // 需要更新库存的集合 + List updateIvtList = new ArrayList<>(); + + // 已分配重量 + double assign_qty = dtlDao.getAssign_qty().doubleValue(); + + // 未分配重量 + double unassign_qty = dtlDao.getUnassign_qty().doubleValue(); + + if (ObjectUtil.isNotEmpty(dtlDao.getSource_bill_code())) { + // 有订单号: 找相同物料、订单号的库存,并根据仓位分组、即木箱分组 + Map> likeMaterOrderMap = ivtList.stream() + .filter(row -> row.getString("material_id").equals(dtlDao.getMaterial_id().toString()) && + row.getString("sale_order_name").equals(dtlDao.getSource_bill_code())) + .collect(Collectors.groupingBy(row -> row.getString("struct_code"))); + + if (ObjectUtil.isEmpty(likeMaterOrderMap)) { + throw new BadRequestException("库存不足!"); + } + + for (String struct_code : likeMaterOrderMap.keySet()) { + + // 判断是否继续分配库存 + if (unassign_qty <= 0) { + break; + } + + // 相同箱号的库存 + List likeBoxList = likeMaterOrderMap.get(struct_code); + + // 计算重量 + double canuse_qty = likeBoxList.stream() + .map(row -> row.getBigDecimal("canuse_qty")) + .reduce(BigDecimal.ZERO, BigDecimal::add) + .doubleValue(); + + // 加已分配重量 + assign_qty = NumberUtil.add(assign_qty, canuse_qty); + + // 减未分配重量 + if (unassign_qty >= canuse_qty) { + unassign_qty = NumberUtil.sub(unassign_qty, canuse_qty); + } else { + unassign_qty = 0; + } + + // 添加需要更新的库存 + updateIvtList.addAll(likeBoxList); + + // 添加生成分配明细 + List disDaoList= divDisParam(likeBoxList, dtlDao); + resultDisList.addAll(disDaoList); + + } + + } else { + // 确定子卷: 找相同物料、批次的箱子 + List likePcsnBoxList = ivtList.stream() + .filter(row -> row.getString("material_id").equals(dtlDao.getMaterial_id().toString()) && + row.getString("pcsn").equals(dtlDao.getPcsn()) + ) + .collect(Collectors.toList()); + + if (ObjectUtil.isEmpty(likePcsnBoxList)) { + throw new BadRequestException("库存不足!"); + } + + // 计算重量 + double canuse_qty = likePcsnBoxList.stream() + .map(row -> row.getBigDecimal("canuse_qty")) + .reduce(BigDecimal.ZERO, BigDecimal::add) + .doubleValue(); + + unassign_qty = 0; + assign_qty = NumberUtil.add(assign_qty, canuse_qty); + + // 添加需要更新的库存 + updateIvtList.addAll(likePcsnBoxList); + + // 添加生成分配明细 + List disDaoList= divDisParam(likePcsnBoxList, dtlDao); + resultDisList.addAll(disDaoList); + + } + + // 更新库存 + upateIvt(updateIvtList, mstDao, IOSEnum.IVT_CHANGE.code("加冻结")); + + // 更新明细 + dtlDao.setAssign_qty(BigDecimal.valueOf(assign_qty)); + dtlDao.setUnassign_qty(BigDecimal.valueOf(unassign_qty)); + dtlDao.setBill_status(unassign_qty == 0 ? IOSEnum.BILL_STATUS.code("分配完") : IOSEnum.BILL_STATUS.code("分配中")); + + iStIvtIostorinvdtlService.updateById(dtlDao); + + return resultDisList; + } + + @Override + public List manualDivIvt(StIvtIostorinvdtl dtlDao, List ivtList) { + + /*更新明细*/ + // 加已分配数量 + double canuse_qty = ivtList.stream() + .map(row -> row.getBigDecimal("canuse_qty")) + .reduce(BigDecimal.ZERO, BigDecimal::add) + .doubleValue(); + + dtlDao.setAssign_qty(NumberUtil.add(dtlDao.getAssign_qty(),canuse_qty)); + + // 减未分配数量 + dtlDao.setUnassign_qty(NumberUtil.sub(dtlDao.getUnassign_qty(), canuse_qty)); + + if (dtlDao.getUnassign_qty().doubleValue() <= 0 ) { + dtlDao.setUnassign_qty(BigDecimal.valueOf(0)); + } + + dtlDao.setBill_status(dtlDao.getUnassign_qty().doubleValue() == 0 ? IOSEnum.BILL_STATUS.code("分配完") : IOSEnum.BILL_STATUS.code("分配中")); + iStIvtIostorinvdtlService.updateById(dtlDao); + + /*更新库存*/ + // 添加需要更新的库存 + StIvtIostorinv mstDao = stIvtIostorinvOutService.getById(dtlDao.getIostorinv_id()); + upateIvt(ivtList, mstDao, IOSEnum.IVT_CHANGE.code("加冻结")); + + return divDisParam(ivtList, dtlDao); + } + + /** + * 准备插入分配明细的参数 + * @param likeBoxList 相同木箱的库存 + * @param dtlDao 明细对象 + * @return List 分配明细对象集合 + */ + private List divDisParam(List likeBoxList, StIvtIostorinvdtl dtlDao) { + + List resultDisList = new ArrayList<>(); + + // 查询库区 + JSONObject jsonSect = WQLObject.getWQLObject("st_ivt_sectattr") + .query("sect_id = '" + likeBoxList.get(0).getString("sect_id") + "'") + .uniqueResult(0); + + String work_status; + if (jsonSect.getString("sect_type_attr").equals(IOSEnum.SECT_TYPE.code("虚拟区"))) { + work_status = IOSEnum.WORK_STATUS.code("生成"); + } else { + work_status = IOSEnum.WORK_STATUS.code("未生成"); + } + + // 查询计量单位 + JSONObject jsonUnit = WQLObject.getWQLObject("md_pb_measureunit") + .query("measure_unit_id = '" + likeBoxList.get(0).getString("qty_unit_id") + "'") + .uniqueResult(0); + + // 查询子卷包装关系 + String pcsn_in = likeBoxList.stream() + .map(row -> row.getString("pcsn")) + .collect(Collectors.joining("','")); + + List subList = WQLObject.getWQLObject("pdm_bi_subpackagerelation") + .query("container_name in ('" + pcsn_in + "')") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + + for (int i = 0; i < likeBoxList.size(); i++) { + JSONObject jsonIvt = likeBoxList.get(i); + + JSONObject jsonSub = subList.stream() + .filter(row -> row.getString("container_name").equals(jsonIvt.getString("pcsn"))) + .collect(Collectors.toList()).get(0); + + StIvtIostorinvdis disDao = StIvtIostorinvdis.builder() + .iostorinvdis_id(IdUtil.getLongId()) + .iostorinv_id(dtlDao.getIostorinv_id()) + .iostorinvdtl_id(dtlDao.getIostorinvdtl_id()) + .seq_no(BigDecimal.valueOf(i + 1)) + .sect_id(jsonIvt.getLongValue("sect_id")) + .sect_code(jsonIvt.getString("sect_code")) + .sect_name(jsonIvt.getString("sect_name")) + .struct_id(jsonIvt.getLongValue("struct_id")) + .struct_code(jsonIvt.getString("struct_code")) + .struct_name(jsonIvt.getString("struct_name")) + .material_id(jsonIvt.getLongValue("material_id")) + .pcsn(jsonIvt.getString("pcsn")) + .quality_scode("01") + .storagevehicle_id(jsonIvt.getLongValue("storagevehicle_id")) + .storagevehicle_code(jsonIvt.getString("storagevehicle_code")) + .is_issued(IOSEnum.IS_NOTANDYES.code("否")) + .qty_unit_id(jsonUnit.getLongValue("measure_unit_id")) + .qty_unit_name(jsonUnit.getString("unit_name")) + .plan_qty(jsonIvt.getBigDecimal("canuse_qty")) + .real_qty(jsonIvt.getBigDecimal("real_qty")) + .work_status(work_status) + .box_no(jsonSub.getString("package_box_sn")) + .build(); + + resultDisList.add(disDao); + } + + return resultDisList; + } + + @Override + public void upateIvt(List list, StIvtIostorinv mstDao, String ivt_change) { + + for (int i = 0; i < list.size(); i++) { + JSONObject json = list.get(i); + + JSONObject jsonParam = new JSONObject(); + jsonParam.put("struct_id", json.getString("struct_id")); + jsonParam.put("material_id", json.getString("material_id")); + jsonParam.put("pcsn", json.getString("pcsn")); + jsonParam.put("change_qty", json.getString("canuse_qty")); + jsonParam.put("bill_type_scode", mstDao.getBill_type()); + jsonParam.put("quality_scode", IOSEnum.QUALITY_SCODE.code("合格品")); + jsonParam.put("inv_id", mstDao.getIostorinv_id()); + jsonParam.put("bill_code", mstDao.getBill_code()); + jsonParam.put("bill_table", "ST_IVT_IOStorInv"); + storPublicService.IOStor(jsonParam, ivt_change); + + } + + } + + @Override + public void createMove(List list) { + //子卷包装关系表 + WQLObject subTab = WQLObject.getWQLObject("pdm_bi_subpackagerelation"); + + //物料表 + WQLObject materTab = WQLObject.getWQLObject("md_me_materialbase"); + + // 获取子卷包装集合 + String vehilcle_in = list.stream() + .map(row -> row.getString("storagevehicle_code")) + .collect(Collectors.joining("','")); + + List subList = subTab.query("package_box_sn IN ('" + vehilcle_in + "')") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + // 查询物料集合 + String materialCode_in = subList.stream() + .map(row -> row.getString("product_name")) + .collect(Collectors.joining("','")); + + List materList = materTab.query("material_code IN ('" + materialCode_in + "')") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + + for (int i = 0; i < list.size(); i++) { + JSONObject json = list.get(i); + + // 生成移库单传入参数 + JSONObject mapParam = new JSONObject(); + // 明细参数 + JSONArray table = new JSONArray(); + + mapParam.put("bill_type", IOSEnum.MOVE_TYPE.code("出库移库")); + mapParam.put("buss_type", IOSEnum.MOVE_TYPE.code("出库移库")); + mapParam.put("bill_status", IOSEnum.MOVE_STATUS.code("提交")); + mapParam.put("biz_date", DateUtil.today()); + mapParam.put("stor_code", json.getString("stor_code")); + mapParam.put("stor_id", json.getString("stor_id")); + mapParam.put("stor_name", json.getString("stor_name")); + mapParam.put("is_task", IOSEnum.IS_NOTANDYES.code("是")); + + // 过滤对应物料 + JSONObject jsonSub = subList.stream() + .filter(row -> row.getString("package_box_sn").equals(json.getString("storagevehicle_code"))) + .collect(Collectors.toList()).get(0); + + JSONObject jsonMater = materList.stream() + .filter(row -> row.getString("material_code").equals(jsonSub.getString("product_name"))) + .collect(Collectors.toList()).get(0); + + // 查询移入货位 + JSONObject moveParam = new JSONObject(); + moveParam.put("stor_id", json.getString("stor_id")); + moveParam.put("sect_id", RegionTypeEnum.TWO_ZZ01.getId()); + moveParam.put("box_no", json.getString("storagevehicle_code")); + moveParam.put("material_id", jsonMater.getString("material_id")); + JSONObject jsonMove = inBussManageService.getOneStruct(moveParam); + + // 查询移出货位的库存物料 + JSONObject jsonMoveIvt = WQL.getWO("ST_OUTIVT03") + .addParam("flag", "6") + .addParam("struct_id", json.getString("struct_id")) + .process().uniqueResult(0); + + // 移库单明细 + JSONObject jsonMoveDtl = new JSONObject(); + jsonMoveDtl.put("is_task", "2"); + jsonMoveDtl.put("turnout_sect_id", json.getLongValue("sect_id")); + jsonMoveDtl.put("turnout_sect_code", json.getString("sect_code")); + jsonMoveDtl.put("turnout_sect_name", json.getString("sect_name")); + jsonMoveDtl.put("turnout_struct_id", json.getLongValue("struct_id")); + jsonMoveDtl.put("turnout_struct_code", json.getString("struct_code")); + jsonMoveDtl.put("turnout_struct_name", json.getString("struct_name")); + jsonMoveDtl.put("material_id", jsonMoveIvt.getLongValue("material_id")); + jsonMoveDtl.put("pcsn", jsonMoveIvt.getString("pcsn")); + jsonMoveDtl.put("quality_scode", IOSEnum.QUALITY_SCODE.code("合格品")); + jsonMoveDtl.put("qty_unit_id", jsonMoveIvt.getLongValue("qty_unit_id")); + jsonMoveDtl.put("qty_unit_name", jsonMoveIvt.getString("unit_name")); + jsonMoveDtl.put("qty", jsonMoveIvt.getDoubleValue("canuse_qty")); + jsonMoveDtl.put("storagevehicle_code", json.getString("storagevehicle_code")); + jsonMoveDtl.put("turnin_sect_id", jsonMove.getLongValue("sect_id")); + jsonMoveDtl.put("turnin_sect_code", jsonMove.getString("sect_code")); + jsonMoveDtl.put("turnin_sect_name", jsonMove.getString("sect_name")); + jsonMoveDtl.put("turnin_struct_id", jsonMove.getLongValue("struct_id")); + jsonMoveDtl.put("turnin_struct_code", jsonMove.getString("struct_code")); + jsonMoveDtl.put("turnin_struct_name", jsonMove.getString("struct_name")); + + // 生成任务 + JSONObject param2 = new JSONObject(); + param2.put("task_type", "010505"); + param2.put("vehicle_code", json.getString("storagevehicle_code")); + param2.put("point_code1", json.getString("struct_code")); + param2.put("point_code2", jsonMove.getString("struct_code")); + + HandMoveStorAcsTask handMoveStorAcsTask = new HandMoveStorAcsTask(); + String move_task_id = handMoveStorAcsTask.createTask(param2); + + // 回显移库明细任务id + jsonMoveDtl.put("task_id", move_task_id); + table.add(jsonMoveDtl); + + mapParam.put("tableData", table); + // 调用移库单新增方法 + handMoveStorService.insertDtl2(mapParam); + + // 下发任务 + handMoveStorAcsTask.immediateNotifyAcs(null); + } + + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/OutBussManageService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/OutBussManageService.java new file mode 100644 index 000000000..f10b982c5 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/OutBussManageService.java @@ -0,0 +1,68 @@ +package org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service; + +import com.alibaba.fastjson.JSONObject; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinv; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdis; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdtl; + +import java.util.ArrayList; +import java.util.List; + +/** + *

+ * 出库业务处理 服务类 + *

+ * + * @author generator + * @since 2023-11-16 + */ +public interface OutBussManageService { + + /** + * 上锁、解锁仓位处理 + * @param param:[ + * { + * struct_code: 仓位编码 + * } + * ] + * @param json { + * inv_type:单据类型 + * inv_id:单据标识 + * inv_code:单据编码 + * lock_type: 锁定类型 + * operate:单据类型 + * } + */ + void lockStruct(List param, JSONObject json); + + /** + * 分配库存方法 + * @param dtlDao: 明细对象 + * @param ivtList: 库存集合 + * @return List: 分配明细集合 + */ + List divIvt(StIvtIostorinvdtl dtlDao, List ivtList); + + /** + * 手工分配库存方法 + * @param dtlDao: 明细对象 + * @param ivtList: 需要配粉的库存集合 + * @return List: 分配明细集合 + */ + List manualDivIvt(StIvtIostorinvdtl dtlDao, List ivtList); + + /** + * 更新库存 + * @param list 需要更新的库存明细 + * @param mstDao 主表对象 + * @param ivt_change 更新类型 + */ + void upateIvt(List list, StIvtIostorinv mstDao, String ivt_change); + + /** + * 创建移库单 + * @param list 需要创建移库单的仓位 + */ + void createMove(List list); + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/wql/BST_OUTDIV.wql b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/wql/BST_OUTDIV.wql new file mode 100644 index 000000000..b80f7c39e --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/wql/BST_OUTDIV.wql @@ -0,0 +1,85 @@ +[交易说明] + 交易名: 出库分配 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.stor_id TYPEAS s_string + 输入.sect_id TYPEAS s_string + 输入.iostorinvdtl_id TYPEAS s_string + 输入.iostorinvdis_id TYPEAS s_string + 输入.iostorinv_id TYPEAS s_string + 输入.task_id TYPEAS s_string + 输入.bill_status TYPEAS s_string + 输入.is_issued TYPEAS s_string + 输入.dtl_id_in TYPEAS f_string + 输入.box_in TYPEAS f_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + QUERY + SELECT + ivt.*, + attr.row_num, + attr.block_num, + attr.storagevehicle_code, + attr.storagevehicle_id, + attr.sect_id, + attr.sect_code, + attr.sect_name, + sub.sale_order_name + FROM + ST_IVT_StructIvt ivt + LEFT JOIN ST_IVT_StructAttr attr ON attr.struct_id = ivt.struct_id + LEFT JOIN PDM_BI_SubPackageRelation sub ON attr.storagevehicle_code = sub.package_box_SN AND sub.container_name = ivt.pcsn + WHERE + ivt.quality_scode = '01' + AND attr.lock_type = '1' + AND ivt.canuse_qty <> '0' + + OPTION 输入.sect_id <> "" + attr.sect_id = 输入.sect_id + ENDOPTION + + OPTION 输入.stor_id <> "" + attr.stor_id = 输入.stor_id + ENDOPTION + + OPTION 输入.box_in <> "" + attr.storagevehicle_code in 输入.box_in + ENDOPTION + + ENDSELECT + ENDQUERY + ENDIF \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/eum/RegionTypeEnum.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/eum/RegionTypeEnum.java index 0d7ee761d..024465a4d 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/eum/RegionTypeEnum.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/eum/RegionTypeEnum.java @@ -19,7 +19,8 @@ public enum RegionTypeEnum { LKRK("16", "密集库入库输送线", "1585164789083148288"), LKCK("17", "密集库出库输送线", "1585167595403874304"), XN01("18", "虚拟区", "1586913215886004224"), - PD01("19", "盘点区", "1645705331612979200"); + PD01("19", "盘点区", "1645705331612979200"), + TWO_ZZ01("20", "暂存区", ""); private String name; private String code; diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/task/HandMoveStorAcsTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/task/HandMoveStorAcsTask.java index 2377b0015..5c593cfd7 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/task/HandMoveStorAcsTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/task/HandMoveStorAcsTask.java @@ -1,6 +1,7 @@ package org.nl.wms.st.instor.task; 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; @@ -120,7 +121,31 @@ public class HandMoveStorAcsTask extends AbstractAcsTask { */ @Override public String createTask(JSONObject form) { - return null; + String currentUserId = SecurityUtils.getCurrentUserId(); + String currentUsername = SecurityUtils.getCurrentUsername(); + + 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("task_name", form.getString("task_name")); + json.put("point_code1", form.getString("point_code1")); + json.put("point_code2", form.getString("point_code2")); + json.put("material_id", form.getString("material_id")); + json.put("task_group_id", form.getString("task_group_id")); + json.put("sort_seq", form.getString("sort_seq")); + + json.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + json.put("handle_class", THIS_CLASS); + json.put("create_id", currentUserId); + json.put("create_name", currentUsername); + json.put("create_time", DateUtil.now()); + json.put("acs_task_type", "7"); + WQLObject.getWQLObject("SCH_BASE_Task").insert(json); + + return json.getString("task_id"); } /** 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 800368551..08ebc3a28 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 @@ -3,8 +3,11 @@ package org.nl.wms.st.outbill.rest; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvOutService; import org.nl.modules.logging.annotation.Log; import org.nl.wms.st.inbill.service.CheckOutBillService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -20,8 +23,17 @@ import java.util.Map; @RequestMapping("/api/checkoutbill") @Slf4j public class CheckOutBillController { + /** + * 一期出库服务 + */ private final CheckOutBillService checkOutBillService; + /** + * 二期出出库服务 + */ + @Autowired + private IStIvtIostorinvOutService iStIvtIostorinvOutService; + @GetMapping @Log("查询出库单") @@ -58,7 +70,8 @@ public class CheckOutBillController { //@PreAuthorize("@el.check('checkoutbill:del')") @DeleteMapping public ResponseEntity delete(@RequestBody Long[] ids) { - checkOutBillService.deleteAll(ids); + iStIvtIostorinvOutService.deleteAll(ids); +// checkOutBillService.deleteAll(ids); return new ResponseEntity<>(HttpStatus.OK); } @@ -66,7 +79,8 @@ public class CheckOutBillController { @Log("修改出库单") public ResponseEntity update(@RequestBody JSONObject whereJson) { - checkOutBillService.update(whereJson); + iStIvtIostorinvOutService.update(whereJson); +// checkOutBillService.update(whereJson); return new ResponseEntity<>(HttpStatus.NO_CONTENT); } @@ -74,7 +88,8 @@ public class CheckOutBillController { @Log("新增出库单") public ResponseEntity insertDtl(@RequestBody JSONObject whereJson) { - checkOutBillService.insertDtl(whereJson); + iStIvtIostorinvOutService.insertMst(whereJson); +// checkOutBillService.insertDtl(whereJson); return new ResponseEntity<>(HttpStatus.CREATED); } @@ -82,7 +97,11 @@ public class CheckOutBillController { @Log("出库单全部分配") public ResponseEntity allDiv(@RequestBody JSONObject whereJson) { - checkOutBillService.allDiv(whereJson); + if (whereJson.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { + iStIvtIostorinvOutService.allDiv(whereJson); + } else { + checkOutBillService.allDiv(whereJson); + } return new ResponseEntity<>(HttpStatus.NO_CONTENT); } @@ -90,7 +109,12 @@ public class CheckOutBillController { @Log("出库单全部分2配") public ResponseEntity allDivOne(@RequestBody JSONObject whereJson) { - checkOutBillService.allDivOne(whereJson); + if (whereJson.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { + iStIvtIostorinvOutService.allDiv(whereJson); + } else { + checkOutBillService.allDivOne(whereJson); + } + return new ResponseEntity<>(HttpStatus.NO_CONTENT); } @@ -98,7 +122,11 @@ public class CheckOutBillController { @Log("出库单全部取消") public ResponseEntity allCancel(@RequestBody JSONObject whereJson) { - checkOutBillService.allCancel(whereJson); + if (whereJson.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { + iStIvtIostorinvOutService.cancelDiv(whereJson); + } else { + checkOutBillService.allCancel(whereJson); + } return new ResponseEntity<>(HttpStatus.NO_CONTENT); } @@ -114,7 +142,12 @@ public class CheckOutBillController { @Log("出库单全部取消") public ResponseEntity oneCancel(@RequestBody JSONObject whereJson) { - checkOutBillService.oneCancel(whereJson); + if (whereJson.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { + iStIvtIostorinvOutService.cancelDiv(whereJson); + } else { + checkOutBillService.oneCancel(whereJson); + } + return new ResponseEntity<>(HttpStatus.NO_CONTENT); } @@ -167,7 +200,12 @@ public class CheckOutBillController { @Log("一键设置") public ResponseEntity allSetPoint(@RequestBody JSONObject whereJson) { - checkOutBillService.allSetPoint(whereJson); + if (whereJson.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { + iStIvtIostorinvOutService.allSetPoint(whereJson); + } else { + checkOutBillService.allSetPoint(whereJson); + } + return new ResponseEntity<>(HttpStatus.NO_CONTENT); } @@ -196,7 +234,12 @@ public class CheckOutBillController { @Log("出库单手动分配") public ResponseEntity manualDiv(@RequestBody JSONObject whereJson) { - checkOutBillService.manualDiv(whereJson); + if (whereJson.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { + iStIvtIostorinvOutService.manualDiv(whereJson); + } else { + checkOutBillService.manualDiv(whereJson); + } + return new ResponseEntity<>(HttpStatus.NO_CONTENT); } @@ -204,7 +247,11 @@ public class CheckOutBillController { @Log("出库单强制确认") public ResponseEntity confirm(@RequestBody JSONObject whereJson) { - checkOutBillService.confirm(whereJson); + if (whereJson.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) { + iStIvtIostorinvOutService.confirm(whereJson); + } else { + checkOutBillService.confirm(whereJson); + } return new ResponseEntity<>(HttpStatus.NO_CONTENT); } diff --git a/lms/nladmin-ui/src/views/wms/st/outbill/DivDialog.vue b/lms/nladmin-ui/src/views/wms/st/outbill/DivDialog.vue index 00a0835ff..1062c83c3 100644 --- a/lms/nladmin-ui/src/views/wms/st/outbill/DivDialog.vue +++ b/lms/nladmin-ui/src/views/wms/st/outbill/DivDialog.vue @@ -425,6 +425,7 @@ export default { this.openParam = res this.structshow = true this.openRow = this.currentRow + this.openRow.stor_id = this.rowmst.stor_id this.loadingAlldiv = false }).catch(() => { this.loadingAlldiv = false @@ -452,6 +453,8 @@ export default { } }, deleteRow(row) { + row.stor_id = this.mstrow.stor_id + row.cancel_type = '3' checkoutbill.oneCancel(row).then(res => { this.queryTableDtl() }) @@ -509,6 +512,7 @@ export default { // return // } this.loadingAlldiv = true + this.mstrow.div_type = '1' checkoutbill.allDiv(this.mstrow).then(res => { this.crud.notify('分配成功!', CRUD.NOTIFICATION_TYPE.INFO) this.queryTableDtl() @@ -522,19 +526,21 @@ export default { // this.crud.notify('请先选择库区!', CRUD.NOTIFICATION_TYPE.INFO) // return // } - this.loadingAutodiv = true + this.loadingAlldiv = true if (this.currentRow.iostorinvdtl_id !== null) { - this.mstrow.iostorinvdtl_id = this.currentRow.iostorinvdtl_id - checkoutbill.allDivOne(this.mstrow).then(res => { + this.currentRow.div_type = '2' + this.currentRow.stor_id = this.rowmst.stor_id + checkoutbill.allDivOne(this.currentRow).then(res => { this.queryTableDtl() - this.loadingAutodiv = false + this.loadingAlldiv = false }).catch(() => { - this.loadingAutodiv = false + this.loadingAlldiv = false }) } }, allCancel() { this.loadingAlldiv = true + this.mstrow.cancel_type = '1' checkoutbill.allCancel(this.mstrow).then(res => { this.queryTableDtl() this.loadingAlldiv = false @@ -544,6 +550,8 @@ export default { }, oneCancel() { this.loadingAlldiv = true + this.currentRow.stor_id = this.mstrow.stor_id + this.currentRow.cancel_type = '2' if (this.currentRow.iostorinvdtl_id !== null) { checkoutbill.allCancel(this.currentRow).then(res => { this.queryTableDtl() @@ -653,7 +661,8 @@ export default { 'point_code': this.form2.point_code, 'iostorinv_id': this.mstrow.iostorinv_id, 'bill_code': this.mstrow.bill_code, - 'checked': this.checked + 'checked': this.checked, + 'stor_id': this.mstrow.stor_id } checkoutbill.allSetPoint(data).then(res => { this.queryTableDdis(this.currentRow.iostorinvdtl_id) diff --git a/lms/nladmin-ui/src/views/wms/st/outbill/StructIvt.vue b/lms/nladmin-ui/src/views/wms/st/outbill/StructIvt.vue index 458a87810..629af6361 100644 --- a/lms/nladmin-ui/src/views/wms/st/outbill/StructIvt.vue +++ b/lms/nladmin-ui/src/views/wms/st/outbill/StructIvt.vue @@ -266,7 +266,9 @@ export default { } }) this.fullscreenLoading = true - checkoutbill.manualDiv({ 'row': this.queryrow, 'rows': rows }).then(res => { + this.queryrow.stor_id = this.rowmst.stor_id + debugger + checkoutbill.manualDiv({ 'row': this.queryrow, 'rows': rows, 'stor_id': this.rowmst.stor_id }).then(res => { this.$emit('update:dialogShow', false) this.$emit('StructIvtClosed') this.fullscreenLoading = false @@ -283,7 +285,7 @@ export default { } }) this.fullscreenLoading = true - checkoutbill.manualDiv({ 'row': this.queryrow, 'rows': rows }).then(res => { + checkoutbill.manualDiv({ 'row': this.queryrow, 'rows': rows, 'stor_id': this.rowmst.stor_id }).then(res => { this.$emit('update:dialogShow', false) this.$emit('StructIvtClosed') this.fullscreenLoading = false diff --git a/lms/nladmin-ui/src/views/wms/st/outbill/index.vue b/lms/nladmin-ui/src/views/wms/st/outbill/index.vue index 5282bafa4..3a2c4cc8d 100644 --- a/lms/nladmin-ui/src/views/wms/st/outbill/index.vue +++ b/lms/nladmin-ui/src/views/wms/st/outbill/index.vue @@ -531,7 +531,7 @@ export default { }, confirm() { this.loadingConfirm = true - checkoutbill.confirm({ 'iostorinv_id': this.currentRow.iostorinv_id }).then(res => { + checkoutbill.confirm({ 'iostorinv_id': this.currentRow.iostorinv_id, 'stor_id': this.currentRow.stor_id }).then(res => { this.querytable() this.crud.notify('出库成功!', CRUD.NOTIFICATION_TYPE.SUCCESS) this.loadingConfirm = false