feat: 添加锁

This commit is contained in:
2024-08-29 15:12:04 +08:00
parent 0d60b7bd01
commit 4e341e1196
13 changed files with 165 additions and 173 deletions

View File

@@ -58,7 +58,7 @@ public class SysCodeRuleServiceImpl extends ServiceImpl<SysCodeRuleMapper, SysCo
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public String codeDemo(Map form) { public String codeDemo(Map form) {
String code = (String) form.get("code"); String code = (String) form.get("code");
String id = codeRuleMapper.selectOne(new LambdaQueryWrapper<SysCodeRule>().eq(SysCodeRule::getCode, code)).getId(); String id = codeRuleMapper.selectOne(new LambdaQueryWrapper<SysCodeRule>().eq(SysCodeRule::getCode, code)).getId();

View File

@@ -227,7 +227,7 @@ public class RawFoilPdaServiceImpl implements RawFoilPdaService {
MDC.put(GeneralDefinition.MDC_KEY, TagNameEnum.RAW_READY.getTag()); MDC.put(GeneralDefinition.MDC_KEY, TagNameEnum.RAW_READY.getTag());
log.info("手持生箔准备就绪, {}", param); log.info("手持生箔准备就绪, {}", param);
// param: point_code // param: point_code
String pointCode = param.getString("point_code"); String pointCode = param.getString("point_code") + "_M";
// 将工单设置确认下卷如果是空轴任务就不用再写信号给ACS // 将工单设置确认下卷如果是空轴任务就不用再写信号给ACS
// 1、获取对应的任务 // 1、获取对应的任务
SchBaseTask task = taskService.getTaskByPointCodeX(null, pointCode, null, null); SchBaseTask task = taskService.getTaskByPointCodeX(null, pointCode, null, null);

View File

@@ -1,7 +1,6 @@
package org.nl.wms.pda.st.service.impl; package org.nl.wms.pda.st.service.impl;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
@@ -9,7 +8,6 @@ import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException; import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.SecurityUtils;
import org.nl.config.lucene.TagNameEnum; import org.nl.config.lucene.TagNameEnum;
import org.nl.wms.pda.st.service.NbjPdaService; import org.nl.wms.pda.st.service.NbjPdaService;
import org.nl.wms.pdm.bi.dao.PdmBiSlittingproductionplan; import org.nl.wms.pdm.bi.dao.PdmBiSlittingproductionplan;
@@ -25,9 +23,7 @@ import org.nl.wms.sch.task.service.dao.SchBaseTask;
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.sch.task_manage.tasks.nbj.PdaSendShaftAGVTask; import org.nl.wms.sch.task_manage.tasks.nbj.PdaSendShaftAGVTask;
import org.nl.wms.sch.task_manage.tasks.nbj.SendShaftAGVTask;
import org.nl.wms.sch.task_manage.tasks.nbj.SubRollDownAGVTask; import org.nl.wms.sch.task_manage.tasks.nbj.SubRollDownAGVTask;
import org.nl.wms.sch.task_manage.tasks.other.PointToPointAGVTask;
import org.nl.wms.util.PointUtils; import org.nl.wms.util.PointUtils;
import org.nl.wms.util.TaskUtils; import org.nl.wms.util.TaskUtils;
import org.slf4j.MDC; import org.slf4j.MDC;
@@ -68,8 +64,6 @@ public class NbjPdaServiceImpl implements NbjPdaService {
@Autowired @Autowired
private IBstIvtCutpointivtService bcutpointivtService; private IBstIvtCutpointivtService bcutpointivtService;
@Autowired @Autowired
private PointToPointAGVTask pointToPointAGVTask;
@Autowired
private PdaSendShaftAGVTask pdaSendShaftAGVTask; private PdaSendShaftAGVTask pdaSendShaftAGVTask;
@Override @Override
public JSONObject changeLiftStatus(JSONObject param) { public JSONObject changeLiftStatus(JSONObject param) {
@@ -122,7 +116,7 @@ public class NbjPdaServiceImpl implements NbjPdaService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public JSONObject doSubVolumeDown(JSONObject param) { public JSONObject doSubVolumeDown(JSONObject param) {
MDC.put(GeneralDefinition.MDC_KEY, TagNameEnum.SUB_ROLL_DOWN.getTag()); MDC.put(GeneralDefinition.MDC_KEY, TagNameEnum.SUB_ROLL_DOWN.getTag());
log.info("手持子卷下线,送到货梯 - {}", param); log.info("手持子卷下线,送到一楼 - {}", param);
// point_code, vehicle_code, container_name // point_code, vehicle_code, container_name
String pointCode = param.getString("point_code"); String pointCode = param.getString("point_code");
String containerName = param.getString("container_name"); String containerName = param.getString("container_name");

View File

@@ -322,4 +322,12 @@ public abstract class AbstractTask {
bean.create(); bean.create();
} }
} }
/**
* AGV取货完成上报
* @param task 任务
*/
public void agvPickUpCompleted(SchBaseTask task) {
}
} }

View File

@@ -9,19 +9,7 @@ package org.nl.wms.sch.task_manage;
* @since 2023-11-16 * @since 2023-11-16
*/ */
public enum TaskStatus { public enum TaskStatus {
// APPLY("1", "申请", "申请"), // 任务状态
// // 创建完成
// CREATED("2", "创建完成", "创建完成"),
// // 下发
// ISSUED("3", "下发", "下发"),
// // 执行中
// EXECUTING("4", "执行中", "执行中"),
// // 完成
// FINISHED("5", "完成", "完成"),
// // 已取消
// CANCELED("6", "已取消", "已取消"),
// // 未完成
// UNFINISHED("7", "未完成", "未完成");
APPLY("00", "申请", "申请"), APPLY("00", "申请", "申请"),
CREATED("01", "生成", "生成"), CREATED("01", "生成", "生成"),
@@ -31,6 +19,7 @@ public enum TaskStatus {
ISSUE("05", "下发", "下发"), ISSUE("05", "下发", "下发"),
EXECUTING("06", "执行中", "执行中"), EXECUTING("06", "执行中", "执行中"),
FINISHED("07", "完成", "完成"), FINISHED("07", "完成", "完成"),
PICK_UP_COMPLETED("071", "取货完成,执行中", "acs请求取货完成后修改的任务状态"),
CANCELED("08", "已取消", "已取消"), CANCELED("08", "已取消", "已取消"),
// 未完成 // 未完成
UNFINISHED("09", "未完成", "未完成"); UNFINISHED("09", "未完成", "未完成");

View File

@@ -10,6 +10,7 @@ import org.nl.wms.pdm.bi.dao.PdmBiRawfoilworkorder;
import org.nl.wms.pdm.bi.service.IpdmBiRawfoilworkorderService; import org.nl.wms.pdm.bi.service.IpdmBiRawfoilworkorderService;
import org.nl.wms.sch.task.service.ISchBaseTaskService; import org.nl.wms.sch.task.service.ISchBaseTaskService;
import org.nl.wms.sch.task.service.dao.SchBaseTask; import org.nl.wms.sch.task.service.dao.SchBaseTask;
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.service.BakingOperationService; import org.nl.wms.sch.task_manage.service.BakingOperationService;
import org.nl.wms.sch.task_manage.tasks.hot.InHotTrussTask; import org.nl.wms.sch.task_manage.tasks.hot.InHotTrussTask;
@@ -17,6 +18,7 @@ import org.nl.wms.sch.task_manage.tasks.hot.OutHotTrussTask;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
@@ -37,6 +39,7 @@ public class BakingOperationServiceImpl implements BakingOperationService {
@Autowired @Autowired
private InHotTrussTask inHotTrussTask; private InHotTrussTask inHotTrussTask;
@Override @Override
@Transactional(rollbackFor = Exception.class)
public JSONObject acsRequestOutHotTask(JSONObject param) { public JSONObject acsRequestOutHotTask(JSONObject param) {
log.info("acs请求出烘箱{}", param); log.info("acs请求出烘箱{}", param);
// device_code // device_code
@@ -63,6 +66,9 @@ public class BakingOperationServiceImpl implements BakingOperationService {
String taskCode = param.getString("task_code"); String taskCode = param.getString("task_code");
Assert.notBlank(taskCode, "任务编码不能为空!"); Assert.notBlank(taskCode, "任务编码不能为空!");
SchBaseTask taskObj = taskService.getByCode(taskCode); SchBaseTask taskObj = taskService.getByCode(taskCode);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("任务不存在");
}
JSONObject taskParam = new JSONObject(); JSONObject taskParam = new JSONObject();
String requestParam = taskObj.getRequest_param(); String requestParam = taskObj.getRequest_param();
JSONObject requestObj = JSONObject.parseObject(requestParam); JSONObject requestObj = JSONObject.parseObject(requestParam);

View File

@@ -3,8 +3,8 @@ package org.nl.wms.sch.task_manage.tasks.hot;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException; import org.nl.common.exception.BadRequestException;
import org.nl.wms.pdm.ivt.hot.service.dao.StIvtHotpointivt;
import org.nl.wms.pdm.ivt.hot.service.IstIvtHotpointivtService; import org.nl.wms.pdm.ivt.hot.service.IstIvtHotpointivtService;
import org.nl.wms.pdm.ivt.hot.service.dao.StIvtHotpointivt;
import org.nl.wms.sch.point.service.ISchBasePointService; import org.nl.wms.sch.point.service.ISchBasePointService;
import org.nl.wms.sch.point.service.dao.SchBasePoint; import org.nl.wms.sch.point.service.dao.SchBasePoint;
import org.nl.wms.sch.task.service.ISchBaseTaskService; import org.nl.wms.sch.task.service.ISchBaseTaskService;
@@ -13,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.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;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@@ -47,26 +48,28 @@ public class OutHotTrussTask extends AbstractTask {
@Override @Override
public void createCompletion(SchBaseTask task) { public void createCompletion(SchBaseTask task) {
// 从烘箱暂存位找一个空位 TaskUtils.taskLock("A1-HXZC", () -> {
List<SchBasePoint> hotDjwList = pointService.getHotNotTaskPoint("A1", "A1-HXZC", // 从烘箱暂存位找一个空位
"4", "1"); List<SchBasePoint> hotDjwList = pointService.getHotNotTaskPoint("A1", "A1-HXZC",
if (hotDjwList.size() == 0) { "4", "1");
throw new BadRequestException("烘箱烘烤完毕的暂存位不够!"); if (hotDjwList.size() == 0) {
} throw new BadRequestException("烘箱烘烤完毕的暂存位不够!");
String requestParam = task.getRequest_param(); }
JSONObject requestObj = JSONObject.parseObject(requestParam); String requestParam = task.getRequest_param();
String startPoint = task.getPoint_code1(); JSONObject requestObj = JSONObject.parseObject(requestParam);
StIvtHotpointivt hotPoint = hotpointivtService.getPointByCode(startPoint, false); String startPoint = task.getPoint_code1();
requestObj.put("workorder_id", hotPoint.getWorkorder_id()); StIvtHotpointivt hotPoint = hotpointivtService.getPointByCode(startPoint, false);
SchBasePoint point = hotDjwList.get(0); requestObj.put("workorder_id", hotPoint.getWorkorder_id());
task.setVehicle_code(hotPoint.getFull_vehicle_code()); SchBasePoint point = hotDjwList.get(0);
task.setPoint_code2(point.getPoint_code()); task.setVehicle_code(hotPoint.getFull_vehicle_code());
task.setRequest_param(JSONObject.toJSONString(requestObj)); task.setPoint_code2(point.getPoint_code());
// 保存任务参数 task.setRequest_param(JSONObject.toJSONString(requestObj));
task.setHandle_class(THIS_CLASS); // 保存任务参数
task.setTask_status(TaskStatus.START_AND_POINT.getCode()); task.setHandle_class(THIS_CLASS);
setUpdateByPC(task); task.setTask_status(TaskStatus.START_AND_POINT.getCode());
taskService.save(task); setUpdateByPC(task);
taskService.save(task);
});
} }
@Override @Override

View File

@@ -46,7 +46,7 @@ public class SubRollDownAGVTask extends AbstractTask {
@Override @Override
public void createCompletion(SchBaseTask task) { public void createCompletion(SchBaseTask task) {
// update: 查找空位没任务的货梯 -> 查找一楼暂存位空位 // update: 查找空位没任务的货梯 -> 查找一楼暂存位空位
TaskUtils.createTask("A1-ZXZC", () -> { TaskUtils.taskLock("A1-ZXZC", () -> {
List<SchBasePoint> zxPoints = pointService.getAllBusinessNotTaskPoint("A1", "A1-ZXZC", List<SchBasePoint> zxPoints = pointService.getAllBusinessNotTaskPoint("A1", "A1-ZXZC",
"1", "1", null, null); "1", "1", null, null);
if (zxPoints.size() == 0) { if (zxPoints.size() == 0) {
@@ -78,6 +78,7 @@ public class SubRollDownAGVTask extends AbstractTask {
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: 创建搬运空架子的任务
// 任务完成 // 任务完成
taskObj.setTask_status(TaskStatus.FINISHED.getCode()); taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskObj.setFinished_type(taskFinishedType.getCode()); taskObj.setFinished_type(taskFinishedType.getCode());

View File

@@ -2,7 +2,6 @@ package org.nl.wms.sch.task_manage.tasks.raw;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException; import org.nl.common.exception.BadRequestException;
@@ -16,18 +15,14 @@ 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.sch.task_manage.tasks.hot.InHotTrussTask;
import org.nl.wms.util.TaskUtils; import org.nl.wms.util.TaskUtils;
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.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit;
import static org.nl.wms.util.TaskUtils.checkTaskOptionStatus; import static org.nl.wms.util.TaskUtils.checkTaskOptionStatus;
import static org.nl.wms.util.TaskUtils.setUpdateByPC; import static org.nl.wms.util.TaskUtils.setUpdateByPC;
@@ -57,50 +52,40 @@ public class RawDownAGVTask extends AbstractTask {
@SneakyThrows @SneakyThrows
@Override @Override
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public void createCompletion(SchBaseTask task) { public void createCompletion(SchBaseTask task) {
String requestParam = task.getRequest_param(); TaskUtils.taskLock(HX_REGION, () -> {
JSONObject requestObj = JSONObject.parseObject(requestParam); String requestParam = task.getRequest_param();
String flag = requestObj.getString("is_flag"); JSONObject requestObj = JSONObject.parseObject(requestParam);
// 生箔位置 String flag = requestObj.getString("is_flag");
String deviceCode = requestObj.getString("device_code"); // 生箔位置
// 收卷辊库出口 String deviceCode = requestObj.getString("device_code");
String startPointCode = requestObj.getString("start_point_code"); // 收卷辊库出口
RLock lock = redissonClient.getLock(HX_REGION); String startPointCode = requestObj.getString("start_point_code");
boolean tryLock = lock.tryLock(5, TimeUnit.SECONDS); // 查找烘箱对接位可用的位置(没货、没任务、没禁用)
try { List<SchBasePoint> hxPoints = pointService.getHotNotTaskPoint("A1", HX_REGION,
if (tryLock) { "1", "1");
// 查找烘箱对接位可用的位置(没货、没任务、没禁用) if (hxPoints.size() == 0) {
List<SchBasePoint> hxPoints = pointService.getHotNotTaskPoint("A1", HX_REGION, throw new BadRequestException("烘箱没有可以用的对接位!");
"1", "1"); }
if (hxPoints.size() == 0) { SchBasePoint hxPoint = hxPoints.get(0);
throw new BadRequestException("烘箱没有可以用的对接位!"); if ("1".equals(flag)) {
} // 创建四点任务:先去收卷辊出口在到生箔位,在从生箔到烘箱对接位
SchBasePoint hxPoint = hxPoints.get(0); task.setPoint_code1(startPointCode);
if ("1".equals(flag)) { task.setPoint_code2(deviceCode + "_K");
// 创建四点任务:先去收卷辊出口在到生箔位,在从生箔到烘箱对接位 task.setPoint_code3(deviceCode + "_M");
task.setPoint_code1(startPointCode); task.setPoint_code4(hxPoint.getPoint_code());
task.setPoint_code2(deviceCode + "_K");
task.setPoint_code3(deviceCode + "_M");
task.setPoint_code4(hxPoint.getPoint_code());
} else {
// 创建两点任务: 搬运到烘箱位置
task.setPoint_code1(deviceCode + "_M");
task.setPoint_code2(hxPoint.getPoint_code());
}
// 保存任务参数
task.setHandle_class(THIS_CLASS);
task.setTask_status(TaskStatus.START_AND_POINT.getCode());
setUpdateByPC(task);
taskService.save(task);
} else { } else {
throw new BadRequestException("系统繁忙,稍后再试!"); // 创建两点任务: 搬运到烘箱位置
task.setPoint_code1(deviceCode + "_M");
task.setPoint_code2(hxPoint.getPoint_code());
} }
} finally { // 保存任务参数
if (tryLock) { task.setHandle_class(THIS_CLASS);
lock.unlock(); task.setTask_status(TaskStatus.START_AND_POINT.getCode());
} setUpdateByPC(task);
} taskService.save(task);
});
} }
@Override @Override

View File

@@ -17,9 +17,8 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
import static org.nl.wms.util.TaskUtils.checkTaskOptionStatus;
import static org.nl.wms.util.TaskUtils.setUpdateByPC;
import static org.nl.wms.util.PointUtils.setUpdateByType; import static org.nl.wms.util.PointUtils.setUpdateByType;
import static org.nl.wms.util.TaskUtils.*;
/** /**
* @Author: lyd * @Author: lyd
@@ -30,6 +29,7 @@ import static org.nl.wms.util.PointUtils.setUpdateByType;
@Component(value = "SlitterSendRollTrussTask") @Component(value = "SlitterSendRollTrussTask")
public class SlitterSendRollTrussTask extends AbstractTask { public class SlitterSendRollTrussTask extends AbstractTask {
private final String THIS_CLASS = SlitterSendRollTrussTask.class.getName(); private final String THIS_CLASS = SlitterSendRollTrussTask.class.getName();
private final String SJG_REGION = "A1-SJGK";
@Autowired @Autowired
private ISchBasePointService pointService; private ISchBasePointService pointService;
@Autowired @Autowired
@@ -43,19 +43,21 @@ public class SlitterSendRollTrussTask extends AbstractTask {
public void createCompletion(SchBaseTask task) { public void createCompletion(SchBaseTask task) {
// 起点一样不记录,直接创建入库任务 // 起点一样不记录,直接创建入库任务
// 查找空位终点即可 // 查找空位终点即可
List<SchBasePoint> allSjgkPoints = pointService.getAllBusinessNotTaskPoint("A1", taskLock(SJG_REGION, () -> {
"A1-SJGK", "3", "1", null, null); List<SchBasePoint> allSjgkPoints = pointService.getAllBusinessNotTaskPoint("A1",
if (allSjgkPoints.size() == 0) { SJG_REGION, "3", "1", null, null);
throw new BadRequestException("收卷辊不存在空位!"); if (allSjgkPoints.size() == 0) {
} throw new BadRequestException("收卷辊不存在空位!");
SchBasePoint endPoint = allSjgkPoints.get(0); }
task.setPoint_code2(endPoint.getPoint_code()); SchBasePoint endPoint = allSjgkPoints.get(0);
// 创建任务 task.setPoint_code2(endPoint.getPoint_code());
task.setHandle_class(THIS_CLASS); // 创建任务
task.setTask_status(TaskStatus.START_AND_POINT.getCode()); task.setHandle_class(THIS_CLASS);
setUpdateByPC(task); task.setTask_status(TaskStatus.START_AND_POINT.getCode());
taskService.save(task); setUpdateByPC(task);
log.info("任务创建成功:{}", task); taskService.save(task);
log.info("任务创建成功:{}", task);
});
} }
@Override @Override

View File

@@ -3,8 +3,10 @@ package org.nl.wms.sch.task_manage.tasks.slitter;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException; import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.SecurityUtils;
import org.nl.wms.pdm.bi.dao.PdmBiRawfoilworkorder; import org.nl.wms.pdm.bi.dao.PdmBiRawfoilworkorder;
import org.nl.wms.pdm.bi.service.IpdmBiRawfoilworkorderService; import org.nl.wms.pdm.bi.service.IpdmBiRawfoilworkorderService;
import org.nl.wms.pdm.ivt.cut.service.dao.StIvtCutpointivt; import org.nl.wms.pdm.ivt.cut.service.dao.StIvtCutpointivt;
@@ -52,40 +54,39 @@ public class SlitterUpAGVTask extends AbstractTask {
@Override @Override
public void createCompletion(SchBaseTask task) { public void createCompletion(SchBaseTask task) {
TaskUtils.createTask("A1-SJGK", () -> { // 收卷辊不需要校验点位,因此无需加锁
String requestParam = task.getRequest_param(); String requestParam = task.getRequest_param();
JSONObject requestObj = JSONObject.parseObject(requestParam); JSONObject requestObj = JSONObject.parseObject(requestParam);
String isFlag = requestObj.getString("is_flag"); String isFlag = requestObj.getString("is_flag");
// 分切上料满料对接位 // 分切上料满料对接位
String cutPointCode = requestObj.getString("cut_point"); String cutPointCode = requestObj.getString("cut_point");
// 烘箱暂存对接位 // 烘箱暂存对接位
String deviceCode = requestObj.getString("device_code"); String deviceCode = requestObj.getString("device_code");
StIvtCutpointivt cutPoint = cutpointivtService.getByFullCode(cutPointCode, false); StIvtCutpointivt cutPoint = cutpointivtService.getByFullCode(cutPointCode, false);
if ("0".equals(isFlag)) { if ("0".equals(isFlag)) {
// 两点任务 // 两点任务
task.setPoint_code1(deviceCode); task.setPoint_code1(deviceCode);
task.setPoint_code2(cutPoint.getFull_point_code()); task.setPoint_code2(cutPoint.getFull_point_code());
} else { } else {
// 收卷辊的入库不做校验 // 收卷辊的入库不做校验
List<SchBasePoint> sjgPoints = pointService.getPointByConditions("A1", "A1-SJGK", List<SchBasePoint> sjgPoints = pointService.getPointByConditions("A1", "A1-SJGK",
"1", null, null, false); "1", null, null, false);
if (sjgPoints.size() == 0) { if (sjgPoints.size() == 0) {
throw new BadRequestException("收卷辊库找不到入口!"); throw new BadRequestException("收卷辊库找不到入口!");
}
SchBasePoint sjgPoint = sjgPoints.get(0);
// 四点任务
task.setPoint_code1(deviceCode);
task.setPoint_code2(cutPoint.getFull_point_code());
task.setPoint_code3(cutPoint.getEmpty_point_code());
task.setPoint_code4(sjgPoint.getPoint_code());
} }
// 创建任务 SchBasePoint sjgPoint = sjgPoints.get(0);
task.setHandle_class(THIS_CLASS); // 四点任务
task.setTask_status(TaskStatus.START_AND_POINT.getCode()); task.setPoint_code1(deviceCode);
setUpdateByPC(task); task.setPoint_code2(cutPoint.getFull_point_code());
taskService.save(task); task.setPoint_code3(cutPoint.getEmpty_point_code());
log.info("任务创建成功:{}", task); task.setPoint_code4(sjgPoint.getPoint_code());
}); }
// 创建任务
task.setHandle_class(THIS_CLASS);
task.setTask_status(TaskStatus.START_AND_POINT.getCode());
setUpdateByPC(task);
taskService.save(task);
log.info("任务创建成功:{}", task);
} }
@@ -141,4 +142,16 @@ public class SlitterUpAGVTask extends AbstractTask {
TaskUtils.setUpdateByType(taskObj, taskFinishedType); TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj); taskService.updateById(taskObj);
} }
@Override
public void agvPickUpCompleted(SchBaseTask task) {
LambdaUpdateWrapper<SchBaseTask> lam = new LambdaUpdateWrapper<>();
lam.set(SchBaseTask::getTask_status, TaskStatus.PICK_UP_COMPLETED.getCode())
.set(SchBaseTask::getUpdate_id, SecurityUtils.getCurrentUserId())
.set(SchBaseTask::getUpdate_name, SecurityUtils.getCurrentNickName())
.set(SchBaseTask::getUpdate_time, DateUtil.now())
.eq(SchBaseTask::getTask_code, task.getTask_code());
boolean update = taskService.update(lam);
log.info("任务[{}]取货完成执行{}", task.getTask_code(), update);
}
} }

View File

@@ -15,15 +15,12 @@ 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.TaskUtils; import org.nl.wms.util.TaskUtils;
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.Propagation;
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 static org.nl.wms.util.PointUtils.clearPoint; import static org.nl.wms.util.PointUtils.clearPoint;
import static org.nl.wms.util.TaskUtils.*; import static org.nl.wms.util.TaskUtils.*;
@@ -37,6 +34,7 @@ import static org.nl.wms.util.TaskUtils.*;
@Component(value = "SlitterUpTrussTask") @Component(value = "SlitterUpTrussTask")
public class SlitterUpTrussTask extends AbstractTask { public class SlitterUpTrussTask extends AbstractTask {
private final String THIS_CLASS = SlitterUpTrussTask.class.getName(); private final String THIS_CLASS = SlitterUpTrussTask.class.getName();
private final static String HX_REGION = "A1-HXZC";
@Autowired @Autowired
private ISchBasePointService pointService; private ISchBasePointService pointService;
@Autowired @Autowired
@@ -54,38 +52,28 @@ public class SlitterUpTrussTask extends AbstractTask {
@SneakyThrows @SneakyThrows
@Override @Override
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public void createCompletion(SchBaseTask task) { public void createCompletion(SchBaseTask task) {
// 桁架任务,到对接位 TaskUtils.taskLock(HX_REGION, () -> {
String requestParam = task.getRequest_param(); // 桁架任务,到对接位
JSONObject requestObj = JSONObject.parseObject(requestParam); String requestParam = task.getRequest_param();
String pointCode = requestObj.getString("zc_point"); JSONObject requestObj = JSONObject.parseObject(requestParam);
RLock lock = redissonClient.getLock("A1-HXZC"); String pointCode = requestObj.getString("zc_point");
boolean tryLock = lock.tryLock(5, TimeUnit.SECONDS); // 终点为出口
try { List<SchBasePoint> endPoints = pointService.getHotNotTaskPoint("A1", HX_REGION,
if (tryLock) { "1", "1");
// 终点为出口 if (endPoints.size() == 0) {
List<SchBasePoint> endPoints = pointService.getHotNotTaskPoint("A1", "A1-HXZC", throw new BadRequestException("烘箱没有可以用的对接位!");
"1", "1");
if (endPoints.size() == 0) {
throw new BadRequestException("烘箱没有可以用的对接位!");
}
SchBasePoint point = endPoints.get(0);
task.setPoint_code1(pointCode);
task.setPoint_code2(point.getPoint_code());
// 创建任务
task.setHandle_class(THIS_CLASS);
task.setTask_status(TaskStatus.START_AND_POINT.getCode());
setUpdateByPC(task);
taskService.save(task);
log.info("任务创建成功:{}", task);
} }
} finally { SchBasePoint point = endPoints.get(0);
if (lock.isHeldByCurrentThread() && lock.isLocked()) { task.setPoint_code1(pointCode);
lock.unlock(); task.setPoint_code2(point.getPoint_code());
} // 创建任务
} task.setHandle_class(THIS_CLASS);
task.setTask_status(TaskStatus.START_AND_POINT.getCode());
setUpdateByPC(task);
taskService.save(task);
log.info("任务创建成功:{}", task);
});
} }
@Override @Override
@@ -95,6 +83,7 @@ public class SlitterUpTrussTask extends AbstractTask {
// 任务完成起点清除创建AGV任务到达参数中的point_code的点位上 // 任务完成起点清除创建AGV任务到达参数中的point_code的点位上
String requestParam = taskObj.getRequest_param(); String requestParam = taskObj.getRequest_param();
JSONObject requestObj = JSONObject.parseObject(requestParam); JSONObject requestObj = JSONObject.parseObject(requestParam);
// 分切机满料位 // 分切机满料位
String isFlag = requestObj.getString("is_flag"); String isFlag = requestObj.getString("is_flag");
String workorderId = requestObj.getString("workorder_id"); String workorderId = requestObj.getString("workorder_id");
@@ -102,6 +91,7 @@ public class SlitterUpTrussTask extends AbstractTask {
String endPointCode = taskObj.getPoint_code2(); String endPointCode = taskObj.getPoint_code2();
SchBasePoint startPoint = pointService.getById(startPointCode); SchBasePoint startPoint = pointService.getById(startPointCode);
clearPoint(startPoint, taskFinishedType); clearPoint(startPoint, taskFinishedType);
// 创建AGV任务 // 创建AGV任务
log.info("点位{}更新完毕创建AGV任务给分切机上料", startPointCode); log.info("点位{}更新完毕创建AGV任务给分切机上料", startPointCode);
PdmBiRawfoilworkorder order = rawfoilworkorderService.getById(workorderId); PdmBiRawfoilworkorder order = rawfoilworkorderService.getById(workorderId);
@@ -119,6 +109,7 @@ public class SlitterUpTrussTask extends AbstractTask {
taskParam.put("up_task_code", taskObj.getTask_code()); taskParam.put("up_task_code", taskObj.getTask_code());
taskParam.put("create_mode", GeneralDefinition.TASK_CREATION); taskParam.put("create_mode", GeneralDefinition.TASK_CREATION);
slitterUpAGVTask.apply(taskParam); slitterUpAGVTask.apply(taskParam);
taskObj.setTask_status(TaskStatus.FINISHED.getCode()); taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskObj.setFinished_type(taskFinishedType.getCode()); taskObj.setFinished_type(taskFinishedType.getCode());
setUpdateByType(taskObj, taskFinishedType); setUpdateByType(taskObj, taskFinishedType);

View File

@@ -44,7 +44,7 @@ public class TaskUtils {
* @param function * @param function
*/ */
@SneakyThrows @SneakyThrows
public static void createTask(String region, Runnable function){ public static void taskLock(String region, Runnable function){
RedissonClient redissonClient = SpringContextHolder.getBean(RedissonClient.class); RedissonClient redissonClient = SpringContextHolder.getBean(RedissonClient.class);
RLock lock = redissonClient.getLock(region); RLock lock = redissonClient.getLock(region);
boolean tryLock = lock.tryLock(5, TimeUnit.SECONDS); boolean tryLock = lock.tryLock(5, TimeUnit.SECONDS);
@@ -52,7 +52,7 @@ public class TaskUtils {
if (tryLock) { if (tryLock) {
PlatformTransactionManager txManager = SpringContextHolder.getBean(PlatformTransactionManager.class); PlatformTransactionManager txManager = SpringContextHolder.getBean(PlatformTransactionManager.class);
DefaultTransactionDefinition def = new DefaultTransactionDefinition(); DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
TransactionStatus status = txManager.getTransaction(def); TransactionStatus status = txManager.getTransaction(def);
//执行目标方法 //执行目标方法