add:空托盘入库

This commit is contained in:
2024-01-26 09:55:09 +08:00
parent 27cd6217c4
commit 3c7f4495da
12 changed files with 992 additions and 19 deletions

View File

@@ -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<AcsTaskDto> 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<AcsTaskDto> 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("取消"));
}
}

View File

@@ -789,11 +789,17 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl<StIvtIostorinvMapper,
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("','"));
List<String> 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()

View File

@@ -30,7 +30,12 @@ public class InBussManageServiceImpl implements InBussManageService {
/**
* 不需要查询的排集合
*/
private List<String> notInRowList;
private List<String> notInRowList = new ArrayList<>();
/**
* 不需要查询的巷道集合
*/
private List<String> 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<JSONObject> 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;
}
}
}

View File

@@ -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;
/**
* <p>
* 空载具业务处理 服务实现类
* </p>
*
* @author generator
* @since 2023-11-10
*/
@Service
public class VehicleManageServiceImpl implements VehicleManageService {
/**
* 不需要查询的排集合
*/
private List<String> notInRowList = new ArrayList<>();
/**
* 不需要查询的巷道集合
*/
private List<String> 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<JSONObject> 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<JSONObject> 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<JSONObject> 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<JSONObject> blockBoxList = new ArrayList<>();
for (int i = 0; i < blockList.size(); i++) {
JSONObject jsonBlock = blockList.get(i);
List<JSONObject> 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<JSONObject> 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<JSONObject> 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<JSONObject> 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<JSONObject> rowkBoxList = new ArrayList<>();
for (int i = 0; i < rowList.size(); i++) {
JSONObject jsonRow = rowList.get(i);
List<JSONObject> 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<JSONObject> 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<JSONObject> rowStructList = WQL.getWO("BST_INVEHICLE").addParamMap(jsonParam)
.process().getResultJSONArray(0).toJavaList(JSONObject.class);
// 获取此仓库、库区、巷道、排的所有仓位
jsonParam.put("flag", "5");
List<JSONObject> 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<JSONObject> 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<JSONObject> 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;
}
}

View File

@@ -42,4 +42,5 @@ public interface InBussManageService {
* @return JSONObject 仓位对象
*/
JSONObject getOneStruct(JSONObject jsonObject);
}

View File

@@ -0,0 +1,26 @@
package org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service;
import com.alibaba.fastjson.JSONObject;
/**
* <p>
* 空载具业务处理 服务类
* </p>
*
* @author generator
* @since 2023-11-16
*/
public interface VehicleManageService {
/**
* 入空载具
* @param whereJson {
* device_code起点
* vehicle_code 载具编码
* vehicle_type 托盘类型
* }
*/
void inVehicle(JSONObject whereJson);
}

View File

@@ -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

View File

@@ -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

View File

@@ -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("项目启动成功!");
}
}

View File

@@ -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;

View File

@@ -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<Object> testInEmp(@RequestBody JSONObject whereJson) {
new VehicleManageServiceImpl().inVehicle(whereJson);
return new ResponseEntity<>(HttpStatus.OK);
}
}