rev:发货任务二次分配修改

This commit is contained in:
2024-06-20 09:39:22 +08:00
parent 5bb695619e
commit 3c2da9058f
5 changed files with 323 additions and 23 deletions

View File

@@ -39,6 +39,8 @@ public class TwoSendOutTask extends AbstractAcsTask {
/*
* 下发给ACS时需要特殊处理
*/
WQLObject taskTab = WQLObject.getWQLObject("sch_base_task");
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<>();
@@ -60,6 +62,11 @@ public class TwoSendOutTask extends AbstractAcsTask {
.remark(json.getString("remark"))
.build();
resultList.add(dto);
// 更新任务为下发
JSONObject paramMap = new JSONObject();
paramMap.put("task_status", TaskStatusEnum.ISSUE.getCode());
taskTab.update(paramMap, "task_id ='" + json.getString("task_id") + "'");
}
return resultList;
}
@@ -79,7 +86,16 @@ public class TwoSendOutTask extends AbstractAcsTask {
jsonTask.put("update_time", DateUtil.now());
taskTab.update(jsonTask);
JSONObject jsonPoint2 = pointTab.query("point_code = '" + jsonTask.getString("point_code2") + "'").uniqueResult(0);
JSONObject jsonPoint2;
if (ObjectUtil.isNotEmpty(jsonTask.getString("point_code4"))) {
// 第一次申请取消
jsonPoint2 = pointTab.query("point_code = '" + jsonTask.getString("point_code4") + "'").uniqueResult(0);
} else {
// 第二次申请取消
jsonPoint2 = pointTab.query("point_code = '" + jsonTask.getString("point_code2") + "'").uniqueResult(0);
}
jsonPoint2.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定"));
jsonPoint2.put("vehicle_code", "");
pointTab.update(jsonPoint2);
@@ -102,11 +118,13 @@ public class TwoSendOutTask extends AbstractAcsTask {
jsonTask.put("update_time", DateUtil.now());
taskTab.update(jsonTask);
// 更新暂存区点位状态
JSONObject jsonPoint2 = WQLObject.getWQLObject("sch_base_point").query("point_code = '" + jsonTask.getString("point_code2") + "'").uniqueResult(0);
jsonPoint2.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定"));
jsonPoint2.put("vehicle_code", jsonTask.getString("vehicle_code"));
pointTab.update(jsonPoint2);
if (ObjectUtil.isEmpty(jsonTask.getString("point_code4"))) {
// 第二次申请任务完成 - 更新点位状态
JSONObject jsonPoint2 = WQLObject.getWQLObject("sch_base_point").query("point_code = '" + jsonTask.getString("point_code2") + "'").uniqueResult(0);
jsonPoint2.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定"));
jsonPoint2.put("vehicle_code", jsonTask.getString("vehicle_code"));
pointTab.update(jsonPoint2);
}
}
}
@@ -126,10 +144,6 @@ public class TwoSendOutTask extends AbstractAcsTask {
WQLObject tab = WQLObject.getWQLObject("SCH_BASE_Task");
CutConveyorTask cutConveyorTask = new CutConveyorTask();
String point_code2 = form.getString("point_code2");
if (cutConveyorTask.isSingleTask(point_code2)) {
throw new BadRequestException("点位:" + point_code2 + "存在未完成的任务!");
}
JSONObject json = new JSONObject();
json.put("task_id", IdUtil.getSnowflake(1, 1).nextId());
json.put("task_code", IdUtil.getSnowflake(1, 1).nextId());
@@ -138,6 +152,7 @@ public class TwoSendOutTask extends AbstractAcsTask {
json.put("point_code1", form.getString("point_code1"));
json.put("route_plan_code", getRoutePlanCode(json.getString("point_code1")));
json.put("point_code2", form.getString("point_code2"));
json.put("point_code4", form.getString("point_code4"));
json.put("vehicle_code", form.getString("vehicle_code"));
json.put("handle_class", THIS_CLASS);
json.put("create_id", SecurityUtils.getCurrentUserId());

View File

@@ -103,6 +103,9 @@ public enum IOSEnum {
OUT_POINT(MapOf.of("1","CK2038", "2","CK2038", "3","CK2042", "4","CK2042" ,"5","CK2046",
"6","CK2046", "7","7", "8","8", "9","9", "10","10")),
// 出库发货等待点
OUT_FH_POINT(MapOf.of("1","B_FH_01_0", "2","B_FH_02_0", "3","B_FH_03_0", "4","B_FH_04_0" ,"5","B_FH_05_0",
"6","B_FH_06_0")),
// 行架点位
OUT_HANGER(MapOf.of("行架位1", "CK2013","行架位2", "CK2017")),

View File

@@ -210,4 +210,263 @@ public class SendOutManageServiceImpl implements SendOutManageService {
// 删除载具对应木箱记录
//extTab.delete(jsonExt);
}
@Override
public void createSendOutTaskOne(JSONObject whereJson) {
// 子卷包装关系表
WQLObject subTab = WQLObject.getWQLObject("pdm_bi_subpackagerelation");
// 载具扩展属性表
WQLObject extTab = WQLObject.getWQLObject("md_pb_storagevehicleext");
/*
* 1.找相同订单号的木箱
* 1有相同订单号有空位的相同订单号的放在一排
* 2没有相同订单号的新开一排
* 3有相同订单号的但是没有空位新开一排
*/
CutConveyorTask cutConveyorTask = new CutConveyorTask();
// 所有发货区点位
List<SchBasePoint> pointDaoList = ischBasePointService.list(
new QueryWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getRegion_id, RegionTypeEnum.TWO_FH01.getId())
.eq(SchBasePoint::getIs_used, IOSEnum.IS_NOTANDYES.code(""))
.eq(SchBasePoint::getIs_delete, IOSEnum.IS_NOTANDYES.code(""))
);
//木箱号可能用逗号隔开
String vehicleCode = Arrays.asList(whereJson.getString("vehicle_code").split(",")).get(0);
JSONObject jsonSub = subTab.query("package_box_sn = '" + vehicleCode + "'").uniqueResult(0);
if (ObjectUtil.isEmpty(jsonSub)) {
throw new BadRequestException("未查询到该木箱对应的包装关系!");
}
// 2.找相同订单号的所有排
jsonSub.put("region_id", RegionTypeEnum.TWO_FH01.getId());
List<JSONObject> pointLikeOrder = schBasePointMapper.queryLikeOrderRow(jsonSub);
// 3.找相同订单号的所在排的所有空位
String point_code = "";
List<SchBasePoint> joArr = new ArrayList<>();
for (int i = 0; i < pointLikeOrder.size(); i++) {
JSONObject json = pointLikeOrder.get(i);
// 过滤此排的空位
List<SchBasePoint> rowPointList = pointDaoList.stream()
.filter(row -> row.getRow_num().toString().equals(json.getString("row_num")) &&
ObjectUtil.isEmpty(row.getVehicle_code()) &&
row.getLock_type().equals(IOSEnum.LOCK_TYPE.code("未锁定"))
)
.sorted(Comparator.comparing(SchBasePoint::getIn_order_seq))
.collect(Collectors.toList());
joArr.addAll(rowPointList);
}
if (ObjectUtil.isEmpty(joArr)) {
//查询新的一排
List<JSONObject> newRowPointList = schBasePointMapper.queryNewRow(jsonSub);
if (ObjectUtil.isEmpty(newRowPointList)) {
throw new BadRequestException("未查询到相同销售订单的放货区点位或空的一排!");
}
for (int i = 0; i < newRowPointList.size(); i++) {
JSONObject json = newRowPointList.get(i);
// 找出这一排的所有空位
List<SchBasePoint> rowPointList = pointDaoList.stream()
.filter(row -> row.getRow_num().toString().equals(json.getString("row_num")) &&
ObjectUtil.isEmpty(row.getVehicle_code()) &&
row.getLock_type().equals(IOSEnum.LOCK_TYPE.code("未锁定"))
)
.sorted(Comparator.comparing(SchBasePoint::getIn_order_seq))
.collect(Collectors.toList());
JSONObject jsonNewRow = JSONObject.parseObject(JSON.toJSONString(rowPointList.get(0)));
if (cutConveyorTask.isSingleTask(jsonNewRow.getString("point_code"))) {
continue;
}
point_code = jsonNewRow.getString("point_code");
break;
}
} else {
// 校验此货位是否被堵住1.如果被堵住则判断下一个是否被堵住 2.如果全部被堵住则新开一排
for (int i = 0; i < joArr.size(); i++) {
JSONObject json = JSONObject.parseObject(JSON.toJSONString(joArr.get(i)));
// 判断是否被挡住
JSONObject paramJson = new JSONObject();
paramJson.put("point_code", json.getString("point_code"));
paramJson.put("region_id", RegionTypeEnum.TWO_FH01.getId());
List<JSONObject> isBlock = schBasePointMapper.isBlock(paramJson);
if (ObjectUtil.isNotEmpty(isBlock)) {
// 堵住则判断下一个
continue;
} else {
if (cutConveyorTask.isSingleTask(json.getString("point_code"))) {
continue;
}
// 未堵住: 跳出循环
point_code = json.getString("point_code");
break;
}
}
}
if (ObjectUtil.isEmpty(point_code)) {
//查询新的一排
List<JSONObject> newRowPointList = schBasePointMapper.queryNewRow(jsonSub);
if (ObjectUtil.isEmpty(newRowPointList)) {
throw new BadRequestException("未查询到相同销售订单的放货区点位或空的一排!");
}
for (int i = 0; i < newRowPointList.size(); i++) {
JSONObject json = newRowPointList.get(i);
// 找出这一排的所有空位
List<SchBasePoint> rowPointList = pointDaoList.stream()
.filter(row -> row.getRow_num().toString().equals(json.getString("row_num")) &&
ObjectUtil.isEmpty(row.getVehicle_code()) &&
row.getLock_type().equals(IOSEnum.LOCK_TYPE.code("未锁定"))
)
.sorted(Comparator.comparing(SchBasePoint::getIn_order_seq))
.collect(Collectors.toList());
JSONObject jsonNewRow = JSONObject.parseObject(JSON.toJSONString(rowPointList.get(0)));
if (cutConveyorTask.isSingleTask(jsonNewRow.getString("point_code"))) {
continue;
}
point_code = jsonNewRow.getString("point_code");
break;
}
}
if (ObjectUtil.isEmpty(point_code)) {
throw new BadRequestException("未查询到相同销售订单的放货区点位或空的一排!");
}
//创建任务
JSONObject task_jo = new JSONObject();
task_jo.put("point_code1", whereJson.getString("device_code"));
// 根据此排找到对应的等待点
String finalPoint_code = point_code;
SchBasePoint schBasePoint = pointDaoList.stream()
.filter(row -> row.getPoint_code().equals(finalPoint_code))
.findFirst().orElse(null);
String code = IOSEnum.OUT_FH_POINT.code(schBasePoint.getRow_num().toString());
task_jo.put("point_code2", code);
task_jo.put("point_code4", point_code);
task_jo.put("vehicle_code", vehicleCode);
task_jo.put("task_type", "010708");
TwoSendOutTask taskBean = new TwoSendOutTask();
taskBean.createTask(task_jo);
// 锁住点位
ischBasePointService.update(
new UpdateWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getPoint_code, point_code)
.set(SchBasePoint::getLock_type, IOSEnum.LOCK_TYPE.code("其它"))
);
}
@Override
public void createSendOutTaskTwo(JSONObject whereJson) {
WQLObject taskTab = WQLObject.getWQLObject("sch_base_task");
WQLObject pointTab = WQLObject.getWQLObject("sch_base_point");
// 根据任务号找到第一次申请时的任务
JSONObject taskJson = taskTab.query("task_code = '" + whereJson.getString("task_code") + "'").uniqueResult(0);
if (ObjectUtil.isEmpty(taskJson)) {
throw new BadRequestException("任务号为:"+ whereJson.getString("task_code")+ "的任务不存在!");
}
String point_code4 = "";
// 判断当前点位是否被堵住
JSONObject paramJson = new JSONObject();
paramJson.put("point_code", taskJson.getString("point_code4"));
paramJson.put("region_id", RegionTypeEnum.TWO_FH01.getId());
List<JSONObject> isBlock = schBasePointMapper.isBlock(paramJson);
if (ObjectUtil.isNotEmpty(isBlock)) {
// 堵住: 找这一排的的空位
// 所有发货区点位
List<SchBasePoint> pointDaoList = ischBasePointService.list(
new QueryWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getRegion_id, RegionTypeEnum.TWO_FH01.getId())
.eq(SchBasePoint::getIs_used, IOSEnum.IS_NOTANDYES.code(""))
.eq(SchBasePoint::getIs_delete, IOSEnum.IS_NOTANDYES.code(""))
);
SchBasePoint pointDao = pointDaoList.stream()
.filter(row -> row.getPoint_code().equals(taskJson.getString("point_code4")))
.findFirst().orElse(null);
// 找出这一排所有空位
List<SchBasePoint> rowPointList = pointDaoList.stream()
.filter(row -> row.getRow_num().toString().equals(pointDao.getRow_num().toString()) &&
ObjectUtil.isEmpty(row.getVehicle_code()) &&
row.getLock_type().equals(IOSEnum.LOCK_TYPE.code("未锁定"))
)
.sorted(Comparator.comparing(SchBasePoint::getIn_order_seq))
.collect(Collectors.toList());
// 判断是否被堵住
for (int i = 0; i < rowPointList.size(); i++) {
SchBasePoint json = rowPointList.get(i);
JSONObject paramJson2 = new JSONObject();
paramJson2.put("point_code", json.getPoint_code());
paramJson2.put("region_id", RegionTypeEnum.TWO_FH01.getId());
List<JSONObject> isBlock2 = schBasePointMapper.isBlock(paramJson2);
if (ObjectUtil.isNotEmpty(isBlock2)) {
continue;
} else {
JSONObject jsonNewRow = JSONObject.parseObject(JSON.toJSONString(rowPointList.get(0)));
point_code4 = jsonNewRow.getString("point_code");
break;
}
}
// 更新原仓位
JSONObject jsonUpdate = new JSONObject();
jsonUpdate.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定"));
pointTab.update(jsonUpdate,"point_code = '"+taskJson.getString("point_code4")+"'");
if (ObjectUtil.isEmpty(point_code4)) {
// 如果没有找到此排空位 则重新下发到别的排
JSONObject param = new JSONObject();
param.put("device_code", taskJson.getString("point_code2"));
param.put("vehicle_code", taskJson.getString("vehicle_code"));
createSendOutTaskOne(param);
return;
} else {
// 更新现仓位
jsonUpdate.put("lock_type", IOSEnum.LOCK_TYPE.code("其它"));
pointTab.update(jsonUpdate,"point_code = '"+point_code4+"'");
}
} else {
point_code4 = taskJson.getString("point_code4");
}
//创建任务
JSONObject task_jo = new JSONObject();
task_jo.put("point_code1", taskJson.getString("point_code2"));
task_jo.put("point_code2", point_code4);
task_jo.put("vehicle_code", taskJson.getString("vehicle_code"));
task_jo.put("task_type", "010721");
TwoSendOutTask taskBean = new TwoSendOutTask();
taskBean.createTask(task_jo);
}
}

View File

@@ -21,4 +21,22 @@ public interface SendOutManageService {
*/
void createSendOutTask(JSONObject whereJson);
/**
* 创建发货任务 - 到等待点
* @param whereJson {
* device_code起点
* vehicle_code: 载具号
* }
*/
void createSendOutTaskOne(JSONObject whereJson);
/**
* 创建发货任务 等待点 - 具体点位
* @param whereJson {
* task_code任务号第一次申请时下发的任务号
* }
*/
void createSendOutTaskTwo(JSONObject whereJson);
}

View File

@@ -1943,21 +1943,26 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
@Transactional(rollbackFor = Exception.class)
public JSONObject applySendOutTwo(JSONObject whereJson) {
log.info("applySendOutTwo输入参数---------------------------------------------" + whereJson.toString());
// 校验
if (ObjectUtil.isEmpty(whereJson.getString("device_code"))) {
throw new BadRequestException("设备号不能为空!");
}
if (ObjectUtil.isEmpty(whereJson.getString("vehicle_code"))) {
throw new BadRequestException("载具号不能为空!");
}
JSONObject result = new JSONObject();
try {
// 调用服务
sendOutManageService.createSendOutTask(whereJson);
try{
// 校验是否是二次分配
if (ObjectUtil.isEmpty(whereJson.getString("task_code"))) {
// 第一次申请
if (ObjectUtil.isEmpty(whereJson.getString("device_code"))) {
throw new BadRequestException("设备号不能为空!");
}
if (ObjectUtil.isEmpty(whereJson.getString("vehicle_code"))) {
throw new BadRequestException("载具号不能为空!");
}
// 调用服务
sendOutManageService.createSendOutTaskOne(whereJson);
} else {
// 第二次申请
sendOutManageService.createSendOutTaskTwo(whereJson);
}
result.put("status", HttpStatus.OK.value());
result.put("message", "下发成功!");
return result;