From bd153c9044f3182547c44855b44a0c11912810a8 Mon Sep 17 00:00:00 2001 From: gongbaoxiong <751575283@qq.com> Date: Tue, 25 Jun 2024 19:06:07 +0800 Subject: [PATCH] =?UTF-8?q?add:=E5=A2=9E=E5=8A=A0=E4=BA=8C=E6=AC=A1?= =?UTF-8?q?=E5=88=86=E9=85=8D=E4=BB=A3=E7=A0=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PdmBiSubpackagerelationController.java | 9 + .../dao/PdmBiSubpackagerelation.java | 6 + .../mapper/PdmBiSubpackagerelationMapper.xml | 18 +- .../IpdmBiSubpackagerelationService.java | 13 + .../PdmBiSubpackagerelationServiceImpl.java | 597 ++++++++++-------- .../BstIvtPackageinfoivtController.java | 35 +- .../sch/point/dao/BstIvtPackageinfoivt.java | 4 + .../mapper/BstIvtPackageinfoivtMapper.java | 7 + .../dao/mapper/BstIvtPackageinfoivtMapper.xml | 15 +- .../service/IbstIvtPackageinfoivtService.java | 22 +- .../impl/BstIvtPackageinfoivtServiceImpl.java | 353 +++++++++-- .../sch/tasks/first_floor_area/DjqTask.java | 11 +- .../first_floor_area/DjqToKzjhcwTask.java | 297 +++++++++ .../sch/tasks/first_floor_area/GzqTask.java | 1 + .../{KzjhcwTask.java => GzqToKzjhcwTask.java} | 90 +-- .../sch/tasks/first_floor_area/MzhcwTask.java | 7 +- .../{SendKzjTask.java => SendDjqKzjTask.java} | 19 +- .../first_floor_area/SendGzqKzjTask.java | 190 ++++++ .../tasks/first_floor_area/SsxDjwTask.java | 3 +- .../sch/tasks/first_floor_area/ZxDjwTask.java | 7 +- .../sch/tasks/first_floor_area/ZxqTask.java | 2 + .../auto/AutoSendDjqToGzq.java | 62 ++ .../auto/AutoSendDjqToZxqTwo.java | 50 -- .../auto/AutoSendGzqToDjq.java | 66 ++ .../auto/AutoSendMzToDjq.java | 83 ++- .../first_floor_area/auto/AutoSendToZxq.java | 22 +- .../auto/AutoSendVehicleToDjq.java | 91 ++- .../auto/AutoSendVehicleToKz.java | 30 - .../auto/AutoSendVehicleToKzj.java | 121 ++++ .../auto/AutoSendZxToDjw.java | 183 +++--- .../first_floor_area/auto/TaskQueue.java | 49 +- .../nl/common/enums/PackageInfoIvtEnum.java | 11 +- .../nl/modules/common/utils/RedisUtils.java | 43 +- .../acs/service/impl/AcsToWmsServiceImpl.java | 72 ++- .../org/nl/wms/sch/rest/TaskController.java | 2 + .../src/test/java/org/nl/init/EventTest.java | 7 +- .../src/views/wms/pdm/sub/DivDialog.vue | 14 +- .../src/views/wms/pdm/sub/MaterDialog.vue | 80 ++- 38 files changed, 1996 insertions(+), 696 deletions(-) create mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/DjqToKzjhcwTask.java rename lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/{KzjhcwTask.java => GzqToKzjhcwTask.java} (65%) rename lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/{SendKzjTask.java => SendDjqKzjTask.java} (91%) create mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/SendGzqKzjTask.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendDjqToGzq.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendDjqToZxqTwo.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendGzqToDjq.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendVehicleToKz.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendVehicleToKzj.java diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/controller/PdmBiSubpackagerelationController.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/controller/PdmBiSubpackagerelationController.java index 1d92ff64b..b2fcf2cef 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/controller/PdmBiSubpackagerelationController.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/controller/PdmBiSubpackagerelationController.java @@ -6,6 +6,7 @@ import java.util.Map; import com.alibaba.fastjson.JSONObject; import org.nl.b_lms.pdm.subpackagerelation.dao.PdmBiSubpackagerelation; import org.nl.common.TableDataInfo; +import org.springframework.data.domain.Pageable; import org.springframework.web.bind.annotation.*; import lombok.RequiredArgsConstructor; @@ -49,6 +50,14 @@ public class PdmBiSubpackagerelationController { } + @GetMapping("/queryBoxSpec") + @Log("查询待检区木箱规格") + public ResponseEntity queryBoxSpec(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(pdmBiSubpackagerelationService.queryBoxSpec(whereJson, page), HttpStatus.OK); + } + + + /** * 查询订单装箱信息 * diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/dao/PdmBiSubpackagerelation.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/dao/PdmBiSubpackagerelation.java index 836d85d84..fba4e8893 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/dao/PdmBiSubpackagerelation.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/dao/PdmBiSubpackagerelation.java @@ -310,6 +310,12 @@ public class PdmBiSubpackagerelation extends Model { */ private String box_group; + /** + * 纸管规格 + */ + @TableField(exist = false) + private String paper_tube_description; + /** diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/dao/mapper/PdmBiSubpackagerelationMapper.xml b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/dao/mapper/PdmBiSubpackagerelationMapper.xml index 032d3abad..84ee3186e 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/dao/mapper/PdmBiSubpackagerelationMapper.xml +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/dao/mapper/PdmBiSubpackagerelationMapper.xml @@ -73,15 +73,17 @@ MAX(create_time) DESC diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/service/IpdmBiSubpackagerelationService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/service/IpdmBiSubpackagerelationService.java index 562e886b9..73bd2a5b9 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/service/IpdmBiSubpackagerelationService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/service/IpdmBiSubpackagerelationService.java @@ -9,7 +9,9 @@ import java.util.Map; import java.util.Set; import com.baomidou.mybatisplus.core.metadata.IPage; +import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxinfo; import org.nl.common.domain.query.PageQuery; +import org.springframework.data.domain.Pageable; import org.springframework.web.bind.annotation.RequestBody; @@ -32,6 +34,17 @@ public interface IpdmBiSubpackagerelationService extends IService queryAll(Map whereJson, PageQuery pageable); + /** + * 查询待检区木箱规格 + * + * @param whereJson 查询条件 + * @param page 分页参数 + * @return Map + */ + Map queryBoxSpec(Map whereJson, Pageable page); + + + /** * 查询订单装箱信息 * diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/service/impl/PdmBiSubpackagerelationServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/service/impl/PdmBiSubpackagerelationServiceImpl.java index 131c91337..6b90e07b8 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/service/impl/PdmBiSubpackagerelationServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/service/impl/PdmBiSubpackagerelationServiceImpl.java @@ -20,6 +20,8 @@ import org.nl.b_lms.sch.task.dao.SchBaseTask; import org.nl.b_lms.sch.tasks.first_floor_area.*; import org.nl.b_lms.sch.tasks.first_floor_area.auto.TaskQueueManager; import org.nl.b_lms.sch.tasks.first_floor_area.auto.TaskQueue; +import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxinfo; +import org.nl.b_lms.storage_manage.database.service.dao.mapper.BstIvtBoxinfoMapper; import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.OutBoxManageService; import org.nl.common.enums.PackageInfoIvtEnum; import org.nl.common.utils.SecurityUtils; @@ -27,8 +29,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.nl.modules.common.exception.BadRequestException; import org.nl.system.service.param.ISysParamService; +import org.nl.wms.sch.manage.TaskStatusEnum; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.scheduling.annotation.Async; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.metadata.IPage; import org.nl.common.domain.query.PageQuery; @@ -66,7 +69,7 @@ public class PdmBiSubpackagerelationServiceImpl extends ServiceImpl queryBoxSpec(Map whereJson, Pageable page) { + Map boxInfoList = new HashMap(); + //IPage resultPage = new Page<>(page.getPageNumber(), page.getPageSize()); + IPage resultPage = new Page<>(page.getPageNumber() + 1, page.getPageSize()); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (whereJson.containsKey("search")) { + String searchValue = whereJson.get("search").toString(); + queryWrapper.and(w -> + w.eq(BstIvtBoxinfo::getBox_length, searchValue) + .or() + .eq(BstIvtBoxinfo::getMaterial_code, searchValue) + .or() + .like(BstIvtBoxinfo::getMaterial_name, searchValue) + .or() + .like(BstIvtBoxinfo::getBox_no, searchValue) + .or() + .eq(BstIvtBoxinfo::getBox_id, searchValue) + .or() + .eq(BstIvtBoxinfo::getBox_high, searchValue) + .or() + .eq(BstIvtBoxinfo::getBox_width, searchValue) + .or() + .eq(BstIvtBoxinfo::getNum, searchValue) + .or() + .eq(BstIvtBoxinfo::getVehicle_type, searchValue) + ); + } + queryWrapper.eq(BstIvtBoxinfo::getIs_packing, "0"); + queryWrapper.groupBy(BstIvtBoxinfo::getMaterial_code); + queryWrapper.orderByAsc(BstIvtBoxinfo::getBox_id); + IPage result = bstIvtBoxinfoMapper.selectPage(resultPage, queryWrapper); + boxInfoList.put("content", result.getRecords()); + boxInfoList.put("totalElements", result.getTotal()); + return boxInfoList; + } + + @Override public IPage queryContainerization(Map whereJson, PageQuery pageable) { Page pageObject = new Page<>(pageable.getPage(), pageable.getSize()); @@ -154,7 +203,7 @@ public class PdmBiSubpackagerelationServiceImpl extends ServiceImpl queryContainerNameBySaleOrder(Map whereJson) { if (!whereJson.containsKey("sale_order_name")) { - return null; + return Collections.emptyList(); } List pdmBiSubpackagerelationList = pdmBiSubpackagerelationMapper.queryContainerNameBySaleOrder(whereJson.get("sale_order_name").toString()); Map countByGroup = pdmBiSubpackagerelationList.stream() @@ -189,6 +238,285 @@ public class PdmBiSubpackagerelationServiceImpl extends ServiceImpl packagerelationList = JSONObject.parseArray(whereJson.getJSONArray("tableMater").toJSONString(), PdmBiSubpackagerelation.class); + //检查是否存在已分配规格的子卷号 + List isOutBox = packagerelationList.stream().filter(r -> r.getStatus().equals("0")).collect(Collectors.toList()); + if (isOutBox.size() > 0) { + throw new BadRequestException("标记为黄色的子卷号已分配且对应的木箱正在出库,请重新选择未分配木箱规格的子卷"); + } + JSONArray jsonArray = whereJson.getJSONArray("tableMater"); + if (jsonArray == null || jsonArray.size() == 0) { + throw new BadRequestException("无选中子卷信息"); + } + //均衡获取木箱出库装箱区对接位 + String deviceCode = getPointCode(); + Integer taskCount = bstIvtPackageinfoivtMapper.getZxqTaskCount(deviceCode.substring(deviceCode.lastIndexOf("_") + 1)); + if (taskCount + packagerelationList.size() > 10) { + throw new BadRequestException("子卷搬运任务数已达上限!"); + } + List pdmBiSubpackagerelationList = pdmBiSubpackagerelationMapper + .selectList(new LambdaQueryWrapper().eq(PdmBiSubpackagerelation::getSale_order_name, jsonArray.getJSONObject(0).getString("sale_order_name"))); + Integer maxBoxGroup = pdmBiSubpackagerelationList.stream() + .map(PdmBiSubpackagerelation::getBox_group) + .filter(Objects::nonNull) + .map(Integer::parseInt) + .max(Integer::compareTo) + .orElse(0) + 1; + try { + List entityList = JSONObject.parseArray(whereJson.getJSONArray("tableMater").toJSONString(), PdmBiSubpackagerelation.class).stream() + .map(PdmBiSubpackagerelation::getWorkorder_id) + .map(String::valueOf) + .collect(Collectors.toList()); + if (entityList.isEmpty()) { + return; + } + outBox(entityList, packagerelationList, deviceCode, maxBoxGroup, whereJson.getString("checked")); + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } + } + + + /** + * 空木箱出库 + */ + private void outBox(List entityList, List packagerelationList, String deviceCode, Integer maxBoxGroup, String boxType) { + //均衡获取装箱对接位 + //String deviceCode = "ZXQ_1_1"; + JSONObject boxInfo = new JSONObject(); + //确定装箱区终点 + boxInfo.put("device_code", deviceCode); + boxInfo.put("material_code", boxType); + boxInfo.put("num", entityList.size()); + String boxSn = outBoxManageService.outBox(boxInfo); + if (StringUtils.isBlank(boxSn)) { + throw new BadRequestException("装箱区 -> 装箱对接位,木箱码不能为空!"); + } + //更新及子卷包装状态已分配规格及木箱规格组 + CompletableFuture.runAsync(() -> { + try { + updateBoxGroup(maxBoxGroup, entityList, boxType); + } catch (Exception e) { + log.error("异常信息:" + e); + } + }, pool); + //更新子卷包装关系更新木箱号 + CompletableFuture.runAsync(() -> { + try { + updateBoxInfo(entityList, boxSn); + } catch (Exception e) { + log.error("异常信息:" + e); + } + }, pool); + //待检区->装箱区agv任务 +// CompletableFuture.runAsync(() -> { +// try { +// agvTransfer(packagerelationList, deviceCode, boxSn); +// } catch (Exception e) { +// log.error("异常信息:" + e); +// } +// }, pool); + } + + private void updateBoxGroup(Integer maxBoxGroup, List entityList, String boxType) { + // code:终点,material_code:木箱规格,num: 子卷数 + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("box_type", boxType); + updateWrapper.set("box_group", maxBoxGroup); + updateWrapper.set("status", "0"); + updateWrapper.in("workorder_id", entityList); + pdmBiSubpackagerelationMapper.update(null, updateWrapper); + } + + private String getPointCode() { + //均衡获取木箱出库装箱区对接位 + List bstIvtPackageinfoivtList = bstIvtPackageinfoivtMapper.selectList(new LambdaQueryWrapper().eq(BstIvtPackageinfoivt::getPoint_status, "5").eq(BstIvtPackageinfoivt::getIs_used, "1").orderByAsc(BstIvtPackageinfoivt::getPoint_code)); + if (CollectionUtils.isEmpty(bstIvtPackageinfoivtList)) { + throw new BadRequestException("没有可用的装箱区对接位"); + } + Map resultMap = new HashMap<>(); + //获取装箱位任务数量 + List> taskCount = bstIvtPackageinfoivtMapper.getPointTaskCount(); + if (taskCount != null) { + for (Map map : taskCount) { + Object pointCode2Obj = map.get("point_code2"); + Object countObj = map.get("count"); + if (pointCode2Obj != null && countObj != null) { + String pointCode2 = pointCode2Obj.toString(); + Long countLong = (Long) countObj; + Integer count = countLong.intValue(); + resultMap.merge(pointCode2, count, Integer::sum); + } + } + } + bstIvtPackageinfoivtList.stream() + .collect(Collectors.toMap( + BstIvtPackageinfoivt::getPoint_code, + p -> StringUtils.isNotBlank(p.getContainer_name()) ? 1 : 0, + Integer::sum + )) + .forEach((key, value) -> resultMap.merge(key, value, Integer::sum)); + List> result = resultMap.entrySet().stream() + .map(entry -> Collections.singletonMap(entry.getKey(), entry.getValue())) + .collect(Collectors.toList()); + //获取数量最少的点位 + Optional minPointCode = result.stream() + .min(Comparator.comparingInt(map -> map.entrySet().iterator().next().getValue())) + .map(map -> map.keySet().iterator().next()); + return minPointCode.orElseGet(() -> bstIvtPackageinfoivtList.get(0).getPoint_code()); + } + + + protected void updateBoxInfo(List entityList, String boxSn) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("package_box_sn", boxSn); + updateWrapper.in("workorder_id", entityList); + pdmBiSubpackagerelationMapper.update(null, updateWrapper); + } + + + protected void agvTransfer(List packagerelationList, String deviceCode, String boxSn) { + //待检区点位 + List djqPointList = packageinfoivtService + .list(new LambdaUpdateWrapper() + .eq(BstIvtPackageinfoivt::getPoint_status, PackageInfoIvtEnum.POINT_STATUS.code("待检区")) + .eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用")) + //.eq(BstIvtPackageinfoivt::getIvt_status, PackageInfoIvtEnum.IVT_STATUS.code("合格品")) + .eq(BstIvtPackageinfoivt::getIvt_status, PackageInfoIvtEnum.IVT_STATUS.code("有子卷")) + .orderByAsc(BstIvtPackageinfoivt::getSort_seq)); + Set containerNames = packagerelationList.stream() + .map(PdmBiSubpackagerelation::getContainer_name) + .collect(Collectors.toSet()); + List djqPoints = djqPointList.stream() + .filter(r -> containerNames.contains(r.getContainer_name())) + .collect(Collectors.toList()); + //任务组id + String groupId = deviceCode.substring(deviceCode.lastIndexOf("_") + 1); + List schBaseTaskList = new ArrayList<>(); + //确定起点,安装装箱组标识加入任务队列 + djqPoints.forEach(r -> { + JSONObject jo = new JSONObject(); + jo.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("待检区->装箱区")); + jo.put("vehicle_code", r.getContainer_name()); + jo.put("point_code1", r.getPoint_code()); + jo.put("task_status", TaskStatusEnum.SURE_START.getCode()); + //木箱号 + jo.put("vehicle_code2", groupId); + //任务组id + //jo.put("car_no", deviceCode); + SchBaseTask task = new SchBaseTask(); + task.setTask_id(zxqTask.createTask(jo)); + //增加任务到队列 + schBaseTaskList.add(task); + }); + //taskQueueManager.addTasksToQueue(groupId, schBaseTaskList); + if (CollectionUtils.isNotEmpty(schBaseTaskList)) { + taskQueue.addTasksToQueue(groupId, schBaseTaskList); + } + } + + /** + * 待检区->装箱区agv任务 + */ + private void agvTransfer1(List packagerelationList, String deviceCode, String boxSn) { + //待检区点位 + List djqPointList = packageinfoivtService + .list(new LambdaUpdateWrapper() + .eq(BstIvtPackageinfoivt::getPoint_status, PackageInfoIvtEnum.POINT_STATUS.code("待检区")) + .eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用")) + //todo 暂时改为合格品 + .eq(BstIvtPackageinfoivt::getIvt_status, PackageInfoIvtEnum.IVT_STATUS.code("合格品")) + .orderByAsc(BstIvtPackageinfoivt::getSort_seq)); + Set containerNames = packagerelationList.stream() + .map(PdmBiSubpackagerelation::getContainer_name) + .collect(Collectors.toSet()); + List djqPoints = djqPointList.stream() + .filter(djqPoint -> containerNames.contains(djqPoint.getContainer_name())) + .collect(Collectors.toList()); + //下发agv任务 + djqPoints.forEach(r -> { + //装箱区点位 + List zxqPointList = packageinfoivtService + .list(new LambdaUpdateWrapper() + .eq(BstIvtPackageinfoivt::getPoint_status, PackageInfoIvtEnum.POINT_STATUS.code("装箱区")) + .eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用")) + .eq(BstIvtPackageinfoivt::getIvt_status, PackageInfoIvtEnum.IVT_STATUS.code("空")) + .eq(BstIvtPackageinfoivt::getBlock, deviceCode.substring(deviceCode.indexOf("_") + 1)) + .orderByAsc(BstIvtPackageinfoivt::getSort_seq)); + JSONObject jo = new JSONObject(); + jo.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("待检区->装箱区")); + jo.put("vehicle_code", r.getContainer_name()); + jo.put("point_code1", r.getPoint_code()); + //木箱号 + jo.put("vehicle_code2", boxSn); + if (CollectionUtils.isEmpty(zxqPointList)) { + throw new BadRequestException("装箱区点位已满!"); + } + jo.put("point_code2", zxqPointList.get(0).getPoint_code()); + zxqTask.createTask(jo); + }); + } + + /** + * 多选删除 + * + * @param ids 多个Id主键 + */ + @Override + public void deleteAll(Set ids) { + // 物理删除 + pdmBiSubpackagerelationMapper.deleteBatchIds(ids); + } + + + /** + * 获取实体基础信息 + * + * @param entity 对象实体 + * @param isCreate 是否创建 + */ + private PdmBiSubpackagerelation getBasicInfo(PdmBiSubpackagerelation entity, boolean isCreate) { + if (isCreate) { + entity.setCreate_id(Long.valueOf(SecurityUtils.getCurrentUserId())); + entity.setCreate_name(SecurityUtils.getCurrentNickName()); + entity.setCreate_time(DateUtil.now()); + } + return entity; + } + /** * 满轴->待检 */ @@ -354,267 +682,6 @@ public class PdmBiSubpackagerelationServiceImpl extends ServiceImpl packagerelationList = JSONObject.parseArray(whereJson.getJSONArray("tableMater").toJSONString(), PdmBiSubpackagerelation.class); - List isOutBox = packagerelationList.stream().filter(r -> r.getStatus().equals("0")).collect(Collectors.toList()); - if (isOutBox.size() > 0) { - throw new BadRequestException("标记为黄色的子卷号已分配木箱,请重新选择未分配木箱的子卷"); - } - JSONArray jsonArray = whereJson.getJSONArray("tableMater"); - if (jsonArray == null || jsonArray.size() == 0) { - throw new BadRequestException("无选中子卷信息"); - } - List pdmBiSubpackagerelationList = pdmBiSubpackagerelationMapper - .selectList(new LambdaQueryWrapper().eq(PdmBiSubpackagerelation::getSale_order_name, jsonArray.getJSONObject(0).getString("sale_order_name"))); - Integer maxBoxGroup = pdmBiSubpackagerelationList.stream() - .map(PdmBiSubpackagerelation::getBox_group) - .filter(Objects::nonNull) - .map(Integer::parseInt) - .max(Integer::compareTo) - .orElse(0) + 1; - try { - List entityList = JSONObject.parseArray(whereJson.getJSONArray("tableMater").toJSONString(), PdmBiSubpackagerelation.class).stream() - .map(PdmBiSubpackagerelation::getWorkorder_id) - .map(String::valueOf) - .collect(Collectors.toList()); - if (entityList.isEmpty()) { - return; - } - // code:终点,material_code:木箱规格,num: 子卷数 - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - String boxType = whereJson.getString("checked"); - updateWrapper.set("box_type", boxType); - updateWrapper.set("box_group", maxBoxGroup); - updateWrapper.set("status", "0"); - updateWrapper.in("workorder_id", entityList); - pdmBiSubpackagerelationMapper.update(null, updateWrapper); - outBox(entityList, packagerelationList, boxType); - } catch (Exception e) { - throw new BadRequestException(e.getMessage()); - } - } - - - /** - * 空木箱出库 - */ - private void outBox(List entityList, List packagerelationList, String boxType) { - //均衡获取装箱对接位 - //String deviceCode= getPointCode(); - String deviceCode = "ZXQ_1_1"; - JSONObject boxInfo = new JSONObject(); - //确定装箱区终点 - boxInfo.put("device_code", deviceCode); - boxInfo.put("material_code", boxType); - boxInfo.put("num", entityList.size()); - String boxSn = outBoxManageService.outBox(boxInfo); - if (StringUtils.isBlank(boxSn)) { - throw new BadRequestException("库位 -> 装箱对接位,木箱码不能为空!"); - } - //更新子卷包装关系更新木箱号 - CompletableFuture.runAsync(() -> { - try { - updateBoxInfo(entityList, boxSn); - } catch (Exception e) { - log.error("异常信息:" + e); - } - }, pool); - //待检区->装箱区agv任务 - // String finalDeviceCode = deviceCode; - // CompletableFuture.runAsync(() -> { - // try { - // agvTransfer(packagerelationList, finalDeviceCode, boxSn); - // } catch (Exception e) { - // log.error("异常信息:" + e); - // } - // }, pool); - } - - private String getPointCode() { - //均衡获取木箱出库终点 - List bstIvtPackageinfoivtList = bstIvtPackageinfoivtMapper.selectList(new LambdaQueryWrapper().eq(BstIvtPackageinfoivt::getPoint_status, "5").eq(BstIvtPackageinfoivt::getIs_used, "1").orderByAsc(BstIvtPackageinfoivt::getPoint_code)); - if (CollectionUtils.isEmpty(bstIvtPackageinfoivtList)) { - throw new BadRequestException("没有可用的装箱区对接位"); - } - Map resultMap = new HashMap<>(); - //获取装箱位任务数量 - List> taskCount = bstIvtPackageinfoivtMapper.getPointTaskCount(); - if (taskCount != null) { - for (Map map : taskCount) { - Object pointCode2Obj = map.get("point_code2"); - Object countObj = map.get("count"); - if (pointCode2Obj != null && countObj != null) { - String pointCode2 = pointCode2Obj.toString(); - Long countLong = (Long) countObj; - Integer count = countLong.intValue(); - resultMap.merge(pointCode2, count, Integer::sum); - } - } - } - bstIvtPackageinfoivtList.stream() - .collect(Collectors.toMap( - BstIvtPackageinfoivt::getPoint_code, - p -> StringUtils.isNotBlank(p.getContainer_name()) ? 1 : 0, - Integer::sum - )) - .forEach((key, value) -> resultMap.merge(key, value, Integer::sum)); - List> result = resultMap.entrySet().stream() - .map(entry -> Collections.singletonMap(entry.getKey(), entry.getValue())) - .collect(Collectors.toList()); - //获取数量最少的点位 - Optional minPointCode = result.stream() - .min(Comparator.comparingInt(map -> map.entrySet().iterator().next().getValue())) - .map(map -> map.keySet().iterator().next()); - return minPointCode.orElseGet(() -> bstIvtPackageinfoivtList.get(0).getPoint_code()); - } - - - protected void updateBoxInfo(List entityList, String boxSn) { - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.set("package_box_sn", boxSn); - updateWrapper.in("workorder_id", entityList); - pdmBiSubpackagerelationMapper.update(null, updateWrapper); - } - - - /** - * 待检区->装箱区agv任务 - */ - private void agvTransfer1(List packagerelationList, String deviceCode, String boxSn) { - //待检区点位 - List djqPointList = packageinfoivtService - .list(new LambdaUpdateWrapper() - .eq(BstIvtPackageinfoivt::getPoint_status, PackageInfoIvtEnum.POINT_STATUS.code("待检区")) - .eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用")) - //todo 暂时改为合格品 - .eq(BstIvtPackageinfoivt::getIvt_status, PackageInfoIvtEnum.IVT_STATUS.code("合格品")) - .orderByAsc(BstIvtPackageinfoivt::getSort_seq)); - Set containerNames = packagerelationList.stream() - .map(PdmBiSubpackagerelation::getContainer_name) - .collect(Collectors.toSet()); - List djqPoints = djqPointList.stream() - .filter(djqPoint -> containerNames.contains(djqPoint.getContainer_name())) - .collect(Collectors.toList()); - //下发agv任务 - djqPoints.forEach(r -> { - //装箱区点位 - List zxqPointList = packageinfoivtService - .list(new LambdaUpdateWrapper() - .eq(BstIvtPackageinfoivt::getPoint_status, PackageInfoIvtEnum.POINT_STATUS.code("装箱区")) - .eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用")) - .eq(BstIvtPackageinfoivt::getIvt_status, PackageInfoIvtEnum.IVT_STATUS.code("空")) - .eq(BstIvtPackageinfoivt::getBlock, deviceCode.substring(deviceCode.indexOf("_") + 1)) - .orderByAsc(BstIvtPackageinfoivt::getSort_seq)); - JSONObject jo = new JSONObject(); - jo.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("待检区->装箱区")); - jo.put("vehicle_code", r.getContainer_name()); - jo.put("point_code1", r.getPoint_code()); - //木箱号 - jo.put("vehicle_code2", boxSn); - if (CollectionUtils.isEmpty(zxqPointList)) { - throw new BadRequestException("装箱区点位已满!"); - } - jo.put("point_code2", zxqPointList.get(0).getPoint_code()); - zxqTask.createTask(jo); - }); - } - - - protected void agvTransfer(List packagerelationList, String deviceCode, String boxSn) { - //待检区点位 - List djqPointList = packageinfoivtService - .list(new LambdaUpdateWrapper() - .eq(BstIvtPackageinfoivt::getPoint_status, PackageInfoIvtEnum.POINT_STATUS.code("待检区")) - .eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用")) - //.eq(BstIvtPackageinfoivt::getIvt_status, PackageInfoIvtEnum.IVT_STATUS.code("合格品")) - .eq(BstIvtPackageinfoivt::getIvt_status, PackageInfoIvtEnum.IVT_STATUS.code("有子卷")) - .orderByAsc(BstIvtPackageinfoivt::getSort_seq)); - Set containerNames = packagerelationList.stream() - .map(PdmBiSubpackagerelation::getContainer_name) - .collect(Collectors.toSet()); - List djqPoints = djqPointList.stream() - .filter(djqPoint -> containerNames.contains(djqPoint.getContainer_name())) - .collect(Collectors.toList()); - //任务组id - String groupId = deviceCode.substring(deviceCode.lastIndexOf("_") + 1); - List schBaseTaskList = new ArrayList<>(); - //确定起点,安装装箱组标识加入任务队列 - djqPoints.forEach(r -> { - JSONObject jo = new JSONObject(); - jo.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("待检区->装箱区")); - jo.put("vehicle_code", r.getContainer_name()); - jo.put("point_code1", r.getPoint_code()); - //木箱号 - jo.put("vehicle_code2", boxSn); - SchBaseTask task = new SchBaseTask(); - task.setTask_id(zxqTask.createTask(jo)); - //增加任务到队列 - schBaseTaskList.add(task); - }); - //taskQueueManager.addTasksToQueue(groupId, schBaseTaskList); - // taskQueue.addTasksToQueue(groupId, schBaseTaskList); - } - - - /** - * 多选删除 - * - * @param ids 多个Id主键 - */ - @Override - public void deleteAll(Set ids) { - // 物理删除 - pdmBiSubpackagerelationMapper.deleteBatchIds(ids); - } - - - /** - * 获取实体基础信息 - * - * @param entity 对象实体 - * @param isCreate 是否创建 - */ - private PdmBiSubpackagerelation getBasicInfo(PdmBiSubpackagerelation entity, boolean isCreate) { - if (isCreate) { - entity.setCreate_id(Long.valueOf(SecurityUtils.getCurrentUserId())); - entity.setCreate_name(SecurityUtils.getCurrentNickName()); - entity.setCreate_time(DateUtil.now()); - } - return entity; - } - } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/controller/BstIvtPackageinfoivtController.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/controller/BstIvtPackageinfoivtController.java index 07e2471a9..fb0fd0c6a 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/controller/BstIvtPackageinfoivtController.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/controller/BstIvtPackageinfoivtController.java @@ -1,9 +1,17 @@ package org.nl.b_lms.sch.point.controller; + import java.util.Set; + +import cn.dev33.satoken.annotation.SaIgnore; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; import org.nl.b_lms.sch.point.dao.BstIvtPackageinfoivt; +import org.nl.modules.common.exception.BadRequestException; import org.springframework.web.bind.annotation.*; import lombok.RequiredArgsConstructor; + import javax.annotation.Resource; + import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -18,7 +26,7 @@ import org.nl.b_lms.sch.point.service.IbstIvtPackageinfoivtService; */ @RestController @RequiredArgsConstructor -@RequestMapping("/api/bstIvtPackageinfoivt") +@RequestMapping("/api/bstIvtPackageInfoIvt") @Slf4j public class BstIvtPackageinfoivtController { @@ -27,6 +35,29 @@ public class BstIvtPackageinfoivtController { private IbstIvtPackageinfoivtService bstIvtPackageinfoivtService; + /** + * 一楼装箱区点位二次分配 + * + * @param whereJson 任务编号,动作类型:1、取货分配 2、放货分配 3、取货完成 + * @return JSONObject 返回信息 + */ + @PostMapping("/secondaryAllocationPoint") + @SaIgnore + ResponseEntity secondaryAllocationPoint(@RequestBody JSONObject whereJson) { + log.info("一楼装箱区点位二次分配接口请求参数:---------------------------------------------" + whereJson.toString()); + String taskCode = whereJson.getString("taskCode"); + String actionType = whereJson.getString("actionType"); + if (StrUtil.isEmpty(whereJson.getString("taskCode")) || StrUtil.isEmpty(whereJson.getString("actionType"))) { + throw new BadRequestException("任务编号或动作类型不能为空!"); + } + return new ResponseEntity<>(bstIvtPackageinfoivtService.secondaryAllocationPoint(taskCode, actionType), HttpStatus.OK); + } + + /** + * agv二次分配类型(1、普通任务 2、取货二次分配 3、防货二次分配 4、取放货二次分配) + */ + private String agv_action_type; + /** * 新增数据 * @@ -40,8 +71,6 @@ public class BstIvtPackageinfoivtController { } - - /** * 删除数据 * diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/BstIvtPackageinfoivt.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/BstIvtPackageinfoivt.java index 9b846b80c..fac1b0812 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/BstIvtPackageinfoivt.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/BstIvtPackageinfoivt.java @@ -135,6 +135,10 @@ public class BstIvtPackageinfoivt extends Model { */ private String plan; + /** + * 规划 + */ + private String wait_point_type; /** * 获取主键值 diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/mapper/BstIvtPackageinfoivtMapper.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/mapper/BstIvtPackageinfoivtMapper.java index df2246777..6f43bc389 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/mapper/BstIvtPackageinfoivtMapper.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/mapper/BstIvtPackageinfoivtMapper.java @@ -21,4 +21,11 @@ public interface BstIvtPackageinfoivtMapper extends BaseMapper> getPointTaskCount(); + + /** + * 获取待检区到装箱区的任务数量 + */ + Integer getZxqTaskCount(String groupId); + + } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/mapper/BstIvtPackageinfoivtMapper.xml b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/mapper/BstIvtPackageinfoivtMapper.xml index 41483a2b7..17f1ae6c9 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/mapper/BstIvtPackageinfoivtMapper.xml +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/dao/mapper/BstIvtPackageinfoivtMapper.xml @@ -9,8 +9,19 @@ sch_base_task t WHERE t.task_type ='010704' - AND t.task_status 08 + AND t.create_time >= DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%s') + AND t.task_status '07' GROUP BY t.point_code2 - + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/IbstIvtPackageinfoivtService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/IbstIvtPackageinfoivtService.java index 6e962a804..9b2f475c2 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/IbstIvtPackageinfoivtService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/IbstIvtPackageinfoivtService.java @@ -36,9 +36,29 @@ public interface IbstIvtPackageinfoivtService extends IService */ - List checkEndPointTask(String ivtType, String ivtStatus, String pointCode,String taskType); + List checkEndPointTask(String ivtType, String ivtStatus, String pointCode,String sortType,String taskType); + + + /** + * 获取等待点 + */ + String getWaitPoint(String block, String waitPointType); + + + /** + * 一楼装箱区点位二次分配 + * @param taskCode 任务编号 + * @param actionType 动作类型:1、申请起点 2、申请终点 3、取货完成 4、放货完成 + * @return JSONObject 返回信息 + */ + Map secondaryAllocationPoint(String taskCode, String actionType); + + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/BstIvtPackageinfoivtServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/BstIvtPackageinfoivtServiceImpl.java index 5dff76afa..5057a7640 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/BstIvtPackageinfoivtServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/BstIvtPackageinfoivtServiceImpl.java @@ -4,48 +4,58 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; -import jodd.net.HttpStatus; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.nl.b_lms.sch.point.dao.BstIvtPackageinfoivt; import org.nl.b_lms.sch.point.dao.mapper.BstIvtPackageinfoivtMapper; import org.nl.b_lms.sch.point.service.IbstIvtPackageinfoivtService; import cn.hutool.core.date.DateUtil; import org.nl.b_lms.sch.task.dao.SchBaseTask; import org.nl.b_lms.sch.task.service.IschBaseTaskService; -import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; import org.nl.common.enums.PackageInfoIvtEnum; import org.nl.common.utils.SecurityUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.nl.modules.common.exception.BadRequestException; import org.nl.wms.sch.manage.TaskStatusEnum; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.metadata.IPage; import org.nl.common.domain.query.PageQuery; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** - * {@code @Description:} 装箱区点位库存表(BstIvtPackageinfoivt)服务实现层 + * {@code @Description:} 装箱区点位库存表(BstIvtPackageInfoIvt)服务实现层 * {@code @Author:} gbx * * @since 2024-01-24 */ @Service("bstIvtPackageinfoivtService") +@Slf4j public class BstIvtPackageinfoivtServiceImpl extends ServiceImpl implements IbstIvtPackageinfoivtService { - - @Resource - private BstIvtPackageinfoivtMapper bstIvtPackageinfoivtMapper; + private RedissonClient redissonClient; @Resource private IschBaseTaskService taskService; + @Resource + private BstIvtPackageinfoivtMapper bstIvtPackageinfoivtMapper; /** @@ -60,15 +70,81 @@ public class BstIvtPackageinfoivtServiceImpl extends ServiceImpl checkEndPointTask(String ivtType, String ivtStatus, String pointCode, String taskType) { - List packageinfoivtList = bstIvtPackageinfoivtMapper - .selectList(new LambdaUpdateWrapper() - .eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用")) - .eq(BstIvtPackageinfoivt::getPoint_status, ivtType) - .eq(BstIvtPackageinfoivt::getIvt_status, ivtStatus) - .orderByAsc(BstIvtPackageinfoivt::getSort_seq)); + public List checkEndPointTask(String ivtType, String ivtStatus, String pointCode, String sortType, String taskType) { + List packageinfoivtList = getBstIvtPackageinfoivts(ivtType, ivtStatus, sortType); + Set pointIds = packageinfoivtList.stream() + .map(BstIvtPackageinfoivt::getPoint_code) + .collect(Collectors.toSet()); + if (CollectionUtils.isEmpty(pointIds)) { + return null; + } + SFunction pointCodeType1; + SFunction pointCodeType2 = null; + if (pointCode.equals(PackageInfoIvtEnum.TASK_POINT_TYPE.code("取货任务"))) { + pointCodeType1 = SchBaseTask::getPoint_code1; + } else if (pointCode.equals(PackageInfoIvtEnum.TASK_POINT_TYPE.code("放货任务"))) { + pointCodeType1 = SchBaseTask::getPoint_code2; + } else if (pointCode.equals(PackageInfoIvtEnum.TASK_POINT_TYPE.code("取货分配"))) { + pointCodeType1 = SchBaseTask::getPoint_code3; + } else if (pointCode.equals(PackageInfoIvtEnum.TASK_POINT_TYPE.code("放货分配"))) { + pointCodeType1 = SchBaseTask::getPoint_code4; + } else if (pointCode.equals(PackageInfoIvtEnum.TASK_POINT_TYPE.code("取货任务取货分配"))) { + pointCodeType1 = SchBaseTask::getPoint_code1; + pointCodeType2 = SchBaseTask::getPoint_code3; + } else { + pointCodeType1 = SchBaseTask::getPoint_code2; + pointCodeType2 = SchBaseTask::getPoint_code4; + } + // 查询未完成任务 + LambdaQueryWrapper taskQueryWrapper = new LambdaQueryWrapper() + .lt(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode()) + .in(pointCodeType1, pointIds); + if (pointCodeType2 != null) { + taskQueryWrapper = new LambdaQueryWrapper() + .lt(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode()) + .in(pointCodeType1, pointIds).in(pointCodeType2, pointIds); + } + if (taskType != null && !taskType.isEmpty()) { + taskQueryWrapper.eq(SchBaseTask::getTask_type, taskType); + } + List taskList = taskService.list(taskQueryWrapper); + SFunction finalPointCodeType2 = pointCodeType2; + Set taskPointCodes = taskList.stream() + .flatMap(task -> { + Set pointCodeTypes = new HashSet<>(); + pointCodeTypes.add(pointCodeType1.apply(task)); + if (finalPointCodeType2 != null) { + pointCodeTypes.add(finalPointCodeType2.apply(task)); + } + return pointCodeTypes.stream(); + }) + .collect(Collectors.toSet()); + // 过滤未完成任务的任务 + return packageinfoivtList.stream() + .filter(packageInfo -> !taskPointCodes.contains(packageInfo.getPoint_code())) + .collect(Collectors.toList()); + + } + + private List getBstIvtPackageinfoivts(String ivtType, String ivtStatus, String sortType) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用")) + .eq(BstIvtPackageinfoivt::getPoint_status, ivtType) + .eq(BstIvtPackageinfoivt::getIvt_status, ivtStatus); + if (PackageInfoIvtEnum.SORT_TYPE.code("升序").equals(sortType)) { + queryWrapper.orderByAsc(BstIvtPackageinfoivt::getSort_seq); + } else if (PackageInfoIvtEnum.SORT_TYPE.code("降序").equals(sortType)) { + queryWrapper.orderByDesc(BstIvtPackageinfoivt::getSort_seq); + } else { + queryWrapper.orderByAsc(BstIvtPackageinfoivt::getSort_seq); + } + return bstIvtPackageinfoivtMapper.selectList(queryWrapper); + } + + + public List checkEndPointTask1(String ivtType, String ivtStatus, String pointCode, String sortType, String taskType) { + List packageinfoivtList = getBstIvtPackageinfoivts(ivtType, ivtStatus, sortType); Set pointIds = packageinfoivtList.stream().map(BstIvtPackageinfoivt::getPoint_code).collect(Collectors.toSet()); if (CollectionUtils.isEmpty(pointIds)) { return null; @@ -95,36 +171,228 @@ public class BstIvtPackageinfoivtServiceImpl extends ServiceImpl checkEndPointTask1(String ivtType, String ivtStatus, String pointCode, String taskType) { - List packageinfoivtList = bstIvtPackageinfoivtMapper - .selectList(new LambdaQueryWrapper() - .eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用")) - .eq(BstIvtPackageinfoivt::getPoint_status, ivtType) - .eq(BstIvtPackageinfoivt::getIvt_status, ivtStatus) - .orderByAsc(BstIvtPackageinfoivt::getSort_seq)); - Set pointIds = packageinfoivtList.stream() - .map(BstIvtPackageinfoivt::getPoint_code) - .collect(Collectors.toSet()); - if (CollectionUtils.isEmpty(pointIds)) { - return null; + /** + * 获取等待点 + */ + @Override + public String getWaitPoint(String block, String waitPointType) { + List waitPointList = bstIvtPackageinfoivtMapper.selectList(new LambdaQueryWrapper() + .eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用")) + .eq(BstIvtPackageinfoivt::getPoint_status, PackageInfoIvtEnum.POINT_STATUS.code("等待点")) + .eq(BstIvtPackageinfoivt::getBlock, block)); + if (CollectionUtils.isEmpty(waitPointList)) { + throw new BadRequestException("找不到等待点!"); } - //1起点2终点 - SFunction pointCodeType = pointCode.equals("1") ? SchBaseTask::getPoint_code1 : SchBaseTask::getPoint_code2; - // 查询未完成任务 - LambdaQueryWrapper taskQueryWrapper = new LambdaQueryWrapper() - .lt(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode()) - .in(pointCodeType, pointIds); - if (taskType != null && !taskType.isEmpty()) { - taskQueryWrapper.eq(SchBaseTask::getTask_type, taskType); + List waitPoints = waitPointList.stream().filter(r -> r.getPoint_location().equals(waitPointType)).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(waitPoints)) { + throw new BadRequestException("找不到等待点!"); + } + return waitPoints.get(0).getPoint_code(); + } + + + /** + * @param taskCode 任务编码唯一ID + * @param actionType 1、取货分配 2、放货分配 3、取货完成 + * @author gbx + */ + @Transactional(rollbackFor = Exception.class) + @SneakyThrows + public Map secondaryAllocationPoint(String taskCode, String actionType) { + String pointCode = ""; + JSONObject result = new JSONObject(); + RLock lock = redissonClient.getLock(taskCode); + boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); + try { + if (tryLock) { + switch (actionType) { + case "1": + case "2": + // 取货分配, 放货分配 + pointCode = getNewPoint(taskCode, actionType); + break; + case "3": + // 取货完成 + updatePointStatus(taskCode, actionType); + break; + case "4": + // 放货完成,就是任务完成,不需要执行任何操作,但是取货任务的放货完成,需要改变updateTaskStatus:只更新终点库存; + //updatePointStatus(taskCode, pointType); + break; + default: + return null; + } + result.put("status", HttpStatus.OK.value()); + result.put("message", "操作成功!"); + result.put("data", pointCode); + log.info("一楼装箱区点位二次分配接口请求返回结果:---------------------------------------------" + result); + } else { + log.info("一楼装箱区点位二次分配接口异常,正在分配中!"); + result.put("status", HttpStatus.BAD_REQUEST.value()); + result.put("message", "二次分配点位正在分配中!"); + } + } finally { + if (tryLock) { + lock.unlock(); + } + } + return result; + } + + /** + * 根据取放货类型二次分配新的点位 + * + * @param taskCode 任务编号 + * @param actionType 动作类型 + * @return 新的点位 + */ + private String getNewPoint(String taskCode, String actionType) { + //执行中的任务 + SchBaseTask baseTask = taskService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTask::getTask_code, taskCode) + .eq(SchBaseTask::getTask_status, TaskStatusEnum.EXECUTING.getCode())); + if (baseTask == null) { + throw new BadRequestException("该任务未执行或不存在!"); + } + //1取货任务2放货任务 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (PackageInfoIvtEnum.TASK_ACTION_TYPE.code("取货分配").equals(actionType)) { + queryWrapper.eq(BstIvtPackageinfoivt::getPoint_code, baseTask.getPoint_code3()); + } else if (PackageInfoIvtEnum.TASK_ACTION_TYPE.code("放货分配").equals(actionType)) { + queryWrapper.eq(BstIvtPackageinfoivt::getPoint_code, baseTask.getPoint_code4()); + } + BstIvtPackageinfoivt bstIvtPackageinfoivt = bstIvtPackageinfoivtMapper.selectOne(queryWrapper); + //根据任务类型返回点位分配规则 + BstIvtPackageinfoivt ivtInfo = getIvtInfoFromRegion(baseTask.getTask_type(), actionType); + List newPointList = getBstIvtPackageinfoivts(bstIvtPackageinfoivt.getPoint_status(), ivtInfo.getIvt_status(), ivtInfo.getSort_seq().toString()); + if (CollectionUtils.isEmpty(newPointList)) { + throw new BadRequestException("暂无点位资源!"); + } + BstIvtPackageinfoivt point = newPointList.get(0); + if (point != null) { + //更新任务起点或终点 + if (PackageInfoIvtEnum.TASK_ACTION_TYPE.code("取货分配").equals(actionType)) { + baseTask.setPoint_code1(point.getPoint_code()); + if (StringUtils.isNotBlank(point.getContainer_name())) { + //更新子卷号 + baseTask.setVehicle_code(point.getContainer_name()); + } + } else if (PackageInfoIvtEnum.TASK_ACTION_TYPE.code("放货分配").equals(actionType)) { + baseTask.setPoint_code2(point.getPoint_code()); + } + taskService.updateById(baseTask); + return point.getPoint_code(); + } else { + return ""; + } + } + + + /** + * 二次分配逻辑,根据任务类型与acs申请动作类型返回点位分配规则 + */ + public BstIvtPackageinfoivt getIvtInfoFromRegion(String taskType, String actionType) { + BstIvtPackageinfoivt bstIvtPackageinfoivt = new BstIvtPackageinfoivt(); + switch (taskType) { + //满轴缓存位->待检区 + case "010902": + if (PackageInfoIvtEnum.TASK_ACTION_TYPE.code("取货分配").equals(actionType)) { + bstIvtPackageinfoivt.setIvt_status(PackageInfoIvtEnum.IVT_STATUS.code("有子卷")); + bstIvtPackageinfoivt.setSort_seq(BigDecimal.valueOf(PackageInfoIvtEnum.SORT_TYPE.longCode("降序"))); + } else { + bstIvtPackageinfoivt.setIvt_status(PackageInfoIvtEnum.IVT_STATUS.code("空")); + bstIvtPackageinfoivt.setSort_seq(BigDecimal.valueOf(PackageInfoIvtEnum.SORT_TYPE.longCode("降序"))); + } + break; + //待检区->管制区 + case "010906": + if (PackageInfoIvtEnum.TASK_ACTION_TYPE.code("取货分配").equals(actionType)) { + bstIvtPackageinfoivt.setIvt_status(PackageInfoIvtEnum.IVT_STATUS.code("管制品")); + bstIvtPackageinfoivt.setSort_seq(BigDecimal.valueOf(PackageInfoIvtEnum.SORT_TYPE.longCode("升序"))); + } else { + bstIvtPackageinfoivt.setIvt_status(PackageInfoIvtEnum.IVT_STATUS.code("空")); + bstIvtPackageinfoivt.setSort_seq(BigDecimal.valueOf(PackageInfoIvtEnum.SORT_TYPE.longCode("升序"))); + } + break; + //管制区->待检区 + case "010907": + if (PackageInfoIvtEnum.TASK_ACTION_TYPE.code("取货分配").equals(actionType)) { + bstIvtPackageinfoivt.setIvt_status(PackageInfoIvtEnum.IVT_STATUS.code("合格品")); + bstIvtPackageinfoivt.setSort_seq(BigDecimal.valueOf(PackageInfoIvtEnum.SORT_TYPE.longCode("降序"))); + } else { + bstIvtPackageinfoivt.setIvt_status(PackageInfoIvtEnum.IVT_STATUS.code("空")); + bstIvtPackageinfoivt.setSort_seq(BigDecimal.valueOf(PackageInfoIvtEnum.SORT_TYPE.longCode("升序"))); + } + break; + //补空(待检区->空载具缓存位) + case "010905": + if (PackageInfoIvtEnum.TASK_ACTION_TYPE.code("取货分配").equals(actionType)) { + bstIvtPackageinfoivt.setIvt_status(PackageInfoIvtEnum.IVT_STATUS.code("空载具")); + bstIvtPackageinfoivt.setSort_seq(BigDecimal.valueOf(PackageInfoIvtEnum.SORT_TYPE.longCode("升序"))); + } else { + bstIvtPackageinfoivt.setIvt_status(PackageInfoIvtEnum.IVT_STATUS.code("空")); + bstIvtPackageinfoivt.setSort_seq(BigDecimal.valueOf(PackageInfoIvtEnum.SORT_TYPE.longCode("降序"))); + } + break; + //"补空(装箱区->待检区) + case "010910": + if (PackageInfoIvtEnum.TASK_ACTION_TYPE.code("取货分配").equals(actionType)) { + bstIvtPackageinfoivt.setIvt_status(PackageInfoIvtEnum.IVT_STATUS.code("空")); + bstIvtPackageinfoivt.setSort_seq(BigDecimal.valueOf(PackageInfoIvtEnum.SORT_TYPE.longCode("升序"))); + + } else { + bstIvtPackageinfoivt.setIvt_status(PackageInfoIvtEnum.IVT_STATUS.code("空")); + bstIvtPackageinfoivt.setSort_seq(BigDecimal.valueOf(PackageInfoIvtEnum.SORT_TYPE.longCode("升序"))); + } + break; + //补空(装箱区->管制区) + case "010912": + if (PackageInfoIvtEnum.TASK_ACTION_TYPE.code("取货分配").equals(actionType)) { + bstIvtPackageinfoivt.setIvt_status(PackageInfoIvtEnum.IVT_STATUS.code("空载具")); + bstIvtPackageinfoivt.setSort_seq(BigDecimal.valueOf(PackageInfoIvtEnum.SORT_TYPE.longCode("升序"))); + } else { + bstIvtPackageinfoivt.setIvt_status(PackageInfoIvtEnum.IVT_STATUS.code("空")); + bstIvtPackageinfoivt.setSort_seq(BigDecimal.valueOf(PackageInfoIvtEnum.SORT_TYPE.longCode("升序"))); + } + break; + //补空(管制区->空载具缓存位) + case "010913": + if (PackageInfoIvtEnum.TASK_ACTION_TYPE.code("取货分配").equals(actionType)) { + bstIvtPackageinfoivt.setIvt_status(PackageInfoIvtEnum.IVT_STATUS.code("空载具")); + bstIvtPackageinfoivt.setSort_seq(BigDecimal.valueOf(PackageInfoIvtEnum.SORT_TYPE.longCode("降序"))); + } else { + bstIvtPackageinfoivt.setIvt_status(PackageInfoIvtEnum.IVT_STATUS.code("空")); + bstIvtPackageinfoivt.setSort_seq(BigDecimal.valueOf(PackageInfoIvtEnum.SORT_TYPE.longCode("降序"))); + } + break; + default: + return null; + } + return bstIvtPackageinfoivt; + } + + + /** + * 更新点位状态 + * + * @param taskCode 任务编码 + * @param actionType 动作类型 + */ + private void updatePointStatus(String taskCode, String actionType) { + SchBaseTask baseTask = taskService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTask::getTask_code, taskCode) + .eq(SchBaseTask::getTask_status, TaskStatusEnum.EXECUTING.getCode())); + if (baseTask == null) { + throw new BadRequestException("任务不存在!"); + } + //取货任务 + if (actionType.equals(PackageInfoIvtEnum.TASK_ACTION_TYPE.code("取货完成"))) { + //清空起点库存状态 + bstIvtPackageinfoivtMapper.update(null, new UpdateWrapper() + .setSql("ivt_status = null, container_name = '0'") + .eq("point_code", baseTask.getPoint_code1())); + } - List taskList = taskService.list(taskQueryWrapper); - Set taskPointCodes = taskList.stream() - .map(pointCodeType) - .collect(Collectors.toSet()); - // 过滤未完成任务的任务 - return packageinfoivtList.stream() - .filter(packageInfo -> !taskPointCodes.contains(packageInfo.getPoint_code())) - .collect(Collectors.toList()); } @@ -141,7 +409,6 @@ public class BstIvtPackageinfoivtServiceImpl extends ServiceImpl().set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("空")).set("container_name", null).eq("point_code", schBaseTask.getPoint_code1())); + //2.改变起点点位状态,二次分配,取货完成就改起点库存 + //packageinfoivtService.update(new UpdateWrapper().set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("空")).set("container_name", null).eq("point_code", schBaseTask.getPoint_code1())); //3更新库存记录 //todo 暂时改为质检合格品 packageinfoivtService.update(new UpdateWrapper().set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("有子卷")).set("container_name", schBaseTask.getVehicle_code()).eq("point_code", schBaseTask.getPoint_code2())); + //清除首次分配目标点位 + schBaseTask.setPoint_code3(""); //4.判断是否存在确定起点的输送线->满轴缓存位任务,存在就下发任务 List taskList = taskService.list(new LambdaQueryWrapper() //确定起点未下发 @@ -198,7 +199,7 @@ public class DjqTask extends AbstractAcsTask { public void sendDjqToZxq(SchBaseTask schBaseTask) { //装箱区有空位 - List bstIvtPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("装箱区"), PackageInfoIvtEnum.IVT_STATUS.code("空"), "2", ""); + List bstIvtPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("装箱区"), PackageInfoIvtEnum.IVT_STATUS.code("空"),PackageInfoIvtEnum.TASK_POINT_TYPE.code("取货任务"), "",""); if (CollectionUtils.isNotEmpty(bstIvtPackageinfoivtList)) { Map> ivtList = bstIvtPackageinfoivtList.stream() .collect(Collectors.groupingBy( diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/DjqToKzjhcwTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/DjqToKzjhcwTask.java new file mode 100644 index 000000000..0d5625916 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/DjqToKzjhcwTask.java @@ -0,0 +1,297 @@ +package org.nl.b_lms.sch.tasks.first_floor_area; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.nl.b_lms.sch.point.dao.BstIvtPackageinfoivt; +import org.nl.b_lms.sch.point.service.IbstIvtPackageinfoivtService; +import org.nl.b_lms.sch.task.dao.SchBaseTask; +import org.nl.b_lms.sch.task.dto.SchBaseTaskVO; +import org.nl.b_lms.sch.task.service.IschBaseTaskService; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.common.enums.PackageInfoIvtEnum; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.wms.sch.AcsTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + + +/** + * 3 目标空载具缓存位, 待检区->空载具缓存位补空agv任务 + * + * @author gbx + * @since 2024-01-24 + */ +@Service() +@RequiredArgsConstructor +@Slf4j +public class DjqToKzjhcwTask extends AbstractAcsTask { + + + private final String THIS_CLASS = DjqToKzjhcwTask.class.getName(); + @Resource + private IschBaseTaskService taskService; + + @Resource + private IbstIvtPackageinfoivtService packageinfoivtService; + + + @Resource + private SsxDjwTask ssxDjwTask; + + + @Override + public List addTask() { + ArrayList resultList = new ArrayList<>(); + List taskList = taskService.list(new LambdaUpdateWrapper().eq(SchBaseTask::getHandle_class, THIS_CLASS) + .eq(SchBaseTask::getTask_status, TaskStatusEnum.START_AND_POINT.getCode()) + .eq(SchBaseTask::getIs_delete, 0) + ); + taskList.forEach(r -> { + AcsTaskDto dto = AcsTaskDto.builder() + .ext_task_id(r.getTask_id().toString()) + .task_code(r.getTask_code()) + .task_type(r.getAcs_task_type()) + .start_device_code(r.getPoint_code1()) + .next_device_code(r.getPoint_code2()) + .vehicle_code(r.getVehicle_code()) + .priority(r.getPriority()) + .remark(r.getRemark()) + .product_area(r.getProduct_area()) + .agv_action_type(r.getVehicle_code2()) + .agv_system_type(PackageInfoIvtEnum.AGV_SYSTEM_TYPE.code("1楼诺宝任务")) + .interaction_json(JSON.parseObject(r.getRequest_param())) + .build(); + resultList.add(dto); + }); + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper().eq(SchBaseTask::getTask_id, taskObj.getString("task_id")), false); + if (schBaseTask == null) { + throw new BadRequestException("待检区->空载具缓存位完成接口任务号为空!"); + } + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + // 更新任务状态为执行中 + schBaseTask.setTask_status(TaskStatusEnum.EXECUTING.getCode()); + } + if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { + //1.更改任务状态为完成 + schBaseTask.setTask_status(TaskStatusEnum.FINISHED.getCode()); + //2.改变起点点位状态 + packageinfoivtService.update(new UpdateWrapper().set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("空")).set("container_name", null).eq("point_code", schBaseTask.getPoint_code1())); + //清除首次分配目标点位 + schBaseTask.setPoint_code4(""); + //更新库存记录 + packageinfoivtService.update(new UpdateWrapper().set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("空载具")).eq("point_code", schBaseTask.getPoint_code2())); + //3.待检区或管制区搬运空载具到空载具缓存位完毕,判断是否存在确定终点的空载具缓存位->输送线任务,存在就下发任务 + List taskList = taskService.list(new LambdaQueryWrapper() + //确定终点未下发 + .eq(SchBaseTask::getTask_status, TaskStatusEnum.SURE_END.getCode()) + .eq(SchBaseTask::getPoint_code2, "NBJ1002") + .eq(SchBaseTask::getTask_type, PackageInfoIvtEnum.TASK_TYPE.code("放空(空载具缓存位->输送线)")).eq(SchBaseTask::getIs_delete, IOSEnum.IS_NOTANDYES.code("否")) + ); + if (CollectionUtils.isNotEmpty(taskList)) { + SchBaseTask task = taskList.get(0); + task.setPoint_code1(schBaseTask.getPoint_code2()); + task.setTask_status(TaskStatusEnum.START_AND_POINT.getCode()); + task.setUpdate_time(DateUtil.now()); + task.setUpdate_optid(SecurityUtils.getCurrentUserId()); + task.setUpdate_optname(SecurityUtils.getCurrentNickName()); + taskService.update(task); + //任务下发 + ssxDjwTask.immediateNotifyAcs(task.getTask_id().toString()); + } + } + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + if (Integer.parseInt(schBaseTask.getTask_status()) > Integer.parseInt(TaskStatusEnum.ISSUE.getCode())) { + throw new BadRequestException("任务已执行不能取消"); + } + //任务被标记为取消 + schBaseTask.setTask_status(TaskStatusEnum.CANCEL.getCode()); + } + schBaseTask.setUpdate_time(DateUtil.now()); + schBaseTask.setUpdate_optid(SecurityUtils.getCurrentUserId()); + schBaseTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); + taskService.update(schBaseTask); + } + + @Override + public String createTask(JSONObject form) { + Assert.notNull(form, "请求参数不能为空"); + String taskType = form.getString("task_type"); + if (StrUtil.isBlank(taskType)) { + throw new BadRequestException("业务类型不能为空"); + } + String vehicleCode = form.getString("vehicle_code"); + // if (StrUtil.isBlank(vehicleCode)) { + // throw new BadRequestException("载具号不能为空"); + // } + String pointCode1 = form.getString("point_code1"); + if (StrUtil.isBlank(pointCode1)) { + throw new BadRequestException("起点不能为空"); + } + String pointCode2 = form.getString("point_code2"); + if (StrUtil.isBlank(pointCode2)) { + throw new BadRequestException("下一点不能为空"); + } + //是否立即下发 + boolean isSend = !StrUtil.isNotBlank(form.getString("is_send")) || BooleanUtil.toBoolean(form.getString("is_send")); + SchBaseTaskVO schBaseTaskVo = SchBaseTaskVO.builder() + .task_type(taskType) + .vehicle_code(vehicleCode) + .vehicle_code2(form.getString("vehicle_code2")) + .point_code1(pointCode1) + .point_code2(pointCode2) + .point_code3(form.getString("point_code3")) + .point_code4(form.getString("point_code4")) + .task_id(org.nl.common.utils.IdUtil.getStringId()) + .task_code(org.nl.common.utils.IdUtil.getStringId()) + .handle_class(THIS_CLASS) + .create_id(SecurityUtils.getCurrentUserId()) + .create_name(SecurityUtils.getCurrentUsername()) + .create_time(DateUtil.now()) + .is_send(isSend ? "1" : "0") + .acs_task_type(StrUtil.isEmpty(form.getString("acs_task_type")) ? PackageInfoIvtEnum.ACS_TASK_TYPE.code("agv任务") : form.getString("acs_task_type")) + .task_status(StrUtil.isEmpty(form.getString("task_status")) ? TaskStatusEnum.START_AND_POINT.getCode() : form.getString("task_status")) + .product_area(StrUtil.isEmpty(form.getString("product_area")) ? "BLK" : form.getString("product_area")) + .build(); + SchBaseTask task = new SchBaseTask(); + BeanUtils.copyProperties(schBaseTaskVo, task); + taskService.save(task); + //如果目标点位没有空位先创建不下发 + if (isSend) { + this.immediateNotifyAcs(null); + } + return task.getTask_id(); + } + + + @Override + @Transactional + public void forceFinish(String taskId) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(SchBaseTask::getTask_id, taskId), false); + if (schBaseTask == null) { + throw new BadRequestException("待检区->空载具缓存位强制完成接口任务号为空!"); + } + updateTaskStatus(JSONObject.parseObject(JSON.toJSONString(schBaseTask)), TaskStatusEnum.FINISHED.getCode()); + } + + + @Override + public void cancel(String taskId) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(SchBaseTask::getTask_id, taskId), false); + if (schBaseTask == null) { + throw new BadRequestException("待检区->空载具缓存位取消接口任务号为空!"); + } + schBaseTask.setTask_status(TaskStatusEnum.CANCEL.getCode()); + schBaseTask.setUpdate_time(DateUtil.now()); + schBaseTask.setUpdate_optid(SecurityUtils.getCurrentUserId()); + schBaseTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); + taskService.update(schBaseTask); + } + + // /** + // * 装箱区->空载具缓存位补空 + // */ + // public void toKzjHcw1(String pointCode) { + // //存在空载具缓存位无空载具的点位 + // List kzjIvtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("空载具缓存位"), PackageInfoIvtEnum.IVT_STATUS.code("空"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("放货分配"), "", ""); + // String pointCode1 = null; + // JSONObject task = new JSONObject(); + // if (StringUtils.isNotBlank(pointCode)) { + // pointCode1 = pointCode; + // } else { + // //待检区有空载具且过滤未完成任务 + // List djqPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("待检区"), PackageInfoIvtEnum.IVT_STATUS.code("空载具"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("取货任务取货分配"), PackageInfoIvtEnum.SORT_TYPE.code("升序"), ""); + // if (CollectionUtils.isNotEmpty(djqPackageinfoivtList)) { + // //无二次分配 + // List notNeedAllocation = djqPackageinfoivtList.stream().filter(r -> !r.getWait_point_type().equals(PackageInfoIvtEnum.WAIT_POINT_TYPE.code("待检区等待点"))).collect(Collectors.toList()); + // if (CollectionUtils.isNotEmpty(notNeedAllocation)) { + // pointCode1 = notNeedAllocation.get(0).getPoint_code(); + // task.put("vehicle_code2", PackageInfoIvtEnum.AGV_ACTION_TYPE.code("放货二次分配")); + // } else { + // if (CollectionUtils.isNotEmpty(djqPackageinfoivtList)) { + // pointCode1 = packageinfoivtService.getWaitPoint(djqPackageinfoivtList.get(0).getBlock(), djqPackageinfoivtList.get(0).getWait_point_type()); + // task.put("vehicle_code1", PackageInfoIvtEnum.AGV_ACTION_TYPE.code("取放货二次分配")); + // task.put("point_code3", djqPackageinfoivtList.get(0).getPoint_code()); + // } + // } + // } else { + // //管制区有空位 + // List gzqList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("管制区"), PackageInfoIvtEnum.IVT_STATUS.code("空载具"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("取货分配"), "", ""); + // if (CollectionUtils.isNotEmpty(gzqList)) { + // //需要二次分配,起点分配等待点 + // pointCode1 = packageinfoivtService.getWaitPoint(gzqList.get(0).getBlock(), gzqList.get(0).getWait_point_type()); + // task.put("point_code3", gzqList.get(0).getPoint_code()); + // task.put("vehicle_code2", PackageInfoIvtEnum.AGV_ACTION_TYPE.code("取放货二次分配")); + // } + // } + // //去待检区或管制区搬运空载具 + // if (CollectionUtils.isNotEmpty(kzjIvtList) && pointCode1 != null) { + // task.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("补空(待检区->空载具缓存位)")); + // task.put("point_code1", pointCode1); + // //送空二次分配,目标点分配等待点 + // task.put("point_code4", kzjIvtList.get(0).getPoint_code()); + // task.put("point_code2", packageinfoivtService.getWaitPoint(kzjIvtList.get(0).getBlock(), kzjIvtList.get(0).getWait_point_type())); + // this.createTask(task); + // } + // } + // } + // + // public void toKzjHcw(String pointCode) { + // //存在空载具缓存位无空载具的点位 + // List kzjIvtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("空载具缓存位"), PackageInfoIvtEnum.IVT_STATUS.code("空"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("放货任务"), PackageInfoIvtEnum.SORT_TYPE.code("降序"), ""); + // String pointCode1 = null; + // JSONObject toKzjHcwTask = new JSONObject(); + // if (StringUtils.isNotBlank(pointCode)) { + // pointCode1 = pointCode; + // } else { + // //查询装箱区有空载具 + // List zxqPointList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("装箱区"), PackageInfoIvtEnum.IVT_STATUS.code("空载具"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("取货任务"), "", ""); + // //装箱区有空载具 + // if (CollectionUtils.isNotEmpty(zxqPointList)) { + // pointCode1 = zxqPointList.get(0).getPoint_code(); + // } else { + // //待检区有空载具 + // List djqPointList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("待检区"), PackageInfoIvtEnum.IVT_STATUS.code("空载具"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("取货任务"), "", ""); + // if (CollectionUtils.isNotEmpty(djqPointList)) { + // pointCode1 = djqPointList.get(0).getPoint_code(); + // } + // } + // } + // //去装箱区搬运空载具 + // if (CollectionUtils.isNotEmpty(kzjIvtList) && pointCode1 != null) { + // toKzjHcwTask.put("point_code1", pointCode1); + // //送到到任意空载具缓存位 + // toKzjHcwTask.put("point_code2", kzjIvtList.get(0).getPoint_code()); + // toKzjHcwTask.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("补空(待检区->空载具缓存位)")); + // this.createTask(toKzjHcwTask); + // } + // } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/GzqTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/GzqTask.java index 930b9e5ef..7e2097f9e 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/GzqTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/GzqTask.java @@ -69,6 +69,7 @@ public class GzqTask extends AbstractAcsTask { .priority(r.getPriority()) .remark(r.getRemark()) .product_area(r.getProduct_area()) + .agv_action_type(r.getVehicle_code2()) .agv_system_type(PackageInfoIvtEnum.AGV_SYSTEM_TYPE.code("1楼诺宝任务")) //.truss_type(PackageInfoIvtEnum.TRUSS_TYPE.code("点对点任务")) //.dtl_type(r.getDtl_type()) diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/KzjhcwTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/GzqToKzjhcwTask.java similarity index 65% rename from lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/KzjhcwTask.java rename to lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/GzqToKzjhcwTask.java index db3c611fe..6d1d6db3e 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/KzjhcwTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/GzqToKzjhcwTask.java @@ -32,10 +32,11 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; /** - * 3 目标空载具缓存位, 待检区或管制区 -> 空载具缓存位补空agv任务 + * 3 目标空载具缓存位, 管制区->空载具缓存位补空agv任务 * * @author gbx * @since 2024-01-24 @@ -43,15 +44,17 @@ import java.util.List; @Service() @RequiredArgsConstructor @Slf4j -public class KzjhcwTask extends AbstractAcsTask { +public class GzqToKzjhcwTask extends AbstractAcsTask { - private final String THIS_CLASS = KzjhcwTask.class.getName(); + private final String THIS_CLASS = GzqToKzjhcwTask.class.getName(); @Resource private IschBaseTaskService taskService; @Resource private IbstIvtPackageinfoivtService packageinfoivtService; + + @Resource private SsxDjwTask ssxDjwTask; @@ -70,12 +73,11 @@ public class KzjhcwTask extends AbstractAcsTask { .task_type(r.getAcs_task_type()) .start_device_code(r.getPoint_code1()) .next_device_code(r.getPoint_code2()) - .start_device_code2(r.getPoint_code3()) - .next_device_code2(r.getPoint_code4()) .vehicle_code(r.getVehicle_code()) .priority(r.getPriority()) .remark(r.getRemark()) .product_area(r.getProduct_area()) + .agv_action_type(r.getVehicle_code2()) .agv_system_type(PackageInfoIvtEnum.AGV_SYSTEM_TYPE.code("1楼诺宝任务")) .interaction_json(JSON.parseObject(r.getRequest_param())) .build(); @@ -89,7 +91,7 @@ public class KzjhcwTask extends AbstractAcsTask { public void updateTaskStatus(JSONObject taskObj, String status) { SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper().eq(SchBaseTask::getTask_id, taskObj.getString("task_id")), false); if (schBaseTask == null) { - throw new BadRequestException("待检区或管制区 -> 空载具缓存位完成接口任务号为空!"); + throw new BadRequestException("管制区->空载具缓存位完成接口任务号为空!"); } if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { // 更新任务状态为执行中 @@ -100,6 +102,8 @@ public class KzjhcwTask extends AbstractAcsTask { schBaseTask.setTask_status(TaskStatusEnum.FINISHED.getCode()); //2.改变起点点位状态 packageinfoivtService.update(new UpdateWrapper().set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("空")).set("container_name", null).eq("point_code", schBaseTask.getPoint_code1())); + //清除首次分配目标点位 + schBaseTask.setPoint_code4(""); //更新库存记录 packageinfoivtService.update(new UpdateWrapper().set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("空载具")).eq("point_code", schBaseTask.getPoint_code2())); //3.待检区或管制区搬运空载具到空载具缓存位完毕,判断是否存在确定终点的空载具缓存位->输送线任务,存在就下发任务 @@ -192,7 +196,7 @@ public class KzjhcwTask extends AbstractAcsTask { SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() .eq(SchBaseTask::getTask_id, taskId), false); if (schBaseTask == null) { - throw new BadRequestException("待检区或管制区 -> 空载具缓存位强制完成接口任务号为空!"); + throw new BadRequestException("管制区->空载具缓存位强制完成接口任务号为空!"); } updateTaskStatus(JSONObject.parseObject(JSON.toJSONString(schBaseTask)), TaskStatusEnum.FINISHED.getCode()); } @@ -203,7 +207,7 @@ public class KzjhcwTask extends AbstractAcsTask { SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() .eq(SchBaseTask::getTask_id, taskId), false); if (schBaseTask == null) { - throw new BadRequestException("待检区或管制区 -> 空载具缓存位取消接口任务号为空!"); + throw new BadRequestException("管制区->空载具缓存位取消接口任务号为空!"); } schBaseTask.setTask_status(TaskStatusEnum.CANCEL.getCode()); schBaseTask.setUpdate_time(DateUtil.now()); @@ -212,75 +216,5 @@ public class KzjhcwTask extends AbstractAcsTask { taskService.update(schBaseTask); } - /** - * 装箱区->空载具缓存位补空 - */ - public void toKzjHcw1(String pointCode) { - //存在空载具缓存位无空载具的点位 - List kzjIvtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("空载具缓存位"), PackageInfoIvtEnum.IVT_STATUS.code("空"), "2", ""); - String pointCode1 = null; - JSONObject toKzjHcwTask = new JSONObject(); - if (StringUtils.isNotBlank(pointCode)) { - pointCode1 = pointCode; - } else { - //查询待检区有空载具 - List djqPointList = packageinfoivtService - .list(new LambdaUpdateWrapper() - .eq(BstIvtPackageinfoivt::getPoint_status, PackageInfoIvtEnum.POINT_STATUS.code("待检区")) - .eq(BstIvtPackageinfoivt::getIs_used, IOSEnum.IS_NOTANDYES.code("是")) - .eq(BstIvtPackageinfoivt::getIvt_status, PackageInfoIvtEnum.IVT_STATUS.code("空载具")).orderByAsc(BstIvtPackageinfoivt::getSort_seq)); - if (CollectionUtils.isNotEmpty(djqPointList)) { - pointCode1 = djqPointList.get(0).getPoint_code(); - } else { - //去管制区搬运空载具 - List gzqPointList = packageinfoivtService - .list(new LambdaUpdateWrapper() - .eq(BstIvtPackageinfoivt::getPoint_status, PackageInfoIvtEnum.POINT_STATUS.code("管制区")) - .eq(BstIvtPackageinfoivt::getIs_used, IOSEnum.IS_NOTANDYES.code("是")) - .eq(BstIvtPackageinfoivt::getIvt_status, PackageInfoIvtEnum.IVT_STATUS.code("空载具")).orderByAsc(BstIvtPackageinfoivt::getSort_seq)); - if (CollectionUtils.isNotEmpty(gzqPointList)) { - pointCode1 = gzqPointList.get(0).getPoint_code(); - } - } - //去待检区或管制区搬运空载具 - if (CollectionUtils.isNotEmpty(kzjIvtList) && pointCode1 != null) { - toKzjHcwTask.put("point_code1", pointCode1); - //送到到任意空载具缓存位 - toKzjHcwTask.put("point_code2", kzjIvtList.get(0).getPoint_code()); - toKzjHcwTask.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("取空(待检区或管制区->空载具缓存位)")); - this.createTask(toKzjHcwTask); - } - } - } - public void toKzjHcw(String pointCode) { - //存在空载具缓存位无空载具的点位 - List kzjIvtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("空载具缓存位"), PackageInfoIvtEnum.IVT_STATUS.code("空"), "2", ""); - String pointCode1 = null; - JSONObject toKzjHcwTask = new JSONObject(); - if (StringUtils.isNotBlank(pointCode)) { - pointCode1 = pointCode; - } else { - //查询装箱区有空载具 - List zxqPointList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("装箱区"), PackageInfoIvtEnum.IVT_STATUS.code("空载具"), "1", ""); - //装箱区有空载具 - if (CollectionUtils.isNotEmpty(zxqPointList)) { - pointCode1 = zxqPointList.get(0).getPoint_code(); - } else { - //待检区有空载具 - List djqPointList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("待检区"), PackageInfoIvtEnum.IVT_STATUS.code("空载具"), "1", ""); - if (CollectionUtils.isNotEmpty(djqPointList)) { - pointCode1 = djqPointList.get(0).getPoint_code(); - } - } - } - //去装箱区搬运空载具 - if (CollectionUtils.isNotEmpty(kzjIvtList) && pointCode1 != null) { - toKzjHcwTask.put("point_code1", pointCode1); - //送到到任意空载具缓存位 - toKzjHcwTask.put("point_code2", kzjIvtList.get(0).getPoint_code()); - toKzjHcwTask.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("取空(待检区或管制区->空载具缓存位)")); - this.createTask(toKzjHcwTask); - } - } } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/MzhcwTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/MzhcwTask.java index 8647258a0..f92fcf7e6 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/MzhcwTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/MzhcwTask.java @@ -69,7 +69,7 @@ public class MzhcwTask extends AbstractAcsTask { @Resource - private KzjhcwTask kzjhcwTask; + private DjqToKzjhcwTask djqToKzjhcwTask; @Resource private SsxDjwTask ssxDjwTask; @@ -95,6 +95,7 @@ public class MzhcwTask extends AbstractAcsTask { .priority(r.getPriority()) .remark(r.getRemark()) .product_area(r.getProduct_area()) + .agv_action_type(PackageInfoIvtEnum.AGV_ACTION_TYPE.code("普通任务")) .interaction_json(JSON.parseObject(r.getRequest_param())) .build(); resultList.add(dto); @@ -199,12 +200,12 @@ public class MzhcwTask extends AbstractAcsTask { toKzjHcwTask.put("point_code1", djqOrGzqPointList.get(0).getPoint_code()); } - toKzjHcwTask.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("取空(待检区或管制区->空载具缓存位)")); + toKzjHcwTask.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("补空(待检区->空载具缓存位)")); //送到到任意空载具缓存位 toKzjHcwTask.put("point_code2", kzjPoint.get(0).getPoint_code()); //toKzjHcwTask.put("vehicle_code", containerInfo.getContainer_name()); toKzjHcwTask.put("vehicle_code", schBaseTask.getVehicle_code()); - kzjhcwTask.createTask(toKzjHcwTask); + djqToKzjhcwTask.createTask(toKzjHcwTask); } } } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/SendKzjTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/SendDjqKzjTask.java similarity index 91% rename from lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/SendKzjTask.java rename to lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/SendDjqKzjTask.java index 1212b86aa..4935afadb 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/SendKzjTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/SendDjqKzjTask.java @@ -31,7 +31,7 @@ import java.util.ArrayList; import java.util.List; /** - * 7 目标待检区, 装箱区 -> 待检区或管制区送空载具,agv任务 + * 7 目标待检区, 装箱区 -> 待检区送空载具,agv任务 * * @author gbx * @since 2024-01-24 @@ -39,13 +39,13 @@ import java.util.List; @Service() @RequiredArgsConstructor @Slf4j -public class SendKzjTask extends AbstractAcsTask { +public class SendDjqKzjTask extends AbstractAcsTask { @Resource private IschBaseTaskService taskService; @Resource private IbstIvtPackageinfoivtService packageinfoivtService; - private final String THIS_CLASS = SendKzjTask.class.getName(); + private final String THIS_CLASS = SendDjqKzjTask.class.getName(); @Override public List addTask() { @@ -67,6 +67,7 @@ public class SendKzjTask extends AbstractAcsTask { .priority(r.getPriority()) .remark(r.getRemark()) .product_area(r.getProduct_area()) + .agv_action_type(r.getVehicle_code2()) .agv_system_type(PackageInfoIvtEnum.AGV_SYSTEM_TYPE.code("1楼诺宝任务")) .interaction_json(JSON.parseObject(r.getRequest_param())) .build(); @@ -80,7 +81,7 @@ public class SendKzjTask extends AbstractAcsTask { public void updateTaskStatus(JSONObject taskObj, String status) { SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper().eq(SchBaseTask::getTask_id, taskObj.getString("task_id")), false); if (schBaseTask == null) { - throw new BadRequestException("装箱区->待检区或管制区送空载具完成接口任务号为空!"); + throw new BadRequestException("装箱区->待检区送空载具完成接口任务号为空!"); } if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { // 更新任务状态为执行中 @@ -116,9 +117,9 @@ public class SendKzjTask extends AbstractAcsTask { throw new BadRequestException("业务类型不能为空"); } String vehicleCode = form.getString("vehicle_code"); - if (StrUtil.isBlank(vehicleCode)) { - throw new BadRequestException("载具号不能为空"); - } + // if (StrUtil.isBlank(vehicleCode)) { + // throw new BadRequestException("载具号不能为空"); + // } String pointCode1 = form.getString("point_code1"); if (StrUtil.isBlank(pointCode1)) { throw new BadRequestException("起点不能为空"); @@ -165,7 +166,7 @@ public class SendKzjTask extends AbstractAcsTask { SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() .eq(SchBaseTask::getTask_id, taskId), false); if (schBaseTask == null) { - throw new BadRequestException("装箱区->待检区或管制区送空载具强制完成接口任务号为空!"); + throw new BadRequestException("装箱区->待检区送空载具强制完成接口任务号为空!"); } updateTaskStatus(JSONObject.parseObject(JSON.toJSONString(schBaseTask)), TaskStatusEnum.FINISHED.getCode()); } @@ -176,7 +177,7 @@ public class SendKzjTask extends AbstractAcsTask { SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() .eq(SchBaseTask::getTask_id, taskId), false); if (schBaseTask == null) { - throw new BadRequestException("装箱区->待检区或管制区送空载具取消接口任务号为空!"); + throw new BadRequestException("装箱区->待检区送空载具取消接口任务号为空!"); } schBaseTask.setTask_status(TaskStatusEnum.CANCEL.getCode()); schBaseTask.setUpdate_time(DateUtil.now()); diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/SendGzqKzjTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/SendGzqKzjTask.java new file mode 100644 index 000000000..7278fd2e4 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/SendGzqKzjTask.java @@ -0,0 +1,190 @@ +package org.nl.b_lms.sch.tasks.first_floor_area; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.b_lms.sch.point.dao.BstIvtPackageinfoivt; +import org.nl.b_lms.sch.point.service.IbstIvtPackageinfoivtService; +import org.nl.b_lms.sch.task.dao.SchBaseTask; +import org.nl.b_lms.sch.task.dto.SchBaseTaskVO; +import org.nl.b_lms.sch.task.service.IschBaseTaskService; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.common.enums.PackageInfoIvtEnum; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.wms.sch.AcsTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * 7 目标管制区, 装箱区 -> 管制区送空载具,agv任务 + * + * @author gbx + * @since 2024-01-24 + */ +@Service() +@RequiredArgsConstructor +@Slf4j +public class SendGzqKzjTask extends AbstractAcsTask { + @Resource + private IschBaseTaskService taskService; + @Resource + private IbstIvtPackageinfoivtService packageinfoivtService; + + private final String THIS_CLASS = SendGzqKzjTask.class.getName(); + + @Override + public List addTask() { + ArrayList resultList = new ArrayList<>(); + List taskList = taskService.list(new LambdaUpdateWrapper().eq(SchBaseTask::getHandle_class, THIS_CLASS) + .eq(SchBaseTask::getTask_status, TaskStatusEnum.START_AND_POINT.getCode()) + .eq(SchBaseTask::getIs_delete, 0) + ); + taskList.forEach(r -> { + AcsTaskDto dto = AcsTaskDto.builder() + .ext_task_id(r.getTask_id().toString()) + .task_code(r.getTask_code()) + .task_type(r.getAcs_task_type()) + .start_device_code(r.getPoint_code1()) + .next_device_code(r.getPoint_code2()) + .start_device_code2(r.getPoint_code3()) + .next_device_code2(r.getPoint_code4()) + .vehicle_code(r.getVehicle_code()) + .priority(r.getPriority()) + .remark(r.getRemark()) + .product_area(r.getProduct_area()) + .agv_action_type(r.getVehicle_code2()) + .agv_system_type(PackageInfoIvtEnum.AGV_SYSTEM_TYPE.code("1楼诺宝任务")) + .interaction_json(JSON.parseObject(r.getRequest_param())) + .build(); + resultList.add(dto); + }); + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper().eq(SchBaseTask::getTask_id, taskObj.getString("task_id")), false); + if (schBaseTask == null) { + throw new BadRequestException("装箱区->管制区送空载具完成接口任务号为空!"); + } + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + // 更新任务状态为执行中 + schBaseTask.setTask_status(TaskStatusEnum.EXECUTING.getCode()); + } + if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { + //1.更改任务状态为完成 + schBaseTask.setTask_status(TaskStatusEnum.FINISHED.getCode()); + //2.改变起点点位状态 + packageinfoivtService.update(new UpdateWrapper().set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("空")).set("container_name", null).eq("point_code", schBaseTask.getPoint_code1())); + //3.更新库存记录 + packageinfoivtService.update(new UpdateWrapper().set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("空载具")).eq("point_code", schBaseTask.getPoint_code2())); + } + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + if (Integer.parseInt(schBaseTask.getTask_status()) > Integer.parseInt(TaskStatusEnum.ISSUE.getCode())) { + throw new BadRequestException("任务已执行不能取消"); + } + //任务被标记为取消 + schBaseTask.setTask_status(TaskStatusEnum.CANCEL.getCode()); + } + schBaseTask.setUpdate_time(DateUtil.now()); + schBaseTask.setUpdate_optid(SecurityUtils.getCurrentUserId()); + schBaseTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); + taskService.update(schBaseTask); + } + + @Override + public String createTask(JSONObject form) { + Assert.notNull(form, "请求参数不能为空"); + String taskType = form.getString("task_type"); + if (StrUtil.isBlank(taskType)) { + throw new BadRequestException("业务类型不能为空"); + } + String vehicleCode = form.getString("vehicle_code"); + // if (StrUtil.isBlank(vehicleCode)) { + // throw new BadRequestException("载具号不能为空"); + // } + String pointCode1 = form.getString("point_code1"); + if (StrUtil.isBlank(pointCode1)) { + throw new BadRequestException("起点不能为空"); + } + String pointCode2 = form.getString("point_code2"); + if (StrUtil.isBlank(pointCode2)) { + throw new BadRequestException("下一点不能为空"); + } + //是否立即下发 + boolean isSend = !StrUtil.isNotBlank(form.getString("is_send")) || BooleanUtil.toBoolean(form.getString("is_send")); + SchBaseTaskVO schBaseTaskVo = SchBaseTaskVO.builder() + .task_type(taskType) + .vehicle_code(vehicleCode) + .vehicle_code2(form.getString("vehicle_code2")) + .point_code1(pointCode1) + .point_code2(pointCode2) + .point_code3(form.getString("point_code3")) + .point_code4(form.getString("point_code4")) + .task_id(org.nl.common.utils.IdUtil.getStringId()) + .task_code(org.nl.common.utils.IdUtil.getStringId()) + .handle_class(THIS_CLASS) + .create_id(SecurityUtils.getCurrentUserId()) + .create_name(SecurityUtils.getCurrentUsername()) + .create_time(DateUtil.now()) + .is_send(isSend ? "1" : "0") + .acs_task_type(StrUtil.isEmpty(form.getString("acs_task_type")) ? PackageInfoIvtEnum.ACS_TASK_TYPE.code("agv任务") : form.getString("acs_task_type")) + .task_status(StrUtil.isEmpty(form.getString("task_status")) ? TaskStatusEnum.START_AND_POINT.getCode() : form.getString("task_status")) + .product_area(StrUtil.isEmpty(form.getString("product_area")) ? "BLK" : form.getString("product_area")) + .build(); + SchBaseTask task = new SchBaseTask(); + BeanUtils.copyProperties(schBaseTaskVo, task); + taskService.save(task); + //如果目标点位没有空位先创建不下发 + if (isSend) { + this.immediateNotifyAcs(null); + } + return task.getTask_id(); + } + + + @Override + @Transactional + public void forceFinish(String taskId) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(SchBaseTask::getTask_id, taskId), false); + if (schBaseTask == null) { + throw new BadRequestException("装箱区->管制区送空载具强制完成接口任务号为空!"); + } + updateTaskStatus(JSONObject.parseObject(JSON.toJSONString(schBaseTask)), TaskStatusEnum.FINISHED.getCode()); + } + + + @Override + public void cancel(String taskId) { + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper() + .eq(SchBaseTask::getTask_id, taskId), false); + if (schBaseTask == null) { + throw new BadRequestException("装箱区->管制区送空载具取消接口任务号为空!"); + } + schBaseTask.setTask_status(TaskStatusEnum.CANCEL.getCode()); + schBaseTask.setUpdate_time(DateUtil.now()); + schBaseTask.setUpdate_optid(SecurityUtils.getCurrentUserId()); + schBaseTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); + taskService.update(schBaseTask); + } + + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/SsxDjwTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/SsxDjwTask.java index 65eb95275..085e9cf44 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/SsxDjwTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/SsxDjwTask.java @@ -71,6 +71,7 @@ public class SsxDjwTask extends AbstractAcsTask { .vehicle_code(r.getVehicle_code()) .priority(r.getPriority()) .remark(r.getRemark()) + .agv_action_type(PackageInfoIvtEnum.AGV_ACTION_TYPE.code("普通任务")) .product_area(r.getProduct_area()) .interaction_json(JSON.parseObject(r.getRequest_param())) .build(); @@ -105,7 +106,7 @@ public class SsxDjwTask extends AbstractAcsTask { // //有空载具,创建搬运空载具任务 // if (CollectionUtils.isNotEmpty(zxqPointList)) { // JSONObject toKzjhcwTask = new JSONObject(); - // toKzjhcwTask.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("取空(待检区或管制区->空载具缓存位)")); + // toKzjhcwTask.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("补空(待检区->空载具缓存位)")); // toKzjhcwTask.put("point_code1", zxqPointList.get(0).getPoint_code()); // //任务起点为补空载具终点 // toKzjhcwTask.put("point_code2", schBaseTask.getPoint_code1()); diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/ZxDjwTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/ZxDjwTask.java index e829f8d1d..f5adf7673 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/ZxDjwTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/ZxDjwTask.java @@ -12,7 +12,6 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; 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.subpackagerelation.dao.PdmBiSubpackagerelation; @@ -38,7 +37,6 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; /** * 6 目标装箱对接位, 装箱区 -> 装箱对接位,桁架任务 @@ -52,7 +50,7 @@ import java.util.stream.Collectors; public class ZxDjwTask extends AbstractAcsTask { @Resource - private KzjhcwTask kzjhcwTask; + private DjqToKzjhcwTask djqToKzjhcwTask; @Resource private DjqTask djqTask; @Resource @@ -85,6 +83,7 @@ public class ZxDjwTask extends AbstractAcsTask { .start_device_code2(r.getPoint_code3()) .next_device_code2(r.getPoint_code4()) .vehicle_code(r.getVehicle_code()) + .agv_action_type(PackageInfoIvtEnum.AGV_ACTION_TYPE.code("普通任务")) .interaction_json(JSON.parseObject(r.getRequest_param())) .priority(r.getPriority()) .remark(r.getRemark()) @@ -148,8 +147,8 @@ public class ZxDjwTask extends AbstractAcsTask { } //任务被标记为取消 schBaseTask.setTask_status(TaskStatusEnum.CANCEL.getCode()); + schBaseTask.setRemark("任务被强制取消,不执行任何逻辑!"); } - schBaseTask.setRemark("任务被强制取消,不执行任何逻辑!"); schBaseTask.setUpdate_time(DateUtil.now()); schBaseTask.setUpdate_optid(SecurityUtils.getCurrentUserId()); schBaseTask.setUpdate_optname(SecurityUtils.getCurrentNickName()); diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/ZxqTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/ZxqTask.java index eac540018..b64698f16 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/ZxqTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/ZxqTask.java @@ -99,6 +99,7 @@ public class ZxqTask extends AbstractAcsTask { .remark(r.getRemark()) .product_area(r.getProduct_area()) .interaction_json(JSON.parseObject(r.getRequest_param())) + .agv_action_type(PackageInfoIvtEnum.AGV_ACTION_TYPE.code("普通任务")) .agv_system_type(PackageInfoIvtEnum.AGV_SYSTEM_TYPE.code("1楼诺宝任务")) //.truss_type(PackageInfoIvtEnum.TRUSS_TYPE.code("点对点任务")) //.dtl_type(r.getDtl_type()) @@ -263,6 +264,7 @@ public class ZxqTask extends AbstractAcsTask { .task_id(org.nl.common.utils.IdUtil.getStringId()) .task_code(org.nl.common.utils.IdUtil.getStringId()) .handle_class(THIS_CLASS) + .car_no(form.getString("car_no")) .create_id(SecurityUtils.getCurrentUserId()) .create_name(SecurityUtils.getCurrentUsername()) .create_time(DateUtil.now()) diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendDjqToGzq.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendDjqToGzq.java new file mode 100644 index 000000000..00661196f --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendDjqToGzq.java @@ -0,0 +1,62 @@ +package org.nl.b_lms.sch.tasks.first_floor_area.auto; + +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.nl.b_lms.sch.point.dao.BstIvtPackageinfoivt; +import org.nl.b_lms.sch.point.service.IbstIvtPackageinfoivtService; +import org.nl.b_lms.sch.tasks.first_floor_area.GzqTask; +import org.nl.common.enums.PackageInfoIvtEnum; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + + +@Slf4j +@Component +@RequiredArgsConstructor +public class AutoSendDjqToGzq { + + @Resource + private GzqTask gzqTask; + + @Resource + private IbstIvtPackageinfoivtService packageinfoivtService; + + //待检区->管制区agv自动搬运任务 + public void run() { + //this.sendDjqToGzq(); + } + + void sendDjqToGzq() { + JSONObject task = new JSONObject(); + String pointCode1; + //待检区有管制品且过滤未完成任务 + List djqPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("待检区"), PackageInfoIvtEnum.IVT_STATUS.code("管制品"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("取货任务取货分配"), PackageInfoIvtEnum.SORT_TYPE.code("升序"), ""); + if (CollectionUtils.isEmpty(djqPackageinfoivtList)) { + return; + } + //无需二次分配 + List notNeedAllocation = djqPackageinfoivtList.stream().filter(r -> !r.getWait_point_type().equals(PackageInfoIvtEnum.WAIT_POINT_TYPE.code("待检区等待点"))).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(notNeedAllocation)) { + pointCode1 = notNeedAllocation.get(0).getPoint_code(); + task.put("vehicle_code2", PackageInfoIvtEnum.AGV_ACTION_TYPE.code("放货二次分配")); + } else { + pointCode1 = packageinfoivtService.getWaitPoint(djqPackageinfoivtList.get(0).getBlock(), djqPackageinfoivtList.get(0).getWait_point_type()); + task.put("vehicle_code2", PackageInfoIvtEnum.AGV_ACTION_TYPE.code("取放货二次分配")); + task.put("point_code3", djqPackageinfoivtList.get(0).getPoint_code()); + } + List gzqPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("管制区"), PackageInfoIvtEnum.IVT_STATUS.code("空"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("放货分配"), "", ""); + if (pointCode1 != null && CollectionUtils.isNotEmpty(gzqPackageinfoivtList)) { + task.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("待检区->管制区")); + task.put("point_code1", pointCode1); + //需要二次分配,起点分配等待点 + task.put("point_code2", packageinfoivtService.getWaitPoint(gzqPackageinfoivtList.get(0).getBlock(), gzqPackageinfoivtList.get(0).getWait_point_type())); + task.put("point_code4", gzqPackageinfoivtList.get(0).getPoint_code()); + gzqTask.createTask(task); + } + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendDjqToZxqTwo.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendDjqToZxqTwo.java deleted file mode 100644 index 7c242dbcb..000000000 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendDjqToZxqTwo.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.nl.b_lms.sch.tasks.first_floor_area.auto; - -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.collections4.CollectionUtils; -import org.nl.b_lms.sch.point.dao.BstIvtPackageinfoivt; -import org.nl.b_lms.sch.point.service.IbstIvtPackageinfoivtService; -import org.nl.b_lms.sch.tasks.first_floor_area.ZxqTask; -import org.nl.common.enums.PackageInfoIvtEnum; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; - - -@Slf4j -@Component -@RequiredArgsConstructor -public class AutoSendDjqToZxqTwo { - - @Resource - private IbstIvtPackageinfoivtService packageinfoivtService; - @Resource - private ZxqTask zxqTask; - @Resource - private TaskQueueManager taskQueueManager; - @Resource - private TaskQueue taskQueue; - //待检区->装箱区agv自动搬运任务 - public void run() { - this.sendDjqToZxq(); - } - - void sendDjqToZxq() { - JSONObject toDjqTask =new JSONObject(); - //待检区有子卷且没有未完成任务 - List djqPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("待检区"), PackageInfoIvtEnum.IVT_STATUS.code("有子卷"), "1",""); - List zxqPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("装箱区"), PackageInfoIvtEnum.IVT_STATUS.code("空"), "2",""); - if (CollectionUtils.isNotEmpty(djqPackageinfoivtList)&&CollectionUtils.isNotEmpty(zxqPackageinfoivtList)) { - toDjqTask.put("vehicle_code", djqPackageinfoivtList.get(0).getContainer_name()); - toDjqTask.put("point_code1", djqPackageinfoivtList.get(0).getPoint_code()); - toDjqTask.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("待检区->装箱区")); - toDjqTask.put("point_code2", zxqPackageinfoivtList.get(0).getPoint_code()); - zxqTask.createTask(toDjqTask); - } - } - - -} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendGzqToDjq.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendGzqToDjq.java new file mode 100644 index 000000000..d2972ee34 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendGzqToDjq.java @@ -0,0 +1,66 @@ +package org.nl.b_lms.sch.tasks.first_floor_area.auto; + +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.nl.b_lms.sch.point.dao.BstIvtPackageinfoivt; +import org.nl.b_lms.sch.point.service.IbstIvtPackageinfoivtService; +import org.nl.b_lms.sch.tasks.first_floor_area.DjqTask; +import org.nl.common.enums.PackageInfoIvtEnum; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + + +@Slf4j +@Component +@RequiredArgsConstructor +public class AutoSendGzqToDjq { + + @Resource + private DjqTask djqTask; + + @Resource + private IbstIvtPackageinfoivtService packageinfoivtService; + + //管制区->待检区agv自动搬运任务 + public void run() { + //this.sendGzqToDjq(); + } + + void sendGzqToDjq() { + JSONObject task = new JSONObject(); + String pointCode2; + //管制区有合格品且过滤未完成任务 + List gzqPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("管制区"), PackageInfoIvtEnum.IVT_STATUS.code("合格品"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("取货分配"), PackageInfoIvtEnum.SORT_TYPE.code("降序"), ""); + if (CollectionUtils.isEmpty(gzqPackageinfoivtList)) { + return; + } + //待检区有空位且过滤未完成任务 + List djqPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("待检区"), PackageInfoIvtEnum.IVT_STATUS.code("空"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("放货任务放货分配"), PackageInfoIvtEnum.SORT_TYPE.code("升序"), ""); + if (CollectionUtils.isEmpty(djqPackageinfoivtList)) { + return; + } + //无需二次分配 + List notNeedAllocation = djqPackageinfoivtList.stream().filter(r -> !r.getWait_point_type().equals(PackageInfoIvtEnum.WAIT_POINT_TYPE.code("待检区等待点"))).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(notNeedAllocation)) { + pointCode2 = notNeedAllocation.get(0).getPoint_code(); + task.put("vehicle_code2", PackageInfoIvtEnum.AGV_ACTION_TYPE.code("取货二次分配")); + } else { + pointCode2 = packageinfoivtService.getWaitPoint(djqPackageinfoivtList.get(0).getBlock(), djqPackageinfoivtList.get(0).getWait_point_type()); + task.put("vehicle_code2", PackageInfoIvtEnum.AGV_ACTION_TYPE.code("取放货二次分配")); + task.put("point_code4", djqPackageinfoivtList.get(0).getPoint_code()); + } + if (pointCode2 != null) { + task.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("管制区->待检区")); + //需要二次分配,起点分配等待点 + task.put("point_code1", packageinfoivtService.getWaitPoint(gzqPackageinfoivtList.get(0).getBlock(), gzqPackageinfoivtList.get(0).getWait_point_type())); + task.put("point_code3", gzqPackageinfoivtList.get(0).getPoint_code()); + task.put("point_code2", pointCode2); + djqTask.createTask(task); + } + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendMzToDjq.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendMzToDjq.java index 831e2880e..c1a9243d5 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendMzToDjq.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendMzToDjq.java @@ -28,21 +28,64 @@ public class AutoSendMzToDjq { //满轴->待检区agv自动搬运任务 public void run() { - this.sendMzqToDjq(); + this.sendMzqToDjq(); } void sendMzqToDjq() { - JSONObject toDjqTask =new JSONObject(); + JSONObject toDjqTask = new JSONObject(); //满轴有子卷且没有未完成任务 - List bstIvtPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("满轴缓存位"), PackageInfoIvtEnum.IVT_STATUS.code("有子卷"), "1",""); - List djqPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("待检区"), PackageInfoIvtEnum.IVT_STATUS.code("空"), "2",""); - if (CollectionUtils.isNotEmpty(bstIvtPackageinfoivtList)&&CollectionUtils.isNotEmpty(djqPackageinfoivtList)) { - toDjqTask.put("vehicle_code", bstIvtPackageinfoivtList.get(0).getContainer_name()); - toDjqTask.put("point_code1", bstIvtPackageinfoivtList.get(0).getPoint_code()); - toDjqTask.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("满轴缓存位->待检区")); - toDjqTask.put("point_code2", djqPackageinfoivtList.get(0).getPoint_code()); - djqTask.createTask(toDjqTask); + List bstIvtPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("满轴缓存位"), PackageInfoIvtEnum.IVT_STATUS.code("有子卷"), "1", "2", ""); + if (CollectionUtils.isEmpty(bstIvtPackageinfoivtList)) { + return; } + List djqPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("待检区"), PackageInfoIvtEnum.IVT_STATUS.code("空"), "2", "1", ""); + if (CollectionUtils.isNotEmpty(djqPackageinfoivtList)) { + toDjqTask.put("vehicle_code", bstIvtPackageinfoivtList.get(0).getContainer_name()); + toDjqTask.put("point_code1", bstIvtPackageinfoivtList.get(0).getPoint_code()); + toDjqTask.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("满轴缓存位->待检区")); + toDjqTask.put("point_code2", djqPackageinfoivtList.get(0).getPoint_code()); + djqTask.createTask(toDjqTask); + } + } + + + void sendMzqToDjq1() { + try { + String pointCode2 = null; + JSONObject task = new JSONObject(); + //满轴有子卷且过滤未完成任务 + List mzqPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("满轴缓存位"), PackageInfoIvtEnum.IVT_STATUS.code("有子卷"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("取货分配"), PackageInfoIvtEnum.SORT_TYPE.code("降序"), ""); + if (CollectionUtils.isEmpty(mzqPackageinfoivtList)) { + return; + } + //待检区有空位且过滤未完成任务 + List djqPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("待检区"), PackageInfoIvtEnum.IVT_STATUS.code("空"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("放货任务放货分配"), PackageInfoIvtEnum.SORT_TYPE.code("降序"), ""); + if (CollectionUtils.isEmpty(djqPackageinfoivtList)) { + return; + } + //无需二次分配 + List notNeedAllocation = djqPackageinfoivtList.stream().filter(r -> !r.getWait_point_type().equals(PackageInfoIvtEnum.WAIT_POINT_TYPE.code("待检区等待点"))).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(notNeedAllocation)) { + pointCode2 = notNeedAllocation.get(0).getPoint_code(); + task.put("vehicle_code2", PackageInfoIvtEnum.AGV_ACTION_TYPE.code("取货二次分配")); + } else { + pointCode2 = packageinfoivtService.getWaitPoint(djqPackageinfoivtList.get(0).getBlock(), djqPackageinfoivtList.get(0).getWait_point_type()); + task.put("vehicle_code2", PackageInfoIvtEnum.AGV_ACTION_TYPE.code("取放货二次分配")); + task.put("point_code4", djqPackageinfoivtList.get(0).getPoint_code()); + } + if (pointCode2 != null) { + task.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("满轴缓存位->待检区")); + task.put("vehicle_code", mzqPackageinfoivtList.get(0).getContainer_name()); + //需要二次分配,起点分配等待点 + task.put("point_code1", packageinfoivtService.getWaitPoint(mzqPackageinfoivtList.get(0).getBlock(), mzqPackageinfoivtList.get(0).getWait_point_type())); + task.put("point_code3", mzqPackageinfoivtList.get(0).getPoint_code()); + task.put("point_code2", pointCode2); + djqTask.createTask(task); + } + } catch (Exception ex) { + log.error("sendMzqToDjq1 error:{}", ex.getMessage()); + } + } // void sendMzqToDjq() { // //满轴位有子卷 @@ -68,8 +111,8 @@ public class AutoSendMzToDjq { // throw new BadRequestException("非法的子卷等级!"); // } // level = "1"; - // JSONObject toDjqTask = new JSONObject(); - // toDjqTask.put("vehicle_code", containerName); + // JSONObject task = new JSONObject(); + // task.put("vehicle_code", containerName); // // 判断子卷等级属于待检区还是管制区,创建满轴缓存位到待检区或管制区的agv任务 // String finalLevel1 = level; // if (Stream.of(ContainerLevelEnum.BEST, ContainerLevelEnum.WELL, ContainerLevelEnum.COMMON).anyMatch(enumItem -> enumItem.getCode().equals(finalLevel1))) { @@ -79,10 +122,10 @@ public class AutoSendMzToDjq { // if (CollectionUtils.isEmpty(djqPointList)) { // throw new BadRequestException("待检区暂无空余库位!"); // } - // toDjqTask.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("满轴缓存位->待检区")); - // toDjqTask.put("point_code1", pointCode); - // toDjqTask.put("point_code2", djqPointList.get(0).getPoint_code()); - // djqTask.createTask(toDjqTask); + // task.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("满轴缓存位->待检区")); + // task.put("point_code1", pointCode); + // task.put("point_code2", djqPointList.get(0).getPoint_code()); + // djqTask.createTask(task); // } else { // String finalLevel2 = level; // if (Stream.of(ContainerLevelEnum.REWORK, ContainerLevelEnum.CONTROL).anyMatch(enumItem -> enumItem.getCode().equals(finalLevel2))) { @@ -92,10 +135,10 @@ public class AutoSendMzToDjq { // if (CollectionUtils.isEmpty(gkqPointList)) { // throw new BadRequestException("管控区暂无空余库位!"); // } - // toDjqTask.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("满轴缓存位->管制区")); - // toDjqTask.put("point_code1", pointCode); - // toDjqTask.put("point_code2", gkqPointList.get(0).getPoint_code()); - // gzqTask.createTask(toDjqTask); + // task.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("满轴缓存位->管制区")); + // task.put("point_code1", pointCode); + // task.put("point_code2", gkqPointList.get(0).getPoint_code()); + // gzqTask.createTask(task); // } // } // } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendToZxq.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendToZxq.java index a6c995d6d..b952870d9 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendToZxq.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendToZxq.java @@ -17,7 +17,6 @@ import java.util.Map; import java.util.stream.Collectors; - @Slf4j @Component @RequiredArgsConstructor @@ -31,17 +30,21 @@ public class AutoSendToZxq { private TaskQueueManager taskQueueManager; @Resource private TaskQueue taskQueue; + //待检区->装箱区agv自动搬运任务 public void run() { this.sendDjqToZxq(); } - void sendDjqToZxq1() { - JSONObject toDjqTask =new JSONObject(); - //待检区有子卷且没有未完成任务 - List djqPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("待检区"), PackageInfoIvtEnum.IVT_STATUS.code("有子卷"), "1",""); - List zxqPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("装箱区"), PackageInfoIvtEnum.IVT_STATUS.code("空"), "2",""); - if (CollectionUtils.isNotEmpty(djqPackageinfoivtList)&&CollectionUtils.isNotEmpty(zxqPackageinfoivtList)) { + void sendDjqToZxq() { + JSONObject toDjqTask = new JSONObject(); + //待检区有子卷且过滤未完成任务 + List djqPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("待检区"), PackageInfoIvtEnum.IVT_STATUS.code("有子卷"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("取货任务"), "", ""); + if (CollectionUtils.isEmpty(djqPackageinfoivtList)) { + return; + } + List zxqPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("装箱区"), PackageInfoIvtEnum.IVT_STATUS.code("空"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("放货任务"), "", ""); + if (CollectionUtils.isNotEmpty(zxqPackageinfoivtList)) { toDjqTask.put("vehicle_code", djqPackageinfoivtList.get(0).getContainer_name()); toDjqTask.put("point_code1", djqPackageinfoivtList.get(0).getPoint_code()); toDjqTask.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("待检区->装箱区")); @@ -51,11 +54,12 @@ public class AutoSendToZxq { } - public void sendDjqToZxq() { + public void sendDjqToZxq1() { //装箱区有空位,去待检区消费合格品子卷 List bstIvtPackageinfoivtList = packageinfoivtService.checkEndPointTask( PackageInfoIvtEnum.POINT_STATUS.code("装箱区"), - PackageInfoIvtEnum.IVT_STATUS.code("空"),"2",""); + PackageInfoIvtEnum.IVT_STATUS.code("空"), + PackageInfoIvtEnum.TASK_POINT_TYPE.code("放货任务"), "", ""); if (CollectionUtils.isNotEmpty(bstIvtPackageinfoivtList)) { Map> ivtList = bstIvtPackageinfoivtList.stream() .collect(Collectors.groupingBy( diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendVehicleToDjq.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendVehicleToDjq.java index cb09a4f82..e0517deff 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendVehicleToDjq.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendVehicleToDjq.java @@ -1,65 +1,92 @@ package org.nl.b_lms.sch.tasks.first_floor_area.auto; import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.nl.b_lms.sch.point.dao.BstIvtPackageinfoivt; import org.nl.b_lms.sch.point.service.IbstIvtPackageinfoivtService; -import org.nl.b_lms.sch.tasks.first_floor_area.SendKzjTask; -import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.b_lms.sch.tasks.first_floor_area.DjqToKzjhcwTask; +import org.nl.b_lms.sch.tasks.first_floor_area.GzqToKzjhcwTask; +import org.nl.b_lms.sch.tasks.first_floor_area.SendDjqKzjTask; +import org.nl.b_lms.sch.tasks.first_floor_area.SendGzqKzjTask; import org.nl.common.enums.PackageInfoIvtEnum; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.List; +import java.util.stream.Collectors; @Slf4j @Component +@RequiredArgsConstructor public class AutoSendVehicleToDjq { + @Resource + private SendDjqKzjTask sendDjqKzjTask; + @Resource + private SendGzqKzjTask sendGzqKzjTask; @Resource private IbstIvtPackageinfoivtService packageinfoivtService; - @Resource - private SendKzjTask sendKzjTask; - //装箱区->待检区送空agv自动搬运任务 + public void run() { - //this.sendKzjHcwEmptyVehicle(); + //this.sendVehicleToDjqOrGzq(); } - void sendKzjHcwEmptyVehicle() { + /** + * 装箱区->待检区或管制区补空载具 + */ + public void sendVehicleToDjqOrGzq() { + //存在装箱区有空载具的点位 + String pointCode2 = null; JSONObject task = new JSONObject(); - String pointCode1=null; - String pointCode2; - //待检区有空位 - List djqList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("装箱区"), PackageInfoIvtEnum.IVT_STATUS.code("空"),"2",""); - if (CollectionUtils.isNotEmpty(djqList)) { - pointCode2=djqList.get(0).getPoint_code(); - }else{ + List zxqIvtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("装箱区"), PackageInfoIvtEnum.IVT_STATUS.code("空载具"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("取货任务"), "", ""); + if (CollectionUtils.isEmpty(zxqIvtList)) { + return; + } + //待检区有空位且过滤未完成任务 + List djqPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("待检区"), PackageInfoIvtEnum.IVT_STATUS.code("空"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("放货分配"), PackageInfoIvtEnum.SORT_TYPE.code("降序"), ""); + if (CollectionUtils.isNotEmpty(djqPackageinfoivtList)) { + //无二次分配 + List notNeedAllocation = djqPackageinfoivtList.stream().filter(r -> !r.getWait_point_type().equals(PackageInfoIvtEnum.WAIT_POINT_TYPE.code("待检区等待点"))).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(notNeedAllocation)) { + pointCode2 = notNeedAllocation.get(0).getPoint_code(); + task.put("vehicle_code2", PackageInfoIvtEnum.AGV_ACTION_TYPE.code("普通任务")); + } else { + if (CollectionUtils.isNotEmpty(djqPackageinfoivtList)) { + pointCode2 = packageinfoivtService.getWaitPoint(djqPackageinfoivtList.get(0).getBlock(), djqPackageinfoivtList.get(0).getWait_point_type()); + task.put("vehicle_code1", PackageInfoIvtEnum.AGV_ACTION_TYPE.code("放货二次分配")); + task.put("point_code4", djqPackageinfoivtList.get(0).getPoint_code()); + } + } + task.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("补空(装箱区->待检区)")); + } else { //管制区有空位 - List zxqList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("装箱区"), PackageInfoIvtEnum.IVT_STATUS.code("空"),"2",""); - pointCode2=zxqList.get(0).getPoint_code(); + List gzqList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("管制区"), PackageInfoIvtEnum.IVT_STATUS.code("空"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("放货分配"), PackageInfoIvtEnum.SORT_TYPE.code("升序"), ""); + if (CollectionUtils.isNotEmpty(gzqList)) { + //需要二次分配,起点分配等待点 + pointCode2 = packageinfoivtService.getWaitPoint(gzqList.get(0).getBlock(), gzqList.get(0).getWait_point_type()); + task.put("point_code4", gzqList.get(0).getPoint_code()); + //agv二次分配类型 + task.put("vehicle_code2", PackageInfoIvtEnum.AGV_ACTION_TYPE.code("取放货二次分配")); + task.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("补空(装箱区->管制区)")); + } } - //查询装箱区有空载具 - List zxqPointList = packageinfoivtService - .list(new LambdaUpdateWrapper() - .eq(BstIvtPackageinfoivt::getPoint_status, PackageInfoIvtEnum.POINT_STATUS.code("装箱区")) - .eq(BstIvtPackageinfoivt::getIs_used, IOSEnum.IS_NOTANDYES.code("是")) - .eq(BstIvtPackageinfoivt::getIvt_status, PackageInfoIvtEnum.IVT_STATUS.code("空载具")).orderByAsc(BstIvtPackageinfoivt::getSort_seq)); - //装箱区有空载具 - if (CollectionUtils.isNotEmpty(zxqPointList)) { - pointCode1 = zxqPointList.get(0).getPoint_code(); - } - //去装箱区搬运空载具 - if (pointCode1 != null && pointCode2 != null) { - task.put("point_code1", pointCode1); + //去待检区或管制区搬运空载具 + if (pointCode2 != null) { task.put("point_code2", pointCode2); - task.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("送空(装箱区->待检区或管制区)")); - sendKzjTask.createTask(task); + //送空二次分配,目标点分配等待点 + task.put("point_code3", zxqIvtList.get(0).getPoint_code()); + task.put("point_code1", packageinfoivtService.getWaitPoint(zxqIvtList.get(0).getBlock(), zxqIvtList.get(0).getWait_point_type())); + if (task.getString("task_type").equals(PackageInfoIvtEnum.TASK_TYPE.code("补空(装箱区->待检区)"))) { + sendDjqKzjTask.createTask(task); + } else { + sendGzqKzjTask.createTask(task); + } } } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendVehicleToKz.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendVehicleToKz.java deleted file mode 100644 index 21284bcda..000000000 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendVehicleToKz.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.nl.b_lms.sch.tasks.first_floor_area.auto; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.b_lms.sch.tasks.first_floor_area.KzjhcwTask; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - - -@Slf4j -@Component -@RequiredArgsConstructor -public class AutoSendVehicleToKz { - - @Resource - private KzjhcwTask kzjhcwTask; - - - public void run() { - this.sendToKzjHcw(); - } - - //待检区->空轴缓存位补空agv自动搬运任务 - void sendToKzjHcw() { - kzjhcwTask.toKzjHcw(""); - } - - -} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendVehicleToKzj.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendVehicleToKzj.java new file mode 100644 index 000000000..b859711a2 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendVehicleToKzj.java @@ -0,0 +1,121 @@ +package org.nl.b_lms.sch.tasks.first_floor_area.auto; + +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.nl.b_lms.sch.point.dao.BstIvtPackageinfoivt; +import org.nl.b_lms.sch.point.service.IbstIvtPackageinfoivtService; +import org.nl.b_lms.sch.tasks.first_floor_area.DjqToKzjhcwTask; +import org.nl.b_lms.sch.tasks.first_floor_area.GzqToKzjhcwTask; +import org.nl.common.enums.PackageInfoIvtEnum; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + + +@Slf4j +@Component +@RequiredArgsConstructor +public class AutoSendVehicleToKzj { + + @Resource + private DjqToKzjhcwTask djqToKzjhcwTask; + @Resource + private GzqToKzjhcwTask gzqToKzjhcwTask; + + @Resource + private IbstIvtPackageinfoivtService packageinfoivtService; + + + public void run() { + this.toKzjHcw(); + } + + + /** + * 待检区或管制区->空载具缓存位补空 + */ + public void toKzjHcw1() { + //存在空载具缓存位无空载具的点位 + String pointCode1 = null; + JSONObject task = new JSONObject(); + List kzjIvtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("空载具缓存位"), PackageInfoIvtEnum.IVT_STATUS.code("空"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("放货分配"), "", ""); + if (CollectionUtils.isEmpty(kzjIvtList)) { + return; + } + //待检区有空载具且过滤未完成任务 + List djqPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("待检区"), PackageInfoIvtEnum.IVT_STATUS.code("空载具"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("取货任务取货分配"), PackageInfoIvtEnum.SORT_TYPE.code("升序"), ""); + if (CollectionUtils.isNotEmpty(djqPackageinfoivtList)) { + //无二次分配 + List notNeedAllocation = djqPackageinfoivtList.stream().filter(r -> !r.getWait_point_type().equals(PackageInfoIvtEnum.WAIT_POINT_TYPE.code("待检区等待点"))).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(notNeedAllocation)) { + pointCode1 = notNeedAllocation.get(0).getPoint_code(); + task.put("vehicle_code2", PackageInfoIvtEnum.AGV_ACTION_TYPE.code("放货二次分配")); + } else { + if (CollectionUtils.isNotEmpty(djqPackageinfoivtList)) { + pointCode1 = packageinfoivtService.getWaitPoint(djqPackageinfoivtList.get(0).getBlock(), djqPackageinfoivtList.get(0).getWait_point_type()); + task.put("vehicle_code1", PackageInfoIvtEnum.AGV_ACTION_TYPE.code("取放货二次分配")); + task.put("point_code3", djqPackageinfoivtList.get(0).getPoint_code()); + } + } + task.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("补空(待检区->空载具缓存位)")); + } else { + //管制区有空位 + List gzqList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("管制区"), PackageInfoIvtEnum.IVT_STATUS.code("空载具"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("取货分配"), "", ""); + if (CollectionUtils.isNotEmpty(gzqList)) { + //需要二次分配,起点分配等待点 + pointCode1 = packageinfoivtService.getWaitPoint(gzqList.get(0).getBlock(), gzqList.get(0).getWait_point_type()); + task.put("point_code3", gzqList.get(0).getPoint_code()); + //agv二次分配类型 + task.put("vehicle_code2", PackageInfoIvtEnum.AGV_ACTION_TYPE.code("取放货二次分配")); + task.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("补空(管制区->空载具缓存位)")); + } + } + //去待检区或管制区搬运空载具 + if (pointCode1 != null) { + task.put("point_code1", pointCode1); + //送空二次分配,目标点分配等待点 + task.put("point_code4", kzjIvtList.get(0).getPoint_code()); + task.put("point_code2", packageinfoivtService.getWaitPoint(kzjIvtList.get(0).getBlock(), kzjIvtList.get(0).getWait_point_type())); + if (task.getString("task_type").equals(PackageInfoIvtEnum.TASK_TYPE.code("补空(待检区->空载具缓存位)"))) { + djqToKzjhcwTask.createTask(task); + } else { + gzqToKzjhcwTask.createTask(task); + } + } + } + + public void toKzjHcw() { + //存在空载具缓存位无空载具的点位 + List kzjIvtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("空载具缓存位"), PackageInfoIvtEnum.IVT_STATUS.code("空"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("放货任务"), PackageInfoIvtEnum.SORT_TYPE.code("降序"), ""); + if (CollectionUtils.isEmpty(kzjIvtList)) { + return; + } + String pointCode1 = null; + JSONObject toKzjHcwTask = new JSONObject(); + //查询装箱区有空载具 + List zxqPointList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("装箱区"), PackageInfoIvtEnum.IVT_STATUS.code("空载具"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("取货任务"), "", ""); + //装箱区有空载具 + if (CollectionUtils.isNotEmpty(zxqPointList)) { + pointCode1 = zxqPointList.get(0).getPoint_code(); + } else { + //待检区有空载具 + List djqPointList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("待检区"), PackageInfoIvtEnum.IVT_STATUS.code("空载具"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("取货任务"), "", ""); + if (CollectionUtils.isNotEmpty(djqPointList)) { + pointCode1 = djqPointList.get(0).getPoint_code(); + } + } + //去装箱区搬运空载具 + if (pointCode1 != null) { + toKzjHcwTask.put("point_code1", pointCode1); + //送到到任意空载具缓存位 + toKzjHcwTask.put("point_code2", kzjIvtList.get(0).getPoint_code()); + toKzjHcwTask.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("补空(待检区->空载具缓存位)")); + djqToKzjhcwTask.createTask(toKzjHcwTask); + } + } + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendZxToDjw.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendZxToDjw.java index fe5a053bd..1fc929787 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendZxToDjw.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendZxToDjw.java @@ -6,15 +6,13 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; -import org.nl.b_lms.pdm.bi.slittingproductionplan.service.IPdmBiSlittingproductionplanService; +import org.apache.commons.lang3.StringUtils; import org.nl.b_lms.pdm.bi.slittingproductionplan.service.dao.PdmBiSlittingproductionplan; import org.nl.b_lms.pdm.bi.slittingproductionplan.service.dao.mapper.PdmBiSlittingproductionplanMapper; import org.nl.b_lms.pdm.subpackagerelation.dao.PdmBiSubpackagerelation; import org.nl.b_lms.pdm.subpackagerelation.service.IpdmBiSubpackagerelationService; import org.nl.b_lms.sch.point.dao.BstIvtPackageinfoivt; import org.nl.b_lms.sch.point.service.IbstIvtPackageinfoivtService; -import org.nl.b_lms.sch.task.service.IschBaseTaskService; -import org.nl.b_lms.sch.tasks.first_floor_area.DjqTask; import org.nl.b_lms.sch.tasks.first_floor_area.ZxDjwTask; import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxinfo; import org.nl.b_lms.storage_manage.database.service.dao.mapper.BstIvtBoxinfoMapper; @@ -52,98 +50,121 @@ public class AutoSendZxToDjw { @Resource private ISysParamService iSysParamService; - //满轴->待检区agv自动搬运任务 + //装箱区->装箱对接位agv自动搬运任务 public void run() { this.sendZxToDjw(); } void sendZxToDjw() { - List zxqPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("装箱区"), PackageInfoIvtEnum.IVT_STATUS.code("有子卷"), "1",""); - List zxwPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("装箱位"), PackageInfoIvtEnum.IVT_STATUS.code("空载具"), "2",PackageInfoIvtEnum.TASK_TYPE.code("装箱区->装箱对接位")); - if (CollectionUtils.isNotEmpty(zxqPackageinfoivtList) && CollectionUtils.isNotEmpty(zxwPackageinfoivtList)) { - //3.查询子卷对应的包装关系表,判断装箱位的木箱号是否为子卷对应的木箱号,是,创建搬运任务到装箱对接位位桁架任务,否,什么都不做 - PdmBiSubpackagerelation pdmBiSubpackagerelation = subpackageRelationService - .getOne(new LambdaUpdateWrapper().eq(PdmBiSubpackagerelation::getPackage_box_sn, zxwPackageinfoivtList.get(0).getContainer_name()), false); - if (pdmBiSubpackagerelation == null) { - throw new BadRequestException("装箱位木箱号无对应子卷包装关系的木箱号!"); - } + //装箱区有子卷且没有正在进行的装箱任务 + List zxqPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("装箱区"), PackageInfoIvtEnum.IVT_STATUS.code("有子卷"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("取货任务"), "", ""); + if (CollectionUtils.isEmpty(zxqPackageinfoivtList)) { + return; + } + //装箱位有木箱 + List zxwPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("装箱位"), PackageInfoIvtEnum.IVT_STATUS.code("空载具"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("放货任务"), PackageInfoIvtEnum.SORT_TYPE.code("升序"), PackageInfoIvtEnum.TASK_TYPE.code("装箱区->装箱对接位")); + if (CollectionUtils.isNotEmpty(zxwPackageinfoivtList)) { //装箱位上的木箱号 String boxNo = zxwPackageinfoivtList.get(0).getContainer_name(); - String containerName = pdmBiSubpackagerelation.getContainer_name(); - List zxqPoint = zxqPackageinfoivtList.stream().filter(r -> r.getContainer_name().equals(containerName)).collect(Collectors.toList()); - if (CollectionUtils.isEmpty(zxqPoint)) { - throw new BadRequestException("装箱区暂无该子卷信息"); - } - List productionPlanList = pdmBiSlittingproductionplanMapper.selectList(new LambdaQueryWrapper().eq(PdmBiSlittingproductionplan::getContainer_name, containerName)); - if (productionPlanList.isEmpty()) { - throw new BadRequestException("该子卷暂无分切计划信息"); - } - //创建搬运任务到装箱位 - JSONObject jo = new JSONObject(); - jo.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("装箱区->装箱对接位")); - jo.put("acs_task_type", PackageInfoIvtEnum.ACS_TASK_TYPE.code("桁架任务")); - jo.put("point_code1", zxqPoint.get(0).getPoint_code()); - jo.put("point_code2", zxwPackageinfoivtList.get(0).getPoint_code()); - jo.put("vehicle_code", pdmBiSubpackagerelation.getContainer_name()); - jo.put("vehicle_code2", boxNo); - jo.put("is_send", "1"); - //获取纸管长度 - String containerLength = productionPlanList.get(0).getPaper_tube_or_FRP().equals("1") ? productionPlanList.get(0).getPaper_tube_description() : productionPlanList.get(0).getFRP_description(); - int maxNum = 0; - for (String part : containerLength.split("\\|")) { - String numStr = part.replaceAll("\\D+", ""); - if (!numStr.isEmpty()) { - int num = Integer.parseInt(numStr); - if (num > maxNum) { - maxNum = num; - } - } - } - //扩展参数 - JSONObject param = new JSONObject(); //获取木箱信息,未包装的木箱 BstIvtBoxinfo bstIvtBoxinfo = bstIvtBoxinfoMapper.selectOne(new LambdaQueryWrapper().eq(BstIvtBoxinfo::getBox_no, boxNo).ne(BstIvtBoxinfo::getIs_packing, "1")); if (bstIvtBoxinfo == null) { - throw new BadRequestException("找不到木箱信息!"); + throw new BadRequestException("请检查木箱号:"+ boxNo +"是否存在或者状态为已装箱!"); } - //获取木箱高度等级 - String height = ""; - String heightLevel1 = iSysParamService.findByCode("height_level_1").getValue(); - String heightLevel2 = iSysParamService.findByCode("height_level_2").getValue(); - String box_high = bstIvtBoxinfo.getBox_high(); - if (Integer.parseInt(box_high) <= Integer.parseInt(heightLevel1)) { - height = "1"; - } else if (Integer.parseInt(box_high) > Integer.parseInt(heightLevel1) && Integer.parseInt(box_high) <= Integer.parseInt(heightLevel2)) { - height = "2"; - } else { - height = "3"; + //检查木箱信息 + checkBoxParams(boxNo, bstIvtBoxinfo); + //3.查询子卷对应的包装关系表,判断装箱位的木箱号是否为子卷对应的木箱号,是,创建搬运任务到装箱对接位位桁架任务 + List relationList = subpackageRelationService + .list(new LambdaUpdateWrapper().eq(PdmBiSubpackagerelation::getPackage_box_sn, boxNo).eq(PdmBiSubpackagerelation::getStatus, "0")); + if (CollectionUtils.isEmpty(relationList)) { + throw new BadRequestException("装箱位的木箱号"+boxNo+"对应的子卷包装关系异常,请检查子卷包装关系状态是否为0!"); + } + //获取与该木箱号匹配的子卷号 + String containerName = relationList.get(0).getContainer_name(); + List zxqPoint = zxqPackageinfoivtList.stream().filter(r -> r.getContainer_name().equals(containerName)).collect(Collectors.toList()); + //装箱区点位上有与该木箱号匹配的子卷 + if (CollectionUtils.isNotEmpty(zxqPoint)) { + List productionPlanList = pdmBiSlittingproductionplanMapper.selectList(new LambdaQueryWrapper().eq(PdmBiSlittingproductionplan::getContainer_name, containerName)); + if (productionPlanList.isEmpty()) { + throw new BadRequestException("装箱区的子卷号为"+containerName+"无对应的分切计划信息,请检查!"); + } + //创建搬运任务到装箱位 + JSONObject jo = new JSONObject(); + jo.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("装箱区->装箱对接位")); + jo.put("acs_task_type", PackageInfoIvtEnum.ACS_TASK_TYPE.code("桁架任务")); + jo.put("point_code1", zxqPoint.get(0).getPoint_code()); + jo.put("point_code2", zxwPackageinfoivtList.get(0).getPoint_code()); + jo.put("vehicle_code", containerName); + jo.put("vehicle_code2", boxNo); + jo.put("is_send", "1"); + //扩展参数 + JSONObject param = new JSONObject(); + //查询是否为最后一个子卷,相同木箱号且子卷包装状态为生成 + List packagerelationList = subpackageRelationService.list(new LambdaQueryWrapper().eq(PdmBiSubpackagerelation::getPackage_box_sn, boxNo).eq(PdmBiSubpackagerelation::getStatus, "0")); + if (packagerelationList.size() == 1 && packagerelationList.get(0).getContainer_name().equals(containerName)) { + //最后子卷 + param.put("lastOne", "1"); + } else { + param.put("lastOne", "0"); + } + //获取木箱高度等级 + param.put("heightLevel", getHeightLevel(bstIvtBoxinfo)); + //获取子卷长度 + param.put("len", getMaxNum(productionPlanList)); + //木箱最大数量 + param.put("maxNo", bstIvtBoxinfo.getNum()); + //托盘类型 1小托盘 2大托盘 + param.put("containerType", bstIvtBoxinfo.getVehicle_type()); + //木箱需放入子卷数量 + param.put("boxNo", relationList.get(0).getQuanlity_in_box()); + //子卷号 + param.put("barcode", containerName); + jo.put("request_param", param.toString()); + zxDjwTask.createTask(jo); } - //木箱高度等级 - param.put("heightLevel", height); - //木箱最大数量 - param.put("maxNo", bstIvtBoxinfo.getNum()); - //托盘类型 1小托盘 2大托盘 - param.put("containerType", bstIvtBoxinfo.getVehicle_type()); - //查询是否为最后一个子卷,相同木箱号且状态为生成 - // List packagerelationList = subpackageRelationService.list(new LambdaQueryWrapper().eq(PdmBiSubpackagerelation::getPackage_box_sn, boxNo).eq(PdmBiSubpackagerelation::getStatus, "0")); - // if (packagerelationList.size() == 1 && packagerelationList.get(0).getContainer_name().equals(containerName)) { - // //最后子卷 - // param.put("lastOne", "1"); - // } else { - // param.put("lastOne", "0"); - // } - param.put("lastOne", "1"); - //木箱放入子卷数量 - //param.put("boxNo", pdmBiSubpackagerelation.getQuanlity_in_box()); - param.put("boxNo", "1"); - //子卷号 - param.put("barcode", containerName); - //子卷长度 - param.put("len", maxNum); - jo.put("request_param", param.toString()); - zxDjwTask.createTask(jo); } + } + private static void checkBoxParams(String boxNo, BstIvtBoxinfo bstIvtBoxinfo) { + if (StringUtils.isBlank(bstIvtBoxinfo.getBox_high())) { + throw new BadRequestException("请检查木箱号:"+ boxNo +"木箱高度不能为空!"); + } + if (StringUtils.isBlank(bstIvtBoxinfo.getNum())) { + throw new BadRequestException("请检查木箱号:"+ boxNo +"能装的最大子卷数不能为空!"); + } + if (StringUtils.isBlank(bstIvtBoxinfo.getVehicle_type())) { + throw new BadRequestException("请检查木箱号:"+ boxNo +"托盘类型不能为空!"); + } + } + + private String getHeightLevel(BstIvtBoxinfo bstIvtBoxinfo) { + String height; + String heightLevel1 = iSysParamService.findByCode("height_level_1").getValue(); + String heightLevel2 = iSysParamService.findByCode("height_level_2").getValue(); + String box_high = bstIvtBoxinfo.getBox_high(); + if (Integer.parseInt(box_high) <= Integer.parseInt(heightLevel1)) { + height = "1"; + } else if (Integer.parseInt(box_high) > Integer.parseInt(heightLevel1) && Integer.parseInt(box_high) <= Integer.parseInt(heightLevel2)) { + height = "2"; + } else { + height = "3"; + } + return height; + } + + private static int getMaxNum(List productionPlanList) { + String containerLength = productionPlanList.get(0).getPaper_tube_or_FRP().equals("1") ? productionPlanList.get(0).getPaper_tube_description() : productionPlanList.get(0).getFRP_description(); + int maxNum = 0; + for (String part : containerLength.split("\\|")) { + String numStr = part.replaceAll("\\D+", ""); + if (!numStr.isEmpty()) { + int num = Integer.parseInt(numStr); + if (num > maxNum) { + maxNum = num; + } + } + } + return maxNum; } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/TaskQueue.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/TaskQueue.java index 5c4d1f3c7..970bfd78b 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/TaskQueue.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/TaskQueue.java @@ -1,11 +1,14 @@ package org.nl.b_lms.sch.tasks.first_floor_area.auto; + 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.b_lms.sch.tasks.first_floor_area.ZxqTask; import org.nl.modules.common.utils.RedisUtils; +import org.nl.wms.sch.manage.TaskStatusEnum; import org.springframework.stereotype.Service; + import javax.annotation.Resource; import java.util.List; import java.util.Map; @@ -17,19 +20,30 @@ public class TaskQueue { @Resource private IschBaseTaskService taskService; + @Resource + private ZxqTask zxqTask; private final RedisUtils redisUtils; private static final String TASK_QUEUE_PREFIX = "taskQueue:"; + + /** + * 添加任务 + */ public void addTasksToQueue(String groupId, List tasks) { tasks.forEach(task -> redisUtils.pushToList(TASK_QUEUE_PREFIX + groupId, task)); } + /** + * 任务下发 + */ public void processTasks(Map> tasksToProcessPerQueue) { tasksToProcessPerQueue.forEach((groupId, points) -> { int taskCount = points.size(); for (int i = 0; i < taskCount; i++) { + //List taskElements = getTaskElements(groupId); + //Long taskCounts = getTaskCount(groupId); SchBaseTask task = (SchBaseTask) redisUtils.popFromList(TASK_QUEUE_PREFIX + groupId, SchBaseTask.class); if (task != null) { String pointCode = points.get(i); @@ -42,9 +56,40 @@ public class TaskQueue { private void executeTask(SchBaseTask task, String pointCode) { if (task != null) { task.setPoint_code2(pointCode); + task.setTask_status(TaskStatusEnum.START_AND_POINT.getCode()); taskService.updateById(task); - ZxqTask taskBean = new ZxqTask(); - taskBean.immediateNotifyAcs(null); + zxqTask.immediateNotifyAcs(null); } } + + /** + * 获取队列元素个数 + */ + public long getTaskCount(String groupId) { + return redisUtils.getListSize(TASK_QUEUE_PREFIX + groupId); + } + + /** + * 获取队列元素 + */ + public List getTaskElements(String groupId) { + return redisUtils.getListElements(TASK_QUEUE_PREFIX + groupId); + } + + /** + * 删除队列中的所有元素 + */ + public void clearTaskQueue(String groupId) { + redisUtils.clearList(TASK_QUEUE_PREFIX + groupId); + } + + /** + * 删除队列中的某个元素 + */ + public void removeTaskFromQueue(String groupId, SchBaseTask task) { + redisUtils.removeFromList(TASK_QUEUE_PREFIX + groupId, task); + } + + } + diff --git a/lms/nladmin-system/src/main/java/org/nl/common/enums/PackageInfoIvtEnum.java b/lms/nladmin-system/src/main/java/org/nl/common/enums/PackageInfoIvtEnum.java index 83dea1ca7..4faa6c0a8 100644 --- a/lms/nladmin-system/src/main/java/org/nl/common/enums/PackageInfoIvtEnum.java +++ b/lms/nladmin-system/src/main/java/org/nl/common/enums/PackageInfoIvtEnum.java @@ -22,8 +22,11 @@ public enum PackageInfoIvtEnum { //任务类型 - TASK_TYPE(MapOf.of("输送线->满轴缓存位", "010901", "满轴缓存位->待检区", "010902", "满轴缓存位->管制区", "010903", "放空(空载具缓存位->输送线)", - "010904", "补空(待检区或管制区->空载具缓存位)", "010905", "待检区->管制区", "010906", "管制区->待检区", "010907", "待检区->装箱区", "010908", "装箱区->装箱对接位", "010909", "放空(装箱区->待检区)", "010910", "输送线四个点任务", "010911", "送空(装箱区->待检区或管制区)", "010912")), + TASK_TYPE(MapOf.of("输送线->满轴缓存位", "010901", "满轴缓存位->待检区", "010902", "满轴缓存位->管制区", + "010903", "放空(空载具缓存位->输送线)", "010904", "补空(待检区->空载具缓存位)", "010905", "待检区->管制区", + "010906", "管制区->待检区", "010907", "待检区->装箱区", "010908", "装箱区->装箱对接位", "010909", + "补空(装箱区->待检区)", "010910", "输送线四个点任务", "010911", "补空(装箱区->管制区)", "010912", + "补空(管制区->空载具缓存位)","010913")), //ACS任务类型 ACS_TASK_TYPE(MapOf.of("agv任务", "1", "桁架任务", "6")), @@ -38,8 +41,10 @@ public enum PackageInfoIvtEnum { //起点终点类型 - TASK_POINT_TYPE(MapOf.of("取货任务", "1", "放货任务", "2")), + TASK_POINT_TYPE(MapOf.of("取货任务", "1", "放货任务", "2", "取货分配", "3", "放货分配", "4", "取货任务取货分配", "5", "放货任务放货分配", "6")), + //等待点类型 + WAIT_POINT_TYPE(MapOf.of("满轴区等待点", "1", "待检区等待点", "2")), //排序方式 SORT_TYPE(MapOf.of("升序", "1", "降序", "2")), diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/common/utils/RedisUtils.java b/lms/nladmin-system/src/main/java/org/nl/modules/common/utils/RedisUtils.java index 020247af9..14e2465c3 100644 --- a/lms/nladmin-system/src/main/java/org/nl/modules/common/utils/RedisUtils.java +++ b/lms/nladmin-system/src/main/java/org/nl/modules/common/utils/RedisUtils.java @@ -48,7 +48,6 @@ public class RedisUtils { private final ObjectMapper objectMapper = new ObjectMapper(); - public RedisUtils(RedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; } @@ -716,6 +715,10 @@ public class RedisUtils { log.debug("--------------------------------------------"); } + + /** + * 队列新增 + */ public void pushToList(String key, Object value) { try { String valueJson = objectMapper.writeValueAsString(value); @@ -725,6 +728,9 @@ public class RedisUtils { } } + /** + * 队列移除 + */ public Object popFromList(String key, Class valueType) { String valueJson = (String) redisTemplate.opsForList().leftPop(key); if (valueJson != null) { @@ -736,4 +742,39 @@ public class RedisUtils { } return null; } + + + /** + * 获取队列元素个数 + */ + public long getListSize(String key) { + Long size = redisTemplate.opsForList().size(key); + return (size != null) ? size : 0; + } + + + /** + * 获取队列元素 + */ + public List getListElements(String key) { + List elements = redisTemplate.opsForList().range(key, 0, -1); + return elements; + } + + /** + * 删除队列中的某个元素 + */ + public void removeFromList(String key, Object value) { + redisTemplate.opsForList().remove(key, 1, value); + } + + + /** + * 删除队列中的所有元素 + */ + public void clearList(String key) { + redisTemplate.delete(key); + } + + } 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 3cd8b75d5..edb9281ab 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 @@ -1779,21 +1779,29 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { .filter(r -> PackageInfoIvtEnum.POINT_STATUS.code("空载具缓存位").equals(r.getPoint_status()) && PackageInfoIvtEnum.IVT_STATUS.code("空载具").equals(r.getIvt_status())) .sorted(Comparator.comparing(BstIvtPackageinfoivt::getSort_seq).reversed()).collect(Collectors.toList()); - //空载具缓存位有空载具 + //空载具缓存位有空载具,桁架取空载具从外到里取空载具,升序 if (CollectionUtils.isNotEmpty(kzjPointList)) { - jo.put("point_code3", kzjPointList.get(0).getPoint_code()); - //终点为输送线点位 - jo.put("point_code4", whereJson.getString("device_code")); - jo.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("输送线四个点任务")); - } else { - jo.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("输送线->满轴缓存位")); - //空载具缓存位缺少空载具,下发一个确定终点的空载具缓存位->输送线任务 // 创建前先判断是否有已创建相同任务 - List existTaskList = taskService.list(new LambdaUpdateWrapper() - .eq(SchBaseTask::getTask_type, PackageInfoIvtEnum.TASK_TYPE.code("放空(空载具缓存位->输送线)")) - .eq(SchBaseTask::getTask_status, TaskStatusEnum.SURE_END.getCode()) - .eq(SchBaseTask::getIs_delete, IOSEnum.IS_NOTANDYES.code("否"))); + List existTaskList = getExistTasks(PackageInfoIvtEnum.TASK_TYPE.code("输送线四个点任务")); if (CollectionUtils.isEmpty(existTaskList)) { + jo.put("point_code3", kzjPointList.get(0).getPoint_code()); + //终点为输送线点位 + jo.put("point_code4", whereJson.getString("device_code")); + jo.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("输送线四个点任务")); + jo.put("is_send", true); + mzhcwTask.createTask(jo); + } + } else { + //如果空载具缓存位确少空载具,创建输送线->满轴缓存位两个点任务 + List existTaskList = getExistTasks(PackageInfoIvtEnum.TASK_TYPE.code("输送线->满轴缓存位")); + if (CollectionUtils.isEmpty(existTaskList)) { + jo.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("输送线->满轴缓存位")); + jo.put("is_send", true); + mzhcwTask.createTask(jo); + } + //空载具缓存位缺少空载具,下发一个确定终点的空载具缓存位->输送线任务 + List existTasks = getExistTasks(PackageInfoIvtEnum.TASK_TYPE.code("放空(空载具缓存位->输送线)")); + if (CollectionUtils.isEmpty(existTasks)) { JSONObject jo1 = new JSONObject(); //创建确定终点任务 jo1.put("acs_task_type", PackageInfoIvtEnum.ACS_TASK_TYPE.code("桁架任务")); @@ -1804,27 +1812,24 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { ssxDjwTask.createTask(jo1); } } - jo.put("is_send", true); - mzhcwTask.createTask(jo); result.put("status", HttpStatus.OK.value()); result.put("message", "反馈成功!"); } else { // 如果满轴位没有可用的空点位,先创建一个桁架任务但是不下发,等这边空出来点位,判断是否有这种桁架任务然后补发; - // 创建前先判断是否有已创建相同任务 - List existTaskList = taskService.list(new LambdaUpdateWrapper() - .eq(SchBaseTask::getTask_type, PackageInfoIvtEnum.TASK_TYPE.code("输送线->满轴缓存位")) - .eq(SchBaseTask::getTask_status, TaskStatusEnum.SURE_START.getCode()).eq(SchBaseTask::getIs_delete, IOSEnum.IS_NOTANDYES.code("否"))); - //如果有就不创建,没有就创建 - if (CollectionUtils.isEmpty(existTaskList)) { - //只确定起点NBJ1002 - JSONObject jo2 = new JSONObject(); - jo2.put("acs_task_type", PackageInfoIvtEnum.ACS_TASK_TYPE.code("桁架任务")); - jo2.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("输送线->满轴缓存位")); - jo2.put("point_code1", "NBJ1002"); - jo.put("task_status", TaskStatusEnum.SURE_START.getCode()); - jo2.put("is_send", false); - mzhcwTask.createTask(jo2); - } + // List existTaskList = getExistTasks(PackageInfoIvtEnum.TASK_TYPE.code("输送线->满轴缓存位")); + // //如果有就不创建,没有就创建 + // if (CollectionUtils.isEmpty(existTaskList)) { + // //只确定起点NBJ1002 + // JSONObject jo2 = new JSONObject(); + // jo2.put("acs_task_type", PackageInfoIvtEnum.ACS_TASK_TYPE.code("桁架任务")); + // jo2.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("输送线->满轴缓存位")); + // jo2.put("point_code1", "NBJ1002"); + // jo.put("task_status", TaskStatusEnum.SURE_START.getCode()); + // jo2.put("is_send", false); + // mzhcwTask.createTask(jo2); + // } + result.put("status", HttpStatus.BAD_REQUEST.value()); + result.put("message", "满轴缓存位暂无空位!"); } } else { log.info("二楼到一楼,成品子卷到达一楼输送线,异常,任务正在创建中"); @@ -1839,6 +1844,13 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { return result; } + private List getExistTasks(String taskType) { + return taskService.list(new LambdaUpdateWrapper() + .eq(SchBaseTask::getTask_type, taskType) + .lt(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode()) + .eq(SchBaseTask::getIs_delete, IOSEnum.IS_NOTANDYES.code("否"))); + } + @Override @Transactional(rollbackFor = Exception.class) @@ -1945,7 +1957,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { log.info("applySendOutTwo输入参数:---------------------------------------------" + whereJson.toString()); JSONObject result = new JSONObject(); - try{ + try { // 校验是否是二次分配 if (ObjectUtil.isEmpty(whereJson.getString("task_code"))) { // 第一次申请 diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/rest/TaskController.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/rest/TaskController.java index 765fcfaa0..cdcb51768 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/rest/TaskController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/rest/TaskController.java @@ -1,6 +1,7 @@ package org.nl.wms.sch.rest; +import cn.dev33.satoken.annotation.SaIgnore; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; @@ -69,6 +70,7 @@ public class TaskController { @PutMapping("/operation") @Log("任务操作") + @SaIgnore public ResponseEntity update(@RequestBody Map map) { taskService.operation(map); return new ResponseEntity<>(HttpStatus.NO_CONTENT); 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 bfcaa63c9..fa0744316 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 @@ -9,11 +9,9 @@ import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.nl.b_lms.pdm.bi.slittingproductionplan.service.dao.mapper.PdmBiSlittingproductionplanMapper; 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.BstIvtPackageinfoivtMapper; 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,7 +19,6 @@ 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.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -50,7 +47,7 @@ public class EventTest { private GzqTask gzqTask; @Resource - private KzjhcwTask kzjhcwTask; + private DjqToKzjhcwTask djqToKzjhcwTask; @Resource private OutBoxManageService outBoxManageService; @@ -66,7 +63,7 @@ public class EventTest { */ @Test public void zxToKzjHcw() { - kzjhcwTask.toKzjHcw(""); + //djqToKzjhcwTask.toKzjHcw(""); } /** diff --git a/lms/nladmin-ui/src/views/wms/pdm/sub/DivDialog.vue b/lms/nladmin-ui/src/views/wms/pdm/sub/DivDialog.vue index 06c1e9791..c85add6e7 100644 --- a/lms/nladmin-ui/src/views/wms/pdm/sub/DivDialog.vue +++ b/lms/nladmin-ui/src/views/wms/pdm/sub/DivDialog.vue @@ -45,7 +45,7 @@ - +
@@ -82,9 +82,10 @@ type="primary" icon="el-icon-plus" size="mini" + :disabled="isButtonDisabled" @click="divStruct()" > - 分配 + 分配木箱规格
@@ -103,10 +104,10 @@ - + - + @@ -150,6 +151,7 @@ export default { }, data() { return { + isButtonDisabled: false, // 木箱规格分配按钮 searchText: '', // 存储搜索前的选中状态 previousSelection: [], @@ -164,6 +166,7 @@ export default { stor_id: '', sect_id: '', sectProp: null, + paper_tube_description: '', bucketProp: {}, structShow: false, bucketObj: null, @@ -299,6 +302,7 @@ export default { // 表格1的行点击事件 handleRowClick(scope) { debugger + this.isButtonDisabled = !!(scope.status !== '99' || scope.box_group !== '0') const table2 = this.$refs.dis_table const table2Data = Array.from(this.openParam) const groupValue = scope.box_group === '0' ? scope.container_name : scope.box_group @@ -343,7 +347,9 @@ export default { this.$emit('childEvent') }, divStruct() { + debugger if (this.currentSelection.length > 0 && this.$refs.dis_table.selection.length > 0) { + this.paper_tube_description = this.currentSelection[0].paper_tube_description this.structShow = true this.$refs.child.getMsg(false) } else { diff --git a/lms/nladmin-ui/src/views/wms/pdm/sub/MaterDialog.vue b/lms/nladmin-ui/src/views/wms/pdm/sub/MaterDialog.vue index a39f5ea29..de651c9a1 100644 --- a/lms/nladmin-ui/src/views/wms/pdm/sub/MaterDialog.vue +++ b/lms/nladmin-ui/src/views/wms/pdm/sub/MaterDialog.vue @@ -16,7 +16,7 @@ clearable style="width: 200px" size="mini" - placeholder="输入木箱物料名称" + placeholder="输入关键词搜索" prefix-icon="el-icon-search" class="filter-item" /> @@ -38,8 +38,13 @@ @select-all="onSelectAll" > - + + + + + + @@ -47,6 +52,36 @@ 取 消 确 定 + + +
+
+ + 请仔细核对子卷与木箱规格是否匹配, +
+
+ 木箱长度为:{{ this.box_length }}, +
+
+ 子卷规格为:{{ this.paper_tube_description }}, +
+
+ 点击确定后将立即生成木箱出库任务,无法更改! +
+
+
+ + 取消 + 确定 + +
@@ -63,10 +98,10 @@ export default { return CRUD({ title: '木箱规格', optShow: {}, - url: 'api/Materialbase', - idField: 'material_id', - sort: 'material_id,desc', - query: { box: '木箱', search: 'MX', material_id: '' }, + url: 'api/pdmBiSubpackagerelation/queryBoxSpec', + idField: 'box_id', + sort: 'material_name,desc', + query: { material_id: '' }, crudMethod: { ...crudMaterattr } }) }, @@ -78,12 +113,18 @@ export default { }, sectProp: { type: Object + }, + paperTubeDescription: { + type: String, + default: '' } }, data() { return { + box_length: '', classes: [], dialogVisible: false, + dialogVisible1: false, sect: {}, checkrow: {}, rows: [], @@ -170,14 +211,39 @@ export default { submit() { debugger this.rows = this.$refs.table.selection + this.box_length = this.rows[0].box_length if (this.rows.length <= 0) { this.$message('请先选择木箱信息') return } + this.dialogVisible1 = true + }, + confirmSubmit() { + this.dialogVisible1 = false this.$emit('update:dialogShow', false) this.$emit('tableChanged', this.checkrow) } } } - +