diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutExceptionalTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutExceptionalTask.java new file mode 100644 index 000000000..0359d3cdb --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutExceptionalTask.java @@ -0,0 +1,198 @@ +package org.nl.b_lms.sch.tasks; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.pda.mps.eum.RegionTypeEnum; +import org.nl.wms.sch.AcsTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * 二期出库异常任务类 + * Created by Lxy on 2024/1/19. + */ +public class TwoOutExceptionalTask extends AbstractAcsTask { + + /** + * 处理类 + */ + private final String THIS_CLASS = TwoOutExceptionalTask.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) { + // 任务表 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + // 出入库分配明细表 + WQLObject disTab = WQLObject.getWQLObject("st_ivt_iostorinvdis"); + // 点位表 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + JSONObject jsonTask = taskTab.query("task_id = '" + taskObj.getString("task_id") + "'").uniqueResult(0); + + // 更新任务的参数 + JSONObject map = new JSONObject(); + + /* + * 1-执行中, 2-完成 ,0-acs取消 + */ + // 执行中 + if (status.equals(TaskStatusEnum.EXECUTING.getCode())) { + + map.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + } + + // 完成 + if (status.equals(TaskStatusEnum.FINISHED.getCode())) { + + map.put("task_status", TaskStatusEnum.FINISHED.getCode()); + + // 判断任务是否被标记 + if (jsonTask.getString("is_auto_issue").equals(IOSEnum.IS_SEND.code("否"))) { + // 创建出库任务 + JSONObject jsonDis = disTab.query("iostorinv_id = '" + jsonTask.getString("table_fk") + "' and struct_code = '" + jsonTask.getString("point_code1") + "'").uniqueResult(0); + + JSONObject jsonPoint = pointTab.query("region_id = '" + RegionTypeEnum.TWO_OUT01.getId() + "' and is_delete = '0' and is_used = '1'").uniqueResult(0); + + JSONObject jsonTaskParam = new JSONObject(); + jsonTaskParam.put("task_type", "010504"); + jsonTaskParam.put("point_code1", jsonTask.getString("point_code2")); + jsonTaskParam.put("point_code2", jsonPoint.getString("point_code")); + jsonTaskParam.put("vehicle_code", jsonTask.getString("vehicle_code")); + jsonTaskParam.put("task_group_id", jsonDis.getString("task_id")); + jsonTaskParam.put("is_auto_issue", IOSEnum.IS_SEND.code("否")); + jsonTaskParam.put("table_fk", jsonTask.getString("table_fk")); + jsonTaskParam.put("sort_seq", Integer.parseInt(IOSEnum.ZDEPTH_STRUCT.code("浅"))); + + TwoOutTask twoOutTask = new TwoOutTask(); + String task_id = twoOutTask.createTask(jsonTaskParam); + + // 更新分配明细 + JSONObject param = new JSONObject(); + param.put("task_id",task_id); + param.put("point_id",jsonPoint.getString("point_id")); + disTab.update(param,"iostorinv_id = '"+jsonTask.getString("table_fk")+"' and struct_code = '"+jsonTask.getString("point_code1")+"'"); + } + } + + // 取消 + 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("是")); + + } + 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("table_fk", form.getString("table_fk")); + 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/sch/tasks/TwoOutTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutTask.java index 3034cdb94..6e4601134 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutTask.java @@ -2,12 +2,12 @@ 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.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.impl.StIvtIostorinvOutServiceImpl; import org.nl.common.utils.SecurityUtils; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.core.bean.WQLObject; @@ -15,18 +15,16 @@ 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; +import java.util.Map; +import java.util.stream.Collectors; /** * Created by Lxy on 2021/12/22. */ -@Component -@RequiredArgsConstructor public class TwoOutTask extends AbstractAcsTask { private final String THIS_CLASS = TwoOutTask.class.getName(); @@ -41,10 +39,24 @@ public class TwoOutTask extends AbstractAcsTask { 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); + + List arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0' order by sort_seq") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + // 根据任务组分组 + Map> groupMap = arr.stream() + .collect(Collectors.groupingBy(row -> row.getString("task_group_id"))); + + List taskArr = new ArrayList<>(); + + for(String task_group_id : groupMap.keySet()) { + taskArr = groupMap.get(task_group_id); + continue; + } + ArrayList resultList = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); + for (int i = 0; i < taskArr.size(); i++) { + JSONObject json = taskArr.get(i); char dtl_type = json.getString("task_type").charAt(json.getString("task_type").length() - 1); AcsTaskDto dto = AcsTaskDto.builder() @@ -79,7 +91,7 @@ public class TwoOutTask extends AbstractAcsTask { JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "' and task_status < '07'").uniqueResult(0); if (ObjectUtil.isNotEmpty(jsonTask)) { - if (StrUtil.equals(status, "0")) { + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { // 任务为执行之后就不允许取消 if (jsonTask.getIntValue("task_status") > Integer.valueOf(TaskStatusEnum.ISSUE.getCode())) { throw new BadRequestException("任务:" + jsonTask.getString("task_code") + "已执行,不可取消"); @@ -92,11 +104,11 @@ public class TwoOutTask extends AbstractAcsTask { // 更新分配明细为:未生成 JSONObject map = new JSONObject(); - map.put("work_status", "00"); + map.put("work_status", IOSEnum.WORK_STATUS.code("未生成")); map.put("point_id", ""); + map.put("task_id", ""); disTab.update(map, "task_id = '" + task_id + "'"); - } if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { @@ -108,26 +120,16 @@ public class TwoOutTask extends AbstractAcsTask { } 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); + StIvtIostorinvOutServiceImpl bean = SpringContextHolder.getBean(StIvtIostorinvOutServiceImpl.class); + bean.finishTask(jsonTask); + // 判断此任务组是否全部完成 + JSONArray resultJSONArray = taskTab.query("task_group_id = '" + jsonTask.getString("task_group_id") + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'") + .getResultJSONArray(0); - // 更改任务状态为完成 - 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); + if (ObjectUtil.isEmpty(resultJSONArray)) { + this.immediateNotifyAcs(null); + } } } @@ -159,7 +161,9 @@ public class TwoOutTask extends AbstractAcsTask { 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("is_auto_issue", form.getString("is_auto_issue")); + json.put("table_fk", form.getString("table_fk")); + json.put("sort_seq", form.getIntValue("sort_seq")); json.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); json.put("handle_class", THIS_CLASS); @@ -182,6 +186,6 @@ public class TwoOutTask extends AbstractAcsTask { @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"); + this.updateTaskStatus(taskObj, IOSEnum.IS_NOTANDYES.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 5095d75c0..6b7e9f922 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 @@ -60,7 +60,8 @@ public enum IOSEnum { //仓位锁定类型 LOCK_TYPE(MapOf.of("未锁定", "1", "入库锁", "2", "出库锁", "3", "空托盘出库锁", "4", - "空托盘入库锁", "5", "移出锁", "6", "移入锁", "7","木箱入库锁","8","木箱出库锁","9", "其它", "99" + "空托盘入库锁", "5", "移出锁", "6", "移入锁", "7","木箱入库锁","8","木箱出库锁","9", + "出库异常锁","10","其它", "99" )), //仓库id @@ -81,6 +82,9 @@ public enum IOSEnum { //仓位伸位 ZDEPTH_STRUCT(MapOf.of("浅", "1","深","2","无","3")), + //是否自动下发 + IS_SEND(MapOf.of("是", "1","否","2")), + //外部系统 EXT_SYSTEM(MapOf.of("mes", "mes","sap","sap","crm","crm")), ; 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 7e75b7624..4367d8d46 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 @@ -119,4 +119,11 @@ public interface IStIvtIostorinvOutService extends IService { * } */ void confirm(JSONObject whereJson); + + + /** + * 标识完成 + * @param whereJson: 任务对象 + */ + void finishTask(JSONObject whereJson); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/dao/StIvtIostorinvdis.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/dao/StIvtIostorinvdis.java index bbb647e24..8bedc8387 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/dao/StIvtIostorinvdis.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/dao/StIvtIostorinvdis.java @@ -2,6 +2,7 @@ package org.nl.b_lms.storage_manage.ios.service.iostorInv.dao; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; @@ -21,6 +22,7 @@ import java.math.BigDecimal; @EqualsAndHashCode(callSuper = false) @TableName("st_ivt_iostorinvdis") @Builder +@AllArgsConstructor public class StIvtIostorinvdis implements Serializable { private static final long serialVersionUID = 1L; 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 acfd2a780..472573f75 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 @@ -113,7 +113,7 @@ ST_IVT_IOStorInvDis dis LEFT JOIN pdm_bi_subpackagerelation sub ON sub.container_name = dis.pcsn WHERE - 1 = 1 + dis.work_status = '00' AND dis.iostorinvdtl_id= #{iostorinvdtl_id} 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 237013860..c76f6d868 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 @@ -11,6 +11,8 @@ 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.sch.tasks.TwoOutExceptionalTask; +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.IStIvtIostorinvService; @@ -21,6 +23,7 @@ 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.InBussManageService; 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; @@ -30,6 +33,7 @@ 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.pda.mps.eum.RegionTypeEnum; import org.nl.wms.sch.manage.TaskStatusEnum; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -87,6 +91,12 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl arr = taskTab.query("handle_class = '" + TwoOutTask.class.getName() + "' and task_status = '" + TaskStatusEnum.EXECUTING.getCode() + "' and is_delete ='0'") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + if (ObjectUtil.isNotEmpty(arr)) { + throw new BadRequestException("当前有出库任务正在执行,请稍后在试!"); + } + // 查询此明细所有未生成的分配明细 List disDaoList = stIvtIostorinvdisMapper.getNotCreateDis(whereJson); @@ -548,6 +568,18 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl disLikeList : groupingDisMap.values()) { // 调用任务生成处理 List taskMangeList = createTaskMange(disLikeList,mstDao.getIostorinv_id().toString()); + + // 创建任务并下发一组任务 + createTask(taskMangeList,disLikeList,whereJson.getString("point_code")); + } + + // 下发任务:判断当前单据是否有正在执行的的任务 + JSONArray disArr = taskTab.query("table_fk = '" + mstDao.getIostorinv_id().toString() + "' and is_delete = '0' and task_status = '" + TaskStatusEnum.EXECUTING.getCode() + "'") + .getResultJSONArray(0); + + if (ObjectUtil.isEmpty(disArr)) { + TwoOutTask twoOutTask = new TwoOutTask(); + twoOutTask.immediateNotifyAcs(null); } } @@ -625,11 +657,13 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl '" + TaskStatusEnum.FINISHED.getCode() + "' and task_id = '" + whereJson.getString("task_id") + "'") + .uniqueResult(0); + + if (jsonTask == null) { + throw new BadRequestException("查询不到操作的任务记录!"+whereJson.getString("task_id")); + } + + // 查询分配明细 + List disDaoList = iStIvtIostorinvdisService.list( + new QueryWrapper().lambda() + .eq(StIvtIostorinvdis::getTask_id, whereJson.getString("task_id")) + ); + + StIvtIostorinvdis disDao = disDaoList.get(0); + + // 查询主表 + StIvtIostorinv mstDao = this.getById(disDao.getIostorinv_id()); + + if (ObjectUtil.isEmpty(mstDao)) { + throw new BadRequestException("未查询到对应的出库单据!"); + } + + if (IOSEnum.OUT_TYPE.code("改切出库").equals(mstDao.getBill_type()) || IOSEnum.OUT_TYPE.code("返检出库").equals(mstDao.getBill_type())) { + HashMap map = new HashMap<>(); + map.put("need_delete", IOSEnum.IS_NOTANDYES.code("是")); + + WQLObject.getWQLObject("pdm_bi_subpackagerelation").update(map, "package_box_sn = '" + jsonTask.getString("vehicle_code") + "'"); + + JSONArray rows = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("package_box_sn = '" + jsonTask.getString("vehicle_code") + "'").getResultJSONArray(0); + for (int i = 0; i < rows.size(); i++) { + JSONObject row = rows.getJSONObject(i); + //插入包装关系出入库记录表 + row.put("bill_code", mstDao.getBill_code()); + row.put("bill_id", mstDao.getIostorinv_id()); + row.put("bill_type", mstDao.getBill_type()); + row.put("io_type", IOSEnum.IO_TYPE.code("出库")); + row.put("insert_time", DateUtil.now()); + row.put("record_id", cn.hutool.core.util.IdUtil.getSnowflake(1, 1).nextId()); + WQLObject.getWQLObject("pdm_bi_subpackagerelationrecord").insert(row); + } + } + + //更新任务为完成 + HashMap map = new HashMap<>(); + map.put("task_status", TaskStatusEnum.FINISHED.getCode()); + map.put("update_optid", SecurityUtils.getCurrentUserId()); + map.put("update_optname", SecurityUtils.getCurrentNickName()); + map.put("update_time", DateUtil.now()); + + wo_Task.update(map, "task_id='" + whereJson.getString("task_id") + "'"); + + // 查询此任务下所有的分配明细 + disDaoList.forEach(row -> { + row.setWork_status(IOSEnum.WORK_STATUS.code("完成")); + }); + + iStIvtIostorinvdisService.updateBatchById(disDaoList); + + // 更新明细状态 + iStIvtIostorinvdtlService.updateStatus(disDao.getIostorinvdtl_id()); + + //判断是否还有未完成的明细 + List dtlDaoList = iStIvtIostorinvdtlService.list( + new QueryWrapper().lambda() + .eq(StIvtIostorinvdtl::getIostorinv_id, mstDao.getIostorinv_id()) + .ne(StIvtIostorinvdtl::getBill_status, IOSEnum.BILL_STATUS.code("完成")) + ); + + if (ObjectUtil.isEmpty(dtlDaoList)) { + this.confirm(JSONObject.parseObject(JSON.toJSONString(mstDao))); + } + } + /** * 创建调拨入库单 * @param disDaoList:出库分配明细集合 @@ -882,10 +996,10 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl 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<>(); // 循环准备任务参数 @@ -894,19 +1008,22 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl attrRowList, String iostorinv_id) { + // 仓位表 + WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); + // 子卷包装关系表 + WQLObject subTab = WQLObject.getWQLObject("pdm_bi_subpackagerelation"); + // 任务表 + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); JSONObject result = new JSONObject(); @@ -941,15 +1064,225 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl disDaoList = iStIvtIostorinvdisService.list( + new QueryWrapper().lambda() + .eq(StIvtIostorinvdis::getIostorinv_id, iostorinv_id) + .eq(StIvtIostorinvdis::getBox_no, jsonLow.getString("storagevehicle_code")) + ); + + if (ObjectUtil.isNotEmpty(disDaoList)) { + // 相同 + JSONObject jsonSub1 = subTab.query("package_box_sn = '" + jsonAttr.getString("storagevehicle_code") + "'").uniqueResult(0); + JSONObject jsonSub2 = subTab.query("package_box_sn = '" + jsonLow.getString("storagevehicle_code") + "'").uniqueResult(0); + + if (jsonSub1.getString("sale_order_name").equals(jsonSub2.getString("sale_order_name")) && + jsonSub1.getString("box_length").equals(jsonSub2.getString("box_length")) && + jsonSub1.getString("box_width").equals(jsonSub2.getString("box_width")) && + jsonSub1.getString("box_high").equals(jsonSub2.getString("box_high")) && + jsonSub1.getString("product_name").equals(jsonSub2.getString("product_name"))) { + + flag = false; + } else { + // 不相同:判断是否有此木箱的任务 + JSONObject jsonTask = taskTab.query("table_fk = '" + iostorinv_id + "' and vehicle_code = '" + jsonLow.getString("storagevehicle_code") + "' and is_delete = '0'").uniqueResult(0); + + if (ObjectUtil.isNotEmpty(jsonTask)) { + flag = false; + } + + } + } + + if (flag) { + // 查询移入货位 + JSONObject moveParam = new JSONObject(); + moveParam.put("stor_id", IOSEnum.STOR_ID.code("二期")); + moveParam.put("sect_id", RegionTypeEnum.TWO_ZZ01.getId()); + moveParam.put("box_no", jsonLow.getString("storagevehicle_code")); + // moveParam.put("material_id", jsonMater.getString("material_id")); + JSONObject jsonMove = inBussManageService.getOneStruct(moveParam); + + // 生成任务 + JSONObject jsonTaskParam = new JSONObject(); + jsonTaskParam.put("task_type", "010504"); + jsonTaskParam.put("start_device_code", jsonLow.getString("struct_code")); + jsonTaskParam.put("next_device_code", jsonMove.getString("struct_code")); + jsonTaskParam.put("vehicle_code", jsonLow.getString("storagevehicle_code")); + jsonTaskParam.put("table_fk", iostorinv_id); + + TwoOutExceptionalTask taskBean = new TwoOutExceptionalTask(); + String task_id = taskBean.createTask(jsonTaskParam); + taskBean.immediateNotifyAcs(task_id); + + // 锁定:标记货位为异常并生成异常移库任务 + jsonLow.put("lock_type", IOSEnum.LOCK_TYPE.code("出库异常锁")); + jsonLow.put("task_code", task_id); + attrTab.update(jsonLow); + + // 更新移入货位为出库异常货位 + jsonMove.put("lock_type",IOSEnum.LOCK_TYPE.code("出库异常锁")); + jsonLow.put("task_code", task_id); + attrTab.update(jsonMove); + } } } return result; } + /** + * 创建任务 + * @param taskMangeList:仓位集合 + * @param disLikeList:分配明细集合 + * @param point_code : 终点 + */ + private void createTask(List taskMangeList,List disLikeList, String point_code) { + // 任务表 + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); + // 点位表 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + // 查询异常货位任务集合 + String TaskCodeIn = taskMangeList.stream() + .filter(row -> row.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("出库异常锁"))) + .map(row -> row.getString("task_code")) + .distinct().collect(Collectors.joining("','")); + + List taskList = taskTab.query("task_id IN ('" + TaskCodeIn + "') and is_delete = '0'") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + // 任务组标识 + String task_group_id = IdUtil.getStringId(); + + // 起点 + String start_device_code = ""; + // 是否自动下发 + String is_auto_issue = IOSEnum.IS_SEND.code("是"); + + for (int i = 0; i < taskMangeList.size(); i++) { + JSONObject json = taskMangeList.get(i); + start_device_code = json.getString("struct_code"); + + // 过滤此仓位的分配明细 + List disDaoList = disLikeList.stream() + .filter(row -> row.getString("struct_code").equals(json.getString("struct_code"))) + .map(row -> JSONObject.parseObject(JSONObject.toJSONString(row), StIvtIostorinvdis.class)) + .collect(Collectors.toList()); + + // 判断是否是异常货位 + if (json.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("出库异常锁"))) { + /* + * 判断异常货位上的任务是否完成 + * 完成:生成完成任务的point_code2 当做起点的任务 + * 未完成:只更新分配明细状态为生成 + */ + JSONObject jsonTask = taskList.stream() + .filter(row -> row.getString("task_id").equals(json.getString("task_code"))) + .collect(Collectors.toList()).get(0); + + // 完成 + if (jsonTask.getString("task_status").equals(TaskStatusEnum.FINISHED.getCode())) { + start_device_code = jsonTask.getString("point_code2"); + is_auto_issue = IOSEnum.IS_SEND.code("否"); + } else { + // 未完成:只更新分配明细状态不更新任务id + disDaoList.forEach(row -> { + row.setWork_status(IOSEnum.WORK_STATUS.code("生成")); + row.setTask_id(Long.parseLong(task_group_id)); + }); + iStIvtIostorinvdisService.updateBatchById(disDaoList); + + // 标记任务 + jsonTask.put("is_auto_issue",IOSEnum.IS_SEND.code("否")); + taskTab.update(jsonTask); + continue; + } + } + + // 生成任务 + JSONObject jsonTaskParam = new JSONObject(); + jsonTaskParam.put("task_type", "010504"); + jsonTaskParam.put("point_code1", start_device_code); + jsonTaskParam.put("point_code2", point_code); + jsonTaskParam.put("vehicle_code", json.getString("storagevehicle_code")); + jsonTaskParam.put("task_group_id", task_group_id); + jsonTaskParam.put("is_auto_issue", is_auto_issue); + jsonTaskParam.put("table_fk", disDaoList.get(0).getIostorinv_id().toString()); + + if (json.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("浅")) || + json.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("无"))) + { + jsonTaskParam.put("sort_seq", Integer.parseInt(IOSEnum.ZDEPTH_STRUCT.code("浅"))); + } else { + jsonTaskParam.put("sort_seq", Integer.parseInt(IOSEnum.ZDEPTH_STRUCT.code("深"))); + } + + TwoOutTask twoOutTask = new TwoOutTask(); + String task_id = twoOutTask.createTask(jsonTaskParam); + + // 更新分配明细 + JSONObject jsonPoint = pointTab.query("point_code = '" + point_code + "'").uniqueResult(0); + + disDaoList.forEach(row -> { + row.setWork_status(IOSEnum.WORK_STATUS.code("生成")); + row.setTask_id(Long.parseLong(task_id)); + row.setPoint_id(jsonPoint.getLongValue("point_id")); + }); + iStIvtIostorinvdisService.updateBatchById(disDaoList); + } + } + + /** + * 更新异常货位 + * @param disDaoList:所有分配明细集合 + */ + private void UpdateExceptional(List disDaoList) { + // 仓位表 + WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); + // 任务表 + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); + + // 获取仓位集合 + String structCodeIn = disDaoList.stream() + .map(StIvtIostorinvdis::getStruct_code) + .distinct().collect(Collectors.joining("','")); + + List attrList = attrTab.query("struct_code IN ('" + structCodeIn + "')") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + // 过滤异常货位 + List attrExcepList = attrList.stream() + .filter(row -> ObjectUtil.isNotEmpty(row.getString("task_code"))) + .collect(Collectors.toList()); + + // 找所有异常任务 + String taskCodeIn = attrExcepList.stream() + .map(row -> row.getString("task_code")) + .distinct().collect(Collectors.joining("','")); + + List taskList = taskTab.query("task_id IN ('" + taskCodeIn + "')") + .getResultJSONArray(0).toJavaList(JSONObject.class); + + // 更新异常货位 + List structCodeInList = new ArrayList<>(); + + for (int i = 0; i < taskList.size(); i++) { + JSONObject json = taskList.get(0); + + structCodeInList.add(json.getString("point_code1")); + structCodeInList.add(json.getString("point_code2")); + } + + JSONObject jsonUpdate = new JSONObject(); + jsonUpdate.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定")); + jsonUpdate.put("task_code", ""); + + attrTab.update(jsonUpdate,"struct_code IN ('"+String.join("','",structCodeInList)+"')"); + } /** * 更新主表状态 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 index 56ede66d0..5636d93c2 100644 --- 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 @@ -5,7 +5,6 @@ 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; diff --git a/lms/nladmin-system/src/main/java/org/nl/start/Init.java b/lms/nladmin-system/src/main/java/org/nl/start/Init.java index 00813ad7e..f3290745f 100644 --- a/lms/nladmin-system/src/main/java/org/nl/start/Init.java +++ b/lms/nladmin-system/src/main/java/org/nl/start/Init.java @@ -21,6 +21,7 @@ public class Init implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { // initTwoAttr(4,30,3,2, "2"); +// createAttr(); } /** @@ -152,27 +153,27 @@ public class Init implements ApplicationRunner { String now = DateUtil.now(); - for (int i = 1; i <= 2000; i++) { + for (int i = 1; i <= 3000; i++) { JSONObject json = new JSONObject(); json.put("struct_id", IdUtil.getSnowflake(1,1).nextId()); if (i < 10) { - json.put("struct_code", "B01-"+"000"+i+"-01"); - json.put("struct_name", "B01排"+"000"+i+"列-01层"); + json.put("struct_code", "81-"+"000"+i+"-01"); + json.put("struct_name", "81排"+"000"+i+"列-01层"); }else if (i >= 10 && i < 100) { - json.put("struct_code", "B01-"+"00"+i+"-01"); - json.put("struct_name", "B01排"+"00"+i+"列-01层"); + json.put("struct_code", "81-"+"00"+i+"-01"); + json.put("struct_name", "81排"+"00"+i+"列-01层"); }else if (i >= 100 && i < 1000) { - json.put("struct_code", "B01-"+"0"+i+"-01"); - json.put("struct_name", "B01排"+"0"+i+"列-01层"); + json.put("struct_code", "81-"+"0"+i+"-01"); + json.put("struct_name", "81排"+"0"+i+"列-01层"); } else { - json.put("struct_code", "B01-"+i+"-01"); - json.put("struct_name", "B01排"+i+"列-01层"); + json.put("struct_code", "81-"+i+"-01"); + json.put("struct_name", "81排"+i+"列-01层"); } - JSONObject jsonObject = tab2.query("stor_id = '1582991156504039455'").uniqueResult(0); - JSONObject jsonObjec2 = tab3.query("stor_id = '1582991156504039455' and sect_code = 'BXN01'").uniqueResult(0); + JSONObject jsonObject = tab2.query("stor_id = '1597073830499717137'").uniqueResult(0); + JSONObject jsonObjec2 = tab3.query("stor_id = '1597073830499717137' and sect_code = 'XN81'").uniqueResult(0); // 新增仓位 json.put("simple_name", json.getString("struct_name")); 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 1d224839a..03579cce6 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 @@ -20,11 +20,12 @@ public enum RegionTypeEnum { LKCK("17", "密集库出库输送线", "1585167595403874304"), XN01("18", "虚拟区", "1586913215886004224"), PD01("19", "盘点区", "1645705331612979200"), - TWO_ZZ01("20", "二期暂存区", ""), + TWO_ZZ01("20", "二期暂存区", "1760183596628447232"), TWO_TTP01("21", "二期空托盘区", "1750471797729529856"), TWO_MX01("22", "二期木箱区", "1752254266938101760"), TWO_KZ01("23", "二期捆扎区", "1754774130626007040"), - TWO_FH01("24", "二期发货区", "1759453285649092608"); + TWO_FH01("24", "二期发货区", "1759453285649092608"), + TWO_OUT01("25", "二期出库区", "1760141408548818944"); private String name; private String code;