opt: 内包间送到一楼

This commit is contained in:
2024-08-30 17:35:32 +08:00
parent 9416c39a3a
commit 0f139656ca
4 changed files with 111 additions and 67 deletions

View File

@@ -174,6 +174,10 @@ public class SlitterPdaServiceImpl implements SlitterPdaService {
// 分切机设备 // 分切机设备
String deviceCode = param.getString("point_code"); String deviceCode = param.getString("point_code");
StIvtCutpointivt device = cutpointivtService.getPintByExtCode(deviceCode, false); StIvtCutpointivt device = cutpointivtService.getPintByExtCode(deviceCode, false);
List<SchBaseTask> tasks = taskService.checkHaveTask(device.getPoint_code());
if (tasks.size() > 0) {
throw new BadRequestException("分切机" + deviceCode + " 已经有存在的任务");
}
List<String> qzzNo = Stream.of(device.getUp_qzzno(), device.getDown_qzzno()) List<String> qzzNo = Stream.of(device.getUp_qzzno(), device.getDown_qzzno())
.filter(ObjectUtil::isNotEmpty).collect(Collectors.toList()); .filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
if (qzzNo.size() == 0) { if (qzzNo.size() == 0) {
@@ -183,10 +187,6 @@ public class SlitterPdaServiceImpl implements SlitterPdaService {
if (list.size() == 0) { if (list.size() == 0) {
throw new BadRequestException("分切机" + deviceCode + " 的分切计划 " + qzzNo + " 不存在"); throw new BadRequestException("分切机" + deviceCode + " 的分切计划 " + qzzNo + " 不存在");
} }
List<SchBaseTask> tasks = taskService.checkHaveTask(deviceCode);
if (tasks.size() > 0) {
throw new BadRequestException("分切机" + deviceCode + " 已经有存在的任务");
}
List<String> collect = list List<String> collect = list
.stream() .stream()
.map(PdmBiSlittingproductionplan::getContainer_name) .map(PdmBiSlittingproductionplan::getContainer_name)

View File

@@ -329,5 +329,12 @@ public abstract class AbstractTask {
*/ */
public void agvPickUpCompleted(SchBaseTask task) { public void agvPickUpCompleted(SchBaseTask task) {
}
/**
* AGV放货完成上报
* @param task 任务
*/
public void agvReleaseCompleted(SchBaseTask task) {
} }
} }

View File

@@ -1,5 +1,6 @@
package org.nl.wms.sch.task_manage.tasks.nbj; package org.nl.wms.sch.task_manage.tasks.nbj;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -12,6 +13,7 @@ import org.nl.wms.sch.task_manage.AbstractTask;
import org.nl.wms.sch.task_manage.TaskStatus; import org.nl.wms.sch.task_manage.TaskStatus;
import org.nl.wms.sch.task_manage.core.constant.GeneralDefinition; import org.nl.wms.sch.task_manage.core.constant.GeneralDefinition;
import org.nl.wms.sch.task_manage.core.enums.TaskFinishedTypeEnum; import org.nl.wms.sch.task_manage.core.enums.TaskFinishedTypeEnum;
import org.nl.wms.util.PointUtils;
import org.nl.wms.util.TaskUtils; import org.nl.wms.util.TaskUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -54,6 +56,16 @@ public class SubRollDownAGVTask extends AbstractTask {
} }
SchBasePoint zxPoint = zxPoints.get(0); SchBasePoint zxPoint = zxPoints.get(0);
task.setPoint_code2(zxPoint.getPoint_code()); task.setPoint_code2(zxPoint.getPoint_code());
// 创建搬运空架子的任务
List<SchBasePoint> emptyPoint = pointService.getAllBusinessNotTaskPoint("A1", "A1-ZXZC",
"1", "2", null, null);
if (emptyPoint.size() > 0) {
// 有空架子就是四点任务
SchBasePoint point = emptyPoint.get(0);
task.setVehicle_code2(point.getVehicle_code());
task.setPoint_code3(point.getPoint_code());
task.setPoint_code4(task.getPoint_code1());
}
// 创建任务 // 创建任务
task.setHandle_class(THIS_CLASS); task.setHandle_class(THIS_CLASS);
task.setTask_status(TaskStatus.START_AND_POINT.getCode()); task.setTask_status(TaskStatus.START_AND_POINT.getCode());
@@ -67,18 +79,37 @@ public class SubRollDownAGVTask extends AbstractTask {
public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
checkTaskOptionStatus(taskObj); checkTaskOptionStatus(taskObj);
JSONObject requestObj = JSONObject.parseObject(taskObj.getRequest_param()); JSONObject requestObj = JSONObject.parseObject(taskObj.getRequest_param());
// 起点清空(没有取货完成的业务),终点赋值 // 任务设置071
String startPointCode = taskObj.getPoint_code1(); taskObj.setTask_status(TaskStatus.PICK_UP_COMPLETED.getCode());
TaskUtils.setUpdateByType(taskObj, TaskFinishedTypeEnum.AUTO_ACS);
taskService.updateById(taskObj);
// 终点赋值
String endPointCode = taskObj.getPoint_code2(); String endPointCode = taskObj.getPoint_code2();
SchBasePoint startPoint = pointService.getById(startPointCode);
SchBasePoint endPoint = pointService.getById(endPointCode); SchBasePoint endPoint = pointService.getById(endPointCode);
clearPoint(startPoint, taskFinishedType);
endPoint.setPoint_status("3"); endPoint.setPoint_status("3");
endPoint.setMaterial_code(requestObj.getString("container_name")); endPoint.setMaterial_code(requestObj.getString("container_name"));
endPoint.setVehicle_code(taskObj.getVehicle_code()); endPoint.setVehicle_code(taskObj.getVehicle_code());
setUpdateByType(endPoint, taskFinishedType); setUpdateByType(endPoint, taskFinishedType);
pointService.updateById(endPoint); pointService.updateById(endPoint);
// todo: 创建搬运空架子的任务 // 判断是否为4点任务
String startPointCode2 = taskObj.getPoint_code3();
if (StrUtil.isNotBlank(startPointCode2)) {
// 四点任务
SchBasePoint startPoint2 = pointService.getById(startPointCode2);
clearPoint(startPoint2, taskFinishedType);
SchBasePoint endPoint2 = pointService.getById(taskObj.getPoint_code4());
endPoint2.setPoint_status("2");
endPoint2.setMaterial_code("");
endPoint2.setVehicle_code(taskObj.getVehicle_code2());
endPoint2.setSource_id("");
PointUtils.setUpdateByType(endPoint2, taskFinishedType);
pointService.updateById(endPoint2);
} else {
// 起点清空(没有取货完成的业务),终点赋值
String startPointCode = taskObj.getPoint_code1();
SchBasePoint startPoint = pointService.getById(startPointCode);
clearPoint(startPoint, TaskFinishedTypeEnum.AUTO_ACS);
}
// 任务完成 // 任务完成
taskObj.setTask_status(TaskStatus.FINISHED.getCode()); taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskObj.setFinished_type(taskFinishedType.getCode()); taskObj.setFinished_type(taskFinishedType.getCode());
@@ -87,7 +118,6 @@ public class SubRollDownAGVTask extends AbstractTask {
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public void cancelTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { public void cancelTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
checkTaskOptionStatus(taskObj); checkTaskOptionStatus(taskObj);
// 取消 // 取消
@@ -97,4 +127,21 @@ public class SubRollDownAGVTask extends AbstractTask {
TaskUtils.setUpdateByType(taskObj, taskFinishedType); TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj); taskService.updateById(taskObj);
} }
@Override
public void agvPickUpCompleted(SchBaseTask task) {
if (TaskStatus.PICK_UP_COMPLETED.getCode().equals(task.getTask_status())) {
log.warn("该任务已经执行过取货完成!");
return;
}
// 取货完成
// 起点清空(没有取货完成的业务),终点赋值
String startPointCode = task.getPoint_code3();
SchBasePoint startPoint = pointService.getById(startPointCode);
clearPoint(startPoint, TaskFinishedTypeEnum.AUTO_ACS);
// 任务设置071
task.setTask_status(TaskStatus.PICK_UP_COMPLETED.getCode());
TaskUtils.setUpdateByType(task, TaskFinishedTypeEnum.AUTO_ACS);
taskService.updateById(task);
}
} }

View File

@@ -1,5 +1,6 @@
package org.nl.wms.sch.task_manage.tasks.slitter; package org.nl.wms.sch.task_manage.tasks.slitter;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
@@ -21,14 +22,12 @@ import org.nl.wms.sch.task_manage.core.constant.GeneralDefinition;
import org.nl.wms.sch.task_manage.core.enums.TaskFinishedTypeEnum; import org.nl.wms.sch.task_manage.core.enums.TaskFinishedTypeEnum;
import org.nl.wms.sch.task_manage.tasks.nbj.SendShaftAGVTask; import org.nl.wms.sch.task_manage.tasks.nbj.SendShaftAGVTask;
import org.nl.wms.util.PointUtils; import org.nl.wms.util.PointUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient; import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
@@ -64,64 +63,54 @@ public class SlitterDownAGVTask extends AbstractTask {
@SneakyThrows @SneakyThrows
@Override @Override
public void createCompletion(SchBaseTask task) { public void createCompletion(SchBaseTask task) {
// 分切下料,子卷信息在请求参数中 taskLock(task.getConfig_code(), () -> {
JSONObject requestObj = JSONObject.parseObject(task.getRequest_param()); // 分切下料,子卷信息在请求参数中
JSONArray container = requestObj.getJSONArray("container"); JSONObject requestObj = JSONObject.parseObject(task.getRequest_param());
List<String> containerList = container.toJavaList(String.class); JSONArray container = requestObj.getJSONArray("container");
// 获取分切计划最多4个需要出站的任务 List<String> containerList = container.toJavaList(String.class);
List<PdmBiSlittingproductionplan> currentPlans = slittingproductionplanService.list( // 获取分切计划最多4个需要出站的任务
new LambdaQueryWrapper<PdmBiSlittingproductionplan>() List<PdmBiSlittingproductionplan> currentPlans = slittingproductionplanService.list(
.in(PdmBiSlittingproductionplan::getContainer_name, containerList) new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
.eq(PdmBiSlittingproductionplan::getIs_delete, "0") .in(PdmBiSlittingproductionplan::getContainer_name, containerList)
.eq(PdmBiSlittingproductionplan::getStatus, "05")); .eq(PdmBiSlittingproductionplan::getIs_delete, "0")
if (currentPlans.size() == 0) { .eq(PdmBiSlittingproductionplan::getStatus, "05"));
throw new BadRequestException("当前子卷已经出卷或者不存在!"); if (currentPlans.size() == 0) {
} throw new BadRequestException("当前子卷已经出卷或者不存在!");
// 获取上轴分切计划和下轴分切计划,各一条
PdmBiSlittingproductionplan currentUpPlan = currentPlans.stream()
.filter(p -> "1".equals(p.getUp_or_down()))
.findFirst()
.orElse(null);
PdmBiSlittingproductionplan currentDownPlan = currentPlans.stream()
.filter(p -> "2".equals(p.getUp_or_down()))
.findFirst()
.orElse(null);
task.setPoint_code1(requestObj.getString("device_code"));
// 查找终点,在内包间的区域找个空位.
List<BstIvtCutpointivt> areaEmptyNotTaskPoint = bstIvtCutpointivtService.getAreaNotTaskPointByStatus("1",
"1", "0", "1");
if (areaEmptyNotTaskPoint.size() == 0) {
throw new BadRequestException("请求搬运失败,内包间没有可存放位置!");
}
BstIvtCutpointivt endPoint = areaEmptyNotTaskPoint.get(0);
RLock lock = redissonClient.getLock(endPoint.getPoint_code());
boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS);
try {
if (tryLock) {
task.setPoint_code2(endPoint.getPoint_code());
// 设置气胀轴
task.setVehicle_code(currentUpPlan != null ? currentUpPlan.getQzzno() : "");
task.setVehicle_code2(currentDownPlan != null ? currentDownPlan.getQzzno() : "");
} else {
throw new BadRequestException("系统繁忙,稍后在试!!");
} }
} finally { // 获取上轴分切计划和下轴分切计划,各一条
if (tryLock) { PdmBiSlittingproductionplan currentUpPlan = currentPlans.stream()
lock.unlock(); .filter(p -> "1".equals(p.getUp_or_down()))
.findFirst()
.orElse(null);
PdmBiSlittingproductionplan currentDownPlan = currentPlans.stream()
.filter(p -> "2".equals(p.getUp_or_down()))
.findFirst()
.orElse(null);
task.setPoint_code1(requestObj.getString("device_code"));
// 查找终点,在内包间的区域找个空位.
List<BstIvtCutpointivt> areaEmptyNotTaskPoint = bstIvtCutpointivtService.getAreaNotTaskPointByStatus("1",
"1", "0", "1");
if (areaEmptyNotTaskPoint.size() == 0) {
throw new BadRequestException("请求搬运失败,内包间没有可存放位置!");
} }
} BstIvtCutpointivt endPoint = areaEmptyNotTaskPoint.get(0);
// 创建任务 task.setPoint_code2(endPoint.getPoint_code());
task.setHandle_class(THIS_CLASS); // 设置气胀轴
task.setTask_status(TaskStatus.START_AND_POINT.getCode()); task.setVehicle_code(currentUpPlan != null ? currentUpPlan.getQzzno() : "");
setUpdateByPC(task); task.setVehicle_code2(currentDownPlan != null ? currentDownPlan.getQzzno() : "");
taskService.save(task); // 创建任务
log.info("任务创建成功:{}", task); task.setHandle_class(THIS_CLASS);
// 下来的分切计划修改状态05 -> 06 task.setTask_status(TaskStatus.START_AND_POINT.getCode());
currentPlans.forEach(plan -> { setUpdateByPC(task);
plan.setStatus("06"); taskService.save(task);
updateOptMessageBySlitterPlan(plan); log.info("任务创建成功:{}", task);
// 下来的分切计划修改状态05 -> 06
currentPlans.forEach(plan -> {
plan.setStatus("06");
updateOptMessageBySlitterPlan(plan);
});
slittingproductionplanService.updateBatchById(currentPlans);
}); });
slittingproductionplanService.updateBatchById(currentPlans);
} }
@Override @Override
@@ -152,6 +141,7 @@ public class SlitterDownAGVTask extends AbstractTask {
// 更新分切计划 状态06 -> 09 // 更新分切计划 状态06 -> 09
PdmBiSlittingproductionplan p = new PdmBiSlittingproductionplan(); PdmBiSlittingproductionplan p = new PdmBiSlittingproductionplan();
p.setStatus("09"); p.setStatus("09");
p.setEnd_time(DateUtil.now());
updateOptMessageBySlitterPlan(p); updateOptMessageBySlitterPlan(p);
if (qzzNo.size() > 0) { if (qzzNo.size() > 0) {
slittingproductionplanService.update(p, new LambdaQueryWrapper<PdmBiSlittingproductionplan>() slittingproductionplanService.update(p, new LambdaQueryWrapper<PdmBiSlittingproductionplan>()