Merge remote-tracking branch 'origin/master_merge' into master_merge

This commit is contained in:
2025-09-16 14:20:09 +08:00
4 changed files with 82 additions and 144 deletions

View File

@@ -33,7 +33,7 @@ import java.util.stream.Collectors;
@Slf4j
@Component
@RequiredArgsConstructor
public class AutoSendDjqToGzq extends Prun{
public class AutoSendDjqToGzq extends Prun {
private final String THIS_CLASS = AutoSendDjqToGzq.class.getName();
@Resource
@@ -54,7 +54,7 @@ public class AutoSendDjqToGzq extends Prun{
public void run() {
try {
this.sendDjqToGzq();
}catch (Exception ex){
} catch (Exception ex) {
log.error(ex.getMessage());
}
}
@@ -65,35 +65,29 @@ public class AutoSendDjqToGzq extends Prun{
*/
@SneakyThrows
public void sendDjqToGzq() {
log.info(THIS_CLASS+"-待检区->管制区定时任务开始执行扫描。");
log.info(THIS_CLASS + "-待检区->管制区定时任务开始执行扫描。");
RLock lock = redissonClient.getLock(THIS_CLASS);
boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS);
try {
if (tryLock) {
//待检区有管制品且过滤未完成任务
List<BstIvtPackageinfoivt> djqPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("待检区"), PackageInfoIvtEnum.IVT_STATUS.code("管制品"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("取货任务"), PackageInfoIvtEnum.SORT_TYPE.code("升序"), PackageInfoIvtEnum.TASK_TYPE.code("待检区->管制区"));
List<BstIvtPackageinfoivt> djqPackageinfoivtList2 = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("装箱区"), PackageInfoIvtEnum.IVT_STATUS.code("管制品"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("取货任务"), PackageInfoIvtEnum.SORT_TYPE.code("升序"), PackageInfoIvtEnum.TASK_TYPE.code("待检区->管制区"));
List<BstIvtPackageinfoivt> djqPackageinfoivtList = packageinfoivtService.selectEmpPoints(PackageInfoIvtEnum.POINT_STATUS.code("待检区"), PackageInfoIvtEnum.IVT_STATUS.code("管制品"));
// List<BstIvtPackageinfoivt> djqPackageinfoivtList2 = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("装箱区"), PackageInfoIvtEnum.IVT_STATUS.code("管制品"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("取货任务"), PackageInfoIvtEnum.SORT_TYPE.code("升序"), PackageInfoIvtEnum.TASK_TYPE.code("待检区->管制区"));
if (CollectionUtils.isEmpty(djqPackageinfoivtList)) {
return;
}
if (!CollectionUtils.isEmpty(djqPackageinfoivtList2)){
djqPackageinfoivtList.addAll(djqPackageinfoivtList2);
}
//管制区有空位且过滤未完成任务
List<BstIvtPackageinfoivt> gzqPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("管制区"), PackageInfoIvtEnum.IVT_STATUS.code(""), PackageInfoIvtEnum.TASK_POINT_TYPE.code("放货任务"), PackageInfoIvtEnum.SORT_TYPE.code("升序"), PackageInfoIvtEnum.TASK_TYPE.code("待检区->管制区"));
//todo 新增NG卷放置临时管制区135136只取空不补空
List<BstIvtPackageinfoivt> ivtLists =
gzqPackageinfoivtList.stream()
.filter(r -> PackageInfoIvtEnum.POINT_STATUS.code("管制区").equals(r.getPoint_status()))
.collect(Collectors.toList());
if (ObjectUtils.isEmpty(ivtLists)) {
List<BstIvtPackageinfoivt> gzqPackageinfoivtList = packageinfoivtService.selectEmpPoints(PackageInfoIvtEnum.POINT_STATUS.code("管制区"), PackageInfoIvtEnum.IVT_STATUS.code(""));
if (ObjectUtils.isEmpty(gzqPackageinfoivtList)) {
log.info("待检区->管制区agv自动搬运任务暂无可用空位,子卷号为:" + djqPackageinfoivtList.get(0).getContainer_name());
throw new BadRequestException("待检区->管制区agv自动搬运任务暂无可用空位,子卷号为:" + djqPackageinfoivtList.get(0).getContainer_name());
}
JSONObject task = new JSONObject();
task.put("point_code2", ivtLists.get(0).getPoint_code());
task.put("vehicle_code", djqPackageinfoivtList.get(0).getContainer_name());
task.put("point_code1", djqPackageinfoivtList.get(0).getPoint_code());
task.put("point_code2", gzqPackageinfoivtList.get(0).getPoint_code());
task.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("待检区->管制区"));
createTask(djqPackageinfoivtList, task);
gzqTask.createTask(task);
} else {
log.info("待检区->管制区任务正在创建被锁住。");
}
@@ -104,128 +98,4 @@ public class AutoSendDjqToGzq extends Prun{
}
}
/**
* 创建任务
*/
private void createTask(List<BstIvtPackageinfoivt> djqPackageinfoivtList, JSONObject task) {
// 浅货位和深货位
Map<Boolean, List<BstIvtPackageinfoivt>> ivtMap = djqPackageinfoivtList.stream()
.collect(Collectors.partitioningBy(r -> r.getDepth().equals(PackageInfoIvtEnum.DEPTH_TYPE.code("浅货位"))));
List<BstIvtPackageinfoivt> shallowIvtList = ivtMap.get(true);
List<BstIvtPackageinfoivt> deepIvtList = ivtMap.get(false);
if (ObjectUtils.isNotEmpty(shallowIvtList)) {
// 优先处理浅货位
handleTaskForShallow(task, shallowIvtList.get(0));
} else if (ObjectUtils.isNotEmpty(deepIvtList)) {
// 处理深货位
handleTaskForDeep(task, deepIvtList.get(0));
}
}
/**
* 处理浅货位
*/
private void handleTaskForShallow(JSONObject task, BstIvtPackageinfoivt shallowIvt) {
task.put("vehicle_code", shallowIvt.getContainer_name());
task.put("point_code1", shallowIvt.getPoint_code());
gzqTask.createTask(task);
}
/**
* 处理深货位
*/
private void handleTaskForDeep(JSONObject task, BstIvtPackageinfoivt deepIvt) {
String pointCode1 = deepIvt.getPoint_code();
List<BstIvtPackageinfoivt> groupIvtList = packageinfoivtService.list(new LambdaQueryWrapper<BstIvtPackageinfoivt>()
.eq(BstIvtPackageinfoivt::getCol_num, deepIvt.getCol_num()))
.stream()
.filter(r -> r.getDepth().equals(PackageInfoIvtEnum.DEPTH_TYPE.code("浅货位")))
.collect(Collectors.toList());
if (ObjectUtils.isNotEmpty(groupIvtList)) {
BstIvtPackageinfoivt shallowIvt = groupIvtList.get(0);
//处理深货位对应浅货位的状态
handleShallowIvtStatus(task, deepIvt, shallowIvt, pointCode1);
}
}
/**
* 处理深货位对应浅货位的状态
*/
private void handleShallowIvtStatus(JSONObject task, BstIvtPackageinfoivt deepIvt, BstIvtPackageinfoivt shallowIvt, String pointCode1) {
Set<String> pointCodes2 = Collections.singleton(shallowIvt.getPoint_code());
//浅货位状态为空,查询该货位是否存在运行中的放货任务
//如果不存在,则直接创建主任务
//如果存在则1.建立确定起点的主任务2.运行中的放货任务完成后,再让下发执行主任务
//浅货位状态不为空,查询该货位是否存在运行中的取货任务
//如果不存在,1.创建主任务不下发2.创建移库任务绑定主任务关联关系task_group_id等待移库任务完成后再下发主任务
//如果存在不需要移库绑定与主任务关联关系task_group_id等待运行中的取货任务完成后再让下发执行主任务
List<SchBaseTask> existTaskList = shallowIvt.getIvt_status().equals(PackageInfoIvtEnum.IVT_STATUS.code(""))
? bstIvtPackageinfoivtMapper.getTaskList(null, pointCodes2, null, null)
: bstIvtPackageinfoivtMapper.getTaskList(pointCodes2, null, null, null);
//创建搬运任务
task.put("vehicle_code", deepIvt.getContainer_name());
task.put("point_code1", pointCode1);
//不存在搬运任务
if (ObjectUtils.isEmpty(existTaskList)) {
//浅库位状态为空
if (shallowIvt.getIvt_status().equals(PackageInfoIvtEnum.IVT_STATUS.code(""))) {
gzqTask.createTask(task);
} else {
createMainTask(task, deepIvt, shallowIvt, pointCode1, null);
}
//存在搬运任务
} else {
//浅库位状态为空
if (shallowIvt.getIvt_status().equals(PackageInfoIvtEnum.IVT_STATUS.code(""))) {
createMainTask(task, deepIvt, shallowIvt, pointCode1, existTaskList.get(0));
} else {
//浅库位状态不为空
task.put("task_status", TaskStatusEnum.SURE_END.getCode());
LambdaUpdateWrapper<SchBaseTask> updateWrapper = new LambdaUpdateWrapper<SchBaseTask>().eq(SchBaseTask::getTask_id, existTaskList.get(0).getTask_id());
updateWrapper.set(SchBaseTask::getTask_group_id, gzqTask.createTask(task));
taskService.update(null, updateWrapper);
}
}
}
/**
* 创建搬运和移库任务
*/
private void createMainTask(JSONObject task, BstIvtPackageinfoivt deepIvt, BstIvtPackageinfoivt shallowIvt, String pointCode1, SchBaseTask existTask) {
String taskId;
String shiftingTaskId;
task.put("vehicle_code", deepIvt.getContainer_name());
task.put("point_code1", pointCode1);
task.put("task_status", TaskStatusEnum.SURE_END.getCode());
taskId = gzqTask.createTask(task);
//获取移库任务目标点
String pointCode4 = packageinfoivtService.getDjqShiftingPoint(shallowIvt,true);
JSONObject task1 = new JSONObject();
if (existTask != null) {
task1.put("task_status", StringUtils.isBlank(pointCode4) ? TaskStatusEnum.SURE_START.getCode() : TaskStatusEnum.SURE_END.getCode());
} else {
task1.put("task_status", StringUtils.isBlank(pointCode4) ? TaskStatusEnum.SURE_START.getCode() : TaskStatusEnum.START_AND_POINT.getCode());
}
task1.put("vehicle_code2", PackageInfoIvtEnum.AGV_ACTION_TYPE.code("普通任务"));
task1.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("待检区移库任务"));
task1.put("vehicle_code", shallowIvt.getContainer_name());
task1.put("point_code1", shallowIvt.getPoint_code());
task1.put("point_code2", pointCode4);
task1.put("task_group_id", taskId);
task1.put("material_code", shallowIvt.getIvt_status());
shiftingTaskId = shiftingTask.createTask(task1);
if (existTask != null) {
LambdaUpdateWrapper<SchBaseTask> updateWrapper = new LambdaUpdateWrapper<SchBaseTask>()
.eq(SchBaseTask::getTask_id, existTask.getTask_id());
updateWrapper.set(SchBaseTask::getTask_group_id, shiftingTaskId);
taskService.update(null, updateWrapper);
}
}
}

View File

@@ -16,6 +16,7 @@ import org.nl.b_lms.sch.task.dao.SchBaseTask;
import org.nl.b_lms.sch.task.service.IschBaseTaskService;
import org.nl.b_lms.sch.tasks.first_floor_area.DjqToKzjhcwTask;
import org.nl.b_lms.sch.tasks.first_floor_area.GzqToKzjhcwTask;
import org.nl.b_lms.sch.tasks.first_floor_area.SendDjqKzjTask;
import org.nl.b_lms.sch.tasks.first_floor_area.ShiftingTask;
import org.nl.b_lms.storage_manage.ios.enums.IOSEnum;
import org.nl.common.enums.PackageInfoIvtEnum;
@@ -53,11 +54,14 @@ public class AutoSendVehicleToKzj extends Prun{
private ShiftingTask shiftingTask;
@Resource
private IschBaseTaskService taskService;
@Resource
private SendDjqKzjTask sendDjqKzjTask;
//待检区或管制区->空载具缓存位补空
public void run() {
try {
this.toKzjHcw();
this.sendVehicleToDjqOrGzq(IOSEnum.IS_NOTANDYES.code(""), null);
}catch (Exception ex){
log.error(ex.getMessage());
}
@@ -82,6 +86,17 @@ public class AutoSendVehicleToKzj extends Prun{
if (existTask.size() <= 1) {
List<BstIvtPackageinfoivt> empPoints = this.packageinfoivtService.selectEmpPoints(PackageInfoIvtEnum.POINT_STATUS.code("空载具缓存位"), PackageInfoIvtEnum.IVT_STATUS.code(""));
List<BstIvtPackageinfoivt> vehiclePoints = this.packageinfoivtService.selectEmpPoints(PackageInfoIvtEnum.POINT_STATUS.code("待检区"), PackageInfoIvtEnum.IVT_STATUS.code("空载具"));
//如果待检区没有可用的空载具
if (CollectionUtils.isEmpty(vehiclePoints)){
List<SchBaseTask> taskList = taskService.list(new LambdaQueryWrapper<SchBaseTask>()
.lt(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode())
.eq(SchBaseTask::getIs_delete, IOSEnum.IS_NOTANDYES.code(""))
.eq(SchBaseTask::getTask_type, "010909"));
if (ObjectUtils.isEmpty(taskList)){
vehiclePoints = packageinfoivtService
.selectEmpPoints(PackageInfoIvtEnum.POINT_STATUS.code("装箱区"), PackageInfoIvtEnum.IVT_STATUS.code("空载具"));
}
}
if (!CollectionUtils.isEmpty(empPoints) && !CollectionUtils.isEmpty(vehiclePoints) && existTask.size() < empPoints.size()) {
//增加空洞判断
//车 04 05 06
@@ -111,6 +126,57 @@ public class AutoSendVehicleToKzj extends Prun{
}
}
@SneakyThrows
public void sendVehicleToDjqOrGzq(String isCalling, String block) {
log.info(THIS_CLASS + "-装箱区->待检区或管制区补空任务开始执行扫描。");
RLock lock = redissonClient.getLock("todjq");
boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS);
try {
if (tryLock) {
if (isCalling.equals(IOSEnum.IS_NOTANDYES.code(""))) {
//存在正在执行的行架任务
List<SchBaseTask> taskList = taskService.list(new LambdaQueryWrapper<SchBaseTask>()
.lt(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode())
.eq(SchBaseTask::getIs_delete, IOSEnum.IS_NOTANDYES.code(""))
.eq(SchBaseTask::getTask_type, "010909"));
if (ObjectUtils.isNotEmpty(taskList)) {
log.warn("当前装箱区存在执行的行架任务"+taskList.stream().map(SchBaseTask::getTask_code).collect(Collectors.joining(",")));
return;
}
}
//存在装箱区有空载具的点位
List<BstIvtPackageinfoivt> zxqVehicleList = packageinfoivtService
.selectEmpPoints(PackageInfoIvtEnum.POINT_STATUS.code("装箱区"), PackageInfoIvtEnum.IVT_STATUS.code("空载具"));
List<BstIvtPackageinfoivt> djqEmpList = packageinfoivtService
.selectEmpPoints(PackageInfoIvtEnum.POINT_STATUS.code("待检区"), PackageInfoIvtEnum.IVT_STATUS.code(""));
if (CollectionUtils.isEmpty(zxqVehicleList) || CollectionUtils.isEmpty(djqEmpList)) {
log.info(THIS_CLASS + "装箱区或待检区没有可用点位");
return;
}
JSONObject task = new JSONObject();
task.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("补空(装箱区->待检区)"));
task.put("point_code1", zxqVehicleList.get(0).getPoint_code());
task.put("vehicle_code2", PackageInfoIvtEnum.AGV_ACTION_TYPE.code("普通任务"));
task.put("task_status", TaskStatusEnum.SURE_END.getCode());
task.put("point_code2", djqEmpList.get(0).getPoint_code());
try {
sendDjqKzjTask.createTask(task);
}catch (Exception ex){
log.error(THIS_CLASS+"任务创建失败"+ex.getMessage());
}
} else {
log.info(THIS_CLASS + "装箱区搬空任务正在创建被锁住");
}
} finally {
if (lock.isLocked() && lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}
private void getPointCode(JSONObject task, String taskType) {
List<BstIvtPackageinfoivt> packageList;

View File

@@ -539,7 +539,7 @@ public class BakingServiceImpl implements BakingService {
throw new BadRequestException("物料基础信息中无此物料!");
}
//查询该母卷对应最近的一条入烘箱记录
/*//查询该母卷对应最近的一条入烘箱记录
JSONObject last_hot_mst = WQLObject.getWQLObject("ST_IVT_HotRegionIOMst").query("container_name = '" + jsonHotIvt.getString("container_name") + "' AND io_type = '0' order by confirm_time desc").uniqueResult(0);
JSONObject hotParam = new JSONObject();
@@ -565,7 +565,7 @@ public class BakingServiceImpl implements BakingService {
} else {
hotParam.put("oven_time", last_hot_mst.getString("oven_time"));
}
this.createHotIoMst(hotParam);
this.createHotIoMst(hotParam);*/
}
}
JSONObject result = new JSONObject();

View File

@@ -10,6 +10,7 @@ import org.nl.b_lms.sch.task.dao.SchBaseTask;
import org.nl.b_lms.sch.task.service.IschBaseTaskService;
import org.nl.b_lms.sch.tasks.first_floor_area.auto.AutoSendToZxq;
import org.nl.modules.wql.WQL;
import org.nl.modules.wql.util.SpringContextHolder;
import org.nl.wms.sch.tasks.InCoolIvtTask;
import org.nl.wms.sch.tasks.InHotTask;
import org.redisson.api.RLock;
@@ -54,7 +55,6 @@ public class AutoIntoHotCacheTask {
log.info("烘箱对接位:{} 没找到暂存位!", task.getPoint_code1());
return;
}
new InHotTask().immediateNotifyAcs(task.getTask_id());
task.setTask_status(TaskStatusEnum.START_AND_POINT.getCode());
task.setPoint_code2(cache_jo.getString("point_code"));
@@ -62,6 +62,8 @@ public class AutoIntoHotCacheTask {
task.setUpdate_time(DateUtil.now());
task.setTask_type("010204");
taskService.updateById(task);
SpringContextHolder.getBean(InHotTask.class).immediateNotifyAcs(task.getTask_id());
}
} else {
log.info("定时对B1入暂存任务被锁住。");