From a7d2c0288f820633db40e90a6216129a20ccebd0 Mon Sep 17 00:00:00 2001 From: liyongde <1419499670@qq.com> Date: Mon, 24 Feb 2025 17:11:22 +0800 Subject: [PATCH] =?UTF-8?q?rev:=20=E4=BA=8C=E6=9C=9F=E5=86=85=E5=8C=85?= =?UTF-8?q?=E9=97=B4=E6=94=B9=E9=80=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task/dao/mapper/SchBaseTaskMapper.java | 2 + .../sch/task/dao/mapper/SchBaseTaskMapper.xml | 11 + .../sch/task/service/IschBaseTaskService.java | 18 +- .../service/impl/SchBaseTaskServiceImpl.java | 14 + .../service/impl/SlitterServiceImpl.java | 42 +- .../common/constants/ProduceAreaConstant.java | 28 ++ .../coderule/impl/SysCodeRuleServiceImpl.java | 1 + .../notice/impl/SysNoticeServiceImpl.java | 3 + .../wms/ext/acs/rest/AcsToWmsController.java | 10 +- .../wms/ext/acs/service/AcsToWmsService.java | 2 +- .../acs/service/impl/AcsToWmsServiceImpl.java | 79 +++- .../mes/service/impl/MesToLmsServiceImpl.java | 5 +- .../wms/pda/mps/rest/PaperTubeController.java | 11 + .../wms/pda/mps/rest/ShippingController.java | 16 + .../org/nl/wms/pda/mps/service/InService.java | 2 +- .../wms/pda/mps/service/PaperTubeService.java | 13 + .../wms/pda/mps/service/ShippingService.java | 20 + .../mps/service/impl/CasingServiceImpl.java | 4 +- .../pda/mps/service/impl/InServiceImpl.java | 19 +- .../pda/mps/service/impl/OutServiceImpl.java | 253 ++++++++++++- .../service/impl/PaperTubeServiceImpl.java | 178 +++++++++ .../mps/service/impl/ShippingServiceImpl.java | 164 +++++++- .../java/org/nl/wms/pda/mps/wql/PDA_02.wql | 162 ++++++++ .../DeliverycachepointivtController.java | 60 +++ .../pdm/ivt/deliverycache/package-info.java | 6 + .../IDeliverycachepointivtService.java | 87 +++++ .../service/dao/Deliverycachepointivt.java | 123 ++++++ .../mapper/DeliverycachepointivtMapper.java | 23 ++ .../mapper/DeliverycachepointivtMapper.xml | 103 +++++ .../service/dto/DeliveryConDto.java | 28 ++ .../service/dto/DeliverycachepointivtDto.java | 111 ++++++ .../dto/DeliverycachepointivtQuery.java | 18 + .../DeliverycachepointivtServiceImpl.java | 118 ++++++ .../ivt/service/dto/DeliveryPointIvtDto.java | 1 + .../src/main/java/org/nl/wms/pdm/wql/pdm.xls | Bin 254976 -> 259584 bytes .../wms/sch/manage/AutoCallEmptyVehicle.java | 172 ++++++--- .../org/nl/wms/sch/tasks/CutConveyorTask.java | 84 +++- .../org/nl/wms/sch/tasks/CutTrussTask.java | 358 +++++++++++++++--- .../org/nl/wms/sch/tasks/PaperTrussTask.java | 6 + .../org/nl/wms/sch/tasks/PaperTubeTask.java | 4 +- .../tasks/renovation/auto/package-info.java | 6 + .../renovation/constant/package-info.java | 6 + .../sch/tasks/renovation/package-info.java | 6 + .../renovation/service/ReNbjService.java | 16 + .../service/impl/ReNbjServiceImpl.java | 81 ++++ .../sch/tasks/renovation/util/RenUtils.java | 33 ++ .../java/org/nl/wms/sch/wql/QAUTO_QUERY.wql | 56 ++- .../src/main/resources/logback-spring.xml | 2 +- .../src/test/java/org/nl/init/EventTest.java | 20 + .../deliverycache/deliverycachepointivt.js | 27 ++ .../views/wms/pdm/ivt/deliverycache/index.vue | 294 ++++++++++++++ .../wms/pdm/ivt/deliverypointivt/index.vue | 27 +- .../src/views/wms/sch/task/index.vue | 21 +- 53 files changed, 2746 insertions(+), 208 deletions(-) create mode 100644 lms/nladmin-system/src/main/java/org/nl/common/constants/ProduceAreaConstant.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/controller/DeliverycachepointivtController.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/package-info.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/IDeliverycachepointivtService.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/dao/Deliverycachepointivt.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/dao/mapper/DeliverycachepointivtMapper.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/dao/mapper/DeliverycachepointivtMapper.xml create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/dto/DeliveryConDto.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/dto/DeliverycachepointivtDto.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/dto/DeliverycachepointivtQuery.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/impl/DeliverycachepointivtServiceImpl.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/renovation/auto/package-info.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/renovation/constant/package-info.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/renovation/package-info.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/renovation/service/ReNbjService.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/renovation/service/impl/ReNbjServiceImpl.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/renovation/util/RenUtils.java create mode 100644 lms/nladmin-ui/src/views/wms/pdm/ivt/deliverycache/deliverycachepointivt.js create mode 100644 lms/nladmin-ui/src/views/wms/pdm/ivt/deliverycache/index.vue diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/dao/mapper/SchBaseTaskMapper.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/dao/mapper/SchBaseTaskMapper.java index dd5960fcb..4167abefb 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/dao/mapper/SchBaseTaskMapper.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/dao/mapper/SchBaseTaskMapper.java @@ -28,6 +28,8 @@ public interface SchBaseTaskMapper extends BaseMapper { */ List getTaskByPlanQzzNoAndDevice(String resourceName); + List getNbjEmptyTask(String productArea, String pointLocation); + /** * 检测点位起点的任务是否存在 * @param code diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/dao/mapper/SchBaseTaskMapper.xml b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/dao/mapper/SchBaseTaskMapper.xml index 0732f1748..3c636a31b 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/dao/mapper/SchBaseTaskMapper.xml +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/dao/mapper/SchBaseTaskMapper.xml @@ -28,4 +28,15 @@ AND is_delete = '0' AND point_code1 = #{code} + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/IschBaseTaskService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/IschBaseTaskService.java index 13b3e98b1..402ec636a 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/IschBaseTaskService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/IschBaseTaskService.java @@ -74,13 +74,19 @@ public interface IschBaseTaskService extends IService { */ List getTaskByPlanQzzNoAndDevice(String resourceName); - - /** *校验相同任务类型 */ List getExistTasks(List taskTypes); + /** + * 根据任务类型与状态获取任务数据 + * @param taskType + * @param taskStatus + * @return + */ + List getAllTaskByTypeAndStatus(String taskType, String taskStatus); + /** * 查找暂存位置是否有任务,包括桁架任务 * @param point / @@ -94,6 +100,14 @@ public interface IschBaseTaskService extends IService { * @return */ List checkHaveStartTask(String pointCode); + + /** + * 同区域、位置 的载具任务 010401 + * @param productArea 区域 + * @param pointLocation 上下位置 + * @return + */ + List getNbjEmptyTask(String productArea, String pointLocation); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/impl/SchBaseTaskServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/impl/SchBaseTaskServiceImpl.java index e7c0c6ce1..fba770d28 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/impl/SchBaseTaskServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/impl/SchBaseTaskServiceImpl.java @@ -146,6 +146,15 @@ public class SchBaseTaskServiceImpl extends ServiceImpl getAllTaskByTypeAndStatus(String taskType, String taskStatus) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SchBaseTask::getTask_status, taskStatus) + .eq(SchBaseTask::getIs_delete, IOSEnum.IS_NOTANDYES.code("否")) + .eq(SchBaseTask::getTask_type, taskType); + return list(queryWrapper); + } + @Override public Boolean checkHaveTaskByZcPoint(BstIvtCutpointivt point) { LambdaQueryWrapper lam = new QueryWrapper().lambda(); @@ -166,6 +175,11 @@ public class SchBaseTaskServiceImpl extends ServiceImpl getNbjEmptyTask(String productArea, String pointLocation) { + return schBaseTaskMapper.getNbjEmptyTask(productArea, pointLocation); + } + } 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 a63497329..c14ffcb6a 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 @@ -1951,7 +1951,7 @@ public class SlitterServiceImpl implements SlitterService { PdmBiSlittingproductionplan plan = slittingproductionplanService.getByContainerName(containerName); if (ObjectUtil.isEmpty(plan)) { plan = new PdmBiSlittingproductionplan(); - plan.setWorkorder_id(IdUtil.getSnowflake(1,1).nextIdStr()); + plan.setWorkorder_id(IdUtil.getSnowflake(1, 1).nextIdStr()); } // 公共部分插入 plan.setOrder_type("1"); @@ -1975,11 +1975,13 @@ public class SlitterServiceImpl implements SlitterService { plan.setIs_parent_ok("0"); plan.setIs_child_tz_ok("0"); plan.setIs_child_ps_ok("0"); + plan.setPaper_weight("0"); plan.setQzzno(""); plan.setIs_delete("0"); plan.setSale_order_name("-"); - plan.setIs_call("0"); - plan.setIs_paper_ok("1"); + plan.setIs_call("1"); + plan.setCall_time(DateUtil.now()); + plan.setIs_paper_ok(area.startsWith("B") ? "1" : "0"); plan.setFRP_model(""); plan.setFRP_material(""); plan.setFRP_description(""); @@ -1987,7 +1989,7 @@ public class SlitterServiceImpl implements SlitterService { plan.setPaper_tube_material(""); plan.setPaper_tube_description(""); // 区分位置创建 - if (i==0 && ObjectUtil.isNotEmpty(upLeftSizeK)) { + if (i == 0 && ObjectUtil.isNotEmpty(upLeftSizeK)) { // 上左 plan.setPaper_tube_or_FRP(upLeftSizeV.startsWith("48") ? "1" : "2"); String[] split = upLeftSizeK.split("\\|"); @@ -2009,7 +2011,7 @@ public class SlitterServiceImpl implements SlitterService { plan.setUp_or_down("1"); plan.setLeft_or_right("1"); } - if (i==1 && ObjectUtil.isNotEmpty(upRightSizeK)) { + if (i == 1 && ObjectUtil.isNotEmpty(upRightSizeK)) { // 上右 plan.setPaper_tube_or_FRP(upRightSizeV.startsWith("48") ? "1" : "2"); String[] split = upRightSizeK.split("\\|"); @@ -2031,7 +2033,7 @@ public class SlitterServiceImpl implements SlitterService { plan.setQzz_generation("5"); } } - if (i==2 && ObjectUtil.isNotEmpty(downLeftSizeK)) { + if (i == 2 && ObjectUtil.isNotEmpty(downLeftSizeK)) { // 下左 plan.setPaper_tube_or_FRP(downLeftSizeV.startsWith("48") ? "1" : "2"); String[] split = downLeftSizeK.split("\\|"); @@ -2053,7 +2055,7 @@ public class SlitterServiceImpl implements SlitterService { plan.setQzz_generation("5"); } } - if (i==4 && ObjectUtil.isNotEmpty(downRightSizeK)) { + if (i == 4 && ObjectUtil.isNotEmpty(downRightSizeK)) { // 下右 plan.setPaper_tube_or_FRP(downRightSizeV.startsWith("48") ? "1" : "2"); String[] split = downRightSizeK.split("\\|"); @@ -2075,29 +2077,31 @@ public class SlitterServiceImpl implements SlitterService { plan.setQzz_generation("5"); } } - if (i==0 && ObjectUtil.isEmpty(upLeftSizeK)) { + if (i == 0 && ObjectUtil.isEmpty(upLeftSizeK)) { plan.setIs_delete("1"); } - if (i==1 && ObjectUtil.isEmpty(upRightSizeK)) { + if (i == 1 && ObjectUtil.isEmpty(upRightSizeK)) { plan.setIs_delete("1"); } - if (i==2 && ObjectUtil.isEmpty(downLeftSizeK)) { + if (i == 2 && ObjectUtil.isEmpty(downLeftSizeK)) { plan.setIs_delete("1"); } - if (i==3 && ObjectUtil.isEmpty(downRightSizeK)) { + if (i == 3 && ObjectUtil.isEmpty(downRightSizeK)) { plan.setIs_delete("1"); } plans.add(plan); } slittingproductionplanService.saveOrUpdateBatch(plans); - // 机台打开 - LambdaUpdateWrapper lamu = new LambdaUpdateWrapper<>(); - lamu.set(StIvtCutpointivt::getIs_used, "1") - .set(StIvtCutpointivt::getUpdate_optid, SecurityUtils.getCurrentUserId()) - .set(StIvtCutpointivt::getUpdate_optname, SecurityUtils.getCurrentNickName()) - .set(StIvtCutpointivt::getUpdate_time, DateUtil.now()) - .eq(StIvtCutpointivt::getPoint_code, pointCode); - cutpointivtService.update(lamu); + if (area.startsWith("B")) { + // 机台打开 + LambdaUpdateWrapper lamu = new LambdaUpdateWrapper<>(); + lamu.set(StIvtCutpointivt::getIs_used, "1") + .set(StIvtCutpointivt::getUpdate_optid, SecurityUtils.getCurrentUserId()) + .set(StIvtCutpointivt::getUpdate_optname, SecurityUtils.getCurrentNickName()) + .set(StIvtCutpointivt::getUpdate_time, DateUtil.now()) + .eq(StIvtCutpointivt::getPoint_code, pointCode); + cutpointivtService.update(lamu); + } JSONObject res = new JSONObject(); res.put("status", HttpStatus.HTTP_OK); res.put("message", "呼叫送轴成功!"); diff --git a/lms/nladmin-system/src/main/java/org/nl/common/constants/ProduceAreaConstant.java b/lms/nladmin-system/src/main/java/org/nl/common/constants/ProduceAreaConstant.java new file mode 100644 index 000000000..1232e807d --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/common/constants/ProduceAreaConstant.java @@ -0,0 +1,28 @@ +package org.nl.common.constants; + +/** + * 区域枚举编码 + * @Author: lyd + * @Date: 2024/11/21 + */ +public class ProduceAreaConstant { + /** + * A1 + */ + public static final String A1 = "A1"; + + /** + * A2 + */ + public static final String A2 = "A2"; + + /** + * A3 + */ + public static final String A3 = "A3"; + + /** + * A4 + */ + public static final String A4 = "A4"; +} diff --git a/lms/nladmin-system/src/main/java/org/nl/system/service/coderule/impl/SysCodeRuleServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/system/service/coderule/impl/SysCodeRuleServiceImpl.java index e143efb7a..f9a98852f 100644 --- a/lms/nladmin-system/src/main/java/org/nl/system/service/coderule/impl/SysCodeRuleServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/system/service/coderule/impl/SysCodeRuleServiceImpl.java @@ -22,6 +22,7 @@ import org.nl.system.service.coderule.dao.mapper.SysCodeRuleMapper; import org.nl.system.service.coderule.utils.CodeRuleTypeEnum; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; diff --git a/lms/nladmin-system/src/main/java/org/nl/system/service/notice/impl/SysNoticeServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/system/service/notice/impl/SysNoticeServiceImpl.java index 7a1efeb18..51de17ff2 100644 --- a/lms/nladmin-system/src/main/java/org/nl/system/service/notice/impl/SysNoticeServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/system/service/notice/impl/SysNoticeServiceImpl.java @@ -24,6 +24,8 @@ import org.nl.system.service.notice.dao.SysNotice; import org.nl.system.service.notice.dao.mapper.SysNoticeMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.io.IOException; @@ -158,6 +160,7 @@ public class SysNoticeServiceImpl extends ServiceImpl sysNotices = sysNoticeMapper.selectList(new LambdaQueryWrapper() .eq(SysNotice::getNotice_title, title) diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java index 61408c116..527fc78d2 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java @@ -35,11 +35,6 @@ public class AcsToWmsController { return new ResponseEntity<>(acsToWmsService.receiveTaskStatusAcs(string), HttpStatus.OK); } - - - - - @PostMapping("/orderFinish") @Log(value = "ACS给WMS下发工单完成状态", isInterfaceLog = true, interfaceLogType = InterfaceLogType.ACS_TO_LMS) @@ -107,6 +102,11 @@ public class AcsToWmsController { return new ResponseEntity<>(acsToWmsService.sendGetGoalStruct(jo), HttpStatus.OK); } + /** + * 取货完成、放货完成、横移所请求的接口 + * @param jo + * @return + */ @PostMapping("/actionFinishRequest") @SaIgnore public ResponseEntity actionFinishRequest(@RequestBody JSONObject jo) { diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java index fa56b751e..ff3531279 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java @@ -72,7 +72,7 @@ public interface AcsToWmsService { /** * ACS客户端--->LMS服务端 - * 输送线光电无货上报 + * 输送线光电无货上报 - * * @param whereJson 条件 * @return JSONObject 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 2f77454e4..19152dc68 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 @@ -39,6 +39,7 @@ import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.*; import org.nl.common.enums.NoticeTypeEnum; import org.nl.common.enums.PackageInfoIvtEnum; import org.nl.common.utils.CodeUtil; +import org.nl.common.utils.MapOf; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; @@ -58,6 +59,7 @@ import org.nl.wms.sch.tasks.CutConveyorTask; import org.nl.wms.sch.tasks.EmptyVehicleTask; import org.nl.wms.sch.tasks.PaperTrussTask; import org.nl.wms.sch.tasks.SendOutTask; +import org.nl.wms.sch.tasks.renovation.util.RenUtils; import org.nl.wms.st.inbill.service.RawAssistIStorService; import org.nl.wms.st.inbill.service.StorPublicService; import org.nl.wms.st.instor.service.impl.HandMoveStorServiceImpl; @@ -1095,7 +1097,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { String device_code = whereJson.getString("device_code"); JSONObject result = new JSONObject(); - //桁架任务 + //桁架任务 (气胀轴任务) String task_code1 = whereJson.getString("task_code1"); //纸管任务 String task_code2 = whereJson.getString("task_code2"); @@ -1111,14 +1113,14 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { } else { product_area = task_jo.getString("product_area"); } - - String public_area = ""; - if (product_area.equals("A1") || product_area.equals("A2")) { - public_area = "A1"; - } - if (product_area.equals("A3") || product_area.equals("A4")) { - public_area = "A3"; - } + // hint: 不在设置公共位置 + String public_area = product_area; +// if (product_area.equals("A1") || product_area.equals("A2")) { +// public_area = "A1"; +// } +// if (product_area.equals("A3") || product_area.equals("A4")) { +// public_area = "A3"; +// } // point_type = '0' :穿拔轴点 JSONObject cbz_jo = WQLObject.getWQLObject("st_ivt_shaftivt").query("product_area = '" + product_area + "' AND point_type = '0'").uniqueResult(0); String cbz_size = cbz_jo.getString("qzz_size"); @@ -1165,6 +1167,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { } } else { if (cbz_size.equals(zg_size) && zg_generation.equals(cbz_generation)) { + // 尺寸、代数相同 //todo:反馈ACS可以进行穿轴 result.put("status", HttpStatus.OK.value()); result.put("is_bushing", "1"); @@ -1233,12 +1236,15 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { casingService.confirm(conrimd_jo); //查询当前输送线入口是否存在可用的载具 + // 分切输送线入口(IN点) JSONObject in_jo = WQLObject.getWQLObject("sch_base_point").query("product_area = '" + product_area + "' AND point_type = '6'").uniqueResult(0); String vehicle_code = in_jo.getString("vehicle_code"); if (StrUtil.isNotEmpty(vehicle_code)) { + // 表示in点有托盘 //判断是否存在010606 的任务存在 JSONObject in_task = WQLObject.getWQLObject("sch_base_task").query("task_type = '010606' AND product_area = '" + product_area + "' AND is_delete = '0' AND task_status < '07'").uniqueResult(0); if (ObjectUtil.isEmpty(in_task)) { + // todo: 如果托盘不可用,考虑更改任务托盘号所指定的位置 JSONObject vehicle_jo = WQLObject.getWQLObject("md_pb_vehiclearea").query("vehicle_code = '" + vehicle_code + "'").uniqueResult(0); if (vehicle_jo.getString("point_location").equals(point_location)) { //创建一个从套管工位到IN点的任务 @@ -1263,7 +1269,11 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { } } //todo:如果缓存位有可用库位,创建一个桁架任务从穿拔轴位到缓存位,否则不动 - JSONObject tz_jo = WQLObject.getWQLObject("st_ivt_shaftivt").query("product_area = '" + product_area + "' AND point_type = '2' AND have_qzz = '0' order by sort_seq").uniqueResult(0); + JSONObject tz_jo = WQLObject.getWQLObject("st_ivt_shaftivt") + .query("product_area = '" + product_area + + "' AND point_type = '2" + + "' AND have_qzz = '0'" + " AND is_used = '1'" + + " order by sort_seq").uniqueResult(0); if (ObjectUtil.isNotEmpty(tz_jo)) { JSONObject jo = new JSONObject(); jo.put("task_type", "010607"); @@ -1274,6 +1284,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { jo.put("vehicle_code", task_resq.getString("container_name1")); jo.put("truss_type", "1"); JSONObject request_param = new JSONObject(); + request_param.put("temp", "2"); request_param.put("need_size", cbz_size); request_param.put("need_generation", cbz_generation); request_param.put("need_location", point_location); @@ -1305,13 +1316,14 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { // 申请取货 if ("4".equals(type)) { //查询可用的空气涨轴点位 - struct_jo = WQL.getWO("QAUTO_QUERY").addParam("flag", "6") + struct_jo = WQL.getWO("QAUTO_QUERY").addParam("flag", "6002") .addParam("need_size", need_size) .addParam("need_generation", need_generation) .addParam("product_area", public_area) .process().uniqueResult(0); if (ObjectUtil.isEmpty(struct_jo)) { + // todo: 没有位置,需要找对应的分切车间输出??? noticeService.createNotice("任务:" + task_code1 + "气胀轴取货失败:" + need_size + "寸" + need_generation + "代气胀轴库存不足!", "气胀轴库存不足" , NoticeTypeEnum.EXCEPTION.getCode()); throw new BadRequestException("未查询到可用的气胀轴库存!"); @@ -1330,13 +1342,14 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { // 申请放货 if ("3".equals(type)) { //查询可用的空点位 - struct_jo = WQL.getWO("QAUTO_QUERY").addParam("flag", "7") + struct_jo = WQL.getWO("QAUTO_QUERY").addParam("flag", "6001") .addParam("need_size", have_size) .addParam("need_generation", have_generation) .addParam("product_area", public_area) .process().uniqueResult(0); if (ObjectUtil.isEmpty(struct_jo)) { + // todo: 没有位置,需要送到对应的分切车间??? throw new BadRequestException("未查询到可用的点位!"); } //更新任务 @@ -1419,11 +1432,47 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { return result; } + /** + * 创建呼叫空载具的任务 + * @param product_area + * @param point_location + * @return + */ + @Deprecated + private String doCallEmptyTask(String product_area, String point_location) { + JSONObject empty_vehicle = WQL.getWO("PDA_02") + .addParam("sql_str", " ORDER BY point_type, point_code") + .addParam("product_area", product_area) + .addParam("point_location", point_location) + .addParam("flag", "302").process().uniqueResult(0); + //如果查询到给ACS下发一个输送线任务 + // 创建输送线任务规则:(内测保持空载具、外侧先出的逻辑) + JSONObject form = new JSONObject(); + if (ObjectUtil.isEmpty(empty_vehicle)) { + // todo: 没有空载具情况不可能发生 + throw new BadRequestException("暂无空载具!!!"); + } else { + form.put("point_code1", empty_vehicle.getString("point_code")); + form.put("vehicle_code2", empty_vehicle.getString("vehicle_code")); + if (StrUtil.isEmpty(empty_vehicle.getString("vehicle_code"))) { + throw new BadRequestException("点位:" + empty_vehicle.getString("point_code") + "载具号为空!"); + } + } + //查询该区域点位类型为出口的点位 + JSONObject ss_jo = WQLObject.getWQLObject("sch_base_point").query("product_area = '" + product_area + "' AND point_type = '7'").uniqueResult(0); + form.put("point_code2", ss_jo.getString("point_code")); + form.put("task_type", "010401"); + form.put("product_area", product_area); + cutConveyorTask.createTask(form); + return ss_jo.getString("point_code"); + } + //创建气胀轴放货任务 private JSONObject createTask(JSONObject result, String product_area, JSONObject cbz_jo, String cbz_size, String cbz_generation) { JSONObject jo = new JSONObject(); jo.put("task_type", "010603"); jo.put("point_code1", cbz_jo.getString("point_code")); + // A1_FHD_01 JSONObject fhd_jo = WQLObject.getWQLObject("st_ivt_shaftivt").query("point_type = '7' AND product_area = '" + product_area + "'").uniqueResult(0); jo.put("point_code2", fhd_jo.getString("point_code")); jo.put("product_area", product_area); @@ -1553,6 +1602,12 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { return result; } + /** + * 判断等待 + * @param product_area + * @param vehicle_jo + * @return + */ private boolean judgeWait(String product_area, JSONObject vehicle_jo) { boolean need_wait = false; JSONArray task_rows = WQL.getWO("QAUTO_QUERY").addParam("flag", "8").addParam("product_area", product_area).process().getResultJSONArray(0); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java index 6cd2f400c..94d87f151 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java @@ -765,8 +765,9 @@ public class MesToLmsServiceImpl implements MesToLmsService { if (StrUtil.equals("1", Attribute2)) { //更新该子卷号对应的分切计划为已呼叫 - plan_jo.put("is_call", "1"); - plan_jo.put("call_time", DateUtil.now()); + // todo: 一切根据手动呼叫 +// plan_jo.put("is_call", "1"); +// plan_jo.put("call_time", DateUtil.now()); WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").update(plan_jo); } if (StrUtil.equals(is_mesTolms, "1")) { diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/rest/PaperTubeController.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/rest/PaperTubeController.java index 639be7403..c57bdbfa5 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/rest/PaperTubeController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/rest/PaperTubeController.java @@ -49,4 +49,15 @@ public class PaperTubeController { return new ResponseEntity<>(paperTubeService.queryPaperTubeInfo(whereJson), HttpStatus.OK); } + @PostMapping("/shaftGoBack") + @Log("气胀轴回库") + public ResponseEntity shaftGoBack(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(paperTubeService.shaftGoBack(whereJson), HttpStatus.OK); + } + @PostMapping("/callPaperShaft") + @Log("一期新呼叫送轴") + public ResponseEntity callPaperShaft(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(paperTubeService.callPaperShaft(whereJson), HttpStatus.OK); + } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/rest/ShippingController.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/rest/ShippingController.java index 06e0b83e9..1c6d77ddf 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/rest/ShippingController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/rest/ShippingController.java @@ -62,4 +62,20 @@ public class ShippingController { public ResponseEntity check(@RequestBody JSONObject whereJson) { return new ResponseEntity<>(shippingService.check(whereJson), HttpStatus.OK); } + + @PostMapping("/queryMaterialInfoL1400") + @Log("人工套轴>1400分切计划初始化查询") + public ResponseEntity queryMaterialInfoL1400(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(shippingService.queryMaterialInfoL1400(whereJson), HttpStatus.OK); + } + @PostMapping("/shaftRecedesL1400") + @Log("人工套轴>1400气胀轴退回") + public ResponseEntity shaftRecedesL1400(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(shippingService.shaftRecedesL1400(whereJson), HttpStatus.OK); + } + @PostMapping("/bushingDistributionL1400") + @Log("人工套轴>1400套轴配送") + public ResponseEntity bushingDistributionL1400(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(shippingService.bushingDistributionL1400(whereJson), HttpStatus.OK); + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/InService.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/InService.java index b4cd77300..c831ecfca 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/InService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/InService.java @@ -13,7 +13,7 @@ public interface InService { JSONObject queryMaterialInfo(JSONObject whereJson); /** - * 出站确认 + * 入站确认 * * @param whereJson / * @return JSONObject diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/PaperTubeService.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/PaperTubeService.java index a991552da..dc26d8d5d 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/PaperTubeService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/PaperTubeService.java @@ -37,4 +37,17 @@ public interface PaperTubeService { */ JSONObject queryPaperTubeInfo(JSONObject whereJson); + /** + * 气胀轴回库 + * @param whereJson + * @return + */ + JSONObject shaftGoBack(JSONObject whereJson); + + /** + * 呼叫送轴 + * @param param + * @return + */ + JSONObject callPaperShaft(JSONObject param); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/ShippingService.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/ShippingService.java index 05c1cbe63..feaa502b0 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/ShippingService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/ShippingService.java @@ -52,4 +52,24 @@ public interface ShippingService { */ JSONObject check(JSONObject whereJson); + /** + * 分切计划信息 + * @param whereJson + * @return + */ + JSONObject queryMaterialInfoL1400(JSONObject whereJson); + + /** + * 气胀轴退回 + * @param whereJson + * @return + */ + JSONObject shaftRecedesL1400(JSONObject whereJson); + + /** + * 人工套轴>1400套轴配送 + * @param whereJson + * @return + */ + JSONObject bushingDistributionL1400(JSONObject whereJson); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/CasingServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/CasingServiceImpl.java index eb4b86771..ba873f78a 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/CasingServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/CasingServiceImpl.java @@ -143,9 +143,9 @@ public class CasingServiceImpl implements CasingService { } //如果一个分切组只有两个子卷,则一定得分两根轴进行绑定 - if ((rows.size() == 2 || (rows.size() == 1 && case_rows.size() == 1)) && "1".equals(order_type)) { + if ("1".equals(order_type)) { JSONArray group_rows = WQLObject.getWQLObject("pdm_bi_slittingproductionplan").query("parent_container_name = '" + parent_container_name + "' AND split_group = '" + split_group + "' AND is_delete = '0'").getResultJSONArray(0); - if (group_rows.size() == 2) { + if (group_rows.size() == 2 && rows.size() == 2) { throw new BadRequestException("该分切组只有两个分切计划,请选择两个不同的轴进行绑定!"); } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/InServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/InServiceImpl.java index 87c9cd259..a43fe7be9 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/InServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/InServiceImpl.java @@ -14,6 +14,7 @@ import org.nl.wms.pda.mps.service.InService; import org.nl.wms.sch.manage.TaskStatusEnum; import org.nl.wms.sch.tasks.CutConveyorTask; import org.nl.wms.sch.tasks.CutTrussTask; +import org.nl.wms.sch.tasks.renovation.util.RenUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -28,6 +29,8 @@ public class InServiceImpl implements InService { @Override public JSONObject queryMaterialInfo(JSONObject whereJson) { + // 查询套好、配送到位的气胀轴 + // todo: 不再是st_ivt_deliverypointivt,而应该是找分切缓存架的数据 String product_area = whereJson.getString("product_area"); String device_code = whereJson.getString("device_code"); @@ -45,6 +48,9 @@ public class InServiceImpl implements InService { if (ObjectUtil.isNotEmpty(in_area_id)) { map.put("in_area_id", in_area_id); } + if (RenUtils.isOpenTzArea(product_area)) { + map.put("flag", "701"); + } JSONArray rows = WQL.getWO("PDA_02").addParamMap(map).process().getResultJSONArray(0); JSONObject jo = new JSONObject(); jo.put("data", rows); @@ -56,7 +62,7 @@ public class InServiceImpl implements InService { @Override @Transactional(rollbackFor = Exception.class) public JSONObject confirm(JSONObject whereJson) { - + // hint: 是从缓存架到设备 String point_code = whereJson.getString("point_code"); JSONObject cut_row = whereJson.getJSONObject("cut_rows"); @@ -78,10 +84,13 @@ public class InServiceImpl implements InService { jo.put("product_area", cut_ivt.getString("product_area")); jo.put("task_type", "010405"); char dtl_type = cut_row.getString("delivery_code").charAt(cut_row.getString("delivery_code").length() - 1); - //判断起点是否远离分切机 question: ??? - if (Integer.valueOf(String.valueOf(dtl_type)) % 2 == 0) { - jo.put("task_status", TaskStatusEnum.SURE_END.getCode()); - jo.put("point_code1", ""); + + if (!RenUtils.isOpenTzArea(cut_ivt.getString("product_area"))) { + //判断起点是否远离分切机 + if (Integer.valueOf(String.valueOf(dtl_type)) % 2 == 0) { + jo.put("task_status", TaskStatusEnum.SURE_END.getCode()); + jo.put("point_code1", ""); + } } cutTrussTask.createTask(jo); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/OutServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/OutServiceImpl.java index 37ffd68dd..a19e7cc38 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/OutServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/OutServiceImpl.java @@ -4,20 +4,32 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.nl.b_lms.pdm.bi.slittingproductionplan.service.IPdmBiSlittingproductionplanService; +import org.nl.b_lms.pdm.bi.slittingproductionplan.service.dao.PdmBiSlittingproductionplan; +import org.nl.b_lms.sch.tasks.slitter.constant.SlitterConstant; +import org.nl.common.utils.TaskUtils; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.wms.basedata.st.service.impl.UserAreaServiceImpl; import org.nl.wms.pda.mps.service.OutService; +import org.nl.wms.pdm.ivt.deliverycache.service.IDeliverycachepointivtService; +import org.nl.wms.pdm.ivt.deliverycache.service.dao.Deliverycachepointivt; +import org.nl.wms.pdm.ivt.deliverycache.service.dto.DeliveryConDto; import org.nl.wms.sch.manage.TaskStatusEnum; import org.nl.wms.sch.tasks.CutConveyorTask; import org.nl.wms.sch.tasks.CutTrussTask; +import org.nl.wms.sch.tasks.renovation.util.RenUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.HashMap; +import java.util.List; +import java.util.function.Consumer; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -25,6 +37,8 @@ import java.util.HashMap; public class OutServiceImpl implements OutService { private final CutTrussTask cutTrussTask; + private final IDeliverycachepointivtService deliverycachepointivtService; + private final IPdmBiSlittingproductionplanService slittingproductionplanService; @Override public JSONObject queryMaterialInfo(JSONObject whereJson) { @@ -116,6 +130,8 @@ public class OutServiceImpl implements OutService { throw new BadRequestException("未查询到对应的分切机!"); } + boolean isOpen = RenUtils.isOpenTzArea(cut_ivt.getString("product_area")); + if (!StrUtil.equals(rows.getJSONObject(0).getString("resource_name"), cut_ivt.getString("ext_code"))) { throw new BadRequestException("请选择和分切计划相同的设备点位进行下卷!"); } @@ -124,14 +140,105 @@ public class OutServiceImpl implements OutService { //判断是否末次下卷 if ("1".equals(is_last)) { + // hint: 最后一次下卷,到左边的输送线上,如果没有则到中转点 //查询该分切机邻近位置的空载具的输送线点位 + // 找内侧 JSONObject empty_vehicle = WQL.getWO("PDA_02") .addParam("sort_seq", cut_ivt.getString("sort_seq")) .addParam("sql_str", " ORDER BY abs(" + cut_ivt.getString("sort_seq") + "-sort_seq),point_code") .addParam("product_area", cut_ivt.getString("product_area")) .addParam("point_location", cut_ivt.getString("point_location")) .addParam("flag", "3").process().uniqueResult(0); + // 套好纸管的空轴点位 + Deliverycachepointivt dec = null; + List nextPlan = null; + if (isOpen) { + // 找下一趟 + // 这里还需要多加一步判断,有没有下一趟分切计划,需要在缓存架找到对应的管芯。 + List allPlans = slittingproductionplanService.list(new LambdaQueryWrapper() + .eq(order_type.equals("1"), PdmBiSlittingproductionplan::getParent_container_name, parent_container_name) + .eq(order_type.equals("2"), PdmBiSlittingproductionplan::getRestruct_container_name, restruct_container_name) + .eq(PdmBiSlittingproductionplan::getResource_name, resource_name) + .ne(PdmBiSlittingproductionplan::getSplit_group, split_group)); + if (allPlans.size() > 0) { + // 判断当前是分切机的什么位置(上/下) + if (cut_ivt.getString("up_point_code").equals(point_code)) { + // 上轴 + nextPlan = allPlans.stream().filter(p -> "1".equals(p.getUp_or_down())).collect(Collectors.toList()); + } else { + // 下轴 + nextPlan = allPlans.stream().filter(p -> "2".equals(p.getUp_or_down())).collect(Collectors.toList()); + } + if (nextPlan.size() > 0) { + // hint: 虚拟分切计划不动,直到搬运成功后清除点位时删除(*) + if (nextPlan.size() == 1) { + PdmBiSlittingproductionplan onePlan = nextPlan.get(0); + // 找单根单管 + List deliverycachepointivts = deliverycachepointivtService.getOneConformShaft( + onePlan.getPaper_tube_or_FRP().equals("1") ? onePlan.getPaper_tube_material() : onePlan.getFRP_material(), + cut_ivt.getString("product_area"), + cut_ivt.getString("point_location")); + if (deliverycachepointivts.size() > 0) { + dec = deliverycachepointivts.get(0); + } + } else { + PdmBiSlittingproductionplan onePlan = nextPlan.get(0); + PdmBiSlittingproductionplan twoPlan = nextPlan.get(1); + // 找单根双管 + List deliverycachepointivts = deliverycachepointivtService.getMoreConformShaft( + onePlan.getPaper_tube_or_FRP().equals("1") ? onePlan.getPaper_tube_material() : onePlan.getFRP_material(), + twoPlan.getPaper_tube_or_FRP().equals("1") ? twoPlan.getPaper_tube_material() : twoPlan.getFRP_material(), + cut_ivt.getString("product_area"), + cut_ivt.getString("point_location")); + if (deliverycachepointivts.size() > 0) { + dec = deliverycachepointivts.get(0); + } + } + } + // hint: 如果都不满足,就创建单下任务 + } + } + + if (ObjectUtil.isEmpty(empty_vehicle)) { + if (isOpen) { + // hint: 如果没有载具号,就需要创建到中转架的任务 + // mark:查找子卷缓存架的空位(固定:点位类型:03) + List caches = deliverycachepointivtService.getVolumeDeliveryCacheNoTask(DeliveryConDto.builder() + .area(cut_ivt.getString("product_area")) + .location(cut_ivt.getString("point_location")) + .pointStatus("01") + .sortSeq(cut_ivt.getString("sort_seq")) + .build()); + if (caches.size() > 0) { + Deliverycachepointivt cachePoint = caches.get(0); + JSONObject jo = new JSONObject(); + jo.put("point_code1", point_code); + jo.put("point_code2", cachePoint.getPoint_code()); + jo.put("vehicle_code", cut_qzzno); + jo.put("product_area", cut_ivt.getString("product_area")); + //分切机->子卷中转架 子卷出站 + jo.put("task_type", "010404"); + if (ObjectUtil.isNotEmpty(dec)) { + // 子卷出站、空轴进站的任务 + jo.put("point_code1", dec.getPoint_code()); + jo.put("point_code2", point_code); + jo.put("point_code3", cachePoint.getPoint_code()); + jo.put("point_code4", point_code); + jo.put("vehicle_code2", cut_qzzno); + jo.put("vehicle_code", dec.getQzzno()); + jo.put("task_type", "010403"); + } + cutTrussTask.createTask(jo); + JSONObject result = new JSONObject(); + result.put("message", "操作成功!"); + return result; + } + } +// throw new BadRequestException("未查询到可用的空载具或当前载具存在任务!!"); + } + // hint: 改造的内包间业务如果暂存架不存在才去校验外侧的位置。 //查询缓存位的空载具 + // 内测没有找外侧 if (ObjectUtil.isEmpty(empty_vehicle)) { empty_vehicle = WQL.getWO("PDA_02") .addParam("sort_seq", cut_ivt.getString("sort_seq")) @@ -140,7 +247,6 @@ public class OutServiceImpl implements OutService { .addParam("point_location", cut_ivt.getString("point_location")) .addParam("flag", "303").process().uniqueResult(0); } - if (ObjectUtil.isEmpty(empty_vehicle)) { throw new BadRequestException("未查询到可用的空载具或当前载具存在任务!!"); } @@ -156,12 +262,31 @@ public class OutServiceImpl implements OutService { jo.put("product_area", cut_ivt.getString("product_area")); //分切>输送线 子卷出站 jo.put("task_type", "010404"); + if (isOpen) { + if (ObjectUtil.isNotEmpty(dec)) { + // 子卷出站、空轴进站的任务 + jo.put("point_code1", dec.getPoint_code()); + jo.put("point_code2", point_code); + jo.put("point_code3", empty_vehicle.getString("point_code")); + jo.put("point_code4", point_code); + jo.put("vehicle_code", dec.getQzzno()); + jo.put("vehicle_code2", cut_qzzno); + jo.put("task_type", "010403"); + } + } char dtl_type = empty_vehicle.getString("point_code").charAt(empty_vehicle.getString("point_code").length() - 1); //判断起点是否远离分切机 if (Integer.valueOf(String.valueOf(dtl_type)) % 2 == 0) { jo.put("task_status", TaskStatusEnum.SURE_START.getCode()); - jo.put("point_code2", ""); +// jo.put("point_code2", ""); + if (isOpen) { + if (ObjectUtil.isNotEmpty(dec)) { + jo.put("point_code3", ""); + } + } else { + jo.put("point_code2", ""); + } } cutTrussTask.createTask(jo); @@ -169,30 +294,72 @@ public class OutServiceImpl implements OutService { String ext_code = cut_ivt.getString("ext_code"); //查询该机台编号已经配送完成,套轴完成但是未完成的分切计划 - JSONObject delivery_point = WQL.getWO("PDA_02").addParam("ext_code", ext_code).addParam("flag", "16").process().uniqueResult(0); + // 可能存在多个,故需要根据点位更新时间排序,关联点位已经不再是移栽台而是架子(新表)。 + // 如果近分切机一端没有空载具,需要下到桁架中转点。在获取气胀轴! + // todo: 查找下一条计划需要校验顺序。。。 + JSONObject delivery_point = WQL.getWO("PDA_02") + .addParam("ext_code", ext_code) + .addParam("flag", isOpen ? "1601" : "16") + .process().uniqueResult(0); + // todo: 查找下一趟分切计划 if (ObjectUtil.isEmpty(delivery_point)) { - throw new BadRequestException("分切机【" + ext_code + "】无配送完成的气涨轴!"); + throw new BadRequestException("分切机【" + ext_code + "】无配送完成的气涨轴,请勾选末次下卷!"); } - char dtl_type = delivery_point.getString("point_code").charAt(delivery_point.getString("point_code").length() - 1); - // 取空取满,放空放满 JSONObject jo = new JSONObject(); - jo.put("point_code1", delivery_point.getString("point_code")); - jo.put("point_code2", point_code); - jo.put("point_code3", point_code); - jo.put("point_code4", delivery_point.getString("point_code")); - jo.put("vehicle_code", delivery_point.getString("qzzno")); - jo.put("vehicle_code2", cut_qzzno); - jo.put("product_area", cut_ivt.getString("product_area")); - //判断起点是否远离分切机 - if (Integer.valueOf(String.valueOf(dtl_type)) % 2 == 0) { - jo.put("task_status", TaskStatusEnum.SURE_START.getCode()); - jo.put("point_code1", ""); - jo.put("point_code4", ""); + if (isOpen) { + // 查找输送线内测空载具的点位来放子卷,找不到则找中转点,找不到就报异常! + // 找内侧 + JSONObject empty_vehicle = WQL.getWO("PDA_02") + .addParam("sort_seq", cut_ivt.getString("sort_seq")) + .addParam("sql_str", " ORDER BY abs(" + cut_ivt.getString("sort_seq") + "-sort_seq),point_code") + .addParam("product_area", cut_ivt.getString("product_area")) + .addParam("point_location", cut_ivt.getString("point_location")) + .addParam("flag", "3").process().uniqueResult(0); + if (ObjectUtil.isEmpty(empty_vehicle)) { + // mark:查找子卷缓存架的空位(中转架) + List caches = deliverycachepointivtService.getVolumeDeliveryCacheNoTask(DeliveryConDto.builder() + .area(cut_ivt.getString("product_area")) + .location(cut_ivt.getString("point_location")) + .pointStatus("01") + .sortSeq(cut_ivt.getString("sort_seq")) + .build()); + if (caches.size() > 0) { + Deliverycachepointivt deliverycachepointivt = caches.get(0); + jo.put("point_code3", deliverycachepointivt.getPoint_code()); + } else { + throw new BadRequestException("请求失败,中转架与靠近分切机的输送线移栽台均没空载具位置,如果远离分切机有位置,则先手动横移!"); + } + } else { + jo.put("point_code3", empty_vehicle.getString("point_code")); + } + jo.put("point_code1", delivery_point.getString("point_code")); + jo.put("point_code2", point_code); + jo.put("point_code4", point_code); + jo.put("vehicle_code", delivery_point.getString("qzzno")); + jo.put("vehicle_code2", cut_qzzno); + jo.put("product_area", cut_ivt.getString("product_area")); + } else { + char dtl_type = delivery_point.getString("point_code").charAt(delivery_point.getString("point_code").length() - 1); + + jo.put("point_code1", delivery_point.getString("point_code")); + jo.put("point_code2", point_code); + jo.put("point_code3", point_code); + jo.put("point_code4", delivery_point.getString("point_code")); + jo.put("vehicle_code", delivery_point.getString("qzzno")); + jo.put("vehicle_code2", cut_qzzno); + jo.put("product_area", cut_ivt.getString("product_area")); + //判断起点是否远离分切机(等携带气胀轴的载具移到近分切机一端的任务(横移任务)完成后完善此下卷任务) + if (Integer.valueOf(String.valueOf(dtl_type)) % 2 == 0) { + jo.put("task_status", TaskStatusEnum.SURE_START.getCode()); + jo.put("point_code1", ""); + jo.put("point_code4", ""); + } } jo.put("task_type", "010403"); cutTrussTask.createTask(jo); + } JSONObject result = new JSONObject(); @@ -200,6 +367,56 @@ public class OutServiceImpl implements OutService { return result; } + public boolean doCheckUpShaft(String order_type, JSONObject cut_ivt, String parent_container_name, String restruct_container_name, + String resource_name, String split_group, String point_code) { + // 这里还需要多加一步判断,有没有下一趟分切计划,需要在缓存架找到对应的管芯。 + List allPlans = slittingproductionplanService.list(new LambdaQueryWrapper() + .eq(order_type.equals("1"), PdmBiSlittingproductionplan::getParent_container_name, parent_container_name) + .eq(order_type.equals("2"), PdmBiSlittingproductionplan::getRestruct_container_name, restruct_container_name) + .eq(PdmBiSlittingproductionplan::getResource_name, resource_name) + .ne(PdmBiSlittingproductionplan::getSplit_group, split_group)); + if (allPlans.size() > 0) { + List nextPlan = null; + // 判断当前是分切机的什么位置(上/下) + if (cut_ivt.getString("up_point_code").equals(point_code)) { + // 上轴 + nextPlan = allPlans.stream().filter(p -> "1".equals(p.getUp_or_down())).collect(Collectors.toList()); + } else { + // 下轴 + nextPlan = allPlans.stream().filter(p -> "2".equals(p.getUp_or_down())).collect(Collectors.toList()); + } + if (nextPlan.size() > 0) { + if (nextPlan.size() == 1) { + PdmBiSlittingproductionplan onePlan = nextPlan.get(0); + // 找单根单管 + List deliverycachepointivts = deliverycachepointivtService.getOneConformShaft( + onePlan.getPaper_tube_or_FRP().equals("1") ? onePlan.getPaper_tube_material() : onePlan.getFRP_material(), + cut_ivt.getString("product_area"), + cut_ivt.getString("point_location")); + if (deliverycachepointivts.size() > 0) { + Deliverycachepointivt dec = deliverycachepointivts.get(0); + + } + } else { + PdmBiSlittingproductionplan onePlan = nextPlan.get(0); + PdmBiSlittingproductionplan twoPlan = nextPlan.get(1); + // 找单根双管 + List deliverycachepointivts = deliverycachepointivtService.getMoreConformShaft( + onePlan.getPaper_tube_or_FRP().equals("1") ? onePlan.getPaper_tube_material() : onePlan.getFRP_material(), + twoPlan.getPaper_tube_or_FRP().equals("1") ? twoPlan.getPaper_tube_material() : twoPlan.getFRP_material(), + cut_ivt.getString("product_area"), + cut_ivt.getString("point_location")); + if (deliverycachepointivts.size() > 0) { + Deliverycachepointivt dec = deliverycachepointivts.get(0); + + } + } + + } + } + return true; + } + @Override @Transactional(rollbackFor = Exception.class) public JSONObject disuseConfirm(JSONObject whereJson) { diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/PaperTubeServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/PaperTubeServiceImpl.java index 6032ebb78..9dd8c6529 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/PaperTubeServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/PaperTubeServiceImpl.java @@ -1,20 +1,35 @@ package org.nl.wms.pda.mps.service.impl; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpStatus; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.nl.b_lms.pdm.bi.slittingproductionplan.service.IPdmBiSlittingproductionplanService; +import org.nl.b_lms.pdm.bi.slittingproductionplan.service.dao.PdmBiSlittingproductionplan; +import org.nl.b_lms.sch.point.dao.StIvtCutpointivt; +import org.nl.b_lms.sch.point.service.IstIvtCutpointivtService; +import org.nl.b_lms.sch.task.dao.SchBaseTask; +import org.nl.b_lms.sch.task.service.IschBaseTaskService; +import org.nl.common.utils.TaskUtils; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.wms.basedata.st.service.impl.UserAreaServiceImpl; import org.nl.wms.ext.acs.service.WmsToAcsService; import org.nl.wms.pda.mps.service.PaperTubeService; +import org.nl.wms.sch.tasks.PaperTrussTask; import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; @Service @RequiredArgsConstructor @@ -22,6 +37,10 @@ import java.util.HashMap; public class PaperTubeServiceImpl implements PaperTubeService { private final WmsToAcsService wmsToAcsService; + private final PaperTrussTask paperTrussTask; + private final IschBaseTaskService taskService; + private final IstIvtCutpointivtService cutpointivtService; + private final IPdmBiSlittingproductionplanService pdmBiSlittingproductionplanService; @Override public JSONObject queryDeviceList(JSONObject whereJson) { @@ -131,6 +150,165 @@ public class PaperTubeServiceImpl implements PaperTubeService { return result; } + @Override + public JSONObject shaftGoBack(JSONObject param) { + // param: area,qzz_size, qzz_generation + String area = param.getString("area"); + String qzzSize = param.getString("qzz_size"); + String qzzGeneration = param.getString("qzz_generation"); + String startPoint = area + "_RG_RGV"; + if (!area.startsWith("A")) { + throw new BadRequestException("此功能用于一期区域!"); + } + // 判断是否存在任务 + List tasks = taskService.checkHaveTask(startPoint); + if (tasks.size() > 0) { + throw new BadRequestException(startPoint + "任务已存在!"); + } + // A1_FHD_01 + JSONObject fhd_jo = WQLObject.getWQLObject("st_ivt_shaftivt").query("point_type = '7' AND product_area = '" + area + "'").uniqueResult(0); + JSONObject jo = new JSONObject(); + jo.put("task_type", "010603"); + jo.put("point_code1", startPoint); + jo.put("point_code2", fhd_jo.getString("point_code")); + jo.put("product_area", area); + jo.put("vehicle_code", DateUtil.format(DateUtil.date(), "HHmm") + "qzz"); + jo.put("truss_type", "8"); + JSONObject request_param = new JSONObject(); + request_param.put("have_size", qzzSize); + request_param.put("have_generation", qzzGeneration); + jo.put("request_param", request_param.toString()); + paperTrussTask.createTask(jo); + JSONObject result = new JSONObject(); + result.put("message", "操作成功!"); + return result; + } + + @Override + public JSONObject callPaperShaft(JSONObject param) { + log.info("一期新呼叫套轴:{}", param); +// 纸制筒管|纸管|6英寸|1300 +// 纸制筒管|纸管|3英寸|12|650 +// 玻璃纤维及其制品|FRP管|6英寸|15-20|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 + // location, qzz_size, qzz_generation + // 虚拟设备:A1_XNFQ_01 + String area = param.getString("area"); + if (!area.startsWith("A")) { + throw new BadRequestException("该功能只对一期有用!"); + } + String location = param.getString("location"); + String qzz_generation = param.getString("qzz_generation"); + StIvtCutpointivt xnDevice = cutpointivtService.getOne(new LambdaQueryWrapper() + .eq(StIvtCutpointivt::getPoint_location, location) + .eq(StIvtCutpointivt::getProduct_area, area) + .eq(StIvtCutpointivt::getIs_used, "1") + .eq(StIvtCutpointivt::getQzz_generation, qzz_generation) + .like(StIvtCutpointivt::getPoint_code, "XN")); + if (ObjectUtil.isEmpty(xnDevice)) { + throw new BadRequestException("该半区的虚拟设备不存在!"); + } + // mes的设备号 + String deviceCode = xnDevice.getExt_code(); + Integer number = param.getInteger("qqz_num"); + // 当前轴需要的管芯名称 ... + String upLeftSizeK = param.getString("up_left_size_k"); + String upRightSizeK = param.getString("up_right_size_k"); + String upLeftSizeV = param.getString("up_left_size_v"); + String upRightSizeV = param.getString("up_right_size_v"); + // 判断是单管还是双管 + Integer paperNum = (ObjectUtil.isNotEmpty(upLeftSizeK) && ObjectUtil.isNotEmpty(upRightSizeK)) ? 2 : 1; + List plans = new ArrayList<>(); + // 虚拟计划 + for (int i = 0; i < number; i++) { + String parentContainer = area + "M虚拟" + i + TaskUtils.getDateTime("yyMMddHHmmss"); + String now = DateUtil.now(); + for (int j = 0; j < paperNum; j++) { + PdmBiSlittingproductionplan plan = new PdmBiSlittingproductionplan(); + plan.setWorkorder_id(IdUtil.getSnowflake(1, 1).nextIdStr()); + // 公共部分插入 + plan.setOrder_type("1"); + plan.setContainer_name(area + "Z虚拟" + i + TaskUtils.getDateTime("yyMMddHHmmss") + j); + plan.setProduct_name("220890200000001"); + plan.setDescription("虚拟卷"); + plan.setParent_container_name(parentContainer); + plan.setRestruct_container_name(""); + plan.setWare_house("1"); + plan.setResource_name(deviceCode); + plan.setSplit_group("A"); + plan.setManufacture_sort("P1"); + plan.setMfg_order_name("-"); + plan.setManufacture_date(DateUtil.format(DateUtil.date(), "yyyy-MM-dd")); + plan.setSplit_breadth(new BigDecimal("999")); + plan.setSplit_height(new BigDecimal("999")); + plan.setSplit_weight(new BigDecimal("999")); + plan.setStart_time(now); + plan.setEnd_time(""); + plan.setStatus("01"); + plan.setIs_parent_ok("0"); + plan.setIs_child_tz_ok("0"); + plan.setIs_child_ps_ok("0"); + plan.setPaper_weight("0"); + plan.setQzzno(""); + plan.setIs_delete("0"); + plan.setSale_order_name("-"); + plan.setIs_call("1"); + plan.setCall_time(now); + plan.setIs_paper_ok(area.startsWith("B") ? "1" : "0"); + plan.setFRP_model(""); + plan.setFRP_material(""); + plan.setFRP_description(""); + plan.setPaper_tube_model(""); + plan.setPaper_tube_material(""); + plan.setPaper_tube_description(""); + plan.setQzz_generation(qzz_generation); + // 特殊数据 + // 区分位置创建 + if (ObjectUtil.isNotEmpty(upLeftSizeK)) { + // 上左 + plan.setPaper_tube_or_FRP(upLeftSizeV.startsWith("48") ? "1" : "2"); + String[] split = upLeftSizeK.split("\\|"); + plan.setQzz_size(String.valueOf(split[2].charAt(0))); + if ("1".equals(plan.getPaper_tube_or_FRP())) { + plan.setPaper_tube_material(upLeftSizeV); + plan.setPaper_tube_model(upLeftSizeK); + plan.setPaper_tube_description(upLeftSizeK); + } else { + plan.setFRP_material(upLeftSizeV); + plan.setFRP_model(upLeftSizeK); + plan.setFRP_description(upLeftSizeK); + } + plan.setUp_or_down("1"); + plan.setLeft_or_right("1"); + } + if ( ObjectUtil.isNotEmpty(upRightSizeK)) { + // 上右 + plan.setPaper_tube_or_FRP(upRightSizeV.startsWith("48") ? "1" : "2"); + String[] split = upRightSizeK.split("\\|"); + plan.setQzz_size(String.valueOf(split[2].charAt(0))); + if ("1".equals(plan.getPaper_tube_or_FRP())) { + plan.setPaper_tube_material(upRightSizeV); + plan.setPaper_tube_model(upRightSizeK); + plan.setPaper_tube_description(upRightSizeK); + } else { + plan.setFRP_material(upRightSizeV); + plan.setFRP_model(upRightSizeK); + plan.setFRP_description(upRightSizeK); + } + plan.setUp_or_down("1"); + plan.setLeft_or_right("2"); + } + plans.add(plan); + } + } + pdmBiSlittingproductionplanService.saveBatch(plans); + JSONObject res = new JSONObject(); + res.put("status", HttpStatus.HTTP_OK); + res.put("message", "呼叫送轴成功!"); + return res; + } + @Override public JSONObject queryPaperMaterial(JSONObject whereJson) { String material_code = whereJson.getString("material_code"); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/ShippingServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/ShippingServiceImpl.java index e19e330a2..27bdf6ff6 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/ShippingServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/ShippingServiceImpl.java @@ -1,21 +1,28 @@ package org.nl.wms.pda.mps.service.impl; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.nl.b_lms.sch.task.dao.SchBaseTask; +import org.nl.b_lms.sch.task.service.IschBaseTaskService; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.wms.basedata.st.service.impl.UserAreaServiceImpl; import org.nl.wms.pda.mps.service.ShippingService; import org.nl.wms.sch.tasks.CutConveyorTask; +import org.nl.wms.sch.tasks.PaperTrussTask; +import org.nl.wms.sch.tasks.renovation.util.RenUtils; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.HashMap; +import java.util.List; @Service @RequiredArgsConstructor @@ -23,6 +30,9 @@ import java.util.HashMap; public class ShippingServiceImpl implements ShippingService { private final CutConveyorTask cutConveyorTask; + private final PaperTrussTask paperTrussTask; + + private final IschBaseTaskService taskService; @Override public JSONObject queryMaterialInfo(JSONObject whereJson) { @@ -91,6 +101,7 @@ public class ShippingServiceImpl implements ShippingService { @Override @Transactional(rollbackFor = Exception.class) public JSONObject confirm(JSONObject whereJson) { + // todo: 输送线配送套好轴的气胀轴到分切车间(分切机对面的移栽台位置-这里需要注意,任务完成之后需要创建桁架任务挪到空轴取轴位) // 分切计划 JSONArray rows = whereJson.getJSONArray("cut_rows"); // 载具号 @@ -194,7 +205,7 @@ public class ShippingServiceImpl implements ShippingService { .addParam("product_area", product_area) .addParam("point_location", point_location) .process().getResultJSONArray(0); - + // todo: 输送线最大负荷需要重新定义-需要能够配置 if (cut_rows.size() > 3) { if ("0".equals(point_location)) { throw new BadRequestException("已超过上半段输送线最大负荷任务数,请等下一子卷送出再进行配送,并将该空载具送回!"); @@ -203,20 +214,30 @@ public class ShippingServiceImpl implements ShippingService { throw new BadRequestException("已超过下半段输送线最大负荷任务数,请等下一子卷送出再进行配送,并将该空载具送回!"); } } - // todo: 载具的存放有个规则??? - JSONObject vehicle_area = WQLObject.getWQLObject("md_pb_vehiclearea").query("product_area = '" + product_area + "' AND point_location = '" + point_location + "' AND vehicle_code = '" + vehicle_code + "'").uniqueResult(0); + JSONObject vehicle_area = WQLObject.getWQLObject("md_pb_vehiclearea") + .query("product_area = '" + product_area + "' AND point_location = '" + point_location + + "' AND vehicle_code = '" + vehicle_code + "'").uniqueResult(0); if (ObjectUtil.isEmpty(vehicle_area)) { throw new BadRequestException("该气涨轴无法放在该载具上!"); } //查询离该分切计划包含机台最近的一个空点位 - JSONObject empty_point = WQL.getWO("PDA_02") - .addParam("sql_str", " ORDER BY abs(" + plan_jo.getString("sort_seq") + "-sort_seq),point_code") - .addParam("product_area", plan_jo.getString("product_area")) - .addParam("point_location", plan_jo.getString("point_location")) - .addParam("flag", "4").process().uniqueResult(0); - + // hint: 只能在外侧point_type=01 + JSONObject empty_point; + if (RenUtils.isOpenTzArea(product_area)) { + empty_point = WQL.getWO("PDA_02") + .addParam("sql_str", " ORDER BY abs(" + plan_jo.getString("sort_seq") + "-sort_seq),point_code") + .addParam("product_area", plan_jo.getString("product_area")) + .addParam("point_location", plan_jo.getString("point_location")) + .addParam("flag", "401").process().uniqueResult(0); + } else { + empty_point = WQL.getWO("PDA_02") + .addParam("sql_str", " ORDER BY abs(" + plan_jo.getString("sort_seq") + "-sort_seq),point_code") + .addParam("product_area", plan_jo.getString("product_area")) + .addParam("point_location", plan_jo.getString("point_location")) + .addParam("flag", "4").process().uniqueResult(0); + } if (ObjectUtil.isEmpty(empty_point)) { throw new BadRequestException("未查询到可用的空点位!"); } @@ -265,11 +286,11 @@ public class ShippingServiceImpl implements ShippingService { WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").update(row); } - if (Integer.valueOf(String.valueOf(dtl_type)) % 2 == 0) { - //如果是右边的任务,判断左边是否存在空载具且没任务,如果存在则把左边的空载具送出 + // hint: 改造后的右边一定存放的是空载具 + if (Integer.valueOf(String.valueOf(dtl_type)) % 2 == 0 && !RenUtils.isOpenTzArea(product_area)) { + //如果是右边(外侧)的任务,判断左边是否存在空载具且没任务,如果存在则把左边的空载具送出 JSONObject left_point = WQLObject.getWQLObject("st_ivt_deliverypointivt").query("point_location = '" + empty_point.getString("point_location") + "' AND product_area = '" + empty_point.getString("product_area") + "' AND sort_seq = '" + empty_point.getString("sort_seq") + "' order by point_code").uniqueResult(0); JSONObject task_jo = WQLObject.getWQLObject("sch_base_task").query("(point_code1 = '" + left_point.getString("point_code") + "' OR point_code2 = '" + left_point.getString("point_code") + "') AND task_status < '07' AND is_delete = '0'").uniqueResult(0); - // todo: 载具横移??? if (ObjectUtil.isEmpty(task_jo) && "02".equals(left_point.getString("point_status"))) { //如果查询到给ACS下发一个输送线任务 JSONObject form2 = new JSONObject(); @@ -480,4 +501,123 @@ public class ShippingServiceImpl implements ShippingService { jo.put("message", "校验无误,可以进行配送!"); return jo; } + + @Override + public JSONObject queryMaterialInfoL1400(JSONObject whereJson) { + String product_area = whereJson.getString("product_area"); + String device_code = whereJson.getString("device_code"); + + HashMap map = new HashMap(); + map.put("flag", "602"); + if (StrUtil.isNotEmpty(product_area)) { + map.put("product_area", product_area); + } + if (StrUtil.isNotEmpty(device_code)) { + map.put("device_code", device_code); + } + //获取人员对应的区域 + UserAreaServiceImpl userAreaService = new UserAreaServiceImpl(); + String in_area_id = userAreaService.getInArea(); + if (ObjectUtil.isNotEmpty(in_area_id)) { + map.put("in_area_id", in_area_id); + } + JSONArray rows = WQL.getWO("PDA_02").addParamMap(map).process().getResultJSONArray(0); + JSONObject jo = new JSONObject(); + jo.put("data", rows); + jo.put("message", "操作成功!"); + return jo; + } + + @Override + public JSONObject shaftRecedesL1400(JSONObject param) { + // param: product_area、qzz_size、qzz_generation、start_point + String product_area = param.getString("product_area"); + String qzzSize = param.getString("qzz_size"); + String qzzGeneration = param.getString("qzz_generation"); + String startPoint = param.getString("start_point"); + // 创建桁架任务 + JSONObject jo = new JSONObject(); + jo.put("task_type", "010603"); + jo.put("point_code1", startPoint); + // A1_FHD_01 + JSONObject fhd_jo = WQLObject.getWQLObject("st_ivt_shaftivt").query("point_type = '7' AND product_area = '" + product_area + "'").uniqueResult(0); + jo.put("point_code2", fhd_jo.getString("point_code")); + jo.put("product_area", product_area); + jo.put("vehicle_code", DateUtil.format(DateUtil.date(), "HHmm") + "qzz"); + jo.put("truss_type", "8"); + JSONObject request_param = new JSONObject(); + request_param.put("have_size", qzzSize); + request_param.put("have_generation", qzzGeneration); + jo.put("request_param", request_param.toString()); + paperTrussTask.createTask(jo); + JSONObject result = new JSONObject(); + result.put("status", HttpStatus.OK.value()); + result.put("is_bushing", "0"); + result.put("message", "请求成功!"); + return result; + } + + @Deprecated + @Override + public JSONObject bushingDistributionL1400(JSONObject param) { + // param: product_area、qzz_size、qzz_generation、start_point、rows + String product_area = param.getString("product_area"); + String qzzSize = param.getString("qzz_size"); + String qzzGeneration = param.getString("qzz_generation"); + String startPoint = param.getString("start_point"); + JSONArray rows = param.getJSONArray("rows"); + if (rows.size() == 0) { + throw new BadRequestException("请至少选择一个分切计划!"); + } + List tasks = taskService.checkHaveTask(startPoint); + if (tasks.size() > 0) { + throw new BadRequestException("点位[" + startPoint + "]已经创建过任务!"); + } + String split_group = ""; + String resource_name = ""; + String order_type = ""; + String parent_container_name = ""; + String restruct_container_name = ""; + String package_box_sn = ""; + + //对子卷任务进行校验,最多就两个 + for (int i = 0; i < rows.size(); i++) { + JSONObject row = rows.getJSONObject(i); + if (StrUtil.isEmpty(split_group)) { + split_group = row.getString("split_group"); + resource_name = row.getString("resource_name"); + order_type = row.getString("order_type"); + if ("1".equals(order_type)) { + parent_container_name = row.getString("parent_container_name"); + } else { + restruct_container_name = row.getString("restruct_container_name"); + package_box_sn = row.getString("package_box_sn"); + } + } else { + if (!split_group.equals(row.getString("split_group"))) { + throw new BadRequestException("两个分切计划的分切组必须相同!"); + } + if (!resource_name.equals(row.getString("resource_name"))) { + throw new BadRequestException("两个分切计划的机台编号必须相同!"); + } + if ("1".equals(order_type)) { + if (!parent_container_name.equals(row.getString("parent_container_name"))) { + throw new BadRequestException("两个分切计划的母卷号必须相同!"); + } + } else { + if (!restruct_container_name.equals(row.getString("restruct_container_name")) || !package_box_sn.equals(row.getString("package_box_sn"))) { + throw new BadRequestException("两个分切计划的改制子卷必须相同!"); + } + } + } + } + JSONObject demoPlanObject = rows.getJSONObject(0); + String point_location = demoPlanObject.getString("point_location"); + // 呼叫空载具 + + + // 创建桁架任务 010609 + + return null; + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/wql/PDA_02.wql b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/wql/PDA_02.wql index 79f8dd9ae..173e50cdd 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/wql/PDA_02.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/wql/PDA_02.wql @@ -254,6 +254,26 @@ ENDSELECT ENDQUERY ENDIF + IF 输入.flag = "401" + QUERY + SELECT + ivt.* + FROM + st_ivt_deliverypointivt ivt + WHERE + point_status = '01' + AND ivt.is_used = '1' + AND ivt.point_type = '01' + OPTION 输入.product_area <> "" + ivt.product_area = 输入.product_area + ENDOPTION + OPTION 输入.point_location <> "" + ivt.point_location = 输入.point_location + ENDOPTION + 输入.sql_str + ENDSELECT + ENDQUERY + ENDIF IF 输入.flag = "5" QUERY @@ -321,6 +341,39 @@ ENDSELECT ENDQUERY ENDIF + IF 输入.flag = "602" + QUERY + SELECT + plan.*, + ivt.point_code, + ivt.sort_seq, + ivt.product_area, + ivt.point_location + FROM + PDM_BI_SlittingProductionPlan plan + LEFT JOIN st_ivt_cutpointivt ivt ON ivt.ext_code = plan.resource_name + WHERE + plan.STATUS = '01' + AND + is_child_tz_ok = 0 + AND + is_child_ps_ok = 0 + AND + plan.is_delete = '0' + OPTION 输入.in_area_id <> "" + ivt.product_area in 输入.in_area_id + ENDOPTION + OPTION 输入.product_area <> "" + ivt.product_area = 输入.product_area + ENDOPTION + OPTION 输入.device_code <> "" + ivt.point_code = 输入.device_code + ENDOPTION + AND (( FRP_description IS NOT NULL AND FRP_description != '' AND CAST( SUBSTRING_INDEX( FRP_description, '|', - 1 ) AS UNSIGNED ) > 1400 ) + OR ( paper_tube_description IS NOT NULL AND paper_tube_description != '' AND CAST( SUBSTRING_INDEX( paper_tube_description, '|', - 1 ) AS UNSIGNED ) > 1400 )) + ENDSELECT + ENDQUERY + ENDIF IF 输入.flag = "601" QUERY @@ -408,6 +461,46 @@ ENDQUERY ENDIF + IF 输入.flag = "701" + QUERY + SELECT + plan.mfg_order_name, + plan.container_name, + cut.point_code, + plan.split_group, + plan.manufacture_sort, + plan.manufacture_date, + (case when plan.is_child_ps_ok = '1' then '是' else '否' end) AS is_child_ps_ok, + del.point_code AS delivery_code, + del.qzzno, + cut.ext_code, + plan.resource_name + FROM + st_ivt_deliverycachepointivt del + LEFT JOIN pdm_bi_slittingproductionplan plan ON plan.qzzno = del.qzzno + LEFT JOIN st_ivt_cutpointivt cut ON cut.ext_code = plan.resource_name + WHERE + del.point_status = '03' + AND + plan.is_child_ps_ok = '1' + AND + plan.status = '03' + AND del.is_used = '1' + AND + plan.is_delete = '0' + OPTION 输入.in_area_id <> "" + del.product_area in 输入.in_area_id + ENDOPTION + OPTION 输入.product_area <> "" + del.product_area = 输入.product_area + ENDOPTION + OPTION 输入.device_code <> "" + cut.point_code = 输入.device_code + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + IF 输入.flag = "8" QUERY SELECT @@ -673,6 +766,33 @@ ENDQUERY ENDIF + IF 输入.flag = "1601" + QUERY + SELECT + del.* + FROM + pdm_bi_slittingproductionplan plan + LEFT JOIN st_ivt_deliverycachepointivt del ON del.qzzno = plan.qzzno + WHERE + is_child_tz_ok = '1' + AND + is_child_ps_ok = '1' + AND + `status` = '03' + AND + plan.is_delete = '0' + AND + del.point_status = '03' + AND + del.is_used = '1' + OPTION 输入.ext_code <> "" + plan.resource_name = 输入.ext_code + ENDOPTION + order by plan.manufacture_sort,del.point_code,plan.split_group + ENDSELECT + ENDQUERY + ENDIF + IF 输入.flag = "17" QUERY SELECT @@ -853,5 +973,47 @@ ENDQUERY ENDIF + IF 输入.flag = "24" + QUERY + SELECT + plan.* + FROM + pdm_bi_slittingproductionplan plan + LEFT JOIN st_ivt_cutpointivt cut ON cut.ext_code = plan.resource_name + WHERE + `status` = '01' + AND is_call = '1' + AND order_type = '1' + AND IFNULL( call_time, '' ) <> '' + AND is_delete = '0' + AND cut.product_area = 输入.product_area + AND cut.point_location = 输入.point_location + AND resource_name = '' + AND is_child_ps_ok = '0' + AND is_child_tz_ok = '0' + AND (( FRP_description IS NOT NULL AND FRP_description != '' AND CAST( SUBSTRING_INDEX( FRP_description, '|', - 1 ) AS UNSIGNED ) > 1400 ) + OR ( paper_tube_description IS NOT NULL AND paper_tube_description != '' AND CAST( SUBSTRING_INDEX( paper_tube_description, '|', - 1 ) AS UNSIGNED ) > 1400 )) + UNION + SELECT + plan.* + FROM + pdm_bi_slittingproductionplan plan + LEFT JOIN st_ivt_cutpointivt cut ON cut.ext_code = plan.resource_name + WHERE + `status` = '01' + AND is_call = '1' + AND order_type = '2' + AND IFNULL( call_time, '' ) <> '' + AND is_delete = '0' + AND cut.product_area = 输入.product_area + AND cut.point_location = 输入.point_location + AND resource_name = '' + AND is_child_ps_ok = '0' + AND is_child_tz_ok = '0' + AND (( FRP_description IS NOT NULL AND FRP_description != '' AND CAST( SUBSTRING_INDEX( FRP_description, '|', - 1 ) AS UNSIGNED ) > 1400 ) + OR ( paper_tube_description IS NOT NULL AND paper_tube_description != '' AND CAST( SUBSTRING_INDEX( paper_tube_description, '|', - 1 ) AS UNSIGNED ) > 1400 )) + ENDSELECT + ENDQUERY + ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/controller/DeliverycachepointivtController.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/controller/DeliverycachepointivtController.java new file mode 100644 index 000000000..6c84bb3cc --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/controller/DeliverycachepointivtController.java @@ -0,0 +1,60 @@ +package org.nl.wms.pdm.ivt.deliverycache.controller; + +import lombok.extern.slf4j.Slf4j; +import org.nl.common.TableDataInfo; +import org.nl.common.domain.query.PageQuery; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.pdm.ivt.deliverycache.service.IDeliverycachepointivtService; +import org.nl.wms.pdm.ivt.deliverycache.service.dao.Deliverycachepointivt; +import org.nl.wms.pdm.ivt.deliverycache.service.dto.DeliverycachepointivtQuery; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; +import java.util.Set; +/** +* @author lyd +* @date 2024-11-21 +**/ +@Slf4j +@RestController +@RequestMapping("/api/deliverycachepointivt") +public class DeliverycachepointivtController { + + @Autowired + private IDeliverycachepointivtService deliverycachepointivtService; + + @GetMapping + @Log("查询分切缓存架") + //@SaCheckPermission("@el.check('deliverycachepointivt:list')") + public ResponseEntity query(DeliverycachepointivtQuery deliverycachepointivtQuery, PageQuery page){ + return new ResponseEntity<>(TableDataInfo.build(deliverycachepointivtService.queryAll(deliverycachepointivtQuery,page)),HttpStatus.OK); + } + + @PostMapping + @Log("新增分切缓存架") + //@SaCheckPermission("@el.check('deliverycachepointivt:add')") + public ResponseEntity create(@Validated @RequestBody Deliverycachepointivt entity){ + deliverycachepointivtService.create(entity); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改分切缓存架") + //@SaCheckPermission("@el.check('deliverycachepointivt:edit')") + public ResponseEntity update(@Validated @RequestBody Deliverycachepointivt entity){ + deliverycachepointivtService.update(entity); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除分切缓存架") + //@SaCheckPermission("@el.check('deliverycachepointivt:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Set ids) { + deliverycachepointivtService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/package-info.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/package-info.java new file mode 100644 index 000000000..83733373e --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/package-info.java @@ -0,0 +1,6 @@ +/** + * 分切缓存架 - mp + * @Author: lyd + * @Date: 2024/11/21 + */ +package org.nl.wms.pdm.ivt.deliverycache; diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/IDeliverycachepointivtService.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/IDeliverycachepointivtService.java new file mode 100644 index 000000000..6087806f9 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/IDeliverycachepointivtService.java @@ -0,0 +1,87 @@ +package org.nl.wms.pdm.ivt.deliverycache.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.common.domain.query.PageQuery; +import org.nl.wms.pdm.ivt.deliverycache.service.dao.Deliverycachepointivt; +import org.nl.wms.pdm.ivt.deliverycache.service.dto.DeliveryConDto; +import org.nl.wms.pdm.ivt.deliverycache.service.dto.DeliverycachepointivtQuery; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** +* @description 服务接口 +* @author lyd +* @date 2024-11-21 +**/ +public interface IDeliverycachepointivtService extends IService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param pageable 分页参数 + * @return IPage + */ + IPage queryAll(DeliverycachepointivtQuery whereJson, PageQuery pageable); + + /** + * 创建 + * @param entity / + */ + void create(Deliverycachepointivt entity); + + /** + * 编辑 + * @param entity / + */ + void update(Deliverycachepointivt entity); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(Set ids); + + /** + * 获取缓存架子没有任务的点位 + * @param conDto 参数实体 + * @return + */ + List getDeliveryCacheByConditionsAndNoTask(DeliveryConDto conDto); + + /** + * 根据编码获取缓存架点位 + * @param code 点位 + * @param flag 是否判断启用 + * @return + */ + Deliverycachepointivt getOneByPointCode(String code, boolean flag); + + /** + * 获取对应区域的子卷中转架 + * @param conDto + * @return + */ + List getVolumeDeliveryCacheNoTask(DeliveryConDto conDto); + + /** + * 获取缓存架符合的气胀轴 + * @param code 管芯编码 + * @param area 区域 + * @param location 位置 + * @return + */ + List getOneConformShaft(String code, String area, String location); + + /** + * 获取缓存架一轴两管的位置 + * @param gxCode1 + * @param gcCode2 + * @param area + * @param location + * @return + */ + List getMoreConformShaft(String gxCode1, String gcCode2, String area, String location); +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/dao/Deliverycachepointivt.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/dao/Deliverycachepointivt.java new file mode 100644 index 000000000..66e5083dd --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/dao/Deliverycachepointivt.java @@ -0,0 +1,123 @@ +package org.nl.wms.pdm.ivt.deliverycache.service.dao; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author lyd + * @description / + * @date 2024-11-21 + **/ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("st_ivt_deliverycachepointivt") +public class Deliverycachepointivt implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ivt_id", type = IdType.NONE) + /** 库存记录标识 */ + private String ivt_id; + + /** + * 点位编码 + */ + private String point_code; + + /** + * 生产区域 + */ + private String product_area; + + /** + * 气涨轴 + */ + private String qzzno; + + /** + * 点位状态 + */ + private String point_status; + + /** + * 点位类型 + */ + private String point_type; + + /** + * 位置 + */ + private String point_location; + + /** + * 顺序号 + */ + private BigDecimal sort_seq; + + /** + * 是否启用 + */ + private String is_used; + + /** + * 备注 + */ + private String remark; + + /** + * 创建人 + */ + private String create_id; + + /** + * 创建人姓名 + */ + private String create_name; + + /** + * 创建时间 + */ + private String create_time; + + /** + * 修改人 + */ + private String update_optid; + + /** + * 修改人姓名 + */ + private String update_optname; + + /** + * 修改时间 + */ + private String update_time; + + /** + * 规划 + */ + private String plan; + + /** + * 可以存放的尺寸 + */ + private String can_size; + + /** + * 气胀轴尺寸 + */ + private String qzz_size; + + /** + * 气胀轴代数 + */ + private String qzz_generation; + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/dao/mapper/DeliverycachepointivtMapper.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/dao/mapper/DeliverycachepointivtMapper.java new file mode 100644 index 000000000..cf73061c8 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/dao/mapper/DeliverycachepointivtMapper.java @@ -0,0 +1,23 @@ +package org.nl.wms.pdm.ivt.deliverycache.service.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import org.nl.wms.pdm.ivt.deliverycache.service.dao.Deliverycachepointivt; +import org.nl.wms.pdm.ivt.deliverycache.service.dto.DeliveryConDto; + +import java.util.List; + +/** +* @author lyd +* @date 2024-11-21 +**/ +public interface DeliverycachepointivtMapper extends BaseMapper { + + List getDeliveryCacheByConditionsAndNoTask(@Param("conDto") DeliveryConDto conDto); + + List getVolumeDeliveryCacheNoTask(@Param("conDto") DeliveryConDto conDto); + + List getOneConformShaft(String gxCode, String area, String location); + + List getMoreConformShaft(String gxCode1, String gcCode2, String area, String location); +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/dao/mapper/DeliverycachepointivtMapper.xml b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/dao/mapper/DeliverycachepointivtMapper.xml new file mode 100644 index 000000000..e6dd651fa --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/dao/mapper/DeliverycachepointivtMapper.xml @@ -0,0 +1,103 @@ + + + + + + + + + diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/dto/DeliveryConDto.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/dto/DeliveryConDto.java new file mode 100644 index 000000000..7babe124b --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/dto/DeliveryConDto.java @@ -0,0 +1,28 @@ +package org.nl.wms.pdm.ivt.deliverycache.service.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 查询输送线缓存架的参数 + * @Author: lyd + * @Date: 2024/11/25 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class DeliveryConDto { + /** 区域 */ + private String area; + /** 位置 */ + private String location; + /** 点位状态: 01空位,02有气胀轴,03有子卷 */ + private String pointStatus; + /** 气胀轴尺寸 */ + private String qzzSize; + /** 排序(null时候不排序) */ + private String sortSeq; +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/dto/DeliverycachepointivtDto.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/dto/DeliverycachepointivtDto.java new file mode 100644 index 000000000..59bc88272 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/dto/DeliverycachepointivtDto.java @@ -0,0 +1,111 @@ +package org.nl.wms.pdm.ivt.deliverycache.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Builder; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author lyd + * @description / + * @date 2024-11-21 + **/ +@Data +@Builder +public class DeliverycachepointivtDto implements Serializable { + + /** 库存记录标识 */ + /** + * 防止精度丢失 + */ + @JsonSerialize(using = ToStringSerializer.class) + private Long ivt_id; + + /** + * 点位编码 + */ + private String point_code; + + /** + * 生产区域 + */ + private String product_area; + + /** + * 气涨轴 + */ + private String qzzno; + + /** + * 点位状态 + */ + private String point_status; + + /** + * 点位类型 + */ + private String point_type; + + /** + * 位置 + */ + private String point_location; + + /** + * 顺序号 + */ + private BigDecimal sort_seq; + + /** + * 是否启用 + */ + private String is_used; + + /** + * 备注 + */ + private String remark; + + /** + * 创建人 + */ + private Long create_id; + + /** + * 创建人姓名 + */ + private String create_name; + /** + * 创建时间 + */ + private String create_time; + + /** + * 修改人 + */ + private Long update_optid; + + /** + * 修改人姓名 + */ + private String update_optname; + + /** + * 修改时间 + */ + private String update_time; + + /** + * 规划 + */ + private String plan; + + /** + * 可以存放的尺寸 + */ + private String can_size; +} + diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/dto/DeliverycachepointivtQuery.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/dto/DeliverycachepointivtQuery.java new file mode 100644 index 000000000..cff983ade --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/dto/DeliverycachepointivtQuery.java @@ -0,0 +1,18 @@ +package org.nl.wms.pdm.ivt.deliverycache.service.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** +* @author lyd +* @date 2024-11-21 +**/ +@Data +public class DeliverycachepointivtQuery implements Serializable { + private String point_code; + private String product_area; + private String point_status; + private String point_type; + private String is_used; +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/impl/DeliverycachepointivtServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/impl/DeliverycachepointivtServiceImpl.java new file mode 100644 index 000000000..c3e772ecf --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/deliverycache/service/impl/DeliverycachepointivtServiceImpl.java @@ -0,0 +1,118 @@ +package org.nl.wms.pdm.ivt.deliverycache.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.wms.pdm.ivt.deliverycache.service.IDeliverycachepointivtService; +import org.nl.wms.pdm.ivt.deliverycache.service.dao.Deliverycachepointivt; +import org.nl.wms.pdm.ivt.deliverycache.service.dao.mapper.DeliverycachepointivtMapper; +import org.nl.wms.pdm.ivt.deliverycache.service.dto.DeliveryConDto; +import org.nl.wms.pdm.ivt.deliverycache.service.dto.DeliverycachepointivtQuery; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** +* @description 服务实现 +* @author lyd +* @date 2024-11-21 +**/ +@Slf4j +@Service +public class DeliverycachepointivtServiceImpl extends ServiceImpl implements IDeliverycachepointivtService { + + @Autowired + private DeliverycachepointivtMapper deliverycachepointivtMapper; + + @Override + public IPage queryAll(DeliverycachepointivtQuery whereJson, PageQuery page){ + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.like(ObjectUtil.isNotEmpty(whereJson.getPoint_code()), Deliverycachepointivt::getPoint_code, whereJson.getPoint_code()) + .eq(ObjectUtil.isNotEmpty(whereJson.getProduct_area()), Deliverycachepointivt::getProduct_area, whereJson.getProduct_area()) + .eq(ObjectUtil.isNotEmpty(whereJson.getPoint_status()), Deliverycachepointivt::getPoint_status, whereJson.getPoint_status()) + .eq(ObjectUtil.isNotEmpty(whereJson.getPoint_type()), Deliverycachepointivt::getPoint_type, whereJson.getPoint_type()) + .eq(ObjectUtil.isNotEmpty(whereJson.getIs_used()), Deliverycachepointivt::getIs_used, whereJson.getIs_used()); + IPage pages = new Page<>(page.getPage() + 1, page.getSize()); + deliverycachepointivtMapper.selectPage(pages, lam); + return pages; + } + + @Override + public void create(Deliverycachepointivt entity) { + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + entity.setIvt_id(IdUtil.getSnowflake(1, 1).nextIdStr()); + entity.setCreate_id(currentUserId); + entity.setCreate_name(nickName); + entity.setCreate_time(now); + entity.setUpdate_optid(currentUserId); + entity.setUpdate_optname(nickName); + entity.setUpdate_time(now); + deliverycachepointivtMapper.insert(entity); + } + + @Override + public void update(Deliverycachepointivt entity) { + Deliverycachepointivt dto = deliverycachepointivtMapper.selectById(entity.getIvt_id()); + if (dto == null) { + throw new BadRequestException("点位不存在"); + } + + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + entity.setUpdate_optid(currentUserId); + entity.setUpdate_optname(nickName); + entity.setUpdate_time(now); + + deliverycachepointivtMapper.updateById(entity); + } + + @Override + public void deleteAll(Set ids) { + // 真删除 + deliverycachepointivtMapper.deleteBatchIds(ids); + } + + @Override + public List getDeliveryCacheByConditionsAndNoTask(DeliveryConDto conDto) { + return deliverycachepointivtMapper.getDeliveryCacheByConditionsAndNoTask(conDto); + } + + @Override + public Deliverycachepointivt getOneByPointCode(String code, boolean flag) { + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.eq(Deliverycachepointivt::getPoint_code, code) + .eq(flag, Deliverycachepointivt::getIs_used, flag); + return getOne(lam); + } + + @Override + public List getVolumeDeliveryCacheNoTask(DeliveryConDto conDto) { + return deliverycachepointivtMapper.getVolumeDeliveryCacheNoTask(conDto); + } + + @Override + public List getOneConformShaft(String code, String area, String location) { + return deliverycachepointivtMapper.getOneConformShaft(code, area, location); + } + + @Override + public List getMoreConformShaft(String gxCode1, String gcCode2, String area, String location) { + return deliverycachepointivtMapper.getMoreConformShaft(gxCode1, gcCode2, area, location); + } + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/service/dto/DeliveryPointIvtDto.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/service/dto/DeliveryPointIvtDto.java index 36797ac2f..195937b00 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/service/dto/DeliveryPointIvtDto.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/ivt/service/dto/DeliveryPointIvtDto.java @@ -96,4 +96,5 @@ public class DeliveryPointIvtDto implements Serializable { * 修改时间 */ private String update_time; + private String point_type; } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/pdm.xls b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/pdm.xls index d27901fcc5a74acdbd6352fbb8728bea3bfa6d28..f56b718732af2addd29ef948ff53ebcb4bcf1ec9 100644 GIT binary patch delta 38435 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 delta 34807 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 JYa8eOzW_(_+?W6W diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoCallEmptyVehicle.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoCallEmptyVehicle.java index 49b8591c8..13c1caaa3 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoCallEmptyVehicle.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoCallEmptyVehicle.java @@ -13,12 +13,15 @@ import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.system.service.param.ISysParamService; +import org.nl.system.service.param.dao.Param; import org.nl.wms.ext.acs.service.WmsToAcsService; import org.nl.wms.pda.mps.service.CasingService; import org.nl.wms.sch.tasks.CutConveyorTask; import org.nl.wms.sch.tasks.PaperTrussTask; import org.nl.wms.sch.tasks.PaperTubeTask; import org.nl.wms.sch.tasks.URLEnum; +import org.nl.wms.sch.tasks.renovation.util.RenUtils; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.stereotype.Component; @@ -26,6 +29,8 @@ import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.concurrent.TimeUnit; +import static org.nl.wms.sch.tasks.renovation.util.RenUtils.isOpenTzArea; + /** * 自动呼叫纸管 */ @@ -43,6 +48,9 @@ public class AutoCallEmptyVehicle { private final WmsToAcsService wmsToAcsService; private final RedissonClient redissonClient; + private final ISysParamService paramService; + + public final static String TZ_DAY = "TZ_DAY_ONE"; @SneakyThrows public void run() { @@ -50,8 +58,14 @@ public class AutoCallEmptyVehicle { boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); try { if (tryLock){ -// log.info("AutoCallEmptyVehicle"+ DateUtil.now()+"执行!!!!"); + log.info(" AutoCallEmptyVehicle " + DateUtil.now() + " 一期内包间执行自动套轴!"); + Param tzDay = paramService.findByCode(TZ_DAY); + String integer = ObjectUtil.isEmpty(tzDay.getValue()) ? "0" : tzDay.getValue(); for (URLEnum url : URLEnum.values()) { + // hint: 暂时使用 + if (!isOpenTzArea(url.getProduct_area())) { + continue; + } String product_area = url.getProduct_area(); // 点位类型 9:内包间 JSONObject nbj_jo = WQLObject.getWQLObject("st_ivt_shaftivt").query("product_area = '" + product_area + "' AND point_type = '9'").uniqueResult(0); @@ -60,9 +74,9 @@ public class AutoCallEmptyVehicle { } if (nbj_jo.getString("is_used").equals("1")) { //上半部分 - this.callEmptyVehicle(product_area, "0"); + this.callEmptyVehicle(product_area, "0", integer); //下半部分 - this.callEmptyVehicle(product_area, "1"); + this.callEmptyVehicle(product_area, "1", integer); } } } @@ -74,11 +88,15 @@ public class AutoCallEmptyVehicle { } - void callEmptyVehicle(String product_area, String point_location) { - + void callEmptyVehicle(String product_area, String point_location, String dayNum) { //下半部分的分切组 - JSONArray down_rows = WQL.getWO("QAUTO_QUERY").addParam("flag", "1").addParam("point_location", point_location).addParam("product_area", product_area).process().getResultJSONArray(0); - + JSONArray down_rows = WQL.getWO("QAUTO_QUERY") + .addParam("flag", "1") + .addParam("point_location", point_location) + .addParam("day_num", dayNum) + .addParam("product_area", product_area).process().getResultJSONArray(0); + // todo: 拦截排序最终需要的分切组 + // todo: 空载具只有按需呼叫,不在自动创建到out点 ? //下半部分需要的总空载具 int donw_num = 0; @@ -86,20 +104,22 @@ public class AutoCallEmptyVehicle { JSONObject row = down_rows.getJSONObject(i); String parent_container_name = row.getString("parent_container_name"); String split_group = row.getString("split_group"); + // 根据母卷和组别找到对应的分切计划 JSONArray plan_rows = WQLObject.getWQLObject("pdm_bi_slittingproductionplan") .query("(parent_container_name = '" + parent_container_name + "' OR restruct_container_name = '" + parent_container_name + "') " + "AND split_group = '" + split_group + "' AND is_delete = '0' AND is_call = '1' AND IFNULL(is_paper_ok,'0') = '0' order by container_name").getResultJSONArray(0); - //todo:下发ACS任务呼叫纸管 + // 下发ACS任务呼叫纸管 this.callPaperTube(plan_rows, product_area); - + // hint: 如果是两个分切计划以上,必定是两根轴 if (plan_rows.size() >= 2) { donw_num += 2; } else if (plan_rows.size() == 1) { donw_num += 1; } } - + /* ******************* 校验需要呼叫的载具数 ******************* */ + // 断点:"A1".equals(product_area) && "1".equals(point_location) //减去对应已经在出库的空载具任务 JSONArray out_task = WQL.getWO("QAUTO_QUERY").addParam("flag", "2").addParam("point_location", point_location).addParam("product_area", product_area).process().getResultJSONArray(0); donw_num -= out_task.size(); @@ -123,24 +143,38 @@ public class AutoCallEmptyVehicle { //如果需要空载具数量大于0,进行呼叫载具 if (donw_num > 0) { for (int i = 0; i < donw_num; i++) { + // 这里最多就6个位置 JSONObject empty_vehicle = WQL.getWO("PDA_02") - .addParam("sql_str", " ORDER BY point_code") + .addParam("sql_str", " ORDER BY point_type, point_code") .addParam("product_area", product_area) .addParam("point_location", point_location) .addParam("flag", "302").process().uniqueResult(0); - if (ObjectUtil.isEmpty(empty_vehicle)) { - break; - } //如果查询到给ACS下发一个输送线任务 + // 创建输送线任务规则:(内测保持空载具、外侧先出的逻辑) JSONObject form = new JSONObject(); - form.put("point_code1", empty_vehicle.getString("point_code")); + if (ObjectUtil.isEmpty(empty_vehicle)) { + // todo: 如果还有需要空载具,但是此时这个区域已经没有位置了,创建半条任务,等待载具送达时候,触发。 + if (RenUtils.isOpenTzArea(product_area)) { + JSONObject tips = new JSONObject(); + tips.put("product_area", product_area); + tips.put("point_location", point_location); + form.put("point_code1", ""); + form.put("vehicle_code2", ""); + form.put("task_status", TaskStatusEnum.SURE_END.getCode()); + form.put("tips", tips); + } else { + break; + } + } else { + form.put("point_code1", empty_vehicle.getString("point_code")); + form.put("vehicle_code2", empty_vehicle.getString("vehicle_code")); + if (StrUtil.isEmpty(empty_vehicle.getString("vehicle_code"))) { + throw new BadRequestException("点位:" + empty_vehicle.getString("point_code") + "载具号为空!"); + } + } //查询该区域点位类型为出口的点位 JSONObject ss_jo = WQLObject.getWQLObject("sch_base_point").query("product_area = '" + product_area + "' AND point_type = '7'").uniqueResult(0); form.put("point_code2", ss_jo.getString("point_code")); - if (StrUtil.isEmpty(empty_vehicle.getString("vehicle_code"))) { - throw new BadRequestException("点位:" + empty_vehicle.getString("point_code") + "载具号为空!"); - } - form.put("vehicle_code2", empty_vehicle.getString("vehicle_code")); form.put("task_type", "010401"); form.put("product_area", product_area); cutConveyorTask.createTask(form); @@ -299,57 +333,62 @@ public class AutoCallEmptyVehicle { JSONObject zgk_jo = WQLObject.getWQLObject("st_ivt_shaftivt").query("point_type = '8' AND product_area = '" + product_area + "'").uniqueResult(0); //判断纸管库是否启用 if ("1".equals(zgk_jo.getString("is_used"))) { + log.info("管芯库启动-正在给ACS写入信号..."); device_jo.put("device_code", zgk_jo.getString("point_code")); device_jo.put("product_area", product_area); JSONArray device_ja = new JSONArray(); device_ja.add(device_jo); // 获取管芯数据 - JSONObject device_data = wmsToAcsService.getPointStatus(device_ja); - JSONObject data = device_data.getJSONArray("data").getJSONObject(0); +// JSONObject device_data = wmsToAcsService.getPointStatus(device_ja); +// JSONObject data = device_data.getJSONArray("data").getJSONObject(0); JSONArray task_rows = new JSONArray(); boolean same_flag = false; - boolean need_cz = false; - for (int i = 0; i < rows.size(); i++) { - JSONObject row = rows.getJSONObject(i); - int num = row.getIntValue("num"); - if (num == 2) { - same_flag = true; - } - String material_code = row.getString("paper_code"); - for (int j = 1; j < 13; j++) { - String material_key = "material" + j; - String qty_key = "qty" + j; - String ivt_code = data.getString(material_key); - int ivt_num = data.getIntValue(qty_key); - if (StrUtil.isNotEmpty(ivt_code) && ivt_code.equals(material_code)) { - JSONObject task_jo = new JSONObject(); - task_jo.put("device_code", j); - task_jo.put("material_code", material_code); - if (ivt_num >= num) { - task_jo.put("qty", num); - num = 0; - } else { - task_jo.put("qty", ivt_num); - num -= ivt_num; - } - task_rows.add(task_jo); - if (num == 0) { - break; - } - } - - } - if (num > 0) { - log.info("子卷号为:" + row.getString("pcsn") + "所需的纸管在纸管库中库存不足!不进行套管"); - } else { - need_cz = true; - } - } + // todo: 临时测试 + // 原:false + boolean need_cz = true; +// for (int i = 0; i < rows.size(); i++) { +// JSONObject row = rows.getJSONObject(i); +// int num = row.getIntValue("num"); +// if (num == 2) { +// same_flag = true; +// } +// String material_code = row.getString("paper_code"); +// for (int j = 1; j < 13; j++) { +// String material_key = "material" + j; +// String qty_key = "qty" + j; +// String ivt_code = data.getString(material_key); +// int ivt_num = data.getIntValue(qty_key); +// if (StrUtil.isNotEmpty(ivt_code) && ivt_code.equals(material_code)) { +// JSONObject task_jo = new JSONObject(); +// task_jo.put("device_code", j); +// task_jo.put("material_code", material_code); +// if (ivt_num >= num) { +// task_jo.put("qty", num); +// num = 0; +// } else { +// task_jo.put("qty", ivt_num); +// num -= ivt_num; +// } +// task_rows.add(task_jo); +// if (num == 0) { +// break; +// } +// } +// +// } +// if (num > 0) { +// log.info("子卷号为:" + row.getString("pcsn") + "所需的纸管在纸管库中库存不足!不进行套管"); +// } else { +// need_cz = true; +// } +// } if (need_cz) { //生成出纸管的任务 JSONObject jo = new JSONObject(); + // 纸管出库任务 jo.put("task_type", "010601"); jo.put("point_code1", zgk_jo.getString("point_code")); + // 套管工位 JSONObject tggw_jo = WQLObject.getWQLObject("st_ivt_shaftivt").query("point_type = '4' AND product_area = '" + product_area + "'").uniqueResult(0); jo.put("point_code2", tggw_jo.getString("point_code")); JSONObject request_param = new JSONObject(); @@ -366,10 +405,13 @@ public class AutoCallEmptyVehicle { jo.put("request_param", request_param); jo.put("product_area", product_area); paperTubeTask.createTask(jo); + log.info("出管芯信号写入成功-参数:{}", jo); } else { + log.info("不进行套轴, 配送空气胀轴到载具上...."); createTask(rows, product_area); } } else { + log.info("不进行套轴, 配送空气胀轴到载具上...."); //如果没有启用,不进行套轴配送空气胀轴到载具上 createTask(rows, product_area); } @@ -377,6 +419,7 @@ public class AutoCallEmptyVehicle { /** * 创建空轴搬运任务 + * (如果是不套管芯,就是跳过套轴完成,直接拉到IN点) * @param rows 纸管数组信息 * @param product_area 生产区域 */ @@ -389,9 +432,11 @@ public class AutoCallEmptyVehicle { same_flag = true; } } - //todo 创建一个任务直接搬运空轴到IN口 + // 创建一个任务直接搬运空轴到IN口 //查询对应的分切计划 - JSONObject plan_jo = WQLObject.getWQLObject("pdm_bi_slittingproductionplan").query("container_name = '" + rows.getJSONObject(0).getString("pcsn") + "'").uniqueResult(0); + JSONObject plan_jo = WQLObject.getWQLObject("pdm_bi_slittingproductionplan") + .query("container_name = '" + rows.getJSONObject(0) + .getString("pcsn") + "'").uniqueResult(0); String paper_tube_or_FRP = plan_jo.getString("paper_tube_or_frp"); String paper_name; if ("1".equals(paper_tube_or_FRP)) { @@ -399,14 +444,15 @@ public class AutoCallEmptyVehicle { } else { paper_name = plan_jo.getString("frp_description"); } - if (StrUtil.isEmpty(paper_name)) { //todo:提醒分切计划存在问题无法进行套轴 return; } String need_size = String.valueOf(paper_name.split("\\|")[2].charAt(0)); - JSONObject cut_jo = WQLObject.getWQLObject("st_ivt_cutpointivt").query("ext_code = '" + plan_jo.getString("resource_name") + "'").uniqueResult(0); + JSONObject cut_jo = WQLObject.getWQLObject("st_ivt_cutpointivt") + .query("ext_code = '" + plan_jo.getString("resource_name") + "'") + .uniqueResult(0); //获取分切机维护的气涨轴代数 String need_generation = cut_jo.getString("qzz_generation"); @@ -415,8 +461,10 @@ public class AutoCallEmptyVehicle { jo.put("task_type", "010606"); jo.put("truss_type", "8"); jo.put("task_status", TaskStatusEnum.SURE_START.getCode()); + // 气胀轴-取货点(point_type=6) JSONObject qhd_jo = WQLObject.getWQLObject("st_ivt_shaftivt").query("point_type = '6' AND product_area = '" + product_area + "'").uniqueResult(0); jo.put("point_code1", qhd_jo.getString("point_code")); + // todo: 如果in点没空载具呢? JSONObject in_jo = WQLObject.getWQLObject("sch_base_point").query("product_area = '" + product_area + "' AND point_type = '6'").uniqueResult(0); jo.put("point_code2", in_jo.getString("point_code")); // 构建请求参数 diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CutConveyorTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CutConveyorTask.java index 61c6fe211..c9b40e350 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CutConveyorTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CutConveyorTask.java @@ -4,10 +4,14 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.nl.b_lms.pdm.bi.slittingproductionplan.service.dao.PdmBiSlittingproductionplan; +import org.nl.b_lms.pdm.bi.slittingproductionplan.service.impl.PdmBiSlittingproductionplanServiceImpl; +import org.nl.b_lms.sch.tasks.slitter.util.SlitterTaskUtil; import org.nl.common.utils.SecurityUtils; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.WQL; @@ -15,9 +19,14 @@ import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.SpringContextHolder; import org.nl.wms.ext.acs.service.WmsToAcsService; import org.nl.wms.ext.mes.service.LmsToMesService; +import org.nl.wms.pdm.ivt.deliverycache.service.IDeliverycachepointivtService; +import org.nl.wms.pdm.ivt.deliverycache.service.dao.Deliverycachepointivt; +import org.nl.wms.pdm.ivt.deliverycache.service.dto.DeliveryConDto; import org.nl.wms.sch.AcsTaskDto; import org.nl.wms.sch.manage.AbstractAcsTask; import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.tasks.renovation.service.ReNbjService; +import org.nl.wms.sch.tasks.renovation.util.RenUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -78,6 +87,8 @@ public class CutConveyorTask extends AbstractAcsTask { WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_DeliveryPointIvt"); WQLObject subTab = WQLObject.getWQLObject("pdm_bi_subpackagerelation"); + ReNbjService reNbjService = SpringContextHolder.getBean(ReNbjService.class); + PdmBiSlittingproductionplanServiceImpl planService = SpringContextHolder.getBean(PdmBiSlittingproductionplanServiceImpl.class); String task_id = taskObj.getString("task_id"); JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); @@ -195,7 +206,9 @@ public class CutConveyorTask extends AbstractAcsTask { } //判断内包间是否启用 - JSONObject package_jo = WQLObject.getWQLObject("st_ivt_shaftivt").query("point_type = '9' AND product_area = '" + jsonTask.getString("product_area") + "'").uniqueResult(0); + JSONObject package_jo = WQLObject.getWQLObject("st_ivt_shaftivt").query( + "point_type = '9' AND product_area = '" + jsonTask.getString("product_area") + "'") + .uniqueResult(0); if (package_jo.getString("is_used").equals("1")) { //判断载具上是否存在气涨轴 String vehicle_code = jsonTask.getString("vehicle_code"); @@ -210,18 +223,33 @@ public class CutConveyorTask extends AbstractAcsTask { JSONObject jo = new JSONObject(); jo.put("task_type", "010605"); jo.put("point_code1", jsonTask.getString("point_code2")); - JSONObject rgv_jo = WQLObject.getWQLObject("st_ivt_shaftivt").query("point_type = '5' AND product_area = '" + jsonTask.getString("product_area") + "'").uniqueResult(0); - jo.put("point_code2", rgv_jo.getString("point_code")); + if (RenUtils.isOpenTzArea(out_jo.getString("product_area"))) { + // hint: 超过1400需要送到新增的人工处理RGV上。 + List list = JSON.parseArray(jsonTask.getString("request_param"), String.class); + List plans = planService.getByContainerNames(list); + PdmBiSlittingproductionplan demoPlan = plans.get(0); + Integer paperLength = Integer.valueOf(SlitterTaskUtil.getPaperLength(demoPlan)); + if (paperLength >= 1400) { + JSONObject rgv_jo = WQLObject.getWQLObject("st_ivt_shaftivt").query("point_type = '10' AND product_area = '" + jsonTask.getString("product_area") + "'").uniqueResult(0); + jo.put("point_code2", rgv_jo.getString("point_code")); + } + } + if (ObjectUtil.isEmpty(jo.getString("point_code2"))) { + JSONObject rgv_jo = WQLObject.getWQLObject("st_ivt_shaftivt").query("point_type = '5' AND product_area = '" + jsonTask.getString("product_area") + "'").uniqueResult(0); + jo.put("point_code2", rgv_jo.getString("point_code")); + } jo.put("truss_type", "6"); jo.put("vehicle_code", jsonTask.getString("vehicle_code")); jo.put("product_area", jsonTask.getString("product_area")); JSONObject request_param = new JSONObject(); request_param.put("have_generation", qzz_generation); jo.put("request_param", request_param.toString()); + // 成品卷下线拔轴 - 取货完成动作做完后,ACS请求LMS尺寸。 PaperTrussTask paperTrussTask = SpringContextHolder.getBean(PaperTrussTask.class); paperTrussTask.createTask(jo); } else { //给输送线OUT点下发acition1,让载具进行横移 + // hint: 横移后由ACS请求横移完毕,将载具号设置到IN点 String device_code = jsonTask.getString("point_code2"); WmsToAcsService wmsToAcsService = SpringContextHolder.getBean(WmsToAcsService.class); JSONArray action_rows = new JSONArray(); @@ -254,6 +282,14 @@ public class CutConveyorTask extends AbstractAcsTask { jsonIvt.put("vehicle_code", jsonTask.getString("vehicle_code2")); ivtTab.update(jsonIvt); + if (RenUtils.isOpenTzArea(jsonIvt.getString("product_area"))) { + // 任务完成需要创建桁架任务到空轴取轴位! + reNbjService.sendShaftToCache(taskObj); + return; + } + + + // todo: 分切计划考虑放到桁架任务结束 //更新对应气涨轴的分切计划表为配送完成 HashMap map = new HashMap(); map.put("is_child_ps_ok", "1"); @@ -275,6 +311,7 @@ public class CutConveyorTask extends AbstractAcsTask { } } + // todo: 以下代码需要等桁架完成触发 //判断输送进去的任务终点是否远离分切机,如果远离分切机且靠近分切机的点位上不存在载具且不存在任务进行载具横移 char dtl_type = point_code2.charAt(point_code2.length() - 1); if (Integer.valueOf(String.valueOf(dtl_type)) % 2 == 0) { @@ -301,7 +338,7 @@ public class CutConveyorTask extends AbstractAcsTask { tran_jo.put("product_area", product_area); this.createTask(tran_jo); } else { - //如果有货、且没有任务 + //如果有货、且没有任务 (空载具) left_point = WQL.getWO("PDA_02") .addParam("point_location", point_location) .addParam("point_code", point_code2) @@ -313,6 +350,7 @@ public class CutConveyorTask extends AbstractAcsTask { //创建空载具输送出 JSONObject form = new JSONObject(); form.put("point_code1", left_point.getString("point_code")); + // 分切输送线出口(out点) JSONObject ss_jo = WQLObject.getWQLObject("sch_base_point").query("product_area = '" + left_point.getString("product_area") + "' AND point_type = '7'").uniqueResult(0); form.put("point_code2", ss_jo.getString("point_code")); if (StrUtil.isEmpty(left_point.getString("vehicle_code"))) { @@ -343,7 +381,13 @@ public class CutConveyorTask extends AbstractAcsTask { ivtTab.update(jsonIvt2); //如果载具横移完成时,判断该气涨轴对应的分切机是否存在出站中的,且终点为空,状态为02的任务,则把该分切机的终点补上,状态改为04并下发 + // update: 修改成:判断是否存在中转架且没任务的位置,创建任务搬运到右侧输送线上。 + // todo: 出站失败的,出战到达中转架进行处理 + // vehicle_code:气胀轴编码 if (StrUtil.isNotEmpty(jsonTask.getString("vehicle_code"))) { + if (RenUtils.isOpenTzArea(jsonTask.getString("product_area"))) { + return; + } JSONObject task_jo = WQLObject.getWQLObject("sch_base_task").query("vehicle_code = '" + jsonTask.getString("vehicle_code") + "' AND is_delete = '0' AND task_status < '07'").uniqueResult(0); if (ObjectUtil.isNotEmpty(task_jo)) { if ("010405".equals(task_jo.getString("task_type"))) { @@ -362,7 +406,31 @@ public class CutConveyorTask extends AbstractAcsTask { } } else { + // vehicle_code2:托盘码 if (StrUtil.isNotEmpty(jsonTask.getString("vehicle_code2"))) { + if (RenUtils.isOpenTzArea(jsonTask.getString("product_area"))) { + IDeliverycachepointivtService deliverycachepointivtService = SpringContextHolder.getBean(IDeliverycachepointivtService.class); + // 判断中转架是否存在需要到内包间的任务 + // mark:查找子卷缓存架的有子卷(中转架) + List caches = deliverycachepointivtService.getVolumeDeliveryCacheNoTask(DeliveryConDto.builder() + .area(jsonTask.getString("product_area")) + .location(jsonIvt2.getString("point_location")) + .pointStatus("04") + .sortSeq(jsonIvt2.getString("sort_seq")) + .build()); + if (caches.size() > 0) { + Deliverycachepointivt cachePoint = caches.get(0); + JSONObject jo = new JSONObject(); + jo.put("point_code1", cachePoint.getPoint_code()); + jo.put("point_code2", jsonTask.getString("point_code2")); + jo.put("vehicle_code", cachePoint.getQzzno()); + jo.put("product_area", cachePoint.getProduct_area()); + // 子卷中转架下卷回库 + jo.put("task_type", "010408"); + new CutTrussTask().createTask(jo); + } + return; + } //如果载具横移完成时,判断该空载具是否存在对应终点为空的末次下卷或者废箔下卷任务 JSONObject task_jo2 = WQLObject.getWQLObject("sch_base_task").query("vehicle_code2 = '" + jsonTask.getString("vehicle_code2") + "' AND is_delete = '0' AND task_status = '02'").uniqueResult(0); if (ObjectUtil.isNotEmpty(task_jo2)) { @@ -413,7 +481,7 @@ public class CutConveyorTask extends AbstractAcsTask { json.put("task_id", IdUtil.getSnowflake(1, 1).nextId()); json.put("task_code", IdUtil.getSnowflake(1, 1).nextId()); json.put("task_type", form.getString("task_type")); - json.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + json.put("task_status", ObjectUtil.isNotEmpty(form.getString("task_status")) ? form.getString("task_status") : TaskStatusEnum.START_AND_POINT.getCode()); json.put("point_code1", point_code1); json.put("point_code2", point_code2); json.put("product_area", form.getString("product_area")); @@ -423,6 +491,12 @@ public class CutConveyorTask extends AbstractAcsTask { json.put("create_id", currentUserId); json.put("create_name", currentUsername); json.put("create_time", DateUtil.now()); + if (ObjectUtil.isNotEmpty(form.get("cons"))) { + json.put("request_param", form.getJSONArray("cons").toJSONString()); + } + if (ObjectUtil.isNotEmpty(form.get("tips"))) { + json.put("request_param", form.getJSONObject("tips").toJSONString()); + } //根据类型获取对应的任务优先级 JSONObject priority_jo = WQL.getWO("PDA_COOLIN").addParam("flag", "3").addParam("task_type", json.getString("task_type")).process().uniqueResult(0); if (ObjectUtil.isEmpty(priority_jo)) { diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CutTrussTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CutTrussTask.java index 2cbbf4c3f..fcd16d18a 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CutTrussTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CutTrussTask.java @@ -6,20 +6,36 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.nl.b_lms.pdm.bi.slittingproductionplan.service.IPdmBiSlittingproductionplanService; +import org.nl.b_lms.pdm.bi.slittingproductionplan.service.dao.PdmBiSlittingproductionplan; +import org.nl.b_lms.pdm.bi.slittingproductionplan.service.impl.PdmBiSlittingproductionplanServiceImpl; +import org.nl.b_lms.sch.task.dao.SchBaseTask; +import org.nl.b_lms.sch.task.service.IschBaseTaskService; +import org.nl.b_lms.sch.task.service.impl.SchBaseTaskServiceImpl; import org.nl.common.utils.SecurityUtils; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.ext.mes.service.LmsToMesService; +import org.nl.wms.pdm.ivt.deliverycache.service.IDeliverycachepointivtService; +import org.nl.wms.pdm.ivt.deliverycache.service.dao.Deliverycachepointivt; +import org.nl.wms.pdm.ivt.deliverycache.service.impl.DeliverycachepointivtServiceImpl; import org.nl.wms.sch.AcsTaskDto; import org.nl.wms.sch.manage.AbstractAcsTask; import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.tasks.renovation.util.RenUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.stream.Collectors; /** * @Auther:Zhouz @@ -81,6 +97,12 @@ public class CutTrussTask extends AbstractAcsTask { @Transactional(rollbackFor = Exception.class) public void updateTaskStatus(JSONObject taskObj, String status) { WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_DeliveryPointIvt"); + WQLObject cutTab = WQLObject.getWQLObject("st_ivt_cutpointivt"); + WQLObject cacheTab = WQLObject.getWQLObject("st_ivt_deliverycachepointivt"); + DeliverycachepointivtServiceImpl decTab = SpringContextHolder.getBean(DeliverycachepointivtServiceImpl.class); + PdmBiSlittingproductionplanServiceImpl planTab = SpringContextHolder.getBean(PdmBiSlittingproductionplanServiceImpl.class); + IschBaseTaskService taskService = SpringContextHolder.getBean(SchBaseTaskServiceImpl.class); CutConveyorTask cutConveyorTask = new CutConveyorTask(); String task_id = taskObj.getString("task_id"); @@ -181,21 +203,17 @@ public class CutTrussTask extends AbstractAcsTask { } } WQLObject.getWQLObject("ST_IVT_CutPointIvt").update(cut_point); - //更新输送线的气涨轴编码 - JSONObject delivery_point = WQLObject.getWQLObject("ST_IVT_DeliveryPointIvt").query("point_code = '" + jsonTask.getString("point_code1") + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(delivery_point)) { - throw new BadRequestException("未查询到对应的输送线点位!"); - } - delivery_point.put("qzzno", jsonTask.getString("vehicle_code2")); - delivery_point.put("point_status", "04"); - WQLObject.getWQLObject("ST_IVT_DeliveryPointIvt").update(delivery_point); + //更新出站气涨轴的分切计划状态 JSONArray plan_jo = WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").query("qzzno = '" + jsonTask.getString("vehicle_code2") + "' AND is_child_tz_ok = '1' AND is_child_ps_ok = '1' AND is_delete = '0' AND status = '06'").getResultJSONArray(0); if (ObjectUtil.isEmpty(plan_jo)) { throw new BadRequestException("未查询到气涨轴:" + jsonTask.getString("vehicle_code2") + "对应的分切计划!"); } + // 子卷号 + List cons = new ArrayList<>(); for (int i = 0; i < plan_jo.size(); i++) { JSONObject plan_row = plan_jo.getJSONObject(i); + cons.add(plan_row.getString("container_name")); plan_row.put("status", "09"); plan_row.put("end_time", DateUtil.now()); WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").update(plan_row); @@ -214,58 +232,172 @@ public class CutTrussTask extends AbstractAcsTask { //生成一个输送线出库任务(将满卷送到内包间) JSONObject form = new JSONObject(); - form.put("point_code1", jsonTask.getString("point_code1")); - JSONObject ss_jo = WQLObject.getWQLObject("sch_base_point").query("product_area = '" + delivery_point.getString("product_area") + "' AND point_type = '7'").uniqueResult(0); - form.put("point_code2", ss_jo.getString("point_code")); - form.put("vehicle_code", jsonTask.getString("vehicle_code2")); - if (StrUtil.isEmpty(delivery_point.getString("vehicle_code"))) { - throw new BadRequestException("点位:" + delivery_point.getString("point_code") + "载具号为空!"); + + if (RenUtils.isOpenTzArea(jsonTask.getString("product_area"))) { + // 新改造功能 + JSONObject delivery_cache_point = cacheTab.query("point_code = '" + jsonTask.getString("point_code1") + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(delivery_cache_point)) { + throw new BadRequestException("未查询到对应的输送线缓存架!"); + } + // hint: 需要判断是不是虚拟的 + String qzzno = delivery_cache_point.getString("qzzno"); + List list = planTab.list(new LambdaQueryWrapper() + .eq(PdmBiSlittingproductionplan::getQzzno, qzzno) + .like(PdmBiSlittingproductionplan::getContainer_name, "虚拟")); + if (list.size() > 0) { + planTab.deleteAll(list.stream().map(PdmBiSlittingproductionplan::getWorkorder_id).collect(Collectors.toSet())); + } + // 起点清空 + delivery_cache_point.put("qzzno", ""); + delivery_cache_point.put("point_status", "01"); + cacheTab.update(delivery_cache_point); + // 终点设置值 + String deliveryCode = jsonTask.getString("point_code3"); + JSONObject delivery_point = WQLObject.getWQLObject("ST_IVT_DeliveryPointIvt") + .query("point_code = '" + deliveryCode + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(delivery_point)) { + // 可能是中转点 + Deliverycachepointivt endCachePoint = decTab.getOneByPointCode(deliveryCode, false); + if (ObjectUtil.isEmpty(endCachePoint)) { + throw new BadRequestException("未查询到对应的输送线点位或中转点位!"); + } else { + endCachePoint.setQzzno(jsonTask.getString("vehicle_code2")); + endCachePoint.setPoint_status("04"); + endCachePoint.setUpdate_optid(SecurityUtils.getCurrentUserId()); + endCachePoint.setUpdate_optname(SecurityUtils.getCurrentNickName()); + endCachePoint.setUpdate_time(DateUtil.now()); + decTab.updateById(endCachePoint); + // 如果是中转点,就直接结束 + return; + } + } else { + //更新输送线的气涨轴编码 + delivery_point.put("qzzno", jsonTask.getString("vehicle_code2")); + delivery_point.put("point_status", "04"); + WQLObject.getWQLObject("ST_IVT_DeliveryPointIvt").update(delivery_point); + } + if (StrUtil.isEmpty(delivery_point.getString("vehicle_code"))) { + throw new BadRequestException("点位:" + delivery_point.getString("point_code") + "载具号为空!"); + } + // 准备创建输送线任务 + form.put("point_code1", deliveryCode); + form.put("vehicle_code2", delivery_point.getString("vehicle_code")); + form.put("product_area", delivery_point.getString("product_area")); + JSONObject ss_jo = WQLObject.getWQLObject("sch_base_point").query("product_area = '" + delivery_point.getString("product_area") + "' AND point_type = '7'").uniqueResult(0); + form.put("point_code2", ss_jo.getString("point_code")); + } else { + //更新输送线的气涨轴编码 + JSONObject delivery_point = WQLObject.getWQLObject("ST_IVT_DeliveryPointIvt").query("point_code = '" + jsonTask.getString("point_code1") + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(delivery_point)) { + throw new BadRequestException("未查询到对应的输送线点位!"); + } + delivery_point.put("qzzno", jsonTask.getString("vehicle_code2")); + delivery_point.put("point_status", "04"); + WQLObject.getWQLObject("ST_IVT_DeliveryPointIvt").update(delivery_point); + + if (StrUtil.isEmpty(delivery_point.getString("vehicle_code"))) { + throw new BadRequestException("点位:" + delivery_point.getString("point_code") + "载具号为空!"); + } + form.put("point_code1", jsonTask.getString("point_code1")); + form.put("vehicle_code2", delivery_point.getString("vehicle_code")); + form.put("product_area", delivery_point.getString("product_area")); + JSONObject ss_jo = WQLObject.getWQLObject("sch_base_point").query("product_area = '" + delivery_point.getString("product_area") + "' AND point_type = '7'").uniqueResult(0); + form.put("point_code2", ss_jo.getString("point_code")); } - form.put("vehicle_code2", delivery_point.getString("vehicle_code")); + form.put("cons", cons); + form.put("vehicle_code", jsonTask.getString("vehicle_code2")); form.put("task_type", "010401"); - form.put("product_area", delivery_point.getString("product_area")); cutConveyorTask.createTask(form); } //子卷出站任务(单独下卷) if ("010404".equals(jsonTask.getString("task_type"))) { - //更新输送线的气涨轴编码 - JSONObject delivery_point = WQLObject.getWQLObject("ST_IVT_DeliveryPointIvt").query("point_code = '" + jsonTask.getString("point_code2") + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(delivery_point)) { - throw new BadRequestException("未查询到对应的输送线点位!"); - } - delivery_point.put("qzzno", jsonTask.getString("vehicle_code")); - delivery_point.put("point_status", "04"); - WQLObject.getWQLObject("ST_IVT_DeliveryPointIvt").update(delivery_point); - //更新出站气涨轴的分切计划状态 JSONArray plan_jo2 = WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").query("qzzno = '" + jsonTask.getString("vehicle_code") + "' AND is_child_tz_ok = '1' AND is_child_ps_ok = '1' AND is_delete = '0' AND status = '06'").getResultJSONArray(0); + // 子卷号 + List cons = new ArrayList<>(); if (ObjectUtil.isNotEmpty(plan_jo2)) { for (int i = 0; i < plan_jo2.size(); i++) { JSONObject plan_row = plan_jo2.getJSONObject(i); + cons.add(plan_row.getString("container_name")); plan_row.put("status", "09"); plan_row.put("end_time", DateUtil.now()); WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").update(plan_row); } } - //生成一个输送线出库任务(将卷送到内包间) - JSONObject form = new JSONObject(); - form.put("point_code1", jsonTask.getString("point_code2")); - JSONObject ss_jo = WQLObject.getWQLObject("sch_base_point").query("product_area = '" + delivery_point.getString("product_area") + "' AND point_type = '7'").uniqueResult(0); - form.put("point_code2", ss_jo.getString("point_code")); - if (StrUtil.isEmpty(delivery_point.getString("vehicle_code"))) { - throw new BadRequestException("点位:" + delivery_point.getString("point_code") + "载具号为空!"); + //更新输送线的气涨轴编码 + JSONObject delivery_point = WQLObject.getWQLObject("ST_IVT_DeliveryPointIvt").query("point_code = '" + jsonTask.getString("point_code2") + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(delivery_point)) { + delivery_point.put("qzzno", jsonTask.getString("vehicle_code")); + delivery_point.put("point_status", "04"); + WQLObject.getWQLObject("ST_IVT_DeliveryPointIvt").update(delivery_point); + + //生成一个输送线出库任务(将卷送到内包间) + JSONObject form = new JSONObject(); + form.put("point_code1", jsonTask.getString("point_code2")); + JSONObject ss_jo = WQLObject.getWQLObject("sch_base_point").query("product_area = '" + delivery_point.getString("product_area") + "' AND point_type = '7'").uniqueResult(0); + form.put("point_code2", ss_jo.getString("point_code")); + if (StrUtil.isEmpty(delivery_point.getString("vehicle_code"))) { + throw new BadRequestException("点位:" + delivery_point.getString("point_code") + "载具号为空!"); + } + form.put("vehicle_code2", delivery_point.getString("vehicle_code")); + form.put("vehicle_code", jsonTask.getString("vehicle_code")); + form.put("task_type", "010401"); + form.put("cons", cons); + form.put("product_area", delivery_point.getString("product_area")); + cutConveyorTask.createTask(form); + } else { + Deliverycachepointivt cachePoint = decTab.getOneByPointCode(jsonTask.getString("point_code2"), false); + // 查看是否为中转架 + if (ObjectUtil.isEmpty(cachePoint)) { + throw new BadRequestException("未查询到对应的输送线点位!"); + } + // 将数据存储到中转架 + LambdaUpdateWrapper ulam = new LambdaUpdateWrapper<>(); + ulam.set(Deliverycachepointivt::getQzzno, jsonTask.getString("vehicle_code")) + .set(Deliverycachepointivt::getPoint_status, "04") + .set(Deliverycachepointivt::getUpdate_optid, SecurityUtils.getCurrentUserId()) + .set(Deliverycachepointivt::getUpdate_optname, SecurityUtils.getCurrentNickName()) + .set(Deliverycachepointivt::getUpdate_time, DateUtil.now()) + .eq(Deliverycachepointivt::getPoint_code, jsonTask.getString("point_code2")); + if (plan_jo2.size() > 0) { + JSONObject demoPlan = plan_jo2.getJSONObject(0); + ulam.set(Deliverycachepointivt::getQzz_size, demoPlan.getString("qzz_size")); + } + decTab.update(ulam); } - form.put("vehicle_code2", delivery_point.getString("vehicle_code")); - form.put("vehicle_code", jsonTask.getString("vehicle_code")); - form.put("task_type", "010401"); - form.put("product_area", delivery_point.getString("product_area")); - cutConveyorTask.createTask(form); } // 子卷入站 if ("010405".equals(jsonTask.getString("task_type"))) { + //更新入站气涨轴的分切计划状态 + JSONArray plan_jo = WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").query("qzzno = '" + jsonTask.getString("vehicle_code") + "' AND is_child_tz_ok = '1' AND is_child_ps_ok = '1' AND is_delete = '0' AND status IN ('04','05') ").getResultJSONArray(0); + if (ObjectUtil.isEmpty(plan_jo)) { + throw new BadRequestException("未查询到气涨轴:" + jsonTask.getString("vehicle_code") + "对应的分切计划!"); + } + JSONObject demoPlan = plan_jo.getJSONObject(0); + JSONObject cutIvt = cutTab.query("ext_code = '" + demoPlan.getString("resource_name") + "'").uniqueResult(0); + // hint:改造 - 子卷入站只需要桁架完成的数据赋值即可 + if (RenUtils.isOpenTzArea(cutIvt.getString("product_area"))) { + // 缓存架子清空数据 + JSONObject cache_point = cacheTab.query("point_code = '" + jsonTask.getString("point_code1") + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(cache_point)) { + throw new BadRequestException("未查询到对应的输送线点位!"); + } + cache_point.put("qzzno", ""); + cache_point.put("point_status", "01"); + cacheTab.update(cache_point); + + for (int i = 0; i < plan_jo.size(); i++) { + JSONObject plan_row = plan_jo.getJSONObject(i); + plan_row.put("status", "05"); + plan_row.put("end_time", DateUtil.now()); + WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").update(plan_row); + } + return; + } + //更新输送线的气涨轴编码 JSONObject delivery_point = WQLObject.getWQLObject("ST_IVT_DeliveryPointIvt").query("point_code = '" + jsonTask.getString("point_code1") + "'").uniqueResult(0); if (ObjectUtil.isEmpty(delivery_point)) { @@ -275,11 +407,6 @@ public class CutTrussTask extends AbstractAcsTask { delivery_point.put("point_status", "02"); WQLObject.getWQLObject("ST_IVT_DeliveryPointIvt").update(delivery_point); - //更新入站气涨轴的分切计划状态 - JSONArray plan_jo = WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").query("qzzno = '" + jsonTask.getString("vehicle_code") + "' AND is_child_tz_ok = '1' AND is_child_ps_ok = '1' AND is_delete = '0' AND status IN ('04','05') ").getResultJSONArray(0); - if (ObjectUtil.isEmpty(plan_jo)) { - throw new BadRequestException("未查询到气涨轴:" + jsonTask.getString("vehicle_code") + "对应的分切计划!"); - } for (int i = 0; i < plan_jo.size(); i++) { JSONObject plan_row = plan_jo.getJSONObject(i); plan_row.put("status", "05"); @@ -291,7 +418,7 @@ public class CutTrussTask extends AbstractAcsTask { //如果桁架任务执行完,右侧的输送线上存在气涨轴,则生成一个输送出的任务,防止左侧空载具挡住右侧气涨轴进行横移 log.debug("如果桁架任务执行完,缓存位的输送线上存在气涨轴,则对上料位的空载具生成一个输送出的任务"); char dtl_type = jsonTask.getString("point_code1").charAt(jsonTask.getString("point_code1").length() - 1); - // hint: 只有靠近分切机的位置需要移走,靠近分切机的位置才能上轴 + // 只有靠近分切机的位置需要移走,靠近分切机的位置才能上轴 if (Integer.valueOf(String.valueOf(dtl_type)) % 2 != 0) { String point_location = delivery_point.getString("point_location"); String product_area = delivery_point.getString("product_area"); @@ -348,6 +475,150 @@ public class CutTrussTask extends AbstractAcsTask { } } + // 分切缓存架任务,(输送线外侧点位 -> 分切缓存架) + if ("010407".equals(jsonTask.getString("task_type"))) { + String pointCode1 = jsonTask.getString("point_code1"); + //更新对应气涨轴的分切计划表为配送完成 + HashMap map = new HashMap(); + map.put("is_child_ps_ok", "1"); + map.put("status", "03"); + WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").update(map, "qzzno = '" + + jsonTask.getString("vehicle_code") + "' AND is_child_tz_ok = '1' AND is_child_ps_ok = '0' " + + "AND is_delete ='0' AND status = '02'"); + + LmsToMesService lmsToMesService = SpringContextHolder.getBean(LmsToMesService.class); + // 调用MES配送完成接口 + JSONArray rows = WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan") + .query("qzzno = '" + jsonTask.getString("vehicle_code") + + "' AND is_child_tz_ok = '1' AND is_child_ps_ok = '1' AND is_delete ='0' AND status = '03'") + .getResultJSONArray(0); + JSONObject demoPlan = rows.getJSONObject(0); + for (int i = 0; i < rows.size(); i++) { + JSONObject row = rows.getJSONObject(i); + String ContainerName = row.getString("container_name"); + JSONObject jo = new JSONObject(); + jo.put("ContainerName", ContainerName); + //判断该接口是否需要回传 + JSONObject back_jo = WQLObject.getWQLObject("MD_PB_InterfaceBack").query( + "interface_name = 'airSwellWithPaperTubeAssArrival'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(back_jo) && "1".equals(back_jo.getString("is_back"))) { + lmsToMesService.airSwellWithPaperTubeAssArrival(row); + } + } + String point_code1 = jsonTask.getString("point_code1"); + // 起点清空 + JSONObject jsonIvt = ivtTab.query("point_code ='" + point_code1 + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonIvt)) { + throw new BadRequestException("未找到可用点位:" + point_code1); + } + jsonIvt.put("qzzno", ""); + jsonIvt.put("point_status", "02"); + ivtTab.update(jsonIvt); + + JSONObject cutIvt = cutTab.query("ext_code = '" + demoPlan.getString("resource_name") + "'").uniqueResult(0); + + String point_code2 = jsonTask.getString("point_code2"); + LambdaUpdateWrapper ulam = new LambdaUpdateWrapper<>(); + ulam.set(Deliverycachepointivt::getQzzno, jsonTask.getString("vehicle_code")) + .set(Deliverycachepointivt::getPoint_status, "03") + .set(Deliverycachepointivt::getQzz_size, demoPlan.getString("qzz_size")) + .set(Deliverycachepointivt::getQzz_generation, cutIvt.getString("qzz_generation")) + .set(Deliverycachepointivt::getUpdate_optid, SecurityUtils.getCurrentUserId()) + .set(Deliverycachepointivt::getUpdate_optname, SecurityUtils.getCurrentNickName()) + .set(Deliverycachepointivt::getUpdate_time, DateUtil.now()) + .eq(Deliverycachepointivt::getPoint_code, point_code2); + decTab.update(ulam); + + String point_location = jsonIvt.getString("point_location"); + String product_area = jsonIvt.getString("product_area"); + + // 先判断是否需要送回内包间 + List needVehicleTasks = taskService.getAllTaskByTypeAndStatus("010401", "03"); + SchBaseTask needTask = null; + for (SchBaseTask needVehicleTask : needVehicleTasks) { + JSONObject requestParam = JSONObject.parseObject(needVehicleTask.getRequest_param()); + if (product_area.equals(requestParam.getString("product_area")) + && point_location.equals(requestParam.getString("point_location"))) { + needTask = needVehicleTask; + break; + } + } + if (needTask != null) { + needTask.setPoint_code1(jsonTask.getString("point_code1")); + needTask.setTask_status(TaskStatusEnum.START_AND_POINT.getCode()); + needTask.setUpdate_optid(SecurityUtils.getCurrentUserId()); + needTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); + needTask.setVehicle_code2(jsonTask.getString("vehicle_code2")); + needTask.setUpdate_time(DateUtil.now()); + taskService.updateById(needTask); + this.immediateNotifyAcs(null); + return; + } + // 否则查看是否横移 + // 一定是输送进去的任务终点远离分切机,如果远离分切机且靠近分切机的点位上不存在载具且不存在任务进行载具横移 + String sort_seq = jsonIvt.getString("sort_seq"); + JSONObject left_point = WQL.getWO("PDA_02") + .addParam("point_location", point_location) + .addParam("point_code", pointCode1) + .addParam("product_area", product_area) + .addParam("sort_seq", sort_seq) + .addParam("find_type", "2") + .addParam("flag", "18").process().uniqueResult(0); + if (ObjectUtil.isNotEmpty(left_point)) { + // 创建载具横移任务 + String translate_code1 = pointCode1; + String translate_code2 = left_point.getString("point_code"); + JSONObject tran_jo = new JSONObject(); + tran_jo.put("point_code1", translate_code1); + tran_jo.put("point_code2", translate_code2); + tran_jo.put("vehicle_code2", jsonTask.getString("vehicle_code2")); + tran_jo.put("task_type", "010406"); + tran_jo.put("product_area", product_area); + cutConveyorTask.createTask(tran_jo); + } + } + + // 分切缓存架任务,(子卷缓存架 -> 输送线移栽台内测) + if ("010408".equals(jsonTask.getString("task_type"))) { + // 起点清除 + IDeliverycachepointivtService bean = SpringContextHolder.getBean(IDeliverycachepointivtService.class); + Deliverycachepointivt startPoint = bean.getOneByPointCode(jsonTask.getString("point_code1"), false); + LambdaUpdateWrapper lam = new LambdaUpdateWrapper<>(); + lam.set(Deliverycachepointivt::getQzzno, null) + .set(Deliverycachepointivt::getPoint_status, "01") + .set(Deliverycachepointivt::getUpdate_optid, SecurityUtils.getCurrentUserId()) + .set(Deliverycachepointivt::getUpdate_optname, SecurityUtils.getCurrentNickName()) + .set(Deliverycachepointivt::getUpdate_time, DateUtil.now()) + .eq(Deliverycachepointivt::getPoint_code, startPoint.getPoint_code()); + bean.update(lam); + // 终点设置值 + JSONObject delivery_point = WQLObject.getWQLObject("ST_IVT_DeliveryPointIvt").query("point_code = '" + jsonTask.getString("point_code2") + "'").uniqueResult(0); + delivery_point.put("qzzno", jsonTask.getString("vehicle_code")); + delivery_point.put("point_status", "04"); + WQLObject.getWQLObject("ST_IVT_DeliveryPointIvt").update(delivery_point); + + //生成一个输送线出库任务(将卷送到内包间) + JSONObject form = new JSONObject(); + form.put("point_code1", jsonTask.getString("point_code2")); + JSONObject ss_jo = WQLObject.getWQLObject("sch_base_point").query("product_area = '" + delivery_point.getString("product_area") + "' AND point_type = '7'").uniqueResult(0); + form.put("point_code2", ss_jo.getString("point_code")); + if (StrUtil.isEmpty(delivery_point.getString("vehicle_code"))) { + throw new BadRequestException("点位:" + delivery_point.getString("point_code") + "载具号为空!"); + } + // 子卷号 + IPdmBiSlittingproductionplanService planBean = SpringContextHolder.getBean(IPdmBiSlittingproductionplanService.class); + List cons = new ArrayList<>(); + if (ObjectUtil.isNotEmpty(jsonTask.getString("vehicle_code"))) { + List plans = planBean.getByQzzNo(jsonTask.getString("vehicle_code")); + cons = plans.stream().map(PdmBiSlittingproductionplan::getContainer_name).collect(Collectors.toList()); + } + form.put("vehicle_code2", delivery_point.getString("vehicle_code")); + form.put("vehicle_code", jsonTask.getString("vehicle_code")); + form.put("task_type", "010401"); + form.put("cons", cons); + form.put("product_area", delivery_point.getString("product_area")); + cutConveyorTask.createTask(form); + } } } @@ -424,7 +695,6 @@ public class CutTrussTask extends AbstractAcsTask { WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").update(plan_row); } } - //分切>输送线 子卷出站 if ("010404".equals(form.getString("task_type")) && !json.getString("vehicle_code").contains("废箔")) { //更新出站气涨轴的分切计划状态 diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PaperTrussTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PaperTrussTask.java index 4b999d47b..3b8c91492 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PaperTrussTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PaperTrussTask.java @@ -110,6 +110,7 @@ public class PaperTrussTask extends AbstractAcsTask { } //空轴换货任务 if ("010604".equals(task_type)) { + // 将信息记录到穿拔轴机构 String point_code = task_jo.getString("point_code1"); JSONObject goal_point = ivt_shaftivt.query("point_code = '" + point_code + "'").uniqueResult(0); JSONObject request_param = task_jo.getJSONObject("request_param"); @@ -156,6 +157,7 @@ public class PaperTrussTask extends AbstractAcsTask { JSONObject confirm_jo = new JSONObject(); confirm_jo.put("vehicle_code", vehicle_code); confirm_jo.put("cut_rows", cut_rows); + // 创建配送任务 ShippingService shippingService = SpringContextHolder.getBean(ShippingService.class); shippingService.confirm(confirm_jo); in_jo.put("vehicle_code", ""); @@ -167,12 +169,16 @@ public class PaperTrussTask extends AbstractAcsTask { JSONObject goal_point2 = ivt_shaftivt.query("point_code = '" + point_code2 + "'").uniqueResult(0); if (ObjectUtil.isNotEmpty(goal_point2)) { JSONObject request_param = task_jo.getJSONObject("request_param"); + String temp = request_param.getString("temp"); String qzz_size = request_param.getString("need_size"); String qzz_generation = request_param.getString("need_generation"); String point_location = request_param.getString("need_location"); String container_name1 = request_param.getString("container_name1"); String container_name2 = request_param.getString("container_name2"); goal_point2.put("have_qzz", "1"); + if (ObjectUtil.isNotEmpty(temp) && "1".equals(temp)) { + goal_point2.put("have_qzz", "3"); + } goal_point2.put("qzz_size", qzz_size); goal_point2.put("qzz_generation", qzz_generation); goal_point2.put("point_location", point_location); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PaperTubeTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PaperTubeTask.java index 2f71b56d6..fcaf9700d 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PaperTubeTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PaperTubeTask.java @@ -88,7 +88,7 @@ public class PaperTubeTask extends AbstractAcsTask { map.put("task_status", TaskStatusEnum.FINISHED.getCode()); //更新套轴工位点位的子卷号 String product_area = task_jo.getString("product_area"); - //查询对应的纸管出库口 + //查询对应的纸管出库口 - 套管工位 JSONObject out_jo = WQLObject.getWQLObject("st_ivt_shaftivt").query("point_type = '4' AND product_area = '" + product_area + "'").uniqueResult(0); // 一根轴最多能够套两个管芯(两个子卷) @@ -127,7 +127,7 @@ public class PaperTubeTask extends AbstractAcsTask { JSONObject container_jo = WQLObject.getWQLObject("sch_base_task").query("task_type = '010605' AND product_area = '"+product_area+"' AND task_status < '07' AND is_delete = '0'").uniqueResult(0); if ("0".equals(have_qzz) && "0".equals(rgv_jo.getString("have_qzz")) && ObjectUtil.isEmpty(container_jo)) { PaperTrussTask paperTrussTask = SpringContextHolder.getBean(PaperTrussTask.class); - //todo:创建桁架任务搬运一个符合的气涨轴 + // 创建桁架任务搬运一个符合的气涨轴 JSONObject jo = new JSONObject(); jo.put("task_type", "010602"); /*String public_area = ""; diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/renovation/auto/package-info.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/renovation/auto/package-info.java new file mode 100644 index 000000000..d4403a471 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/renovation/auto/package-info.java @@ -0,0 +1,6 @@ +/** + * 定时器任务 + * @Author: lyd + * @Date: 2024/11/20 + */ +package org.nl.wms.sch.tasks.renovation.auto; diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/renovation/constant/package-info.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/renovation/constant/package-info.java new file mode 100644 index 000000000..8b469ae41 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/renovation/constant/package-info.java @@ -0,0 +1,6 @@ +/** + * 一期内包间改造所需要的常量 + * @Author: lyd + * @Date: 2024/11/20 + */ +package org.nl.wms.sch.tasks.renovation.constant; diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/renovation/package-info.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/renovation/package-info.java new file mode 100644 index 000000000..9b1ffc059 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/renovation/package-info.java @@ -0,0 +1,6 @@ +/** + * 一期内包间改造 + * @Author: lyd + * @Date: 2024/11/20 + */ +package org.nl.wms.sch.tasks.renovation; diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/renovation/service/ReNbjService.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/renovation/service/ReNbjService.java new file mode 100644 index 000000000..a7d060639 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/renovation/service/ReNbjService.java @@ -0,0 +1,16 @@ +package org.nl.wms.sch.tasks.renovation.service; + +import com.alibaba.fastjson.JSONObject; + +/** + * 内包间改造服务 + * @Author: lyd + * @Date: 2024/11/22 + */ +public interface ReNbjService { + /** + * 创建桁架任务送气胀轴到分切缓存架 + * @param param + */ + void sendShaftToCache(JSONObject param); +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/renovation/service/impl/ReNbjServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/renovation/service/impl/ReNbjServiceImpl.java new file mode 100644 index 000000000..afee8ecf6 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/renovation/service/impl/ReNbjServiceImpl.java @@ -0,0 +1,81 @@ +package org.nl.wms.sch.tasks.renovation.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import org.nl.b_lms.pdm.bi.slittingproductionplan.service.IPdmBiSlittingproductionplanService; +import org.nl.b_lms.pdm.bi.slittingproductionplan.service.dao.PdmBiSlittingproductionplan; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.pdm.ivt.deliverycache.service.IDeliverycachepointivtService; +import org.nl.wms.pdm.ivt.deliverycache.service.dao.Deliverycachepointivt; +import org.nl.wms.pdm.ivt.deliverycache.service.dto.DeliveryConDto; +import org.nl.wms.sch.tasks.CutTrussTask; +import org.nl.wms.sch.tasks.renovation.service.ReNbjService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Author: lyd + * @Date: 2024/11/22 + */ +@Service +public class ReNbjServiceImpl implements ReNbjService { + @Autowired + private IPdmBiSlittingproductionplanService planService; + @Autowired + private IDeliverycachepointivtService deliverycachepointivtService; + @Override + public void sendShaftToCache(JSONObject param) { + /* ******************* 表对象 ******************* */ + WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_DeliveryPointIvt"); + WQLObject cutTab = WQLObject.getWQLObject("ST_IVT_CutPointIvt"); + + // param: vehicle_code,point_code2 + // 创建桁架任务到空轴取轴位(任务完成该点位需要设置空盘,并且查看是否能够触发载具横移任务) + String qzzno = param.getString("vehicle_code"); + String vehicle_code = param.getString("vehicle_code2"); + String endPoint = param.getString("point_code2"); + JSONObject endPointObj = ivtTab.query("point_code ='" + endPoint + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(endPointObj)) { + throw new BadRequestException("未找到可用点位:" + endPoint); + } + String pointLocation = endPointObj.getString("point_location"); + String productArea = endPointObj.getString("product_area"); + // "is_child_ps_ok", "1" + // "status", "03" + List plans = planService.getByQzzNoByStatus(qzzno, "02"); + if (plans.size() == 0) { + return; + } + PdmBiSlittingproductionplan demoPlan = plans.get(0); + JSONObject cut_ivt = cutTab.query("ext_code = '" + demoPlan.getResource_name() + "'").uniqueResult(0); + // 查找对应的缓存架子, 就近原则 + List cacheDeliverys = deliverycachepointivtService + .getDeliveryCacheByConditionsAndNoTask(DeliveryConDto.builder() + .location(pointLocation) + .area(productArea) + .pointStatus("01") + .qzzSize(demoPlan.getQzz_size()) + .sortSeq(cut_ivt.getString("sort_seq")) + .build()); + if (cacheDeliverys.size() == 0) { + // todo: 考虑使用中转位置??? + // todo: 考虑找不到不抛出异常,通过创建半条任务,由其他地方触发。 + throw new BadRequestException("未找到合适的气胀轴缓存架!"); + } + Deliverycachepointivt cachePoint = cacheDeliverys.get(0); + // 创建桁架任务,(桁架任务完成之后需要根据需求创建空载具横移任务) + JSONObject taskParam = new JSONObject(); + taskParam.put("point_code1", endPoint); + taskParam.put("point_code2", cachePoint.getPoint_code()); + taskParam.put("vehicle_code", qzzno); + taskParam.put("vehicle_code2", vehicle_code); + taskParam.put("product_area", cut_ivt.getString("product_area")); + taskParam.put("task_type", "010407"); + CutTrussTask cutTrussTask = new CutTrussTask(); + cutTrussTask.createTask(taskParam); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/renovation/util/RenUtils.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/renovation/util/RenUtils.java new file mode 100644 index 000000000..a7ffb57fc --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/renovation/util/RenUtils.java @@ -0,0 +1,33 @@ +package org.nl.wms.sch.tasks.renovation.util; + +import cn.hutool.core.util.ObjectUtil; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.system.service.param.dao.Param; +import org.nl.system.service.param.impl.SysParamServiceImpl; + +import java.util.Arrays; +import java.util.List; + +/** + * 改造一期内包间的工具类 + * @Author: lyd + * @Date: 2024/11/21 + */ +public class RenUtils { + + /** + * 判断该区域是否为定义开放(改造)的区域 + * @param area + * @return + */ + public static boolean isOpenTzArea(String area) { + SysParamServiceImpl bean = SpringContextHolder.getBean(SysParamServiceImpl.class); + Param openOneTzArea = bean.findByCode("open_one_tz_area"); + if (ObjectUtil.isEmpty(openOneTzArea)) { + throw new BadRequestException("请配置[open_one_tz_area]参数"); + } + List list = Arrays.asList(openOneTzArea.getValue().split("[,,]")); + return list.contains(area); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/wql/QAUTO_QUERY.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/wql/QAUTO_QUERY.wql index aeafccc77..365716bad 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/wql/QAUTO_QUERY.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/wql/QAUTO_QUERY.wql @@ -18,6 +18,7 @@ 输入.need_generation TYPEAS s_string 输入.product_area TYPEAS s_string 输入.point_location TYPEAS s_string + 输入.day_num TYPEAS s_string [临时表] @@ -61,6 +62,9 @@ OPTION 输入.point_location <> "" cut.point_location = 输入.point_location ENDOPTION + OPTION 输入.day_num <> "" + DATE(call_time) >= DATE_SUB(CURDATE(), INTERVAL 输入.day_num DAY) + ENDOPTION OPTION 输入.is_paper_ok <> "" plan.is_paper_ok = 输入.is_paper_ok ENDOPTION @@ -82,12 +86,15 @@ AND is_delete = '0' AND cut.product_area = 输入.product_area AND cut.point_location = 输入.point_location + OPTION 输入.day_num <> "" + DATE(call_time) >= DATE_SUB(CURDATE(), INTERVAL 输入.day_num DAY) + ENDOPTION GROUP BY restruct_container_name, split_group ORDER BY call_time - LIMIT 3 + LIMIT 4 ENDSELECT ENDQUERY ENDIF @@ -216,6 +223,53 @@ ENDQUERY ENDIF + IF 输入.flag = "6001" + QUERY + SELECT + * + FROM + st_ivt_shaftivt ivt + WHERE + ivt.point_type = '1' + AND + ivt.have_qzz = '0' + AND + ivt.is_used = '1' + AND + ivt.qzz_size = 输入.need_size + AND + ivt.qzz_generation = 输入.need_generation + AND + ivt.product_area = 输入.product_area + AND 0 = (SELECT COUNT(*) FROM sch_base_task t WHERE t.point_code2 = ivt.point_code AND t.task_status < '07' AND t.is_delete = '0') + AND 0 = (SELECT COUNT(*) FROM st_ivt_shaftivt bb WHERE bb.have_qzz ='1' AND bb.point_type = '1' + AND bb.qzz_generation = ivt.qzz_generation AND bb.product_area = ivt.product_area + AND bb.qzz_size = ivt.qzz_size AND bb.sort_seq > ivt.sort_seq) + ORDER BY + sort_seq + ENDSELECT + ENDQUERY + ENDIF + IF 输入.flag = "6002" + QUERY + SELECT + * + FROM + st_ivt_shaftivt ivt + WHERE + ivt.point_type = '1' + AND ivt.have_qzz = '1' + AND ivt.is_used = '1' + AND ivt.qzz_size = 输入.need_size + AND ivt.qzz_generation = 输入.need_generation + AND ivt.product_area = 输入.product_area + AND 0 = (SELECT COUNT(*) FROM sch_base_task t WHERE t.point_code2 = ivt.point_code AND t.task_status < '07' AND t.is_delete = '0') + ORDER BY + sort_seq DESC + ENDSELECT + ENDQUERY + ENDIF + IF 输入.flag = "7" QUERY SELECT diff --git a/lms/nladmin-system/src/main/resources/logback-spring.xml b/lms/nladmin-system/src/main/resources/logback-spring.xml index 2ab4707b6..73fbb2be1 100644 --- a/lms/nladmin-system/src/main/resources/logback-spring.xml +++ b/lms/nladmin-system/src/main/resources/logback-spring.xml @@ -12,7 +12,7 @@ https://juejin.cn/post/6844903775631572999 nlAdmin + value="%black(%contextName-) %X{traceId} %red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %cyan(%msg%n)"/> diff --git a/lms/nladmin-system/src/test/java/org/nl/init/EventTest.java b/lms/nladmin-system/src/test/java/org/nl/init/EventTest.java index e7c879339..aac464805 100644 --- a/lms/nladmin-system/src/test/java/org/nl/init/EventTest.java +++ b/lms/nladmin-system/src/test/java/org/nl/init/EventTest.java @@ -14,6 +14,7 @@ import org.nl.b_lms.bst.ivt.shafttubeivt.service.dao.mapper.BstIvtShafttubeivtMa import org.nl.b_lms.pdm.subpackagerelation.dao.PdmBiSubpackagerelation; import org.nl.b_lms.pdm.subpackagerelation.dao.mapper.PdmBiSubpackagerelationMapper; import org.nl.b_lms.sch.point.dao.BstIvtPackageinfoivt; +import org.nl.b_lms.sch.point.dao.mapper.SchBasePointMapper; import org.nl.b_lms.sch.point.service.IbstIvtPackageinfoivtService; import org.nl.b_lms.sch.tasks.first_floor_area.*; import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.OutBoxManageService; @@ -21,6 +22,9 @@ import org.nl.common.enums.ContainerLevelEnum; import org.nl.common.enums.PackageInfoIvtEnum; import org.nl.modules.common.exception.BadRequestException; import org.nl.system.service.param.ISysParamService; +import org.nl.wms.pdm.ivt.deliverycache.service.IDeliverycachepointivtService; +import org.nl.wms.pdm.ivt.deliverycache.service.dao.Deliverycachepointivt; +import org.nl.wms.pdm.ivt.deliverycache.service.dto.DeliveryConDto; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -63,12 +67,28 @@ public class EventTest { @Autowired private BstIvtShafttubeivtMapper bstIvtShafttubeivtMapper; + @Autowired + private IDeliverycachepointivtService deliverycachepointivtService; + @Test public void sl() { List notTaskShaftCache = bstIvtShafttubeivtMapper.getNotTaskShaftCache("3", "4", "0"); System.out.println(notTaskShaftCache); } + @Test + public void test_DeliveryCache() { + List cacheDeliverys = deliverycachepointivtService + .getDeliveryCacheByConditionsAndNoTask(DeliveryConDto.builder() + .location("1") + .area("A1") + .pointStatus("01") + .qzzSize("6") + .sortSeq("1") + .build()); + System.out.println(cacheDeliverys); + } + /** * 装箱区->空载具缓存位补空 */ diff --git a/lms/nladmin-ui/src/views/wms/pdm/ivt/deliverycache/deliverycachepointivt.js b/lms/nladmin-ui/src/views/wms/pdm/ivt/deliverycache/deliverycachepointivt.js new file mode 100644 index 000000000..5c688b469 --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/pdm/ivt/deliverycache/deliverycachepointivt.js @@ -0,0 +1,27 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/deliverycachepointivt', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/deliverycachepointivt/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/deliverycachepointivt', + method: 'put', + data + }) +} + +export default { add, edit, del } diff --git a/lms/nladmin-ui/src/views/wms/pdm/ivt/deliverycache/index.vue b/lms/nladmin-ui/src/views/wms/pdm/ivt/deliverycache/index.vue new file mode 100644 index 000000000..3a3248895 --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/pdm/ivt/deliverycache/index.vue @@ -0,0 +1,294 @@ + + + + + diff --git a/lms/nladmin-ui/src/views/wms/pdm/ivt/deliverypointivt/index.vue b/lms/nladmin-ui/src/views/wms/pdm/ivt/deliverypointivt/index.vue index ba7fc5b8e..c21e034fd 100644 --- a/lms/nladmin-ui/src/views/wms/pdm/ivt/deliverypointivt/index.vue +++ b/lms/nladmin-ui/src/views/wms/pdm/ivt/deliverypointivt/index.vue @@ -80,7 +80,7 @@ > - + + + + + + - + @@ -168,6 +183,11 @@ {{ dict.label.delivery_point_status[scope.row.point_status] }} + + +