From d93fe3a4ed1ae2c252ec9f2c39284bff925e6411 Mon Sep 17 00:00:00 2001 From: liuxy Date: Fri, 19 Jan 2024 18:36:27 +0800 Subject: [PATCH] =?UTF-8?q?add=EF=BC=9Apc=E6=88=90=E5=93=81=E5=85=A5?= =?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/TwoInTask.java | 197 ++++++ .../storage_manage/ios/enums/IOSEnum.java | 17 +- .../iostorInv/IStIvtIostorinvService.java | 70 +++ .../iostorInv/IStIvtIostorinvdisService.java | 23 +- .../iostorInv/IStIvtIostorinvdtlService.java | 46 +- .../impl/StIvtIostorinvServiceImpl.java | 586 +++++++++++++++++- .../impl/StIvtIostorinvdisServiceImpl.java | 78 ++- .../impl/StIvtIostorinvdtlServiceImpl.java | 74 ++- .../util/impl/InBussManageServiceImpl.java | 460 ++++++++++++++ .../util/service/InBussManageService.java | 45 ++ .../service/iostorInv/util/wql/BST_INRULE.wql | 243 ++++++++ .../inbill/rest/RawAssistIStorController.java | 45 +- .../src/views/wms/st/inbill/DivDialog.vue | 5 +- .../src/views/wms/st/inbill/TaskDialog.vue | 7 + .../src/views/wms/st/inbill/index.vue | 4 +- 15 files changed, 1841 insertions(+), 59 deletions(-) create mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoInTask.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InBussManageServiceImpl.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/InBussManageService.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/wql/BST_INRULE.wql diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoInTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoInTask.java new file mode 100644 index 000000000..822866d28 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoInTask.java @@ -0,0 +1,197 @@ +package org.nl.b_lms.sch.tasks; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvdisService; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdis; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.impl.StIvtIostorinvServiceImpl; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.impl.StIvtIostorinvdisServiceImpl; +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.basedata.st.service.dto.StructattrDto; +import org.nl.wms.basedata.st.service.impl.StructattrServiceImpl; +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.impl.InbillServiceImpl; +import org.nl.wms.st.inbill.service.impl.RawAssistIStorServiceImpl; +import org.nl.wms.st.inbill.service.impl.StorPublicServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 二期入库任务类 + * Created by Lxy on 2024/1/19. + */ +public class TwoInTask extends AbstractAcsTask { + + /** + * 处理类 + */ + private final String THIS_CLASS = TwoInTask.class.getName(); + + @Override + public List addTask() { + /* + * 下发给ACS时需要特殊处理 + */ + 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); + } + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + + // 更新任务参数 + JSONObject map = new JSONObject(); + + /* + * 1-执行中, 2-完成 ,0-acs取消 + */ + // 执行中 + if (status.equals(TaskStatusEnum.EXECUTING.getCode())) { + + map.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + // 更新分配明细为执行中 + StIvtIostorinvdisServiceImpl bean = SpringContextHolder.getBean(StIvtIostorinvdisServiceImpl.class); + bean.updateStatusTask(taskObj.getString("task_id"), IOSEnum.WORK_STATUS.code("执行中"),IOSEnum.IS_NOTANDYES.code("是")); + + } + + // 完成 + if (status.equals(TaskStatusEnum.FINISHED.getCode())) { + + map.put("task_status", TaskStatusEnum.FINISHED.getCode()); + //调用入库分配确认方法 + StIvtIostorinvdisServiceImpl bean = SpringContextHolder.getBean(StIvtIostorinvdisServiceImpl.class); + bean.confirmDisIn(taskObj.getString("task_id")); + } + + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + + if (taskObj.getIntValue("task_status") > Integer.valueOf(TaskStatusEnum.ISSUE.getCode())) { + throw new BadRequestException("任务已执行不能取消"); + } + + // 更新任务表删除字段 + map.put("is_delete", IOSEnum.IS_NOTANDYES.code("是")); + + // 更新分配明细状态及相关字段 + StIvtIostorinvdisServiceImpl bean = SpringContextHolder.getBean(StIvtIostorinvdisServiceImpl.class); + bean.update( + new UpdateWrapper().lambda() + .set(StIvtIostorinvdis::getWork_status, IOSEnum.WORK_STATUS.code("未生成")) + .set(StIvtIostorinvdis::getIs_issued, IOSEnum.IS_NOTANDYES.code("否")) + .set(StIvtIostorinvdis::getPoint_id, null) + .set(StIvtIostorinvdis::getTask_id, null) + .eq(StIvtIostorinvdis::getTask_id, taskObj.getString("task_id")) + ); + + } + + map.put("update_optid", SecurityUtils.getCurrentUserId()); + map.put("update_optname", SecurityUtils.getCurrentNickName()); + map.put("update_time", DateUtil.now()); + + WQLObject.getWQLObject("SCH_BASE_Task").update(map, "task_id = '" + taskObj.getString("task_id") + "'"); + } + + @Override + public void findStartPoint() { + + } + + @Override + public void findNextPoint() { + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String createTask(JSONObject form) { + + if (StrUtil.isBlank(form.getString("task_type"))) { + throw new BadRequestException("业务类型不能为空!"); + } + + if (StrUtil.isBlank(form.getString("start_device_code"))) { + throw new BadRequestException("起点不能为空!"); + } + + if (StrUtil.isBlank(form.getString("next_device_code"))) { + throw new BadRequestException("终点不能为空!"); + } + + if (StrUtil.isBlank(form.getString("vehicle_code"))) { + throw new BadRequestException("载具号不能为空!"); + } + + JSONObject json = new JSONObject(); + json.put("task_id", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_code", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_type", form.getString("task_type")); + json.put("vehicle_code", form.getString("vehicle_code")); + json.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + json.put("point_code1", form.getString("start_device_code")); + json.put("point_code2", form.getString("next_device_code")); + json.put("handle_class", this.getClass().getName()); + json.put("create_id", SecurityUtils.getCurrentUserId()); + json.put("create_name", SecurityUtils.getCurrentUsername()); + json.put("create_time", DateUtil.now()); + json.put("priority", "1"); + json.put("acs_task_type", "7"); + + WQLObject.getWQLObject("SCH_BASE_Task").insert(json); + return json.getString("task_id"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void forceFinish(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + } + + @Override + public void cancel(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, IOSEnum.ACS_RESULT.code("取消")); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/enums/IOSEnum.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/enums/IOSEnum.java index fa0399858..d6c09d91b 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 @@ -20,6 +20,9 @@ public enum IOSEnum { //是否 IS_NOTANDYES(MapOf.of("否", "0", "是", "1")), + //acs返回任务状态 + ACS_RESULT(MapOf.of("执行中", "1", "完成", "2","取消","0")), + //出入库类型 IO_TYPE(MapOf.of("入库", "0", "出库", "1")), @@ -48,8 +51,20 @@ public enum IOSEnum { "空托盘入库锁", "5", "移出锁", "6", "移入锁", "7", "其它", "99" )), - //仓位锁定类型 + //仓库id STOR_ID(MapOf.of("二期", "1582991156504039455")), + + //仓位锁定类型 + LOCK_OPERATE(MapOf.of("入库锁定", "1","入库取消","2")), + + //库区类型 + SECT_TYPE(MapOf.of("主存区", "00","暂存区","01","虚拟区","09")), + + //库存变动类型 + IVT_CHANGE(MapOf.of("加待入", "31","加库存","33","减待入","32")), + + //仓位伸位 + ZDEPTH_STRUCT(MapOf.of("浅", "1","深","2","无","3")), ; private Map code; 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 55c35a1e9..7f30d6ca1 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 @@ -70,4 +70,74 @@ public interface IStIvtIostorinvService extends IService { */ void deleteAll(Long[] ids); + /** + * 分配货位 + * @param whereJson:{ + * dtl_row: {明细对象} + * point_code: 入库起点 + * checked:是否自动分类(true、false) + * stor_id:仓库标识 + * sect_id:库区标识 + * tableMater:[ + * {分配明细对象} + * ] + * } + */ + void divStruct(Map whereJson); + + /** + * 取消分配 + * @param whereJson { + * dtl_row: {明细对象} -- 用不到 + * tableMater:[{分配明细对象}] + * stor_id:仓库标识 + * point_code: 入库起点 -- 用不到 + * checked:是否自动分类(true、false) -- 用不到 + * } + */ + void unDivStruct(Map whereJson); + + /** + * 设置起点 + * @param whereJson { + * dtl_row: {明细对象} -- 用不到 + * tableMater:[{分配明细对象}] + * stor_id:仓库标识 + * point_code: 入库起点 + * checked:是否自动分类(true、false) -- 用不到 + * } + */ + void setPoint(Map whereJson); + + /** + * 下发任务 + * @param whereJson { + * task_id: 任务标识 + * } + */ + void reIssueTask(Map whereJson); + + /** + * 删除任务 + * @param whereJson { + * task_id: 任务标识 + * } + */ + void delTask(Map whereJson); + + /** + * 任务标识完成 + * @param whereJson { + * task_id: 任务标识 + * } + */ + void confirmTask(Map whereJson); + + /** + * 强制完成 + * @param whereJson: { + * 主表对象 + * } + */ + void confirm(Map whereJson); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/IStIvtIostorinvdisService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/IStIvtIostorinvdisService.java index 1ee5003b9..2a914e39c 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/IStIvtIostorinvdisService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/IStIvtIostorinvdisService.java @@ -19,12 +19,27 @@ public interface IStIvtIostorinvdisService extends IService { /** * 新增分配明细 + * * @param iostorinv_id : 主表标识 - * @param disDaoMap: - * { - * "明细标识":[{分配明细字段...}] - * } + * @param disDaoMap: { + * "明细标识":[{分配明细字段...}] + * } */ void insertDis(Long iostorinv_id, HashMap> disDaoMap); + + /** + * 根据任务id更新分配明细执行状态 + * + * @param task_id: 任务标识 + * @param work_status:执行状态 + * @param is_issued:是否已下发 + */ + void updateStatusTask(String task_id, String work_status, String is_issued); + + /** + * 任务反馈完成,确认分配明细完成 + * @param task_id: 任务标识 + */ + void confirmDisIn(String task_id); } 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 36f97f1b2..a396bfb13 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 @@ -20,27 +20,35 @@ public interface IStIvtIostorinvdtlService extends IService { /** * 新增出入库明细 - * @param rows: { - * package_box_sn:木箱号 - * thickness:产品厚度 - * plan_qty:计划数量 - * customer_description:客户名称 - * quanlity_in_box:子卷数量 - * product_name:物料编码 - * net_weight:净重 - * container_name:子卷号 - * width:宽 - * sap_pcsn:sap批次 - * customer_name:客户编码 - * sale_order_name:订单号 - * product_description:物料名称 - * quality_scode:品质类型 - * ivt_level:库存等级 - * is_active:是否可用 - * } + * + * @param rows: { + * package_box_sn:木箱号 + * thickness:产品厚度 + * plan_qty:计划数量 + * customer_description:客户名称 + * quanlity_in_box:子卷数量 + * product_name:物料编码 + * net_weight:净重 + * container_name:子卷号 + * width:宽 + * sap_pcsn:sap批次 + * customer_name:客户编码 + * sale_order_name:订单号 + * product_description:物料名称 + * quality_scode:品质类型 + * ivt_level:库存等级 + * is_active:是否可用 + * } * @param iostorinv_id: 主表标识 * @return {"明细标识":分配明细:[]} - * */ HashMap> insertDtl(List rows, Long iostorinv_id); + + /** + * 更新明细状态 + * + * @param iostorinvdtl_id: 明细标识 + */ + void updateStatus(Long iostorinvdtl_id); + } 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 234f4d03c..68ebf8dbb 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 @@ -1,8 +1,11 @@ package org.nl.b_lms.storage_manage.ios.service.iostorInv.impl; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; @@ -11,23 +14,36 @@ import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import lombok.extern.slf4j.Slf4j; import org.nl.b_lms.pdm_manage.enums.SUBEnum; +import org.nl.b_lms.sch.tasks.TwoInTask; 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.StIvtIostorinvMapper; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.InBussManageService; import org.nl.common.TableDataInfo; 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.core.bean.WQLObject; +import org.nl.modules.wql.util.SpringContextHolder; import org.nl.wms.basedata.st.service.StorattrService; import org.nl.wms.basedata.st.service.dto.StorattrDto; import org.nl.wms.basedata.st.service.impl.UserStorServiceImpl; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.service.PointService; +import org.nl.wms.sch.service.dto.PointDto; +import org.nl.wms.sch.tasks.InTask; +import org.nl.wms.st.inbill.service.StorPublicService; +import org.nl.wms.st.returns.service.impl.InAndOutRetrunServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -51,7 +67,7 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl page = PageHelper.startPage(pageQuery.getPageNumber() + 1, pageQuery.getPageSize()); @@ -89,7 +123,7 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl> disDaoMap = iStIvtIostorinvdtlService.insertDtl(rows, mstDao.getIostorinv_id()); // 插入分配明细 - iStIvtIostorinvdisService.insertDis(mstDao.getIostorinv_id(),disDaoMap); + iStIvtIostorinvdisService.insertDis(mstDao.getIostorinv_id(), disDaoMap); // 更新子卷包装关系 String packageIn = rows.stream() @@ -116,10 +150,10 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl> disDaoMap = iStIvtIostorinvdtlService.insertDtl(rows, mstDao.getIostorinv_id()); // 更新分配明细 - iStIvtIostorinvdisService.insertDis(mstDao.getIostorinv_id(),disDaoMap); + iStIvtIostorinvdisService.insertDis(mstDao.getIostorinv_id(), disDaoMap); // 更新子卷包装关系 String packageIn = rows.stream() @@ -156,10 +190,10 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl().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) + .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 divStruct(Map whereJson) { + // 仓位表 + WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); + // 库区表 + WQLObject sectTab = WQLObject.getWQLObject("st_ivt_sectattr"); + + // 参数类型转换 Map-> JSONObject + JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(whereJson)); + + // 分配明细集合 + ArrayList list = (ArrayList) whereJson.get("tableMater"); + + // 类型转换:linkenHashMap -> JSONObject + JSONObject jsonDis = list.stream() + .map(row -> JSONObject.parseObject(JSON.toJSONString(row))) + .collect(Collectors.toList()).get(0); + + // 判断当前木箱是否已经分配过货位 + StIvtIostorinvdis disDao = iStIvtIostorinvdisService.getById(jsonDis.getString("iostorinvdis_id")); + + if (ObjectUtil.isNotEmpty(disDao.getStruct_id())) { + throw new BadRequestException("该木箱已经分配过货位,无法继续分配!"); + } + + // 主表实体类 + StIvtIostorinv mstDao = this.getById(disDao.getIostorinv_id()); + + // 用于锁定货位 + JSONObject jsonLock = new JSONObject(); + ArrayList paramLockList = new ArrayList<>(); + + // 仓位对象 + JSONObject jsonAttr; + + // 是否自动分配货位 + Boolean checked = jsonObject.getBoolean("checked"); + if (ObjectUtil.isNotEmpty(checked) && checked) { + // 自动分配: 根据仓库、库区匹配一个合适的仓位 + JSONObject attrParam = new JSONObject(); + attrParam.put("stor_id", jsonObject.getString("stor_id")); + attrParam.put("sect_id", jsonObject.getString("sect_id")); + attrParam.put("material_id", disDao.getMaterial_id()); + attrParam.put("box_no", disDao.getBox_no()); + + jsonAttr = inBussManageService.getOneStruct(attrParam); + } else { + // 指定分配 + jsonLock.put("inv_type", mstDao.getBill_type()); + jsonLock.put("inv_id", mstDao.getIostorinv_id()); + jsonLock.put("inv_code", mstDao.getBill_code()); + jsonLock.put("lock_type", IOSEnum.LOCK_TYPE.code("入库锁")); + jsonLock.put("operate", IOSEnum.IO_TYPE.code("入库")); + + jsonAttr = attrTab.query("struct_id = '" + jsonDis.getString("struct_id") + "'").uniqueResult(0); + } + + if (ObjectUtil.isEmpty(jsonAttr)) { + throw new BadRequestException("没有可用仓位!"); + } + + // 调用业务处理类锁定货位 + paramLockList.add(jsonAttr.getString("struct_code")); + inBussManageService.lockStruct(paramLockList, jsonLock); + + // 判断是否虚拟区 + String work_status; + Long task_id = null; + + JSONObject jsonSect = sectTab.query("sect_id = '" + jsonAttr.getString("sect_id") + "'").uniqueResult(0); + if (jsonSect.getString("sect_type_attr").equals(IOSEnum.SECT_TYPE.code("虚拟区"))) { + // 虚拟区:执行状态为完成 + work_status = IOSEnum.WORK_STATUS.code("完成"); + task_id = IdUtil.getLongId(); + } else { + work_status = IOSEnum.WORK_STATUS.code("未生成"); + } + + // 更新分配明细 + iStIvtIostorinvdisService.update( + new UpdateWrapper().lambda() + .set(StIvtIostorinvdis::getStruct_id,jsonAttr.getString("struct_id")) + .set(StIvtIostorinvdis::getStruct_code,jsonAttr.getString("struct_code")) + .set(StIvtIostorinvdis::getStruct_name,jsonAttr.getString("struct_name")) + .set(StIvtIostorinvdis::getSect_id,jsonAttr.getString("sect_id")) + .set(StIvtIostorinvdis::getSect_code,jsonAttr.getString("sect_code")) + .set(StIvtIostorinvdis::getSect_name,jsonAttr.getString("sect_name")) + .set(StIvtIostorinvdis::getWork_status, work_status) + .set(StIvtIostorinvdis::getTask_id, task_id) + .eq(StIvtIostorinvdis::getIostorinv_id, disDao.getIostorinv_id()) + .eq(StIvtIostorinvdis::getBox_no, disDao.getBox_no()) + ); + + // 更新库存 + List disDaoList = iStIvtIostorinvdisService.list( + new QueryWrapper().lambda() + .eq(StIvtIostorinvdis::getIostorinv_id, disDao.getIostorinv_id()) + .eq(StIvtIostorinvdis::getBox_no, disDao.getBox_no()) + ); + upateIvt(disDaoList, mstDao,IOSEnum.IVT_CHANGE.code("加待入")); + + // 更新明细状态 + iStIvtIostorinvdtlService.updateStatus(disDao.getIostorinvdtl_id()); + + // 更新主表状态 + StIvtIostorinv mst = updateMstStatus(disDao.getIostorinv_id()); + mst.setDis_optid(Long.parseLong(SecurityUtils.getCurrentUserId())); + mst.setDis_optname(SecurityUtils.getCurrentNickName()); + mst.setDis_time(DateUtil.now()); + this.updateById(mst); + } + + @Override + @Transactional + public void unDivStruct(Map whereJson) { + + // 分配明细集合 + ArrayList list = (ArrayList) whereJson.get("tableMater"); + + // 类型转换:linkenHashMap -> JSONObject + JSONObject jsonDis = list.stream() + .map(row -> JSONObject.parseObject(JSON.toJSONString(row))) + .collect(Collectors.toList()).get(0); + + if (jsonDis.getIntValue("work_status") > Integer.parseInt(IOSEnum.WORK_STATUS.code("生成"))) { + throw new BadRequestException("任务正在执行中或已经完成,不能取消!"); + } + + // 解锁仓位 + ArrayList paramLockList = new ArrayList<>(); + paramLockList.add(jsonDis.getString("struct_code")); + + JSONObject jsonLock = new JSONObject(); + jsonLock.put("inv_type", ""); + jsonLock.put("inv_id", ""); + jsonLock.put("inv_code", ""); + jsonLock.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定")); + jsonLock.put("operate", IOSEnum.IO_TYPE.code("入库")); + + inBussManageService.lockStruct(paramLockList, jsonLock); + + // 更新库存 + StIvtIostorinv mstDao = this.getById(jsonDis.getString("iostorinv_id")); + + List disDaoList = iStIvtIostorinvdisService.list( + new QueryWrapper().lambda() + .eq(StIvtIostorinvdis::getStruct_code, jsonDis.getString("struct_code")) + .eq(StIvtIostorinvdis::getIostorinv_id, jsonDis.getString("iostorinv_id")) + .eq(StIvtIostorinvdis::getBox_no, jsonDis.getString("box_no")) + ); + + upateIvt(disDaoList,mstDao,IOSEnum.IVT_CHANGE.code("减待入")); + + // 更新分配明细状态 + iStIvtIostorinvdisService.update( + new UpdateWrapper().lambda() + .eq(StIvtIostorinvdis::getStruct_code, jsonDis.getString("struct_code")) + .eq(StIvtIostorinvdis::getIostorinv_id, jsonDis.getString("iostorinv_id")) + .eq(StIvtIostorinvdis::getBox_no, jsonDis.getString("box_no")) + .set(StIvtIostorinvdis::getPoint_id, null) + .set(StIvtIostorinvdis::getSect_id, null) + .set(StIvtIostorinvdis::getSect_code, "") + .set(StIvtIostorinvdis::getSect_name, "") + .set(StIvtIostorinvdis::getStruct_id, null) + .set(StIvtIostorinvdis::getStruct_code, "") + .set(StIvtIostorinvdis::getStruct_name, "") + .set(StIvtIostorinvdis::getWork_status, IOSEnum.WORK_STATUS.code("未生成")) + ); + + // 更新明细状态 + iStIvtIostorinvdtlService.updateStatus(jsonDis.getLongValue("iostorinvdtl_id")); + + // 更新主表状态 + StIvtIostorinv mst = updateMstStatus(jsonDis.getLongValue("iostorinv_id")); + mst.setDis_optid(Long.parseLong(SecurityUtils.getCurrentUserId())); + mst.setDis_optname(SecurityUtils.getCurrentNickName()); + mst.setDis_time(DateUtil.now()); + this.updateById(mst); + } + + @Override + @Transactional + public void setPoint(Map whereJson) { + + // 分配明细集合 + ArrayList list = (ArrayList) whereJson.get("tableMater"); + + // 类型转换:linkenHashMap -> JSONObject + JSONObject jsonDis = list.stream() + .map(row -> JSONObject.parseObject(JSON.toJSONString(row))) + .collect(Collectors.toList()).get(0); + + if (ObjectUtil.isEmpty(jsonDis.getString("struct_code"))) { + throw new BadRequestException("请先分配货位!"); + } + + // 点位实体类 + PointDto pointDto = pointService.findByCode((String) whereJson.get("point_code")); + + // 主表实体类 + StIvtIostorinv mstDao = this.getById(jsonDis.getString("iostorinv_id")); + + // 创建任务 + JSONObject jsonTaskParam = new JSONObject(); + // TODO 任务类型 + jsonTaskParam.put("task_type", "010501"); + jsonTaskParam.put("start_device_code", pointDto.getPoint_code()); + jsonTaskParam.put("next_device_code", jsonDis.getString("struct_code")); + jsonTaskParam.put("vehicle_code", jsonDis.getString("box_no")); + jsonTaskParam.put("inv_type", mstDao.getBill_type()); + jsonTaskParam.put("inv_id", mstDao.getIostorinv_id()); + jsonTaskParam.put("inv_code", mstDao.getBill_code()); + + String task_id = new TwoInTask().createTask(jsonTaskParam); + + // 更新分配明细 + iStIvtIostorinvdisService.update( + new UpdateWrapper().lambda() + .set(StIvtIostorinvdis::getTask_id, Long.parseLong(task_id)) + .set(StIvtIostorinvdis::getWork_status, IOSEnum.WORK_STATUS.code("生成")) + .set(StIvtIostorinvdis::getPoint_id, pointDto.getPoint_id()) + .eq(StIvtIostorinvdis::getIostorinv_id, mstDao.getIostorinv_id()) + .eq(StIvtIostorinvdis::getStruct_code, jsonDis.getString("struct_code")) + ); + } + + @Override + @Transactional + public void reIssueTask(Map whereJson) { + + String task_id = MapUtil.getStr(whereJson, "task_id"); + + //判断指令状态,只能下发生成、执行中状态的任务 + JSONObject task_jo = WQLObject.getWQLObject("sch_base_task").query("task_id = '" + task_id + "'").uniqueResult(0); + + if (ObjectUtil.isEmpty(task_jo)) { + throw new BadRequestException("请输入正确的任务号!"); + } + + if (!TaskStatusEnum.START_AND_POINT.getCode().equals(task_jo.getString("task_status"))) { + throw new BadRequestException("只能修改任务状态为未下发的任务!"); + } + + //调用ACS接受任务接口 + AbstractAcsTask task = new TwoInTask(); + JSONObject result = task.immediateNotifyAcs(task_id); + + if (ObjectUtil.isNotEmpty(result)) { + + if (String.valueOf(HttpStatus.OK.value()).equals(result.getString("status"))) { + //更新任务为下发 + JSONObject task_map = new JSONObject(); + task_map.put("task_id", task_id); + task.updateTaskStatus(task_map, TaskStatusEnum.EXECUTING.getCode()); + + } else { + throw new BadRequestException("任务下发失败:" + result.getString("message")); + } + } + + } + + @Override + @Transactional + public void delTask(Map whereJson) { + String task_id = MapUtil.getStr(whereJson, "task_id"); + + JSONObject jsonTask = WQLObject.getWQLObject("sch_base_task").query("task_id = '" + task_id + "'").uniqueResult(0); + + AbstractAcsTask taskClass = new TwoInTask(); + taskClass.updateTaskStatus(jsonTask,IOSEnum.IS_NOTANDYES.code("否")); + } + + @Override + @Transactional + public void confirmTask(Map whereJson) { + String task_id = MapUtil.getStr(whereJson, "task_id"); + + JSONObject jsonTask = WQLObject.getWQLObject("sch_base_task").query("task_id = '" + task_id + "'").uniqueResult(0); + + AbstractAcsTask taskClass = new TwoInTask(); + taskClass.updateTaskStatus(jsonTask,TaskStatusEnum.FINISHED.getCode()); + } + + @Override + @Transactional + public void confirm(Map whereJson) { + + StIvtIostorinv mstDao = this.getById(MapUtil.getStr(whereJson, "iostorinv_id")); + + // 明细必须为分配完 + List dtlDaoList = iStIvtIostorinvdtlService.list( + new QueryWrapper().lambda() + .eq(StIvtIostorinvdtl::getIostorinv_id, mstDao.getIostorinv_id()) + ); + + boolean is_divConfirm = dtlDaoList.stream() + .allMatch(row -> row.getBill_status().equals(IOSEnum.BILL_STATUS.code("分配完")) || + row.getBill_status().equals(IOSEnum.BILL_STATUS.code("完成")) + ); + + if (!is_divConfirm) { + throw new BadRequestException("明细未分配完!"); + } + + confirmMst(mstDao); + } + /** * 组织主表数据 + * * @param whereJson {} * @return StIvtIostorinv */ - private StIvtIostorinv updataMst(Map whereJson,StIvtIostorinv mstDao) { + private StIvtIostorinv updataMst(Map whereJson, StIvtIostorinv mstDao) { // 仓库信息 StorattrDto storattrDto = storattrService.findById(Long.parseLong((String) whereJson.get("stor_id"))); @@ -252,4 +596,216 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl disDaoList, StIvtIostorinv mstDao, String ivt_change) { + + for (int i = 0; i < disDaoList.size(); i++) { + StIvtIostorinvdis disDao = disDaoList.get(i); + + JSONObject jsonParam = new JSONObject(); + jsonParam.put("struct_id", disDao.getStruct_id()); + jsonParam.put("material_id", disDao.getMaterial_id()); + jsonParam.put("pcsn", disDao.getPcsn()); + jsonParam.put("change_qty", disDao.getPlan_qty()); + jsonParam.put("bill_type_scode", mstDao.getBill_type()); + jsonParam.put("quality_scode", disDao.getQuality_scode()); + jsonParam.put("inv_id", mstDao.getIostorinv_id()); + jsonParam.put("bill_code", mstDao.getBill_code()); + jsonParam.put("bill_table", "ST_IVT_IOStorInv"); + jsonParam.put("qty_unit_id", disDao.getQty_unit_id()); + jsonParam.put("qty_unit_name", disDao.getQty_unit_name()); + storPublicService.IOStor(jsonParam, ivt_change); + + } + + } + + /** + * 更新主表状态 + * @param iostorinv_id 主表标识 + */ + public StIvtIostorinv 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()); + + // 调用单据确认 + confirmMst(mstDao); + } + + this.updateById(mstDao); + return mstDao; + } + + /** + * 完成单据:更新主表、明细表、分配明细表、更新库存、更新仓位、更新任务 + * @param mstDao :主表实体类 + */ + private void confirmMst(StIvtIostorinv mstDao) { + + // 仓位表 + WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); + + // 仓位表 + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); + + // 更新库存 + List disDaoList = iStIvtIostorinvdisService.list( + new QueryWrapper().lambda() + .eq(StIvtIostorinvdis::getIostorinv_id, mstDao.getIostorinv_id()) + ); + + upateIvt(disDaoList,mstDao,IOSEnum.IVT_CHANGE.code("加库存")); + + // 更新仓位:解锁仓位、加载具、清除锁定信息 + String struct_code_in = disDaoList.stream() + .map(StIvtIostorinvdis::getStruct_code) + .distinct() + .collect(Collectors.joining("','")); + + List attrList = attrTab.query("struct_code IN ('" + struct_code_in + "')") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + List collect = disDaoList.stream() + .map(row -> { + JSONObject json = new JSONObject(); + json.put("struct_code", row.getStruct_code()); + json.put("storagevehicle_code", row.getStoragevehicle_code()); + return json; + }) + .distinct() + .collect(Collectors.toList()); + + for (int i = 0; i < collect.size(); i++) { + JSONObject jsonObject = collect.get(i); + + List jsonAttrList = attrList.stream() + .filter(row -> row.getString("struct_code").equals(jsonObject.getString("struct_code"))) + .collect(Collectors.toList()); + + if (ObjectUtil.isEmpty(jsonAttrList)) { + throw new BadRequestException("仓位信息错误,请检查!"+jsonObject.getString("struct_code")); + } + + JSONObject jsonAttr = jsonAttrList.get(0); + jsonAttr.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定")); + jsonAttr.put("storagevehicle_code", jsonObject.getString("storagevehicle_code")); + jsonAttr.put("inv_type", ""); + jsonAttr.put("inv_id", ""); + jsonAttr.put("inv_code", ""); + attrTab.update(jsonAttr); + } + + // 更新分配明细为完成 + iStIvtIostorinvdisService.update( + new UpdateWrapper().lambda() + .set(StIvtIostorinvdis::getWork_status, IOSEnum.WORK_STATUS.code("完成")) + .eq(StIvtIostorinvdis::getIostorinv_id, mstDao.getIostorinv_id()) + ); + + // 更新明细为完成 + iStIvtIostorinvdtlService.update( + new UpdateWrapper().lambda() + .set(StIvtIostorinvdtl::getBill_status, IOSEnum.BILL_STATUS.code("完成")) + .eq(StIvtIostorinvdtl::getIostorinv_id, mstDao.getIostorinv_id()) + ); + + // 更新主表为完成 + mstDao.setBill_status(IOSEnum.BILL_STATUS.code("完成")); + mstDao.setConfirm_optid(Long.parseLong(SecurityUtils.getCurrentUserId())); + mstDao.setConfirm_optname(SecurityUtils.getCurrentNickName()); + mstDao.setConfirm_time(DateUtil.now()); + + // 更新任务为完成 + JSONObject jsonTaskParam = new JSONObject(); + jsonTaskParam.put("task_status", TaskStatusEnum.FINISHED.getCode()); + jsonTaskParam.put("update_optid", SecurityUtils.getCurrentUserId()); + jsonTaskParam.put("update_optname", SecurityUtils.getCurrentNickName()); + jsonTaskParam.put("update_time", DateUtil.now()); + + String task_id_in = disDaoList.stream() + .map(row -> row.getTask_id().toString()) + .collect(Collectors.joining("','")); + + taskTab.update(jsonTaskParam,"task_id IN ('"+task_id_in+"') AND task_status <> '"+TaskStatusEnum.FINISHED.getCode()+"'"); + + //返检入库,将回传字段改为1 + if (mstDao.getBill_type().equals(IOSEnum.IN_TYPE.code("返检入库"))) { + mstDao.setIs_upload(IOSEnum.IS_NOTANDYES.code("是")); + } + + this.updateById(mstDao); + + // 生产入库:回传mes + /* if (mstDao.getBill_type().equals(IOSEnum.IN_TYPE.code("生产入库"))) { + InAndOutRetrunServiceImpl bean = SpringContextHolder.getBean(InAndOutRetrunServiceImpl.class); + + JSONObject param = new JSONObject(); + JSONArray rows = new JSONArray(); + + rows.add(mstDao); + param.put("rows", rows); + try { + bean.uploadMES(param); + } catch (Exception e) { + log.info(e.getMessage()); + } finally { + this.updateById(mstDao); + } + }*/ + + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvdisServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvdisServiceImpl.java index e65c1ee76..9cb75f76b 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvdisServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvdisServiceImpl.java @@ -1,19 +1,26 @@ package org.nl.b_lms.storage_manage.ios.service.iostorInv.impl; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; 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.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.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.StIvtIostorinvdisMapper; import org.nl.common.utils.IdUtil; +import org.nl.modules.wql.util.SpringContextHolder; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.transaction.Transactional; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; /** *

@@ -26,6 +33,18 @@ import java.util.HashMap; @Service public class StIvtIostorinvdisServiceImpl extends ServiceImpl implements IStIvtIostorinvdisService { + /** + * 出入库明细服务 + */ + @Autowired + private IStIvtIostorinvdtlService iStIvtIostorinvdtlService; + + /** + * 出入库主表服务 + */ + @Autowired + private IStIvtIostorinvService iStIvtIostorinvService; + @Override public void insertDis(Long iostorinv_id, HashMap> disDaoMap) { @@ -38,7 +57,7 @@ public class StIvtIostorinvdisServiceImpl extends ServiceImpl disDaoList = new ArrayList<>(); - for(String iostorinvdtl_id : disDaoMap.keySet()) { + for (String iostorinvdtl_id : disDaoMap.keySet()) { ArrayList disList = disDaoMap.get(iostorinvdtl_id); for (int i = 0; i < disList.size(); i++) { @@ -49,32 +68,75 @@ public class StIvtIostorinvdisServiceImpl extends ServiceImpl().lambda() + .set(StIvtIostorinvdis::getWork_status, work_status) + .set(StIvtIostorinvdis::getIs_issued, is_issued) + .eq(StIvtIostorinvdis::getTask_id, task_id) + ); + } + + @Override + @Transactional + public void confirmDisIn(String task_id) { + // 更新分配明细为完成 + List disDaoList = this.list( + new QueryWrapper().lambda() + .eq(StIvtIostorinvdis::getTask_id, task_id) + ); + + disDaoList.forEach(row -> { + row.setWork_status(IOSEnum.WORK_STATUS.code("完成")); + }); + + this.updateBatchById(disDaoList); + + // 更新明细 + iStIvtIostorinvdtlService.updateStatus(disDaoList.get(0).getIostorinvdtl_id()); + + // 更新主表 + SpringContextHolder.getBean(StIvtIostorinvServiceImpl.class).updateMstStatus(disDaoList.get(0).getIostorinv_id()); + } } 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 1ff6cf626..3a2833d01 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 @@ -3,15 +3,19 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; 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.IStIvtIostorinvdisService; import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvdtlService; +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; import org.nl.common.utils.IdUtil; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.core.bean.WQLObject; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; @@ -31,6 +35,12 @@ import java.util.stream.Collectors; @Service public class StIvtIostorinvdtlServiceImpl extends ServiceImpl implements IStIvtIostorinvdtlService { + /** + * 出入库分配明细服务 + */ + @Autowired + private IStIvtIostorinvdisService iStIvtIostorinvdisService; + @Override public HashMap>insertDtl(List rows, Long iostorinv_id) { // 先删除所有明细并更新子卷包装关系 @@ -98,11 +108,9 @@ public class StIvtIostorinvdtlServiceImpl extends ServiceImpl disDaoList = iStIvtIostorinvdisService.list( + new QueryWrapper().lambda() + .eq(StIvtIostorinvdis::getIostorinvdtl_id, iostorinvdtl_id) + ); + + boolean no_create = disDaoList.stream() + .allMatch(row -> ObjectUtil.isEmpty(row.getStruct_code())); + + boolean one_create = disDaoList.stream() + .anyMatch(row -> ObjectUtil.isNotEmpty(row.getStruct_code())); + + boolean all_create = disDaoList.stream() + .allMatch(row -> ObjectUtil.isNotEmpty(row.getStruct_code())); + + boolean confirm_create = disDaoList.stream() + .allMatch(row -> row.getWork_status().equals(IOSEnum.WORK_STATUS.code("完成"))); + + if (no_create) { + // 全都未生成 + dtlDao.setBill_status(IOSEnum.BILL_STATUS.code("生成")); + } + + if (one_create) { + // 一个生成 + dtlDao.setBill_status(IOSEnum.BILL_STATUS.code("分配中")); + } + + if (all_create) { + // 分配完 + dtlDao.setBill_status(IOSEnum.BILL_STATUS.code("分配完")); + } + + if (confirm_create) { + // 完成 + dtlDao.setBill_status(IOSEnum.BILL_STATUS.code("完成")); + } + + this.updateById(dtlDao); + + // 更新此木箱中所有的明细状态 + this.update( + new UpdateWrapper().lambda() + .set(StIvtIostorinvdtl::getBill_status, dtlDao.getBill_status()) + .eq(StIvtIostorinvdtl::getIostorinv_id, dtlDao.getIostorinv_id()) + .eq(StIvtIostorinvdtl::getBox_no, dtlDao.getBox_no()) + ); + } + /** * 组织分配明细所需数据 * @param dtlDao: 明细实体类 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 new file mode 100644 index 000000000..e911cd0f6 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InBussManageServiceImpl.java @@ -0,0 +1,460 @@ +package org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.InBussManageService; +import org.nl.common.utils.MapOf; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.lang.reflect.Array; +import java.util.*; +import java.util.stream.Collectors; + +/** + *

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

+ * + * @author generator + * @since 2023-11-10 + */ +@Service +public class InBussManageServiceImpl implements InBussManageService { + + /** + * 不需要查询的排集合 + */ + private List notInRowList; + + @Override + @Transactional + public void lockStruct(ArrayList 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 JSONObject getOneStruct(JSONObject jsonObject) { + /* + * 成品入库规则: + * 1.负载均衡:相同木箱规格(长宽高)、订单、客户、物料的 平均分配在每个巷道 + * 2.相同木箱规格、订单、客户、物料的可以放双伸位,即可以放2个木箱 + * 匹配货位逻辑: + * 1.根据仓库、库区查询所有货位,判断是否有空位 + * 2.确定巷道:查看每个巷道相同木箱规格等 的数量,找到数量最小的那个巷道 + * 1).如果没有相同木箱的,则新开一个巷道(从下往上) + * 2).如果有相同木箱的,则查看有没有空的巷道(优先入空巷道) + * 3.确定哪排:查看每排相同木箱规格等 的数量,找到数量最小的那排 + * 1).如果没有相同木箱的,则新开一个排(从下往上) + * 2).如果有相同木箱的,则查看有没有空的一排(优先入空排) + * 4.确定伸位: + * 1)如果当前仓位为深位则直接入 + * 2)如果当前仓位为浅位,则判断对应深位是否有货,有则入、没有则入深位 + */ + // 仓位表 + WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); + // 子卷包装关系 + WQLObject subTab = WQLObject.getWQLObject("pdm_bi_subpackagerelation"); + + /* + * 判断是否有仓位 + * 判断条件:库区、仓库、是否启用、是否删除、未锁定、没有载具 + */ + JSONArray attrArry = attrTab.query("IFNULL(storagevehicle_code,'') = '' " + + "AND is_used = '" + IOSEnum.IS_NOTANDYES.code("是") + "' AND is_delete = '" + IOSEnum.IS_NOTANDYES.code("否") + "' " + + "AND lock_type = '" + IOSEnum.LOCK_TYPE.code("未锁定") + "' AND stor_id = '"+jsonObject.getString("stor_id")+"' " + + "AND sect_id = '"+jsonObject.getString("sect_id")+"'").getResultJSONArray(0); + + if (ObjectUtil.isEmpty(attrArry)) { + throw new BadRequestException("仓位不足!"); + } + + /* + * 确定巷道:查看每个巷道相同木箱规格等 的数量,找到数量最小的那个巷道 + */ + // 获取木箱入库巷道 + JSONObject jsonSub = subTab.query("package_box_sn = '" + jsonObject.getString("box_no") + "'").uniqueResult(0); + jsonSub.put("stor_id", jsonObject.getString("stor_id")); + jsonSub.put("sect_id", jsonObject.getString("sect_id")); + jsonSub.put("material_id", jsonObject.getString("material_id")); + + String block_num = getMinBlock(jsonSub); + /* + * 确定哪排:确定哪排:查看每排相同木箱规格等 的数量,找到数量最小的那排 + */ + jsonSub.put("block_num",block_num); + String row_num = getMinRow(jsonSub); + + /* + * 确定伸位,找仓位 + */ + jsonSub.put("row_num",row_num); + JSONObject jsonAttr = queryStruct(jsonSub); + + // 为空则新找巷道 + if (ObjectUtil.isEmpty(jsonAttr)) { + + jsonSub.put("flag", "1"); + jsonSub.put("not_block", jsonSub.getString("block_num")); + + List blockList = WQL.getWO("BST_INRULE").addParamMap(jsonSub) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + for (int i = 0; i < blockList.size(); i++) { + JSONObject json = blockList.get(i); + json.put("stor_id", jsonObject.getString("stor_id")); + json.put("sect_id", jsonObject.getString("sect_id")); + json.put("material_id", jsonObject.getString("material_id")); + json.put("customer_name", jsonSub.getString("customer_name")); + json.put("sale_order_name", jsonSub.getString("sale_order_name")); + json.put("box_length", jsonSub.getString("box_length")); + json.put("box_width", jsonSub.getString("box_width")); + json.put("box_high", jsonSub.getString("box_high")); + + String row_num_2 = getMinRow(json); + json.put("row_num",row_num_2); + JSONObject jsonAttr_2 = queryStruct(json); + + if (ObjectUtil.isNotEmpty(jsonAttr_2)) { + jsonAttr = jsonAttr_2; + } else { + continue; + } + } + } + + return jsonAttr; + } + + /** + * 获取最小巷道 + * @param jsonSub { + * jsonSub:木箱信息 + * sect_id:库区 + * stor_id:仓库 + * material_id:物料 + * } + * @return String : 巷道 + */ + private String getMinBlock(JSONObject jsonSub) { + jsonSub.put("flag", "1"); + + // 获取仓库、库区有空位的巷道 + List blockList = WQL.getWO("BST_INRULE").addParamMap(jsonSub) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + /* + * 查询所属巷道所有木箱 + */ + String block_in = blockList.stream() + .map(row -> row.getString("block_num")) + .collect(Collectors.joining("','")); + + jsonSub.put("flag", "2"); + jsonSub.put("block_in", "('"+block_in+"')"); + + List boxAllList = WQL.getWO("BST_INRULE").addParamMap(jsonSub) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + // 为空说明没有木箱,返回最小巷道 + if (ObjectUtil.isEmpty(boxAllList)) { + return blockList.get(0).getString("block_num"); + } + + // 不区分木箱规格:最小木箱数的巷道 + JSONObject jsonBlockMin = sumBlockMinNum(blockList, boxAllList); + + /* + * 查询所属巷道所有相同规格的木箱 + */ + jsonSub.put("flag", "3"); + List boxAllLikeList = WQL.getWO("BST_INRULE").addParamMap(jsonSub) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + // 为空说明库内没有相同规格的木箱,则返回不区分木箱规格的最小巷道 + if (ObjectUtil.isEmpty(boxAllLikeList)) { + return jsonBlockMin.getString("block_num"); + } + + // 区分木箱规格:最小木箱的巷道 + JSONObject jsonBlockLikeMin = sumBlockMinNum(blockList,boxAllLikeList); + + /* + * 比较两个巷道的总木箱数,取最小的 + */ + // 查询区分木箱规格最小木箱的巷道的总木箱数 + List boxAllPackageLikeList = WQL.getWO("BST_INRULE").addParam("flag", "2").addParam("stor_id", jsonSub.getString("stor_id")) + .addParam("sect_id", jsonSub.getString("sect_id")).addParam("block_num", jsonBlockLikeMin.getString("block_num")) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + return jsonBlockMin.getIntValue("box_num") > boxAllPackageLikeList.size() ? + jsonBlockLikeMin.getString("block_num") : jsonBlockMin.getString("block_num"); + } + + /** + * 计算最小巷道木箱数 + * @param blockList : 所有巷道 + * @param boxAllList: 所有木箱 + * @return JSONObject:最小木箱数的巷道 JSONObject{block_num,box_num} + */ + private JSONObject sumBlockMinNum(List blockList, List boxAllList) { + + // 统计各巷道木箱数 + ArrayList blockBoxList = new ArrayList<>(); + + for (int i = 0; i < blockList.size(); i++) { + JSONObject jsonBlock = blockList.get(i); + + List box_num = boxAllList.stream() + .filter(row -> row.getString("block_num").equals(jsonBlock.getString("block_num"))) + .collect(Collectors.toList()); + + jsonBlock.put("box_num", String.valueOf(box_num.size())); + blockBoxList.add(jsonBlock); + } + + // 最小木箱数的巷道 + List boxNumList = blockBoxList.stream() + .sorted(Comparator.comparing(row -> row.getString("box_num"))) + .collect(Collectors.toList()); + + return boxNumList.get(0); + } + + /** + * 获取最小排 + * @param jsonSub { + * jsonSub:木箱信息 + * sect_id:库区 + * stor_id:仓库 + * material_id:物料 + * block_num: 巷道 + * not_row_in: 排(用于递归查询) + * } + * @return String : 排 + */ + private String getMinRow(JSONObject jsonSub) { + + jsonSub.put("flag", "4"); + + // 获取此仓库、库区、巷道 有空位的排 + List rowList = WQL.getWO("BST_INRULE").addParamMap(jsonSub) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + /* + * 查询所属排的所有木箱 + */ + String row_in = rowList.stream() + .map(row -> row.getString("row_num")) + .collect(Collectors.joining("','")); + + jsonSub.put("flag", "2"); + jsonSub.put("row_in", "('"+row_in+"')"); + + List boxAllList = WQL.getWO("BST_INRULE").addParamMap(jsonSub) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + // 为空说明没有木箱,返回最小排 + if (ObjectUtil.isEmpty(boxAllList)) { + return rowList.get(0).getString("row_num"); + } + + // 不区分木箱规格:最小木箱数的排 + JSONObject jsonRowMin = sumRowMinNum(rowList, boxAllList); + + /* + * 查询所属排所有相同规格的木箱 + */ + jsonSub.put("flag", "3"); + List boxAllLikeList = WQL.getWO("BST_INRULE").addParamMap(jsonSub) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + // 为空说明库内没有相同规格的木箱,则返回不区分木箱规格的最小排 + if (ObjectUtil.isEmpty(boxAllLikeList)) { + return jsonRowMin.getString("row_num"); + } + + // 区分木箱规格:最小木箱数的排 + JSONObject jsonRowLikeMin = sumRowMinNum(rowList, boxAllLikeList); + + /* + * 比较两个排的总木箱数,取最小的 + */ + // 查询区分木箱规格最小木箱的排总木箱数 + List boxAllPackageLikeList = WQL.getWO("BST_INRULE").addParam("flag", "2").addParam("stor_id", jsonSub.getString("stor_id")) + .addParam("sect_id", jsonSub.getString("sect_id")).addParam("block_num", jsonSub.getString("block_num")) + .addParam("row_num", jsonRowLikeMin.getString("row_num")) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + return jsonRowMin.getIntValue("box_num") > boxAllPackageLikeList.size() ? + jsonRowLikeMin.getString("row_num") : jsonRowMin.getString("row_num"); + } + + /** + * 计算最小木箱的排 + * @param rowList : 所有排 + * @param boxAllList: 所有木箱 + * @return JSONObject:最小木箱数的排 JSONObject{row_num,box_num} + */ + private JSONObject sumRowMinNum(List rowList, List boxAllList) { + + // 统计各排木箱数 + ArrayList rowkBoxList = new ArrayList<>(); + + for (int i = 0; i < rowList.size(); i++) { + JSONObject jsonRow = rowList.get(i); + + List box_num = boxAllList.stream() + .filter(row -> row.getString("row_num").equals(jsonRow.getString("row_num"))) + .collect(Collectors.toList()); + + jsonRow.put("box_num", String.valueOf(box_num.size())); + rowkBoxList.add(jsonRow); + } + + // 最小木箱数的排 + List boxNumList = rowkBoxList.stream() + .sorted(Comparator.comparing(row -> row.getString("box_num"))) + .collect(Collectors.toList()); + + return boxNumList.get(0); + } + + /** + * 获取仓位 + * @param jsonSub { + * jsonSub:木箱信息 + * sect_id:库区 + * stor_id:仓库 + * material_id:物料 + * block_num: 巷道 + * row_num :排 + * } + * @return JSONObject : 仓位 + */ + private JSONObject queryStruct(JSONObject jsonSub) { + + JSONObject jsonAttr = getStruct(jsonSub); + + // 为空找此巷道新的一排 + if (ObjectUtil.isEmpty(jsonAttr)) { + notInRowList.add(jsonSub.getString("row_num")); + + String join = "('" + String.join("','", notInRowList) + "')"; + jsonSub.put("not_row_in", join); + + // 新的一排 + String row_num_new = this.getMinRow(jsonSub); + jsonSub.put("row_num",row_num_new); + + jsonAttr = this.getStruct(jsonSub); + } + + return jsonAttr; + } + + /** + * 获取一个货位公共方法 + * @param jsonSub { + * jsonSub:木箱信息 + * sect_id:库区 + * stor_id:仓库 + * material_id:物料 + * block_num: 巷道 + * row_num :排 + * } + * @return JSONObject : 仓位 + */ + private JSONObject getStruct(JSONObject jsonSub) { + + // 获取此仓库、库区、巷道、排的所有空位 根据列、层、深度排序 + jsonSub.put("flag", "5"); + + List rowStructList = WQL.getWO("BST_INRULE").addParamMap(jsonSub) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + // 获取此仓库、库区、巷道、排的所有仓位 + jsonSub.put("flag", "6"); + + List structAllList = WQL.getWO("BST_INRULE").addParamMap(jsonSub) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + JSONObject jsonAttr = new JSONObject(); + + for (int i = 0; i < rowStructList.size(); i++) { + JSONObject json = rowStructList.get(i); + + // 判断伸位 + if (json.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("无"))) { + // 无需深度 + jsonAttr = json; + } else if (json.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("深"))) { + /* + * 深货位:判断浅是否阻挡 + */ + // 获取此货位对应的浅货位 + List lowAttr = structAllList.stream() + .filter(row -> row.getString("col_num").equals(json.getString("col_num")) && + row.getString("layer_num").equals(json.getString("layer_num")) && + row.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("浅"))) + .collect(Collectors.toList()); + + if (ObjectUtil.isEmpty(lowAttr) || lowAttr.size() != 1) { + throw new BadRequestException("仓位:" + json.getString("stor_code") + "对应的浅货位错误!"); + } + + // 判断是否有木箱 + JSONObject jsonAttrLow = lowAttr.get(0); + if (ObjectUtil.isEmpty(jsonAttrLow.getString("storagevehicle_code")) && jsonAttrLow.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) { + // 没有木箱 + jsonAttr = json; + } else { + continue; + } + } else if (json.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("浅"))) { + /* + * 浅货位:判断深货位是否空洞 + */ + // 获取此货位对应的深货位 + List darkAttr = structAllList.stream() + .filter(row -> row.getString("col_num").equals(json.getString("col_num")) && + row.getString("layer_num").equals(json.getString("layer_num")) && + row.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("深"))) + .collect(Collectors.toList()); + + if (ObjectUtil.isEmpty(darkAttr) || darkAttr.size() != 1) { + throw new BadRequestException("仓位:" + json.getString("stor_code") + "对应的深货位错误!"); + } + + // 判断是否有木箱 + JSONObject jsonAttrDark = darkAttr.get(0); + + if (ObjectUtil.isNotEmpty(jsonAttrDark.getString("storagevehicle_code")) && jsonAttrDark.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) { + jsonAttr = json; + } else { + jsonAttr = jsonAttrDark; + } + } + + } + + return jsonAttr; + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/InBussManageService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/InBussManageService.java new file mode 100644 index 000000000..92396d259 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/InBussManageService.java @@ -0,0 +1,45 @@ +package org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service; + +import com.alibaba.fastjson.JSONObject; + +import java.util.ArrayList; + +/** + *

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

+ * + * @author generator + * @since 2023-11-16 + */ +public interface InBussManageService { + + /** + * 上锁、解锁仓位处理 + * @param param:[ + * { + * struct_code: 仓位编码 + * } + * ] + * @param json { + * inv_type:单据类型 + * inv_id:单据标识 + * inv_code:单据编码 + * lock_type: 锁定类型 + * operate:单据类型 + * } + */ + void lockStruct(ArrayList param, JSONObject json); + + /** + * 获取一个仓位 + * @param jsonObject: { + * stor_id:仓库标识 + * sect_id:库区标识 + * material_id: 物料标识 + * box_no:木箱号 + * } + * @return JSONObject 仓位对象 + */ + JSONObject getOneStruct(JSONObject jsonObject); +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/wql/BST_INRULE.wql b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/wql/BST_INRULE.wql new file mode 100644 index 000000000..feec57f82 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/wql/BST_INRULE.wql @@ -0,0 +1,243 @@ +[交易说明] + 交易名: 入库逻辑 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.stor_id TYPEAS s_string + 输入.sect_id TYPEAS s_string + 输入.material_id TYPEAS s_string + 输入.customer_name TYPEAS s_string + 输入.sale_order_name TYPEAS s_string + 输入.box_length TYPEAS s_string + 输入.box_width TYPEAS s_string + 输入.box_high TYPEAS s_string + 输入.block_in TYPEAS f_string + 输入.row_in TYPEAS f_string + 输入.block_num TYPEAS s_string + 输入.row_num TYPEAS s_string + 输入.not_row_in TYPEAS f_string + 输入.not_block TYPEAS s_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + QUERY + SELECT + attr.block_num + FROM + st_ivt_structattr attr + WHERE + attr.is_used = '1' + AND attr.is_delete = '0' + AND attr.lock_type = '1' + AND IFNULL(attr.storagevehicle_code,'') = '' + AND attr.stor_id = 输入.stor_id + AND attr.sect_id = 输入.sect_id + + group by attr.block_num + order by attr.block_num + + OPTION 输入.not_block <> "" + attr.block_num <> 输入.not_block + ENDOPTION + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + attr.* + FROM + st_ivt_structattr attr + WHERE + attr.is_used = '1' + AND attr.is_delete = '0' + AND attr.stor_id = 输入.stor_id + AND attr.sect_id = 输入.sect_id + AND IFNULL(attr.storagevehicle_code,'') <> '' + + OPTION 输入.block_in <> "" + attr.block_num in 输入.block_in + ENDOPTION + + OPTION 输入.block_num <> "" + attr.block_num = 输入.block_num + ENDOPTION + + OPTION 输入.row_in <> "" + attr.row_num in 输入.row_in + ENDOPTION + + OPTION 输入.row_num <> "" + attr.row_num = 输入.row_num + ENDOPTION + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "3" + QUERY + SELECT DISTINCT + attr.* + FROM + st_ivt_structattr attr + INNER JOIN pdm_bi_subpackagerelation sub ON sub.package_box_sn = attr.storagevehicle_code + LEFT JOIN md_me_materialbase mater ON mater.material_code = sub.product_name + WHERE + attr.is_used = '1' + AND attr.is_delete = '0' + AND attr.stor_id = 输入.stor_id + AND attr.sect_id = 输入.sect_id + AND IFNULL(attr.storagevehicle_code,'') <> '' + + OPTION 输入.material_id <> "" + mater.material_id = 输入.material_id + ENDOPTION + + OPTION 输入.customer_name <> "" + sub.customer_name = 输入.customer_name + ENDOPTION + + OPTION 输入.sale_order_name <> "" + sub.sale_order_name = 输入.sale_order_name + ENDOPTION + + OPTION 输入.box_length <> "" + sub.box_length = 输入.box_length + ENDOPTION + + OPTION 输入.box_width <> "" + sub.box_width = 输入.box_width + ENDOPTION + + OPTION 输入.box_high <> "" + sub.box_high = 输入.box_high + ENDOPTION + + + OPTION 输入.block_in <> "" + attr.block_num in 输入.block_in + ENDOPTION + + OPTION 输入.row_in <> "" + attr.row_num in 输入.row_in + ENDOPTION + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "4" + QUERY + SELECT + attr.row_num + FROM + st_ivt_structattr attr + WHERE + attr.is_used = '1' + AND attr.is_delete = '0' + AND attr.lock_type = '1' + AND IFNULL(attr.storagevehicle_code,'') = '' + AND attr.stor_id = 输入.stor_id + AND attr.sect_id = 输入.sect_id + + OPTION 输入.block_num <> "" + attr.block_num = 输入.block_num + ENDOPTION + + OPTION 输入.not_row_in <> "" + attr.row_num NOT IN 输入.not_row_in + ENDOPTION + + group by attr.row_num + order by attr.row_num + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "5" + QUERY + SELECT + attr.* + FROM + st_ivt_structattr attr + WHERE + attr.is_used = '1' + AND attr.is_delete = '0' + AND attr.lock_type = '1' + AND IFNULL(attr.storagevehicle_code,'') = '' + AND attr.stor_id = 输入.stor_id + AND attr.sect_id = 输入.sect_id + + OPTION 输入.block_num <> "" + attr.block_num = 输入.block_num + ENDOPTION + + OPTION 输入.row_num <> "" + attr.row_num = 输入.row_num + ENDOPTION + + order by attr.col_num DESC ,attr.layer_num ASC,attr.zdepth DESC + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "6" + QUERY + SELECT + attr.* + FROM + st_ivt_structattr attr + WHERE + attr.is_used = '1' + AND attr.is_delete = '0' + AND attr.stor_id = 输入.stor_id + AND attr.sect_id = 输入.sect_id + + OPTION 输入.block_num <> "" + attr.block_num = 输入.block_num + ENDOPTION + + OPTION 输入.row_num <> "" + attr.row_num = 输入.row_num + ENDOPTION + + ENDSELECT + ENDQUERY + ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/rest/RawAssistIStorController.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/rest/RawAssistIStorController.java index eeeb90c68..608ecec77 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/rest/RawAssistIStorController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/rest/RawAssistIStorController.java @@ -118,7 +118,12 @@ public class RawAssistIStorController { //@PreAuthorize("@el.check('materialtype:list')") public ResponseEntity divStruct(@RequestBody Map whereJson) { - rawAssistIStorService.divStruct(whereJson); + if (whereJson.get("stor_id").toString().equals(IOSEnum.STOR_ID.code("二期"))) { + iStIvtIostorinvService.divStruct(whereJson); + } else { + rawAssistIStorService.divStruct(whereJson); + } + return new ResponseEntity<>(HttpStatus.NO_CONTENT); } @@ -136,7 +141,11 @@ public class RawAssistIStorController { //@PreAuthorize("@el.check('materialtype:list')") public ResponseEntity unDivStruct(@RequestBody Map whereJson) { - rawAssistIStorService.unDivStruct(whereJson); + if (whereJson.get("stor_id").toString().equals(IOSEnum.STOR_ID.code("二期"))) { + iStIvtIostorinvService.unDivStruct(whereJson); + }else { + rawAssistIStorService.unDivStruct(whereJson); + } return new ResponseEntity<>(HttpStatus.NO_CONTENT); } @@ -145,7 +154,11 @@ public class RawAssistIStorController { //@PreAuthorize("@el.check('materialtype:list')") public ResponseEntity divPoint(@RequestBody Map whereJson) { - rawAssistIStorService.divPoint(whereJson); + if (whereJson.get("stor_id").toString().equals(IOSEnum.STOR_ID.code("二期"))) { + iStIvtIostorinvService.setPoint(whereJson); + } else { + rawAssistIStorService.divPoint(whereJson); + } return new ResponseEntity<>(HttpStatus.NO_CONTENT); } @@ -189,7 +202,11 @@ public class RawAssistIStorController { //@PreAuthorize("@el.check('materialtype:list')") public ResponseEntity delTask(@RequestBody Map whereJson) { - rawAssistIStorService.delTask(whereJson); + if (whereJson.get("stor_id").toString().equals(IOSEnum.STOR_ID.code("二期"))) { + iStIvtIostorinvService.delTask(whereJson); + } else { + rawAssistIStorService.delTask(whereJson); + } return new ResponseEntity<>(HttpStatus.NO_CONTENT); } @@ -198,7 +215,11 @@ public class RawAssistIStorController { //@PreAuthorize("@el.check('materialtype:list')") public ResponseEntity reIssueTask(@RequestBody Map whereJson) { - rawAssistIStorService.reIssueTask(whereJson); + if (whereJson.get("stor_id").toString().equals(IOSEnum.STOR_ID.code("二期"))) { + iStIvtIostorinvService.reIssueTask(whereJson); + } else { + rawAssistIStorService.reIssueTask(whereJson); + } return new ResponseEntity<>(HttpStatus.NO_CONTENT); } @@ -207,7 +228,12 @@ public class RawAssistIStorController { //@PreAuthorize("@el.check('materialtype:list')") public ResponseEntity confirmTask(@RequestBody Map whereJson) { - rawAssistIStorService.confirmTask(whereJson); + if (whereJson.get("stor_id").toString().equals(IOSEnum.STOR_ID.code("二期"))) { + iStIvtIostorinvService.confirmTask(whereJson); + } else { + rawAssistIStorService.confirmTask(whereJson); + } + return new ResponseEntity<>(HttpStatus.NO_CONTENT); } @@ -225,7 +251,12 @@ public class RawAssistIStorController { //@PreAuthorize("@el.check('materialtype:list')") public ResponseEntity confirm(@RequestBody Map whereJson) { - rawAssistIStorService.confirm(whereJson); + if (whereJson.get("stor_id").toString().equals(IOSEnum.STOR_ID.code("二期"))) { + iStIvtIostorinvService.confirm(whereJson); + } else { + rawAssistIStorService.confirm(whereJson); + + } return new ResponseEntity<>(HttpStatus.NO_CONTENT); } diff --git a/lms/nladmin-ui/src/views/wms/st/inbill/DivDialog.vue b/lms/nladmin-ui/src/views/wms/st/inbill/DivDialog.vue index c3b588b8e..8f7a8a569 100644 --- a/lms/nladmin-ui/src/views/wms/st/inbill/DivDialog.vue +++ b/lms/nladmin-ui/src/views/wms/st/inbill/DivDialog.vue @@ -355,6 +355,7 @@ export default { this.form.tableMater[i].sect_name = row.sect_name this.form.tableMater.splice(i, 1, this.form.tableMater[i]) // 通过splice 替换数据 触发视图更新 } + this.form.stor_id = this.stor_id crudRawAssist.divStruct(this.form).then(res => { crudRawAssist.getIODtl({ 'bill_code': this.form.dtl_row.bill_code, 'open_flag': '1' }).then(res => { this.openParam = res @@ -367,11 +368,11 @@ export default { this.crud.notify('请选择入库点', CRUD.NOTIFICATION_TYPE.INFO) return } - debugger if (this.form.tableMater.length === 0) { this.crud.notify('请先选择一条明细!', CRUD.NOTIFICATION_TYPE.INFO) return } + this.form.stor_id = this.stor_id crudRawAssist.divPoint(this.form).then(res => { crudRawAssist.getIODtl({ 'bill_code': this.form.dtl_row.bill_code, 'open_flag': '1' }).then(res => { this.openParam = res @@ -443,7 +444,7 @@ export default { this.crud.notify('明细存在未分配货位!', CRUD.NOTIFICATION_TYPE.INFO) return } - // 如果勾选了,直接跳后台 + this.form.stor_id = this.stor_id crudRawAssist.unDivStruct(this.form).then(res => { crudRawAssist.getIODtl({ 'bill_code': this.form.dtl_row.bill_code, 'open_flag': '1' }).then(res => { this.openParam = res diff --git a/lms/nladmin-ui/src/views/wms/st/inbill/TaskDialog.vue b/lms/nladmin-ui/src/views/wms/st/inbill/TaskDialog.vue index 1f191e3d3..6a66d82a0 100644 --- a/lms/nladmin-ui/src/views/wms/st/inbill/TaskDialog.vue +++ b/lms/nladmin-ui/src/views/wms/st/inbill/TaskDialog.vue @@ -170,6 +170,10 @@ export default { openParam: { type: Array, default: () => { return [] } + }, + storId: { + type: String, + default: '' } }, data() { @@ -221,6 +225,7 @@ export default { return } this.fullscreenLoading = true + this.dis_row.stor_id = this.storId crudRawAssist.delTask(this.dis_row).then(res => { this.fullscreenLoading = false crudRawAssist.queryTask(this.form.dtl_row).then(res => { @@ -252,6 +257,7 @@ export default { return } this.fullscreenLoading = true + this.dis_row.stor_id = this.storId crudRawAssist.confirmTask(this.dis_row).then(res => { crudRawAssist.queryTask(this.form.dtl_row).then(res2 => { this.form.tableMater = res2 @@ -296,6 +302,7 @@ export default { return } this.fullscreenLoading = true + this.dis_row.stor_id = this.storId crudRawAssist.reIssueTask(this.dis_row).then(res => { this.fullscreenLoading = false crudRawAssist.queryTask(this.form.dtl_row).then(res2 => { diff --git a/lms/nladmin-ui/src/views/wms/st/inbill/index.vue b/lms/nladmin-ui/src/views/wms/st/inbill/index.vue index 1ded6855f..99cbf3351 100644 --- a/lms/nladmin-ui/src/views/wms/st/inbill/index.vue +++ b/lms/nladmin-ui/src/views/wms/st/inbill/index.vue @@ -233,7 +233,7 @@ - + @@ -277,6 +277,7 @@ export default { edit: ['admin', 'inbill:edit'], del: ['admin', 'inbill:del'] }, + stor_id: null, audit_flag: true, dis_flag: true, task_flag: true, @@ -421,6 +422,7 @@ export default { }, taskOpen() { crudRawAssist.getIODtl({ 'bill_code': this.currentRow.bill_code, 'open_flag': '2' }).then(res => { + this.stor_id = this.currentRow.stor_id this.openParam = res this.taskShow = true })