diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoInEmpTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoInEmpTask.java new file mode 100644 index 000000000..7336bbf89 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoInEmpTask.java @@ -0,0 +1,185 @@ +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 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.dao.StIvtIostorinvdis; +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.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 TwoInEmpTask extends AbstractAcsTask { + + /** + * 处理类 + */ + private final String THIS_CLASS = TwoInEmpTask.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 attrTab = WQLObject.getWQLObject("st_ivt_structattr"); + + // 更新任务的参数 + 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()); + + // 更新仓位 + JSONObject jsonAttr = attrTab.query("struct_code = '" + taskObj.getString("point_code2") + "'").uniqueResult(0); + jsonAttr.put("lock_type",IOSEnum.LOCK_TYPE.code("未锁定")); + jsonAttr.put("storagevehicle_code",taskObj.getString("vehicle_code")); + jsonAttr.put("storagevehicle_type",taskObj.getString("vehicle_type")); + attrTab.update(jsonAttr); + } + + // 取消 + 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("是")); + + // 解锁仓位 + JSONObject jsonAttr = attrTab.query("struct_code = '" + taskObj.getString("point_code2") + "'").uniqueResult(0); + jsonAttr.put("lock_type",IOSEnum.LOCK_TYPE.code("未锁定")); + attrTab.update(jsonAttr); + } + + 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("托盘号不能为空!"); + } + + if (StrUtil.isBlank(form.getString("vehicle_type"))) { + 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("vehicle_type", form.getString("vehicle_type")); + 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/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 63866d33f..8c648b47e 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 @@ -789,11 +789,17 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl row.getTask_id().toString()) - .collect(Collectors.joining("','")); + List needUpdateTaskList = new ArrayList<>(); - taskTab.update(jsonTaskParam,"task_id IN ('"+task_id_in+"') AND task_status <> '"+TaskStatusEnum.FINISHED.getCode()+"'"); + for (int i = 0; i < disDaoList.size(); i++) { + StIvtIostorinvdis disDao = disDaoList.get(i); + if (disDao.getTask_id() != null) { + + needUpdateTaskList.add(disDao.getTask_id().toString()); + } + } + + taskTab.update(jsonTaskParam,"task_id IN ('"+String.join("','", needUpdateTaskList)+"') AND task_status <> '"+TaskStatusEnum.FINISHED.getCode()+"'"); // 更新子卷包装关系 String pcsn_in = disDaoList.stream() diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InBussManageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InBussManageServiceImpl.java index c91e6c4a7..717d46258 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InBussManageServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InBussManageServiceImpl.java @@ -30,7 +30,12 @@ public class InBussManageServiceImpl implements InBussManageService { /** * 不需要查询的排集合 */ - private List notInRowList; + private List notInRowList = new ArrayList<>(); + + /** + * 不需要查询的巷道集合 + */ + private List notInBlockList = new ArrayList<>(); @Override @Transactional @@ -97,7 +102,7 @@ public class InBussManageServiceImpl implements InBussManageService { String block_num = getMinBlock(jsonSub); /* - * 确定哪排:确定哪排:查看每排相同木箱规格等 的数量,找到数量最小的那排 + * 确定哪排:查看每排相同木箱规格等 的数量,找到数量最小的那排 */ jsonSub.put("block_num",block_num); String row_num = getMinRow(jsonSub); @@ -112,7 +117,10 @@ public class InBussManageServiceImpl implements InBussManageService { if (ObjectUtil.isEmpty(jsonAttr)) { jsonSub.put("flag", "1"); - jsonSub.put("not_block", jsonSub.getString("block_num")); + notInBlockList.add(jsonSub.getString("block_num")); + + String join = "('" + String.join("','", notInBlockList) + "')"; + jsonSub.put("not_block", join); List blockList = WQL.getWO("BST_INRULE").addParamMap(jsonSub) .process().getResultJSONArray(0).toJavaList(JSONObject.class); @@ -259,7 +267,7 @@ public class InBussManageServiceImpl implements InBussManageService { .process().getResultJSONArray(0).toJavaList(JSONObject.class); /* - * 查询所属排的所有木箱 + * 查询所属排的所有托盘 */ String row_in = rowList.stream() .map(row -> row.getString("row_num")) @@ -273,7 +281,9 @@ public class InBussManageServiceImpl implements InBussManageService { // 为空说明没有木箱,返回最小排 if (ObjectUtil.isEmpty(boxAllList)) { - return rowList.get(0).getString("row_num"); + if (ObjectUtil.isNotEmpty(rowList)) { + return rowList.get(0).getString("row_num"); + } } // 不区分木箱规格:最小木箱数的排 @@ -405,6 +415,7 @@ public class InBussManageServiceImpl implements InBussManageService { if (json.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("无"))) { // 无需深度 jsonAttr = json; + break; } else if (json.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("深"))) { /* * 深货位:判断浅是否阻挡 @@ -417,7 +428,7 @@ public class InBussManageServiceImpl implements InBussManageService { .collect(Collectors.toList()); if (ObjectUtil.isEmpty(lowAttr) || lowAttr.size() != 1) { - throw new BadRequestException("仓位:" + json.getString("stor_code") + "对应的浅货位错误!"); + throw new BadRequestException("仓位:" + json.getString("struct_code") + "对应的浅货位错误!"); } // 判断是否有木箱 @@ -425,6 +436,7 @@ public class InBussManageServiceImpl implements InBussManageService { if (ObjectUtil.isEmpty(jsonAttrLow.getString("storagevehicle_code")) && jsonAttrLow.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) { // 没有木箱 jsonAttr = json; + break; } else { continue; } @@ -440,7 +452,7 @@ public class InBussManageServiceImpl implements InBussManageService { .collect(Collectors.toList()); if (ObjectUtil.isEmpty(darkAttr) || darkAttr.size() != 1) { - throw new BadRequestException("仓位:" + json.getString("stor_code") + "对应的深货位错误!"); + throw new BadRequestException("仓位:" + json.getString("struct_code") + "对应的深货位错误!"); } // 判断是否有木箱 @@ -450,11 +462,17 @@ public class InBussManageServiceImpl implements InBussManageService { if (jsonAttrDark.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) { jsonAttr = json; + break; + } else { + continue; } } else { if (jsonAttrDark.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) { jsonAttr = jsonAttrDark; + break; + } else { + continue; } } } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/VehicleManageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/VehicleManageServiceImpl.java new file mode 100644 index 000000000..59635cd25 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/VehicleManageServiceImpl.java @@ -0,0 +1,422 @@ +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.sch.tasks.TwoInEmpTask; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.VehicleManageService; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.pda.mps.eum.RegionTypeEnum; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +/** + *

+ * 空载具业务处理 服务实现类 + *

+ * + * @author generator + * @since 2023-11-10 + */ +@Service +public class VehicleManageServiceImpl implements VehicleManageService { + + /** + * 不需要查询的排集合 + */ + private List notInRowList = new ArrayList<>(); + + /** + * 不需要查询的巷道集合 + */ + private List notInBlockList = new ArrayList<>(); + + @Override + @Transactional + public void inVehicle(JSONObject whereJson) { + // 点位表 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + // 仓位表 + WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); + + // 判断起点点位是否存在 + JSONObject jsonPoint = pointTab.query("point_code = '" + whereJson.getString("device_code") + "' AND is_delete = '" + + IOSEnum.IS_NOTANDYES.code("否") + "' AND is_used = '" + + IOSEnum.IS_NOTANDYES.code("是") + "'") + .uniqueResult(0); + + if (ObjectUtil.isEmpty(jsonPoint)) { + throw new BadRequestException("起始点位不存在或未启用!"); + } + + // 找一个托盘区的空仓位 + JSONObject jsonParam = new JSONObject(); + jsonParam.put("stor_id", IOSEnum.STOR_ID.code("二期")); + jsonParam.put("sect_id", RegionTypeEnum.TWO_TTP01.getId()); + jsonParam.put("vehicle_type", whereJson.getString("vehicle_type")); + + JSONObject jsonAttr = getStruct(jsonParam); + + if (ObjectUtil.isEmpty(jsonAttr)) { + throw new BadRequestException("仓位不足!"); + } + + // 生成任务 + JSONObject jsonTaskParam = new JSONObject(); + jsonTaskParam.put("task_type", "010502"); + jsonTaskParam.put("start_device_code", whereJson.getString("device_code")); + jsonTaskParam.put("next_device_code", jsonAttr.getString("struct_code")); + jsonTaskParam.put("vehicle_code", whereJson.getString("vehicle_code")); + jsonTaskParam.put("vehicle_type", whereJson.getString("vehicle_type")); + + TwoInEmpTask taskBean = new TwoInEmpTask(); + taskBean.createTask(jsonTaskParam); + + taskBean.immediateNotifyAcs(null); + + // 锁定终点 + jsonAttr.put("lock_type", IOSEnum.LOCK_TYPE.code("空托盘入库锁")); + attrTab.update(jsonAttr); + } + + /** + * 找一个空仓位(空托盘区) + * @param jsonParam { + * stor_id: 仓库标识 + * sect_id: 库区标识 + * } + * @return JSONObject : 仓位对象 + */ + private JSONObject getStruct(JSONObject jsonParam) { + // 仓位表 + WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); + + /* + * 判断是否有仓位 + * 判断条件:库区、仓库、是否启用、是否删除、未锁定、没有载具 + */ + JSONArray structArray = 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 = '"+jsonParam.getString("stor_id")+"' " + + "AND sect_id = '"+jsonParam.getString("sect_id")+"'").getResultJSONArray(0); + + if (ObjectUtil.isEmpty(structArray)) { + throw new BadRequestException("仓位不足!"); + } + + // 确定巷道:查看每个巷道最小托盘数的巷道,获取最小托盘数的想到 + String block_num = getMinBlock(jsonParam); + + // 确定排:查看每排的载具数量,找到数量最小的那排 + jsonParam.put("block_num",block_num); + String row_num = getMinRow(jsonParam); + + // 确定仓位: 找到相同托盘类型的伸位 + jsonParam.put("row_num",row_num); + JSONObject jsonAttr = queryStruct(jsonParam); + + // 为空则新找巷道 + if (ObjectUtil.isEmpty(jsonAttr)) { + + jsonParam.put("flag", "1"); + notInBlockList.add(jsonParam.getString("block_num")); + + String join = "('" + String.join("','", notInBlockList) + "')"; + jsonParam.put("not_block", join); + jsonParam.put("storagevehicle_type", jsonParam.getString("vehicle_type")); + + List blockList = WQL.getWO("BST_INVEHICLE").addParamMap(jsonParam) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + for (int i = 0; i < blockList.size(); i++) { + JSONObject json = blockList.get(i); + json.put("stor_id", jsonParam.getString("stor_id")); + json.put("sect_id", jsonParam.getString("sect_id")); + json.put("vehicle_type", jsonParam.getString("vehicle_type")); + + 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 jsonParam { + * stor_id: 仓库标识 + * sect_id: 库区标识 + * } + * @return String 巷道 + */ + private String getMinBlock(JSONObject jsonParam) { + + jsonParam.put("flag", "1"); + + // 获取仓库、库区有空位的巷道 + List blockList = WQL.getWO("BST_INVEHICLE").addParamMap(jsonParam) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + /* + * 查询所属巷道所有托盘 + */ + String block_in = blockList.stream() + .map(row -> row.getString("block_num")) + .collect(Collectors.joining("','")); + + jsonParam.put("flag", "2"); + jsonParam.put("block_in", "('"+block_in+"')"); + + List boxAllList = WQL.getWO("BST_INVEHICLE").addParamMap(jsonParam) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + // 为空说明没有托盘,返回最小巷道 + if (ObjectUtil.isEmpty(boxAllList)) { + return blockList.get(0).getString("block_num"); + } + + // 计算每个巷道的托盘数 + 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).getString("block_num"); + + } + + /** + * 获取最小排 + * @param jsonParam { + * stor_id: 仓库标识 + * sect_id: 库区标识 + * block_num: 巷道 + * } + * @return String: 排 + */ + private String getMinRow(JSONObject jsonParam) { + + jsonParam.put("flag", "3"); + + // 获取此仓库、库区、巷道 有空位的排 + List rowList = WQL.getWO("BST_INVEHICLE").addParamMap(jsonParam) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + /* + * 查询所属排的所有托盘号 + */ + String row_in = rowList.stream() + .map(row -> row.getString("row_num")) + .collect(Collectors.joining("','")); + + jsonParam.put("flag", "2"); + jsonParam.put("row_in", "('"+row_in+"')"); + + List boxAllList = WQL.getWO("BST_INVEHICLE").addParamMap(jsonParam) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + // 为空说明没有托盘,返回最小排 + if (ObjectUtil.isEmpty(boxAllList)) { + if (ObjectUtil.isNotEmpty(rowList)) { + return rowList.get(0).getString("row_num"); + } + } + + // 计算最小排的托盘 + 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()); + + String row_num = ""; + + if (ObjectUtil.isNotEmpty(boxNumList)) { + row_num = boxNumList.get(0).getString("row_num"); + } + return row_num; + } + + /** + * 确定仓位 + * @param jsonParam { + * stor_id: 仓库标识 + * sect_id: 库区标识 + * block_num: 巷道 + * row_num: 排 + * } + * @return JSONObject: 仓位 + */ + private JSONObject queryStruct(JSONObject jsonParam) { + + JSONObject jsonAttr = getStructOne(jsonParam); + + // 为空找此巷道新的一排 + if (ObjectUtil.isEmpty(jsonAttr)) { + notInRowList.add(jsonParam.getString("row_num")); + + if (ObjectUtil.isEmpty(jsonParam.getString("row_num"))) { + return null; + } + + String join = "('" + String.join("','", notInRowList) + "')"; + jsonParam.put("not_row_in", join); + + // 新的一排 + String row_num_new = this.getMinRow(jsonParam); + jsonParam.put("row_num",row_num_new); + + jsonAttr = this.getStruct(jsonParam); + } + return jsonAttr; + } + + /** + * 获取一个货位公共方法 + * @param jsonParam { + * sect_id:库区 + * stor_id:仓库 + * block_num: 巷道 + * row_num :排 + * } + * @return JSONObject : 仓位 + */ + private JSONObject getStructOne(JSONObject jsonParam) { + + // 获取此仓库、库区、巷道、排的所有空位 根据列、层、深度排序 + jsonParam.put("flag", "4"); + + List rowStructList = WQL.getWO("BST_INVEHICLE").addParamMap(jsonParam) + .process().getResultJSONArray(0).toJavaList(JSONObject.class); + + // 获取此仓库、库区、巷道、排的所有仓位 + jsonParam.put("flag", "5"); + + List structAllList = WQL.getWO("BST_INVEHICLE").addParamMap(jsonParam) + .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; + break; + + } 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("struct_code") + "对应的浅货位错误!"); + } + + // 判断是否被锁定 + JSONObject jsonAttrLow = lowAttr.get(0); + + if (ObjectUtil.isEmpty(jsonAttrLow.getString("storagevehicle_code")) && jsonAttrLow.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) { + // 没有载具和被锁定 + jsonAttr = json; + break; + } 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("struct_code") + "对应的深货位错误!"); + } + + // 判断是否有托盘 + JSONObject jsonAttrDark = darkAttr.get(0); + + if (ObjectUtil.isNotEmpty(jsonAttrDark.getString("storagevehicle_code"))) { + + if (jsonAttrDark.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) { + + if (jsonAttrDark.getString("storagevehicle_type").equals(jsonParam.getString("vehicle_type"))) { + jsonAttr = json; + break; + } else { + continue; + } + } else { + continue; + } + + } else { + if (jsonAttrDark.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) { + jsonAttr = jsonAttrDark; + break; + } else { + continue; + } + } + + } + } + 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 index 92396d259..e13fe5b0f 100644 --- 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 @@ -42,4 +42,5 @@ public interface InBussManageService { * @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/service/VehicleManageService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/VehicleManageService.java new file mode 100644 index 000000000..6e31452e4 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/VehicleManageService.java @@ -0,0 +1,26 @@ +package org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service; + +import com.alibaba.fastjson.JSONObject; + +/** + *

+ * 空载具业务处理 服务类 + *

+ * + * @author generator + * @since 2023-11-16 + */ +public interface VehicleManageService { + + /** + * 入空载具 + * @param whereJson { + * device_code:起点 + * vehicle_code: 载具编码 + * vehicle_type: 托盘类型 + * } + */ + void inVehicle(JSONObject whereJson); + + +} 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 index feec57f82..ca0bc7b13 100644 --- 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 @@ -27,7 +27,7 @@ 输入.block_num TYPEAS s_string 输入.row_num TYPEAS s_string 输入.not_row_in TYPEAS f_string - 输入.not_block TYPEAS s_string + 输入.not_block TYPEAS f_string [临时表] --这边列出来的临时表就会在运行期动态创建 @@ -65,13 +65,13 @@ AND attr.stor_id = 输入.stor_id AND attr.sect_id = 输入.sect_id + OPTION 输入.not_block <> "" + attr.block_num NOT IN 输入.not_block + ENDOPTION + group by attr.block_num order by attr.block_num - OPTION 输入.not_block <> "" - attr.block_num <> 输入.not_block - ENDOPTION - ENDSELECT ENDQUERY ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/wql/BST_INVEHICLE.wql b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/wql/BST_INVEHICLE.wql new file mode 100644 index 000000000..cb8dac055 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/wql/BST_INVEHICLE.wql @@ -0,0 +1,173 @@ +[交易说明] + 交易名: 载具入库逻辑 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.stor_id TYPEAS s_string + 输入.sect_id TYPEAS s_string + 输入.block_num TYPEAS s_string + 输入.row_num TYPEAS s_string + 输入.block_in TYPEAS f_string + 输入.row_in TYPEAS f_string + 输入.not_row_in TYPEAS f_string + 输入.not_block TYPEAS f_string + 输入.storagevehicle_type 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 + + OPTION 输入.not_block <> "" + attr.block_num NOT IN 输入.not_block + ENDOPTION + + OPTION 输入.storagevehicle_type <> "" + attr.storagevehicle_type = 输入.storagevehicle_type + ENDOPTION + + group by attr.block_num + order by attr.block_num + + + + 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 输入.row_in <> "" + attr.row_num in 输入.row_in + ENDOPTION + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "3" + 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 = "4" + 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 + AND attr.block_num = 输入.block_num + AND attr.row_num = 输入.row_num + + order by attr.col_num,attr.layer_num ASC,attr.zdepth DESC + + 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.stor_id = 输入.stor_id + AND attr.sect_id = 输入.sect_id + AND attr.block_num = 输入.block_num + AND attr.row_num = 输入.row_num + + ENDSELECT + ENDQUERY + ENDIF \ No newline at end of file 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 8b69f8c17..00813ad7e 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 @@ -1,7 +1,12 @@ package org.nl.start; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import com.alibaba.fastjson.JSONObject; +import com.sun.org.apache.bcel.internal.generic.GETSTATIC; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.nl.modules.wql.core.bean.WQLObject; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; @@ -15,7 +20,132 @@ import org.springframework.stereotype.Component; public class Init implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { - /* WQLObject tab = WQLObject.getWQLObject("ST_IVT_StructAttr"); +// initTwoAttr(4,30,3,2, "2"); + } + + /** + * 初始化二期仓位 + */ + private void initTwoAttr(int row_num, int col_num, int layer_num, int block_num, String zdepth) { + + WQLObject tab = WQLObject.getWQLObject("ST_IVT_StructAttr"); + WQLObject tab2 = WQLObject.getWQLObject("st_ivt_bsrealstorattr"); + WQLObject tab3 = WQLObject.getWQLObject("st_ivt_sectattr"); + WQLObject tab4 = WQLObject.getWQLObject("sch_base_point"); + + for (int j = 1; j < layer_num + 1; j++) { + + // 层 + String layer_code = String.valueOf(j); + String layer_name = String.valueOf(j); + if (j < 10) { + layer_code = "0" + j ; + layer_name = "0" + j + "层"; + } else { + layer_code = j + "" ; + layer_name = j + "层"; + } + + // 区 + String block_code = block_num + "0"+zdepth; + String block_name = block_num + "0"+zdepth + "区"; + + for (int i = 1; i < col_num + 1; i++) { + JSONObject json = new JSONObject(); + json.put("struct_id", IdUtil.getSnowflake(1, 1).nextId()); + + // 排 + String row_code = String.valueOf(row_num); + String row_name = String.valueOf(row_num); + if (row_num <= 10) { + row_code = "0" + String.valueOf(row_num) + "-"; + row_name = "0" + String.valueOf(row_num) + "排"; + } else { + row_code = String.valueOf(row_num) + "-"; + row_name = String.valueOf(row_num) + "排"; + } + + // 列 + String col_code = String.valueOf(i); + String col_name = String.valueOf(i); + if (i < 10) { + col_code = "0" + i + "-"; + col_name = "0" + i + "列"; + } else { + col_code = i + "-"; + col_name = i + "列"; + } + + JSONObject jsonObject = tab2.query("stor_id = '1582991156504039455'").uniqueResult(0); + JSONObject jsonObjec2 = tab3.query("stor_id = '1582991156504039455' and sect_code = 'BZC01'").uniqueResult(0); + + // 新增仓位 + json.put("sect_id", jsonObjec2.getString("sect_id")); + json.put("sect_code", jsonObjec2.getString("sect_code")); + json.put("sect_name", jsonObjec2.getString("sect_name")); + json.put("stor_id", jsonObject.getString("stor_id")); + json.put("stor_code", jsonObject.getString("stor_code")); + json.put("stor_name", jsonObject.getString("stor_name")); + json.put("lock_type", "1"); + + json.put("row_num", row_num); + json.put("col_num", i); + json.put("layer_num", j); + json.put("block_num", block_num); + + json.put("struct_code","B"+ block_code + row_code + col_code+ layer_code); + json.put("struct_name","B"+ block_name + row_name + col_name+ layer_name); + json.put("simple_name",json.getString("struct_name")); + + json.put("in_order_seq", i); + json.put("out_order_seq", i); + json.put("in_empty_seq", i); + json.put("out_empty_seq", i); + json.put("zdepth", Integer.valueOf(zdepth)); + + json.put("create_id", "1"); + json.put("create_name", "管理员"); + json.put("create_time", DateUtil.now()); + json.put("material_height_type", 1); + tab.insert(json); + + // 新增点位 + JSONObject jsonPoint = new JSONObject(); + jsonPoint.put("point_id",IdUtil.getSnowflake(1,1).nextId()); + jsonPoint.put("point_code", json.getString("struct_code")); + jsonPoint.put("point_name", json.getString("struct_name")); + jsonPoint.put("region_id", json.getString("sect_id")); + jsonPoint.put("region_code", json.getString("sect_code")); + jsonPoint.put("region_name", json.getString("sect_name")); + jsonPoint.put("point_type", "2"); + jsonPoint.put("point_status", "1"); + jsonPoint.put("lock_type", "1"); + jsonPoint.put("vehicle_max_qty", 0); + jsonPoint.put("vehicle_qty", 0); + jsonPoint.put("block_num", json.getBigDecimal("block_num")); + jsonPoint.put("row_num", json.getBigDecimal("row_num")); + jsonPoint.put("col_num", json.getBigDecimal("col_num")); + jsonPoint.put("layer_num", json.getBigDecimal("layer_num")); + jsonPoint.put("in_order_seq", i); + jsonPoint.put("out_order_seq", i); + jsonPoint.put("in_empty_seq", i); + jsonPoint.put("out_empty_seq", i); + jsonPoint.put("is_have_workder", "0"); + jsonPoint.put("is_used", "1"); + jsonPoint.put("source_id", json.get("struct_id")); + jsonPoint.put("is_delete", "0"); + jsonPoint.put("create_id", "1"); + jsonPoint.put("create_name", "管理员"); + jsonPoint.put("create_time", DateUtil.now()); + tab4.insert(jsonPoint); + + } + + } + } + + private void createAttr() { + WQLObject tab = WQLObject.getWQLObject("ST_IVT_StructAttr"); WQLObject tab2 = WQLObject.getWQLObject("st_ivt_bsrealstorattr"); WQLObject tab3 = WQLObject.getWQLObject("st_ivt_sectattr"); WQLObject tab4 = WQLObject.getWQLObject("sch_base_point"); @@ -98,7 +228,7 @@ public class Init implements ApplicationRunner { tab4.insert(jsonPoint); } - System.out.println("项目启动成功!");*/ + System.out.println("项目启动成功!"); } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/stivt.xls b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/stivt.xls index 422f1ef4b..02df2d11c 100644 Binary files a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/stivt.xls and b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/stivt.xls differ 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 024465a4d..a80c8cecc 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,7 +20,8 @@ public enum RegionTypeEnum { LKCK("17", "密集库出库输送线", "1585167595403874304"), XN01("18", "虚拟区", "1586913215886004224"), PD01("19", "盘点区", "1645705331612979200"), - TWO_ZZ01("20", "暂存区", ""); + TWO_ZZ01("20", "二期暂存区", ""), + TWO_TTP01("21", "二期空托盘区", "1750471797729529856"); private String name; private String code; diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/CheckOutBillController.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/CheckOutBillController.java index 08ebc3a28..9b2bdb037 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/CheckOutBillController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/CheckOutBillController.java @@ -5,6 +5,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvOutService; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl.VehicleManageServiceImpl; import org.nl.modules.logging.annotation.Log; import org.nl.wms.st.inbill.service.CheckOutBillService; import org.springframework.beans.factory.annotation.Autowired; @@ -359,4 +360,14 @@ public class CheckOutBillController { public void download(@RequestParam Map map, HttpServletResponse response, String[] stor_id, String[] bill_status, String[] bill_type) throws IOException { checkOutBillService.download(map, response, stor_id, bill_status, bill_type); } + + + @PostMapping("/testInEmp") + @Log("销售出库回传mes") + + public ResponseEntity testInEmp(@RequestBody JSONObject whereJson) { + new VehicleManageServiceImpl().inVehicle(whereJson); + return new ResponseEntity<>(HttpStatus.OK); + } + }