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

This commit is contained in:
2025-05-01 14:58:41 +08:00
6 changed files with 79 additions and 156 deletions

View File

@@ -33,6 +33,7 @@ import org.nl.common.domain.query.PageQuery;
import org.nl.common.enums.PackageInfoIvtEnum; import org.nl.common.enums.PackageInfoIvtEnum;
import org.nl.common.enums.SpecEnum; import org.nl.common.enums.SpecEnum;
import org.nl.common.utils.MapOf; import org.nl.common.utils.MapOf;
import org.nl.common.utils.RedissonUtils;
import org.nl.common.utils.SecurityUtils; import org.nl.common.utils.SecurityUtils;
import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.wql.util.SpringContextHolder; import org.nl.modules.wql.util.SpringContextHolder;
@@ -154,46 +155,36 @@ public class BstIvtPackageinfoivtServiceImpl extends ServiceImpl<BstIvtPackagein
* @param actionType 1、取货分配 2、放货分配 3、取货完成 * @param actionType 1、取货分配 2、放货分配 3、取货完成
* @author gbx * @author gbx
*/ */
@Transactional(rollbackFor = Exception.class)
@SneakyThrows @SneakyThrows
@Transactional(rollbackFor = Exception.class)
public Map<String, Object> secondaryAllocationPoint(String taskCode, String actionType) { public Map<String, Object> secondaryAllocationPoint(String taskCode, String actionType) {
String pointCode = "";
String action = "";
JSONObject result = new JSONObject(); JSONObject result = new JSONObject();
RLock lock = redissonClient.getLock(taskCode); result.put("status", HttpStatus.BAD_REQUEST.value());
boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); RedissonUtils.lock(c-> {
try { String pointCode = "";
if (tryLock) { String action = "";
switch (actionType) { switch (actionType) {
case "1": case "1":
case "2": case "2":
// 取货分配, 放货分配 // 取货分配, 放货分配
pointCode = getNewPoint(taskCode, actionType); pointCode = getNewPoint(taskCode, actionType);
result.put("data", pointCode); result.put("data", pointCode);
result.put("message", taskCode + "取放货分配成功,新点位为:" + pointCode); result.put("message", taskCode + "取放货分配成功,新点位为:" + pointCode);
break; break;
case "3": case "3":
case "4": case "4":
// 取货完成,放货完成 // 取货完成,放货完成
updatePointStatus(taskCode, actionType); updatePointStatus(taskCode, actionType);
action = taskCode + "取放货完成!"; action = taskCode + "取放货完成!";
result.put("data", action); result.put("data", action);
result.put("message", taskCode + "取放货完成!"); result.put("message", taskCode + "取放货完成!");
break; break;
default: default:
return null; return null;
}
result.put("status", HttpStatus.OK.value());
} else {
log.info("一楼装箱区点位二次分配接口异常,正在分配中!");
result.put("status", HttpStatus.BAD_REQUEST.value());
result.put("message", "二次分配点位正在分配中,已锁住!");
} }
} finally { result.put("status", HttpStatus.OK.value());
if (lock.isLocked() && lock.isHeldByCurrentThread()) { return null;
lock.unlock(); },"sendProductToFirstFloor",null);
}
}
log.info("一楼装箱区点位二次分配" + taskCode + "---------------------------------------------" + result); log.info("一楼装箱区点位二次分配" + taskCode + "---------------------------------------------" + result);
return result; return result;
} }

View File

@@ -71,8 +71,6 @@ public class MzhcwTask extends AbstractAcsTask {
@Resource @Resource
private DjqToKzjhcwTask djqToKzjhcwTask; private DjqToKzjhcwTask djqToKzjhcwTask;
@Resource
private SsxDjwTask ssxDjwTask;
@Override @Override
@@ -153,35 +151,6 @@ public class MzhcwTask extends AbstractAcsTask {
log.info(schBaseTask.getTask_code() + "检查检查->四个点任务,桁架取货完成信号未发送!已在手动点击完成时清除空载具位:" + schBaseTask.getPoint_code3() + "的库存"); log.info(schBaseTask.getTask_code() + "检查检查->四个点任务,桁架取货完成信号未发送!已在手动点击完成时清除空载具位:" + schBaseTask.getPoint_code3() + "的库存");
} }
} }
//3.更新库存记录
// packageinfoivtService.update(null,new UpdateWrapper<BstIvtPackageinfoivt>().set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("有子卷")).set("container_name", schBaseTask.getVehicle_code()).eq("point_code", schBaseTask.getPoint_code2()));
//4.任务一、待检区AGV搬运任务查询子卷信息去分切计划表查找定级数据桁架任务完成根据子卷定级创建AGV任务将满轴搬运至质检区或管制区
//createTaskToDjq(schBaseTask);
//5.创建空载具到输送线任务,完成后需要创建空载具缓存位->输送线任务
// if (schBaseTask.getTask_type().equals(PackageInfoIvtEnum.TASK_TYPE.code("输送线四个点任务"))) {
//四个点任务改变pointCode3点位状态
// packageinfoivtService.update(null,new UpdateWrapper<BstIvtPackageinfoivt>().set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("空")).set("container_name", null).eq("point_code", schBaseTask.getPoint_code3()));
//校验任务是否存在
// List<String> taskTypes = new ArrayList<>(Collections.singletonList(PackageInfoIvtEnum.TASK_TYPE.code("放空(空载具缓存位->输送线)")));
// List<SchBaseTask> existTask = taskService.getExistTasks(taskTypes);
// if (ObjectUtils.isEmpty(existTask)) {
// List<BstIvtPackageinfoivt> kzjPointList = packageinfoivtService
// .list(new LambdaUpdateWrapper<BstIvtPackageinfoivt>()
// .eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用"))
// .eq(BstIvtPackageinfoivt::getPoint_status, PackageInfoIvtEnum.POINT_STATUS.code("空载具缓存位"))
// .eq(BstIvtPackageinfoivt::getIvt_status, PackageInfoIvtEnum.IVT_STATUS.code("空载具"))
// .orderByDesc(BstIvtPackageinfoivt::getSort_seq));
// JSONObject toSsxTask = new JSONObject();
// toSsxTask.put("acs_task_type", PackageInfoIvtEnum.ACS_TASK_TYPE.code("桁架任务"));
// toSsxTask.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("放空(空载具缓存位->输送线)"));
// toSsxTask.put("vehicle_code", schBaseTask.getVehicle_code());
// //判断空载具缓存位是否有空载具库存,有就叫桁架去任一位置搬空载具,如果暂时没有空载具,定时任务会不断判断是否有空载具
// toSsxTask.put("task_status", TaskStatusEnum.SURE_END.getCode());
// //终点为输送线点位
// toSsxTask.put("point_code2", schBaseTask.getPoint_code1());
// ssxDjwTask.createTask(toSsxTask);
// }
// }
} }
// 取消 // 取消
if (status.equals(IOSEnum.IS_NOTANDYES.code(""))) { if (status.equals(IOSEnum.IS_NOTANDYES.code(""))) {

View File

@@ -126,7 +126,7 @@ public class ReturnShaftAgvTask extends AbstractAcsTask {
param.put("point_code1", endPointObj.getTruss_point_code1()); param.put("point_code1", endPointObj.getTruss_point_code1());
param.put("point_code2", putWaitPoint.getPoint_code()); param.put("point_code2", putWaitPoint.getPoint_code());
// hint: 当前分切计划的气涨轴尺寸 // hint: 当前分切计划的气涨轴尺寸
param.put("qzz_size", size); param.put("qzz_size", qzzSize);
param.put("product_area", SlitterConstant.SLITTER_TASK_AREA); param.put("product_area", SlitterConstant.SLITTER_TASK_AREA);
param.put("task_type", SlitterEnum.TASK_TYPE.code("穿拔轴缓存<>气胀轴缓存位")); param.put("task_type", SlitterEnum.TASK_TYPE.code("穿拔轴缓存<>气胀轴缓存位"));
param.put("is_bushing", "0"); param.put("is_bushing", "0");
@@ -145,7 +145,7 @@ public class ReturnShaftAgvTask extends AbstractAcsTask {
param.put("point_code1", endPointObj.getTruss_point_code2()); param.put("point_code1", endPointObj.getTruss_point_code2());
param.put("point_code2", putWaitPoint.getPoint_code()); param.put("point_code2", putWaitPoint.getPoint_code());
// hint: 当前分切计划的气涨轴尺寸 // hint: 当前分切计划的气涨轴尺寸
param.put("qzz_size", size); param.put("qzz_size", qzzSize);
param.put("task_type", SlitterEnum.TASK_TYPE.code("穿拔轴缓存<>气胀轴缓存位")); param.put("task_type", SlitterEnum.TASK_TYPE.code("穿拔轴缓存<>气胀轴缓存位"));
param.put("product_area", SlitterConstant.SLITTER_TASK_AREA); param.put("product_area", SlitterConstant.SLITTER_TASK_AREA);
param.put("is_bushing", "0"); param.put("is_bushing", "0");

View File

@@ -129,6 +129,7 @@ public class SendShaftToCacheTask extends AbstractAcsTask {
task.setTask_status(TaskStatusEnum.START_AND_POINT.getCode()); task.setTask_status(TaskStatusEnum.START_AND_POINT.getCode());
task.setPoint_code1(form.getString("point_code1")); task.setPoint_code1(form.getString("point_code1"));
task.setPoint_code2(form.getString("point_code2")); task.setPoint_code2(form.getString("point_code2"));
task.setVehicle_code(form.getString("qzz_size"));
task.setTask_type("010815"); task.setTask_type("010815");
task.setAcs_task_type("6"); task.setAcs_task_type("6");
task.setIs_delete("0"); task.setIs_delete("0");

View File

@@ -2014,7 +2014,7 @@ public class SlitterServiceImpl implements SlitterService {
// 玻璃纤维及其制品|FRP管|6英寸|15|1700|高强 // 玻璃纤维及其制品|FRP管|6英寸|15|1700|高强
// param: area, device_code, up_left_size_k,up_right_size_k, up_left_size_v,up_right_size_v // param: area, device_code, up_left_size_k,up_right_size_k, up_left_size_v,up_right_size_v
// down_left_size_k,down_right_size_k, down_left_size_v,down_right_size_v // down_left_size_k,down_right_size_k, down_left_size_v,down_right_size_v
log.info("创建虚拟分切计划呼叫气胀轴 - {}", param); log.info("forcedFeedShaft_创建虚拟分切计划呼叫气胀轴 - {}", param);
String area = param.getString("area"); String area = param.getString("area");
int uLeftLen = 0; int uLeftLen = 0;
int uRightLen = 0; int uRightLen = 0;
@@ -2216,6 +2216,7 @@ public class SlitterServiceImpl implements SlitterService {
if (uLeftLen + uRightLen > 1700 || dLeftLen + dRightLen > 1700) { if (uLeftLen + uRightLen > 1700 || dLeftLen + dRightLen > 1700) {
throw new BadRequestException("同一根轴长度不能超过气胀轴长度,请确认是否选择正确!"); throw new BadRequestException("同一根轴长度不能超过气胀轴长度,请确认是否选择正确!");
} }
log.warn("forcedFeedShaft_______:{}",deviceCode);
slittingproductionplanService.saveOrUpdateBatch(plans); slittingproductionplanService.saveOrUpdateBatch(plans);
// 机台打开 // 机台打开
LambdaUpdateWrapper<StIvtCutpointivt> lamu = new LambdaUpdateWrapper<>(); LambdaUpdateWrapper<StIvtCutpointivt> lamu = new LambdaUpdateWrapper<>();

View File

@@ -49,6 +49,7 @@ import org.nl.common.enums.PackageInfoIvtEnum;
import org.nl.common.enums.SpecEnum; import org.nl.common.enums.SpecEnum;
import org.nl.common.utils.CodeUtil; import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.MapOf; import org.nl.common.utils.MapOf;
import org.nl.common.utils.RedissonUtils;
import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.wql.WQL; import org.nl.modules.wql.WQL;
import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.core.bean.WQLObject;
@@ -1845,102 +1846,62 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
* 二楼到一楼,成品子卷到达一楼输送线 * 二楼到一楼,成品子卷到达一楼输送线
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional
@SneakyThrows
public JSONObject sendProductToFirstFloor(JSONObject whereJson) { public JSONObject sendProductToFirstFloor(JSONObject whereJson) {
// JSONObject whereJson 应该传子卷号,设备号,车间号 log.info("sendProductToFirstFloor被调用--------------------------" + whereJson.toString());
// 先查询满轴缓存位是否有可用库位,有创建搬运任务
// 任务完成创建空载具补充到输送线桁架任务子卷搬运至待检区或或管制区agv任务
// 如果满轴位没有可用的空点位,先创建一个桁架任务但是不下发,等这边空出来点位,判断是否有这种桁架任务然后补发;
// 这个情况是有agv任务在搬去待检区或管制区的路上还没有更新任务状态需要查询是否有这种任务等这个任务更新完后
// 再补发之前创建的输送线到满轴缓存位任务;
log.info("二楼到一楼成品子卷到达一楼输送线接口sendProductToFirstFloor被调用--------------------------" + whereJson.toString());
if (StringUtils.isBlank(whereJson.getString("device_code")) || StringUtils.isBlank(whereJson.getString("material_barcode"))) { if (StringUtils.isBlank(whereJson.getString("device_code")) || StringUtils.isBlank(whereJson.getString("material_barcode"))) {
throw new BadRequestException("接口sendProductToFirstFloor目标站点或子卷号参数为空"); throw new BadRequestException("接口sendProductToFirstFloor目标站点或子卷号参数为空");
} }
if (whereJson.getString("device_code").equals("null") || whereJson.getString("material_barcode").equals("null")) { if (whereJson.getString("device_code").equals("null") || whereJson.getString("material_barcode").equals("null")) {
throw new BadRequestException("接口sendProductToFirstFloor目标站点或子卷号参数为null"); throw new BadRequestException("接口sendProductToFirstFloor目标站点或子卷号参数为null");
} }
String containerName = whereJson.getString("material_barcode");
JSONObject result = new JSONObject(); JSONObject result = new JSONObject();
result.put("data", containerName); result.put("status", HttpStatus.BAD_REQUEST.value());
RLock lock = redissonClient.getLock(containerName); result.put("data", whereJson.getString("material_barcode"));
boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); RedissonUtils.lock(c->{
try { //1.查询满轴缓存位是否有空位
if (tryLock) { List<BstIvtPackageinfoivt> MzPoints = packageinfoivtService
//1.查询满轴缓存位是否有空位 .list(new LambdaUpdateWrapper<BstIvtPackageinfoivt>()
List<BstIvtPackageinfoivt> bstIvtPackageinfoivtList = packageinfoivtService .eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用"))
.list(new LambdaUpdateWrapper<BstIvtPackageinfoivt>().eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用")) .eq(BstIvtPackageinfoivt::getPoint_status, PackageInfoIvtEnum.POINT_STATUS.code("满轴缓存位"))
.orderByAsc(BstIvtPackageinfoivt::getSort_seq)); .eq(BstIvtPackageinfoivt::getIvt_status, PackageInfoIvtEnum.IVT_STATUS.code(""))
List<BstIvtPackageinfoivt> mzPointList = bstIvtPackageinfoivtList.stream() .orderByAsc(BstIvtPackageinfoivt::getSort_seq));
.filter(r -> PackageInfoIvtEnum.POINT_STATUS.code("满轴缓存位").equals(r.getPoint_status()) if (CollectionUtils.isEmpty(MzPoints)){
&& PackageInfoIvtEnum.IVT_STATUS.code("").equals(r.getIvt_status())) result.put("message", "满轴位无可用位置");
.sorted(Comparator.comparing(BstIvtPackageinfoivt::getSort_seq).reversed()).collect(Collectors.toList()); return result;
JSONObject jo = new JSONObject();
jo.put("acs_task_type", PackageInfoIvtEnum.ACS_TASK_TYPE.code("桁架任务"));
jo.put("vehicle_code", containerName);
//2.创建输送线->满轴位桁架任务,
String point_code1 = whereJson.getString("device_code");
jo.put("point_code1", point_code1);
if (ObjectUtils.isNotEmpty(mzPointList)) {
//任意一个满轴缓存位为终点
jo.put("point_code2", mzPointList.get(0).getPoint_code());
List<BstIvtPackageinfoivt> kzjPointList = bstIvtPackageinfoivtList.stream()
.filter(r -> PackageInfoIvtEnum.POINT_STATUS.code("空载具缓存位").equals(r.getPoint_status())
&& PackageInfoIvtEnum.IVT_STATUS.code("空载具").equals(r.getIvt_status()))
.sorted(Comparator.comparing(BstIvtPackageinfoivt::getSort_seq)).collect(Collectors.toList());
//空载具缓存位有空载具,桁架取空载具从外到里取空载具,升序
if (ObjectUtils.isNotEmpty(kzjPointList)) {
//创建输送线四个点任务
return createTask(containerName, jo, kzjPointList.get(0).getPoint_code(), whereJson.getString("device_code"));
} else {
result.put("status", HttpStatus.BAD_REQUEST.value());
result.put("message", "空轴位缓存位无载具");
return result;
//创建输送线->满轴缓存位两个点任务
// return createTask2(containerName, jo);
}
} else {
result.put("status", HttpStatus.BAD_REQUEST.value());
result.put("message", "满轴缓存位无可用位置");
return result;
// //如果满轴位没有可用的空点位,先创建一个桁架任务但是不下发,等这边空出来点位,判断是否有这种桁架任务然后补发;
// List<String> taskTypes = new ArrayList<>(Arrays.asList(PackageInfoIvtEnum.TASK_TYPE.code("输送线四个点任务"), PackageInfoIvtEnum.TASK_TYPE.code("输送线->满轴缓存位"), PackageInfoIvtEnum.TASK_TYPE.code("放空(空载具缓存位->输送线)")));
// List<SchBaseTask> existTaskList = taskService.getExistTasks(taskTypes);
// //如果有就不创建,没有就创建
// if (ObjectUtils.isEmpty(existTaskList)) {
// //只确定起点NBJ1002
// JSONObject jo2 = new JSONObject();
// jo2.put("acs_task_type", PackageInfoIvtEnum.ACS_TASK_TYPE.code("桁架任务"));
// jo2.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("输送线->满轴缓存位"));
// jo2.put("point_code1", "NBJ1002");
// jo2.put("vehicle_code", containerName);
// jo2.put("task_status", TaskStatusEnum.SURE_START.getCode());
// jo2.put("is_send", false);
// mzhcwTask.createTask(jo2);
// PdmProductSpecServiceImpl.doRecord(SpecEnum.XX,null,Boolean.TRUE,null,containerName);
// //不确定起点的空载具缓存位->输送线任务
// createTask3(containerName);
// result.put("status", HttpStatus.OK.value());
// result.put("message", "反馈成功!");
// } else {
// log.info("已存在未完成的且已分配的补空载具或桁架任务,任务编号为:" + existTaskList.get(0).getTask_code() + ",请检查!");
// result.put("status", HttpStatus.BAD_REQUEST.value());
// result.put("message", "已存在未完成的且已分配的补空载具或桁架任务,任务编号为:" + existTaskList.get(0).getTask_code() + ",请检查!");
// }
}
} else {
log.info("二楼到一楼成品子卷到达一楼输送线任务正在创建被锁住。");
result.put("status", HttpStatus.BAD_REQUEST.value());
result.put("message", "二楼到一楼成品子卷到达一楼输送线任务正在创建被锁住。");
} }
} finally { List<BstIvtPackageinfoivt> empPoints = packageinfoivtService
if (lock.isLocked() && lock.isHeldByCurrentThread()) { .selectEmpPoints(PackageInfoIvtEnum.POINT_STATUS.code("空载具缓存位"), PackageInfoIvtEnum.IVT_STATUS.code(""));
lock.unlock(); if (CollectionUtils.isEmpty(empPoints)){
result.put("message", "空轴位无可用位置");
return result;
} }
} // 创建前先判断是否有已创建相同任务
log.info("二楼到一楼成品子卷到达一楼输送线接口sendProductToFirstFloor调用成功--------------------------" + result.toString()); List<String> taskTypes = new ArrayList<>(Arrays.asList(PackageInfoIvtEnum.TASK_TYPE.code("输送线四个点任务"), PackageInfoIvtEnum.TASK_TYPE.code("输送线->满轴缓存位"), PackageInfoIvtEnum.TASK_TYPE.code("放空(空载具缓存位->输送线)"), PackageInfoIvtEnum.TASK_TYPE.code("补空(待检区->空载具缓存位)"), PackageInfoIvtEnum.TASK_TYPE.code("补空(管制区->空载具缓存位)")));
List<SchBaseTask> existTaskList1 = taskService.getExistTasks(taskTypes);
List<SchBaseTask> existTaskList2 = existTaskList1.stream().filter(r -> r.getTask_type().equals(PackageInfoIvtEnum.TASK_TYPE.code("输送线四个点任务"))||r.getTask_type().equals(PackageInfoIvtEnum.TASK_TYPE.code("输送线->满轴缓存位"))||r.getTask_type().equals(PackageInfoIvtEnum.TASK_TYPE.code("放空(空载具缓存位->输送线)"))).collect(Collectors.toList());
List<SchBaseTask> existTaskList3 = existTaskList1.stream().filter(r -> StringUtils.isNotBlank(r.getResponse_param())).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(existTaskList2) ||!CollectionUtils.isEmpty(existTaskList3) ){
result.put("message", "存在正在执行的输送线行架任务");
return result;
}
List<BstIvtPackageinfoivt> sortEmpPoint = empPoints.stream().sorted(Comparator.comparing(BstIvtPackageinfoivt::getSort_seq)).collect(Collectors.toList());
JSONObject taskParam = new JSONObject();
taskParam.put("acs_task_type", PackageInfoIvtEnum.ACS_TASK_TYPE.code("桁架任务"));
taskParam.put("vehicle_code", whereJson.getString("material_barcode"));
taskParam.put("point_code1", whereJson.getString("device_code"));
taskParam.put("point_code2", MzPoints.get(0).getPoint_code());
taskParam.put("point_code3", sortEmpPoint.get(0).getPoint_code());
taskParam.put("point_code4", whereJson.getString("device_code"));
taskParam.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("输送线四个点任务"));
taskParam.put("is_send", true);
mzhcwTask.createTask(taskParam);
PdmProductSpecServiceImpl.doRecord(SpecEnum.XX,null,Boolean.TRUE,null,whereJson.getString("material_barcode"));
result.put("status", HttpStatus.OK.value());
result.put("message", "反馈成功!");
return result;
},"sendProductToFirstFloor",null);
log.info("sendProductToFirstFloor调用成功--------------------------" + result);
return result; return result;
} }