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");
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())
.filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
if (qzzNo.size() == 0) {
@@ -183,10 +187,6 @@ public class SlitterPdaServiceImpl implements SlitterPdaService {
if (list.size() == 0) {
throw new BadRequestException("分切机" + deviceCode + " 的分切计划 " + qzzNo + " 不存在");
}
List<SchBaseTask> tasks = taskService.checkHaveTask(deviceCode);
if (tasks.size() > 0) {
throw new BadRequestException("分切机" + deviceCode + " 已经有存在的任务");
}
List<String> collect = list
.stream()
.map(PdmBiSlittingproductionplan::getContainer_name)

View File

@@ -329,5 +329,12 @@ public abstract class AbstractTask {
*/
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;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.SneakyThrows;
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.core.constant.GeneralDefinition;
import org.nl.wms.sch.task_manage.core.enums.TaskFinishedTypeEnum;
import org.nl.wms.util.PointUtils;
import org.nl.wms.util.TaskUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -54,6 +56,16 @@ public class SubRollDownAGVTask extends AbstractTask {
}
SchBasePoint zxPoint = zxPoints.get(0);
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.setTask_status(TaskStatus.START_AND_POINT.getCode());
@@ -67,18 +79,37 @@ public class SubRollDownAGVTask extends AbstractTask {
public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
checkTaskOptionStatus(taskObj);
JSONObject requestObj = JSONObject.parseObject(taskObj.getRequest_param());
// 起点清空(没有取货完成的业务),终点赋值
String startPointCode = taskObj.getPoint_code1();
// 任务设置071
taskObj.setTask_status(TaskStatus.PICK_UP_COMPLETED.getCode());
TaskUtils.setUpdateByType(taskObj, TaskFinishedTypeEnum.AUTO_ACS);
taskService.updateById(taskObj);
// 终点赋值
String endPointCode = taskObj.getPoint_code2();
SchBasePoint startPoint = pointService.getById(startPointCode);
SchBasePoint endPoint = pointService.getById(endPointCode);
clearPoint(startPoint, taskFinishedType);
endPoint.setPoint_status("3");
endPoint.setMaterial_code(requestObj.getString("container_name"));
endPoint.setVehicle_code(taskObj.getVehicle_code());
setUpdateByType(endPoint, taskFinishedType);
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.setFinished_type(taskFinishedType.getCode());
@@ -87,7 +118,6 @@ public class SubRollDownAGVTask extends AbstractTask {
}
@Override
@Transactional(rollbackFor = Exception.class)
public void cancelTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
checkTaskOptionStatus(taskObj);
// 取消
@@ -97,4 +127,21 @@ public class SubRollDownAGVTask extends AbstractTask {
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
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;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
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.tasks.nbj.SendShaftAGVTask;
import org.nl.wms.util.PointUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -64,64 +63,54 @@ public class SlitterDownAGVTask extends AbstractTask {
@SneakyThrows
@Override
public void createCompletion(SchBaseTask task) {
// 分切下料,子卷信息在请求参数中
JSONObject requestObj = JSONObject.parseObject(task.getRequest_param());
JSONArray container = requestObj.getJSONArray("container");
List<String> containerList = container.toJavaList(String.class);
// 获取分切计划最多4个需要出站的任务
List<PdmBiSlittingproductionplan> currentPlans = slittingproductionplanService.list(
new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
.in(PdmBiSlittingproductionplan::getContainer_name, containerList)
.eq(PdmBiSlittingproductionplan::getIs_delete, "0")
.eq(PdmBiSlittingproductionplan::getStatus, "05"));
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("系统繁忙,稍后在试!!");
taskLock(task.getConfig_code(), () -> {
// 分切下料,子卷信息在请求参数中
JSONObject requestObj = JSONObject.parseObject(task.getRequest_param());
JSONArray container = requestObj.getJSONArray("container");
List<String> containerList = container.toJavaList(String.class);
// 获取分切计划最多4个需要出站的任务
List<PdmBiSlittingproductionplan> currentPlans = slittingproductionplanService.list(
new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
.in(PdmBiSlittingproductionplan::getContainer_name, containerList)
.eq(PdmBiSlittingproductionplan::getIs_delete, "0")
.eq(PdmBiSlittingproductionplan::getStatus, "05"));
if (currentPlans.size() == 0) {
throw new BadRequestException("当前子卷已经出卷或者不存在!");
}
} finally {
if (tryLock) {
lock.unlock();
// 获取上轴分切计划和下轴分切计划,各一条
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("请求搬运失败,内包间没有可存放位置!");
}
}
// 创建任务
task.setHandle_class(THIS_CLASS);
task.setTask_status(TaskStatus.START_AND_POINT.getCode());
setUpdateByPC(task);
taskService.save(task);
log.info("任务创建成功:{}", task);
// 下来的分切计划修改状态05 -> 06
currentPlans.forEach(plan -> {
plan.setStatus("06");
updateOptMessageBySlitterPlan(plan);
BstIvtCutpointivt endPoint = areaEmptyNotTaskPoint.get(0);
task.setPoint_code2(endPoint.getPoint_code());
// 设置气胀轴
task.setVehicle_code(currentUpPlan != null ? currentUpPlan.getQzzno() : "");
task.setVehicle_code2(currentDownPlan != null ? currentDownPlan.getQzzno() : "");
// 创建任务
task.setHandle_class(THIS_CLASS);
task.setTask_status(TaskStatus.START_AND_POINT.getCode());
setUpdateByPC(task);
taskService.save(task);
log.info("任务创建成功:{}", task);
// 下来的分切计划修改状态05 -> 06
currentPlans.forEach(plan -> {
plan.setStatus("06");
updateOptMessageBySlitterPlan(plan);
});
slittingproductionplanService.updateBatchById(currentPlans);
});
slittingproductionplanService.updateBatchById(currentPlans);
}
@Override
@@ -152,6 +141,7 @@ public class SlitterDownAGVTask extends AbstractTask {
// 更新分切计划 状态06 -> 09
PdmBiSlittingproductionplan p = new PdmBiSlittingproductionplan();
p.setStatus("09");
p.setEnd_time(DateUtil.now());
updateOptMessageBySlitterPlan(p);
if (qzzNo.size() > 0) {
slittingproductionplanService.update(p, new LambdaQueryWrapper<PdmBiSlittingproductionplan>()