opt:优化二期堆垛机完成并发任务优化

opt:优化木箱信息获取
This commit is contained in:
zhangzq
2025-03-19 22:53:13 +08:00
parent 3a20cf0c92
commit e83dfde69e
8 changed files with 97 additions and 79 deletions

View File

@@ -193,40 +193,33 @@ public class TwoOutHeapTask extends AbstractAcsTask {
@Transactional(rollbackFor = Exception.class)
public void updateTaskStatus(JSONObject taskObj, String status) {
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表
String task_id = taskObj.getString("task_id");
JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "' and task_status < '07'").uniqueResult(0);
if (ObjectUtil.isNotEmpty(jsonTask)) {
if (status.equals(IOSEnum.IS_NOTANDYES.code(""))) {
// 任务为执行之后就不允许取消
if (jsonTask.getIntValue("task_status") > Integer.parseInt(TaskStatusEnum.ISSUE.getCode())) {
throw new BadRequestException("任务:" + jsonTask.getString("task_code") + "已执行,不可取消");
}
// 更新删除字段
jsonTask.put("is_delete", "1");
jsonTask.put("update_time", DateUtil.now());
taskTab.update(jsonTask);
JSONObject param = new JSONObject();
param.put("is_delete", "1");
param.put("update_time", DateUtil.now());
taskTab.update(param,"task_id = '" + task_id);
}
if (TaskStatusEnum.EXECUTING.getCode().equals(status)) {
// 更新任务状态为执行中
jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode());
jsonTask.put("update_time", DateUtil.now());
taskTab.update(jsonTask);
JSONObject param = new JSONObject();
param.put("task_status", TaskStatusEnum.EXECUTING.getCode());
param.put("update_time", DateUtil.now());
taskTab.update(param,"task_id = '" + task_id);
}
if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) {
// 更新任务完成
jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode());
jsonTask.put("update_time", DateUtil.now());
taskTab.update(jsonTask);
JSONObject param = new JSONObject();
param.put("task_status", TaskStatusEnum.FINISHED.getCode());
param.put("update_time", DateUtil.now());
taskTab.update(param,"task_id = '" + task_id);
// 如果是异常出库口则不需要下发行架任务
if (jsonTask.getString("point_code2").equals(IOSEnum.EXCEP_OUT.code("异常出库口"))) {
// 解绑托盘对应关系
WQLObject veExtTab = WQLObject.getWQLObject("md_pb_storagevehicleext");
JSONObject ext_jo = veExtTab.query("pcsn = '" + jsonTask.getString("vehicle_code") + "'").uniqueResult(0);
if (ObjectUtil.isNotEmpty(ext_jo)) {
@@ -239,7 +232,6 @@ public class TwoOutHeapTask extends AbstractAcsTask {
jsonParam.put("device_code", jsonTask.getString("point_code2"));
jsonParam.put("vehicle_code", jsonTask.getString("vehicle_code"));
jsonParam.put("task_group_id", jsonTask.getString("task_group_id"));
LashManageServiceImpl bean1 = SpringContextHolder.getBean(LashManageServiceImpl.class);
bean1.createLashTask(jsonParam);
// 再次下发:找相同任务组的下发
@@ -319,10 +311,9 @@ public class TwoOutHeapTask extends AbstractAcsTask {
.getResultJSONArray(0).toJavaList(JSONObject.class);
if (ObjectUtil.isEmpty(taskArrAll)) {
return;
// taskArrAll = wo_Task
// .query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0' ORDER BY create_time")
// .getResultJSONArray(0).toJavaList(JSONObject.class);
taskArrAll = wo_Task
.query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0' ORDER BY create_time")
.getResultJSONArray(0).toJavaList(JSONObject.class);
}
// 是否下发多个AGV输送出库任务

View File

@@ -9,6 +9,7 @@ import com.alibaba.fastjson.JSONObject;
import org.nl.b_lms.storage_manage.ios.enums.IOSEnum;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.impl.StIvtIostorinvOutServiceImpl;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl.LashManageServiceImpl;
import org.nl.common.utils.RedissonUtils;
import org.nl.common.utils.SecurityUtils;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.wql.WQL;
@@ -164,44 +165,33 @@ public class TwoOutTask extends AbstractAcsTask {
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表
WQLObject disTab = WQLObject.getWQLObject("st_ivt_iostorinvdis"); // 出入库分配表
WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); // 仓位表
String task_id = taskObj.getString("task_id");
JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "' and task_status < '07'").uniqueResult(0);
if (ObjectUtil.isNotEmpty(jsonTask)) {
if (status.equals(IOSEnum.IS_NOTANDYES.code(""))) {
// 任务为执行之后就不允许取消
if (jsonTask.getIntValue("task_status") > Integer.parseInt(TaskStatusEnum.ISSUE.getCode())) {
throw new BadRequestException("任务:" + jsonTask.getString("task_code") + "已执行,不可取消");
}
// 更新删除字段
jsonTask.put("is_delete", "1");
jsonTask.put("update_time", DateUtil.now());
taskTab.update(jsonTask);
// 更新分配明细为:未生成
JSONObject map = new JSONObject();
map.put("work_status", IOSEnum.WORK_STATUS.code("未生成"));
map.put("point_id", "");
map.put("task_id", "");
disTab.update(map, "task_id = '" + task_id + "'");
if (ObjectUtil.isEmpty(jsonTask)){
return;
}
if (status.equals(IOSEnum.IS_NOTANDYES.code(""))) {
if (jsonTask.getIntValue("task_status") > Integer.parseInt(TaskStatusEnum.ISSUE.getCode())) {
throw new BadRequestException("任务:" + jsonTask.getString("task_code") + "已执行,不可取消");
}
if (TaskStatusEnum.EXECUTING.getCode().equals(status)) {
// 更新任务状态为执行中
jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode());
jsonTask.put("update_time", DateUtil.now());
taskTab.update(jsonTask);
}
if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) {
// 调用标识完成
jsonTask.put("is_delete", "1");
jsonTask.put("update_time", DateUtil.now());
taskTab.update(jsonTask);
JSONObject map = new JSONObject();
map.put("work_status", IOSEnum.WORK_STATUS.code("未生成"));
map.put("point_id", "");
map.put("task_id", "");
disTab.update(map, "task_id = '" + task_id + "'");
}
if (TaskStatusEnum.EXECUTING.getCode().equals(status)) {
jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode());
jsonTask.put("update_time", DateUtil.now());
taskTab.update(jsonTask);
}
if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) {
RedissonUtils.lock(c -> {
StIvtIostorinvOutServiceImpl bean = SpringContextHolder.getBean(StIvtIostorinvOutServiceImpl.class);
bean.finishTask(jsonTask);
// 判断是否有异常货位的需要更新
JSONObject jsonExt = attrTab.query("inv_code = '" + jsonTask.getString("vehicle_code") + "' AND lock_type = '"+IOSEnum.LOCK_TYPE.code("出库异常锁")+"'").uniqueResult(0);
if (ObjectUtil.isNotEmpty(jsonExt)) {
@@ -209,27 +199,21 @@ public class TwoOutTask extends AbstractAcsTask {
jsonExt.put("inv_code", "");
attrTab.update(jsonExt);
}
// 判断此任务组是否全部完成
JSONArray resultJSONArray = taskTab.query("task_group_id = '" + jsonTask.getString("task_group_id") + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "' and handle_class = '"+THIS_CLASS+"'")
.getResultJSONArray(0);
// 下发堆垛机至行架任务2个行架位
JSONObject jsonParam = new JSONObject();
jsonParam.put("device_code",jsonTask.getString("point_code2"));
jsonParam.put("vehicle_code",jsonTask.getString("vehicle_code"));
jsonParam.put("task_group_id",jsonTask.getString("task_group_id"));
jsonParam.put("vehicle_type",jsonTask.getJSONObject("request_param").getString("containerType"));
LashManageServiceImpl bean1 = SpringContextHolder.getBean(LashManageServiceImpl.class);
bean1.createHeapTask(jsonParam);
// 判断此任务组是否全部完成
JSONArray resultJSONArray = taskTab.query("task_group_id = '" + jsonTask.getString("task_group_id") + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "' and handle_class = '"+THIS_CLASS+"'")
.getResultJSONArray(0);
if (ObjectUtil.isEmpty(resultJSONArray)) {
this.immediateNotifyAcs(null);
}
}
}, "出库堆垛机任务反馈完成", 30, this);
}
}
@Override

View File

@@ -73,7 +73,8 @@ public class AutoSendMzToDjq {
}
JSONObject task = new JSONObject();
//满轴有子卷且过滤未完成任务
List<BstIvtPackageinfoivt> mzqPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("满轴缓存位"), PackageInfoIvtEnum.IVT_STATUS.code("有子卷"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("四个点任务取货"), PackageInfoIvtEnum.SORT_TYPE.code("降序"), "");
List<BstIvtPackageinfoivt> mzqPackageinfoivtList = packageinfoivtService.selectEmpPoints(PackageInfoIvtEnum.POINT_STATUS.code("满轴缓存位"), PackageInfoIvtEnum.IVT_STATUS.code("有子卷"));
if (ObjectUtils.isEmpty(mzqPackageinfoivtList)) {
return;
}
@@ -88,7 +89,8 @@ public class AutoSendMzToDjq {
task.put("vehicle_code", mzqPackageinfoivtList.get(0).getContainer_name());
task.put("point_code1", packageinfoivtService.getWaitPoint(mzqPackageinfoivtList.get(0).getBlock(), mzqPackageinfoivtList.get(0).getWait_point_type()));
//如果浅库位和深库位都有空位,且为一组,优先深库位
task.put("point_code2", mzqPackageinfoivtList.get(0).getPoint_code());
task.put("point_code2", selectEmpPoints.get(0).getPoint_code());
task.put("point_code3", mzqPackageinfoivtList.get(0).getPoint_code());
djqTask.createTask(task);
} else {
log.info("满轴->待检区agv自动搬运任务正在创建被锁住。");

View File

@@ -81,9 +81,14 @@ public class BstIvtBoxinfoServiceImpl extends ServiceImpl<BstIvtBoxinfoMapper, B
BstIvtBoxinfo boxDao = this.getOne(new LambdaQueryWrapper<BstIvtBoxinfo>().eq(BstIvtBoxinfo::getBox_no, whereJson.getString("ContainerName")));
if (ObjectUtil.isEmpty(boxDao)) {
String height = whereJson.getString("Height");
int i = height.indexOf("|");
if (i>1){
height=height.substring(0,i);
}
boxDao = BstIvtBoxinfo.builder()
.box_id(IdUtil.getStringId())
.box_high(whereJson.getString("Height"))
.box_high(height)
.box_length(whereJson.getString("Length"))
.box_width(whereJson.getString("Width"))
.material_code(whereJson.getString("ProductName"))
@@ -96,7 +101,6 @@ public class BstIvtBoxinfoServiceImpl extends ServiceImpl<BstIvtBoxinfoMapper, B
// 截取子卷号
String description = whereJson.getString("Description");
try {
String one = description.substring(description.indexOf("|") + 1);
String two = one.substring(one.indexOf("|") + 1);
@@ -109,7 +113,12 @@ public class BstIvtBoxinfoServiceImpl extends ServiceImpl<BstIvtBoxinfoMapper, B
this.save(boxDao);
}else {
boxDao.setBox_high(whereJson.getString("Height"));
String height = whereJson.getString("Height");
int i = height.indexOf("|");
if (i>1){
height=height.substring(0,i);
}
boxDao.setBox_high(height);
boxDao.setBox_length(whereJson.getString("Length"));
boxDao.setBox_width(whereJson.getString("Width"));
boxDao.setVehicle_type(vehicle_type);
@@ -128,7 +137,6 @@ public class BstIvtBoxinfoServiceImpl extends ServiceImpl<BstIvtBoxinfoMapper, B
return boxDao;
}
@Override
public JSONObject saveBoxInfo(JSONObject jsonObject) {
//从MES获取包装关系

View File

@@ -1,11 +1,13 @@
package org.nl.common.utils;
import lombok.SneakyThrows;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.wql.util.SpringContextHolder;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
@@ -41,4 +43,33 @@ public class RedissonUtils {
}
}
}
/**
*
* @param process
* @param key
* @param secend:最大等待时间
* @param param
*/
@SneakyThrows
public static void lock(Consumer process, String key, int secend, Object param){
RedissonClient redissonClient = SpringContextHolder.getBean(RedissonClient.class);
RLock lock = redissonClient.getLock(key);
boolean isLock;
isLock = lock.tryLock(secend,secend+5,TimeUnit.SECONDS);
try {
if (isLock){
process.accept(param);
} else {
throw new BadRequestException("当前业务"+key+"正在执行");
}
}catch (Exception ex){
ex.printStackTrace();
throw ex;
}finally {
if (isLock && lock.isHeldByCurrentThread()){
lock.unlock();
}
}
}
}

View File

@@ -85,9 +85,11 @@ public class LmsToBigScreenServiceImpl implements LmsToBigScreenService {
Map<String, List<PdmBiSubpackagerelation>> collect = list.stream().filter(a->StringUtils.isNotEmpty(a.getPackage_box_sn())).collect(Collectors.groupingBy(item -> item.getPackage_box_sn()));
for (int i = 0; i < rows.size(); i++) {
JSONObject row = rows.get(i);
JSONObject item = new JSONObject();
item.put("struct_code", row.getString("struct_code"));
item.put("struct_status", "0");
String box = row.getString("storagevehicle_code");
if (!StringUtils.isEmpty(box)){
JSONObject item = new JSONObject();
item.put("storagevehicle_code", box);
if (box.startsWith("KTP")) {
item.put("struct_status", "1");
@@ -99,21 +101,21 @@ public class LmsToBigScreenServiceImpl implements LmsToBigScreenService {
item.put("container_weight", container_weight);
item.put("product_description", subs.get(0).getProduct_description());
item.put("sale_order_name", subs.get(0).getSale_order_name());
item.put("quanlity_in_box", subs.get(0).getQuanlity_in_box());
item.put("quanlity_in_box", subs.get(0).getQuanlity_in_box().toString());
item.put("box_weight", subs.get(0).getBox_weight());
item.put("struct_status", "2");
JSONArray detail = new JSONArray();
for (PdmBiSubpackagerelation dtl : subs) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("container_name", dtl.getContainer_name());
jsonObject.put("net_weight", dtl.getNet_weight());
jsonObject.put("net_weight", dtl.getNet_weight().toString());
detail.add(jsonObject);
}
item.put("detail", detail);
}
}
data.add(item);
}
data.add(item);
}
return data;
}

View File

@@ -42,7 +42,7 @@ spring:
url-pattern: /druid/*
reset-enable: false
filters:
`DruidFilter`,stat
DruidFilter,stat
url: jdbc:mysql://10.1.3.87:3306/lms?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
username: root
password: NLABC&hl123

View File

@@ -6,7 +6,7 @@ spring:
freemarker:
check-template-location: false
profiles:
active: dev
active: prod
jackson:
time-zone: GMT+8
data: