diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/BstIvtPackageinfoivtServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/BstIvtPackageinfoivtServiceImpl.java index 291a381fa..d14e0e636 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/BstIvtPackageinfoivtServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/BstIvtPackageinfoivtServiceImpl.java @@ -33,6 +33,7 @@ import org.nl.common.domain.query.PageQuery; import org.nl.common.enums.PackageInfoIvtEnum; import org.nl.common.enums.SpecEnum; import org.nl.common.utils.MapOf; +import org.nl.common.utils.RedissonUtils; import org.nl.common.utils.SecurityUtils; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.util.SpringContextHolder; @@ -154,46 +155,36 @@ public class BstIvtPackageinfoivtServiceImpl extends ServiceImpl secondaryAllocationPoint(String taskCode, String actionType) { - String pointCode = ""; - String action = ""; JSONObject result = new JSONObject(); - RLock lock = redissonClient.getLock(taskCode); - boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); - try { - if (tryLock) { - switch (actionType) { - case "1": - case "2": - // 取货分配, 放货分配 - pointCode = getNewPoint(taskCode, actionType); - result.put("data", pointCode); - result.put("message", taskCode + "取放货分配成功,新点位为:" + pointCode); - break; - case "3": - case "4": - // 取货完成,放货完成 - updatePointStatus(taskCode, actionType); - action = taskCode + "取放货完成!"; - result.put("data", action); - result.put("message", taskCode + "取放货完成!"); - break; - default: - return null; - } - result.put("status", HttpStatus.OK.value()); - } else { - log.info("一楼装箱区点位二次分配接口异常,正在分配中!"); - result.put("status", HttpStatus.BAD_REQUEST.value()); - result.put("message", "二次分配点位正在分配中,已锁住!"); + result.put("status", HttpStatus.BAD_REQUEST.value()); + RedissonUtils.lock(c-> { + String pointCode = ""; + String action = ""; + switch (actionType) { + case "1": + case "2": + // 取货分配, 放货分配 + pointCode = getNewPoint(taskCode, actionType); + result.put("data", pointCode); + result.put("message", taskCode + "取放货分配成功,新点位为:" + pointCode); + break; + case "3": + case "4": + // 取货完成,放货完成 + updatePointStatus(taskCode, actionType); + action = taskCode + "取放货完成!"; + result.put("data", action); + result.put("message", taskCode + "取放货完成!"); + break; + default: + return null; } - } finally { - if (lock.isLocked() && lock.isHeldByCurrentThread()) { - lock.unlock(); - } - } + result.put("status", HttpStatus.OK.value()); + return null; + },"sendProductToFirstFloor",null); log.info("一楼装箱区点位二次分配" + taskCode + "---------------------------------------------" + result); return result; } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/MzhcwTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/MzhcwTask.java index a23245b98..7040b7395 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/MzhcwTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/MzhcwTask.java @@ -71,8 +71,6 @@ public class MzhcwTask extends AbstractAcsTask { @Resource private DjqToKzjhcwTask djqToKzjhcwTask; - @Resource - private SsxDjwTask ssxDjwTask; @Override @@ -153,35 +151,6 @@ public class MzhcwTask extends AbstractAcsTask { log.info(schBaseTask.getTask_code() + "检查检查->四个点任务,桁架取货完成信号未发送!已在手动点击完成时清除空载具位:" + schBaseTask.getPoint_code3() + "的库存"); } } - //3.更新库存记录 - // packageinfoivtService.update(null,new UpdateWrapper().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().set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("空")).set("container_name", null).eq("point_code", schBaseTask.getPoint_code3())); - //校验任务是否存在 - // List taskTypes = new ArrayList<>(Collections.singletonList(PackageInfoIvtEnum.TASK_TYPE.code("放空(空载具缓存位->输送线)"))); - // List existTask = taskService.getExistTasks(taskTypes); - // if (ObjectUtils.isEmpty(existTask)) { - // List kzjPointList = packageinfoivtService - // .list(new LambdaUpdateWrapper() - // .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("否"))) { diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/ReturnShaftAgvTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/ReturnShaftAgvTask.java index 0149596da..cce520216 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/ReturnShaftAgvTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/ReturnShaftAgvTask.java @@ -126,7 +126,7 @@ public class ReturnShaftAgvTask extends AbstractAcsTask { param.put("point_code1", endPointObj.getTruss_point_code1()); param.put("point_code2", putWaitPoint.getPoint_code()); // hint: 当前分切计划的气涨轴尺寸 - param.put("qzz_size", size); + param.put("qzz_size", qzzSize); param.put("product_area", SlitterConstant.SLITTER_TASK_AREA); param.put("task_type", SlitterEnum.TASK_TYPE.code("穿拔轴缓存<>气胀轴缓存位")); 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_code2", putWaitPoint.getPoint_code()); // hint: 当前分切计划的气涨轴尺寸 - param.put("qzz_size", size); + param.put("qzz_size", qzzSize); param.put("task_type", SlitterEnum.TASK_TYPE.code("穿拔轴缓存<>气胀轴缓存位")); param.put("product_area", SlitterConstant.SLITTER_TASK_AREA); param.put("is_bushing", "0"); diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/SendShaftToCacheTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/SendShaftToCacheTask.java index 6300a5e44..292fead27 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/SendShaftToCacheTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/SendShaftToCacheTask.java @@ -129,6 +129,7 @@ public class SendShaftToCacheTask extends AbstractAcsTask { task.setTask_status(TaskStatusEnum.START_AND_POINT.getCode()); task.setPoint_code1(form.getString("point_code1")); task.setPoint_code2(form.getString("point_code2")); + task.setVehicle_code(form.getString("qzz_size")); task.setTask_type("010815"); task.setAcs_task_type("6"); task.setIs_delete("0"); diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/impl/SlitterServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/impl/SlitterServiceImpl.java index b36d023ab..ca77664b4 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/impl/SlitterServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/impl/SlitterServiceImpl.java @@ -2014,7 +2014,7 @@ public class SlitterServiceImpl implements SlitterService { // 玻璃纤维及其制品|FRP管|6英寸|15|1700|高强 // 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 - log.info("创建虚拟分切计划呼叫气胀轴 - {}", param); + log.info("forcedFeedShaft_创建虚拟分切计划呼叫气胀轴 - {}", param); String area = param.getString("area"); int uLeftLen = 0; int uRightLen = 0; @@ -2216,6 +2216,7 @@ public class SlitterServiceImpl implements SlitterService { if (uLeftLen + uRightLen > 1700 || dLeftLen + dRightLen > 1700) { throw new BadRequestException("同一根轴长度不能超过气胀轴长度,请确认是否选择正确!"); } + log.warn("forcedFeedShaft_______:{}",deviceCode); slittingproductionplanService.saveOrUpdateBatch(plans); // 机台打开 LambdaUpdateWrapper lamu = new LambdaUpdateWrapper<>(); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index 84f1b02bf..6adeee7eb 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -49,6 +49,7 @@ import org.nl.common.enums.PackageInfoIvtEnum; import org.nl.common.enums.SpecEnum; import org.nl.common.utils.CodeUtil; import org.nl.common.utils.MapOf; +import org.nl.common.utils.RedissonUtils; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; @@ -1845,102 +1846,62 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { * 二楼到一楼,成品子卷到达一楼输送线 */ @Override - @Transactional(rollbackFor = Exception.class) - @SneakyThrows + @Transactional public JSONObject sendProductToFirstFloor(JSONObject whereJson) { - // JSONObject whereJson 应该传子卷号,设备号,车间号 - // 先查询满轴缓存位是否有可用库位,有创建搬运任务 - // 任务完成创建空载具补充到输送线桁架任务,子卷搬运至待检区或或管制区agv任务 - // 如果满轴位没有可用的空点位,先创建一个桁架任务但是不下发,等这边空出来点位,判断是否有这种桁架任务然后补发; - // 这个情况是有agv任务在搬去待检区或管制区的路上,还没有更新任务状态;需要查询是否有这种任务,等这个任务更新完后, - // 再补发之前创建的输送线到满轴缓存位任务; - log.info("二楼到一楼,成品子卷到达一楼输送线接口sendProductToFirstFloor被调用--------------------------:" + whereJson.toString()); + log.info("sendProductToFirstFloor被调用--------------------------:" + whereJson.toString()); if (StringUtils.isBlank(whereJson.getString("device_code")) || StringUtils.isBlank(whereJson.getString("material_barcode"))) { throw new BadRequestException("接口sendProductToFirstFloor,目标站点或子卷号参数为空!"); } if (whereJson.getString("device_code").equals("null") || whereJson.getString("material_barcode").equals("null")) { throw new BadRequestException("接口sendProductToFirstFloor,目标站点或子卷号参数为null!"); } - String containerName = whereJson.getString("material_barcode"); JSONObject result = new JSONObject(); - result.put("data", containerName); - RLock lock = redissonClient.getLock(containerName); - boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); - try { - if (tryLock) { - //1.查询满轴缓存位是否有空位 - List bstIvtPackageinfoivtList = packageinfoivtService - .list(new LambdaUpdateWrapper().eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用")) - .orderByAsc(BstIvtPackageinfoivt::getSort_seq)); - List mzPointList = 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).reversed()).collect(Collectors.toList()); - - 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 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 taskTypes = new ArrayList<>(Arrays.asList(PackageInfoIvtEnum.TASK_TYPE.code("输送线四个点任务"), PackageInfoIvtEnum.TASK_TYPE.code("输送线->满轴缓存位"), PackageInfoIvtEnum.TASK_TYPE.code("放空(空载具缓存位->输送线)"))); -// List 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", "二楼到一楼成品子卷到达一楼输送线任务正在创建被锁住。"); + result.put("status", HttpStatus.BAD_REQUEST.value()); + result.put("data", whereJson.getString("material_barcode")); + RedissonUtils.lock(c->{ + //1.查询满轴缓存位是否有空位 + List MzPoints = packageinfoivtService + .list(new LambdaUpdateWrapper() + .eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用")) + .eq(BstIvtPackageinfoivt::getPoint_status, PackageInfoIvtEnum.POINT_STATUS.code("满轴缓存位")) + .eq(BstIvtPackageinfoivt::getIvt_status, PackageInfoIvtEnum.IVT_STATUS.code("空")) + .orderByAsc(BstIvtPackageinfoivt::getSort_seq)); + if (CollectionUtils.isEmpty(MzPoints)){ + result.put("message", "满轴位无可用位置"); + return result; } - } finally { - if (lock.isLocked() && lock.isHeldByCurrentThread()) { - lock.unlock(); + List empPoints = packageinfoivtService + .selectEmpPoints(PackageInfoIvtEnum.POINT_STATUS.code("空载具缓存位"), PackageInfoIvtEnum.IVT_STATUS.code("空")); + if (CollectionUtils.isEmpty(empPoints)){ + result.put("message", "空轴位无可用位置"); + return result; } - } - log.info("二楼到一楼,成品子卷到达一楼输送线接口sendProductToFirstFloor调用成功--------------------------:" + result.toString()); + // 创建前先判断是否有已创建相同任务 + List 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 existTaskList1 = taskService.getExistTasks(taskTypes); + List 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 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 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; }