From 4e74fba86b3100c122416c26dec296af7e30b72b Mon Sep 17 00:00:00 2001 From: ls <1793460677@qq.com> Date: Tue, 29 Jul 2025 15:49:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=A8=E7=AE=B1=E8=A3=85=E7=AE=B1=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=95=EF=BC=8C=E5=87=BA?= =?UTF-8?q?=E5=BA=93wql=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BstIvtBoxstackController.java | 4 +- .../bst/ivt/boxstack/enums/BoxStackEnum.java | 4 +- .../dao/mapper/BstIvtBoxstackMapper.java | 6 + .../dao/mapper/BstIvtBoxstackMapper.xml | 39 ++ .../dto/PdmBiSlittingproductionplanDto.java | 3 +- .../PdmBiSubpackagerelationServiceImpl.java | 340 +++++++++++------- .../impl/BstIvtPackageinfoivtServiceImpl.java | 13 +- .../org/nl/b_lms/sch/tasks/TwoOutEmpTask.java | 2 - .../nl/b_lms/sch/tasks/TwoOutHeapTask.java | 249 +++++++------ .../org/nl/b_lms/sch/tasks/TwoOutTask.java | 165 ++++++--- .../b_lms/sch/tasks/boxstack/BoxSSXTask.java | 181 ++++++++++ .../sch/tasks/boxstack/InBoxTrussTask.java | 215 +++++++++++ .../b_lms/sch/tasks/boxstack/MxOutTask.java | 92 ++++- .../sch/tasks/boxstack/auto/AutoMxZxTask.java | 121 +++++++ .../auto/AutoSendMzToDjq.java | 2 +- .../first_floor_area/auto/AutoSendToZxq.java | 4 +- .../auto/AutoSendVehicleToKzj.java | 6 +- .../storage_manage/ios/enums/IOSEnum.java | 12 +- .../impl/StIvtIostorinvOutServiceImpl.java | 28 +- .../impl/StIvtIostorinvServiceImpl.java | 23 +- .../util/impl/LashManageServiceImpl.java | 66 ++-- .../nl/common/enums/PackageInfoIvtEnum.java | 2 +- .../acs/service/impl/AcsToWmsServiceImpl.java | 39 +- .../nl/wms/sch/manage/AbstractAcsTask.java | 22 +- .../main/resources/config/application-dev.yml | 3 + .../src/main/resources/config/application.yml | 2 +- .../src/views/b_lms/bst/ivt/paper/index.vue | 8 +- .../wms/pdm/order/rawfoilworkorder/index.vue | 2 +- .../wms/pdm/order/slittingplan/index.vue | 8 +- .../views/wms/st/inStor/check/AddDialog.vue | 18 +- .../views/wms/st/inStor/check/CheckDialog.vue | 2 +- .../wms/st/inStor/check/RepairDialog.vue | 14 +- 32 files changed, 1246 insertions(+), 449 deletions(-) create mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/BoxSSXTask.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/InBoxTrussTask.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/auto/AutoMxZxTask.java diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/controller/BstIvtBoxstackController.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/controller/BstIvtBoxstackController.java index 50c5ce4..6379659 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/controller/BstIvtBoxstackController.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/controller/BstIvtBoxstackController.java @@ -28,7 +28,7 @@ public class BstIvtBoxstackController { private IBstIvtBoxstackService boxstackService; @GetMapping - @Log("查询木箱堆叠位") +// @Log("查询木箱堆叠位") public ResponseEntity query(BstIvtBoxstackQuery whereJson, PageQuery page) { return new ResponseEntity<>(boxstackService.queryAll(whereJson, page), HttpStatus.OK); } @@ -59,4 +59,4 @@ public class BstIvtBoxstackController { boxstackService.saveBoxStack(reqParam); return new ResponseEntity<>(HttpStatus.OK); } -} \ No newline at end of file +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/enums/BoxStackEnum.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/enums/BoxStackEnum.java index c7aa989..2ed5c33 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/enums/BoxStackEnum.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/enums/BoxStackEnum.java @@ -18,7 +18,7 @@ import java.util.Map; @Getter public enum BoxStackEnum { // 木箱任务类型 - TASK_TYPE(MapOf.of("木箱入库", "010702", "木箱出库", "010704", "木箱移库", "010705")), + TASK_TYPE(MapOf.of("木箱入库", "010702", "木箱出库", "010704", "木箱移库", "010705","木箱缓存区到对接位", "010706","木箱行架", "010706","木箱对接位到缓存区", "010707")), // 木箱出入库任务二次分配类型 AGV_ACTION_TYPE(MapOf.of("普通任务", "1", "取货二次分配", "2", "放货二次分配", "3", "取放货二次分配", "4")), //木箱库二次分配等待点 @@ -34,7 +34,7 @@ public enum BoxStackEnum { //备货计划状态 STOCK_UP_STATUS(MapOf.of("未开始", "1", "执行中", "2", "完成", "3")), //木箱库区域 - POINT_STATUS(MapOf.of("密集区", "1", "零散区", "2", "缓存区", "3", "出库区", "4", "等待区", "5")); + POINT_STATUS(MapOf.of("密集区", "1", "零散区", "2", "缓存区", "3", "对接区", "4", "等待区", "5")); private Map code; diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstackMapper.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstackMapper.java index 49698f9..4318043 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstackMapper.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstackMapper.java @@ -13,4 +13,10 @@ import java.util.Map; public interface BstIvtBoxstackMapper extends BaseMapper { List pageQuery(@Param("query") BstIvtBoxstackQuery query, @Param("pageQuery") PageQuery pageQuery); + + List selectAndNoTask(String point_status); + + List selectDJAndNoTask(@Param("param") BstIvtBoxstack boxstack); + + List selectHCAndNoTask(BstIvtBoxstack bstIvtBoxstack); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstackMapper.xml b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstackMapper.xml index 6ace4dc..df95d4e 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstackMapper.xml +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstackMapper.xml @@ -41,4 +41,43 @@ ORDER BY bs.stack_code ASC + + + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/dto/PdmBiSlittingproductionplanDto.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/dto/PdmBiSlittingproductionplanDto.java index 754762b..c26cd4e 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/dto/PdmBiSlittingproductionplanDto.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/dto/PdmBiSlittingproductionplanDto.java @@ -162,7 +162,8 @@ public class PdmBiSlittingproductionplanDto extends PdmBiSlittingproductionplan private String point_location; private String source_container_name; - + /** 客户要求幅宽 */ + private String width_standard; /** * 人员对应的区域 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 1744f89..49f8191 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 @@ -1,6 +1,6 @@ package org.nl.b_lms.pdm.subpackagerelation.service.impl; -import cn.hutool.core.date.DateTime; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.NumberUtil; @@ -18,11 +18,12 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.pagehelper.PageHelper; -import lombok.Data; -import lombok.SneakyThrows; import lombok.extern.log4j.Log4j; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; +import org.nl.b_lms.bst.ivt.boxstack.enums.BoxStackEnum; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstack; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.mapper.BstIvtBoxstackMapper; 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.info.dao.PdmBiContainerinbound; @@ -40,16 +41,17 @@ 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.task.dao.SchBaseTask; -import org.nl.b_lms.sch.task.dto.SchBaseTaskDto; import org.nl.b_lms.sch.task.service.IschBaseTaskService; +import org.nl.b_lms.sch.tasks.TwoInBoxTrussTask; +import org.nl.b_lms.sch.tasks.boxstack.InBoxTrussTask; import org.nl.b_lms.sch.tasks.TwoOutBoxTask; +import org.nl.b_lms.sch.tasks.boxstack.MxMoveTask; +import org.nl.b_lms.sch.tasks.boxstack.MxOutTask; import org.nl.b_lms.sch.tasks.first_floor_area.ZxqTask; -import org.nl.b_lms.sch.tasks.first_floor_area.auto.TaskQueue; import org.nl.b_lms.storage_manage.database.service.IBstIvtBoxinfoService; 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.enums.IOSEnum; -import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl.OutBoxManageServiceImpl; import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.OutBoxManageService; import org.nl.common.TableDataInfo; import org.nl.common.domain.query.PageQuery; @@ -64,17 +66,13 @@ import org.nl.modules.common.utils.FileUtil; import org.nl.modules.logging.service.EsLogService; import org.nl.modules.logging.service.dto.LogQuery; import org.nl.modules.logging.service.dto.LogRepositoryDTO; -import org.nl.modules.logging.service.impl.LuceneLogServiceImpl; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.SpringContextHolder; import org.nl.system.service.param.ISysParamService; import org.nl.system.service.param.impl.SysParamServiceImpl; import org.nl.wms.ext.mes.service.impl.LmsToMesServiceImpl; -import org.nl.wms.pda.mps.eum.RegionTypeEnum; import org.nl.wms.sch.AcsUtil; import org.nl.wms.sch.manage.TaskStatusEnum; -import org.redisson.api.RLock; -import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.domain.Pageable; @@ -87,9 +85,7 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.*; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -145,6 +141,16 @@ public class PdmBiSubpackagerelationServiceImpl extends ServiceImpl packagerelationList = JSONObject.parseArray(whereJson.getJSONArray("tableMater").toJSONString(), PdmBiSubpackagerelation.class); + + List packagerelationList = JSONObject.parseArray(whereJson.getJSONArray("tableMater").toJSONString(), PdmBiSubpackagerelation.class); //子卷信息校验 checkEntityList(whereJson, packagerelationList); //均衡获取木箱出库装箱区对接位 - //= getPointCode(packagerelationList.size()); + //= getPointCode(packagerelationList.size()); List workIdList = JSONObject.parseArray(whereJson.getJSONArray("tableMater").toJSONString(), PdmBiSubpackagerelation.class).stream() .map(PdmBiSubpackagerelation::getWorkorder_id) .map(String::valueOf) @@ -299,13 +308,13 @@ public class PdmBiSubpackagerelationServiceImpl extends ServiceImpl planList = iPdmBiSlittingproductionplanService.list(new LambdaQueryWrapper() .in(PdmBiSlittingproductionplan::getContainer_name, containerNameList) - .eq(PdmBiSlittingproductionplan::getIs_delete,IOSEnum.IS_NOTANDYES.code("否")) + .eq(PdmBiSlittingproductionplan::getIs_delete, IOSEnum.IS_NOTANDYES.code("否")) ); List subpackagerelations = this.list(new QueryWrapper().in("workorder_id", workIdList)); if (ObjectUtils.isEmpty(planList)) { @@ -314,9 +323,9 @@ public class PdmBiSubpackagerelationServiceImpl extends ServiceImpl any = subpackagerelations.stream() .filter(sub -> sub.getStatus().equals("0") && StringUtils.isNotEmpty(sub.getPackage_box_sn())) .findAny(); - if (any.isPresent()){ + if (any.isPresent()) { PdmBiSubpackagerelation subpackagerelation = any.get(); - throw new BadRequestException(subpackagerelation.getPackage_box_sn()+"包装关系已存在"+subpackagerelation.getPackage_box_sn()+",如重新生成请确认MES跟LMS包装关系已解绑定"); + throw new BadRequestException(subpackagerelation.getPackage_box_sn() + "包装关系已存在" + subpackagerelation.getPackage_box_sn() + ",如重新生成请确认MES跟LMS包装关系已解绑定"); } BigDecimal totalWeight; @@ -339,11 +348,11 @@ public class PdmBiSubpackagerelationServiceImpl extends ServiceImpl collect = ivtList.stream().map(a -> a.getIvt_id()).collect(Collectors.toList()); packageinfoivtService.update(new UpdateWrapper() .set("update_time", DateUtil.now()) - .in("ivt_id",collect)); + .in("ivt_id", collect)); List subList = this.list(new QueryWrapper() .eq("status", "0") @@ -352,14 +361,14 @@ public class PdmBiSubpackagerelationServiceImpl extends ServiceImpl containers = subList.stream().map(PdmBiSubpackagerelation::getContainer_name).collect(Collectors.toSet()); String boxSn = subList.get(0).getPackage_box_sn(); //子卷到装箱区 -// agvTransfer(containers, deviceCode); + agvTransfer(containers); PdmBiContainerinbound pdmBiContainerinbound = new PdmBiContainerinbound(); pdmBiContainerinbound.setId(org.nl.common.utils.IdUtil.getStringId()); pdmBiContainerinbound.setContainer_name(String.join(",", containerNameList)); pdmBiContainerinbound.setBox(boxSn); Boolean inbound = whereJson.getBoolean("inbound"); - if (inbound!=null){ + if (inbound != null) { pdmBiContainerinbound.setInbound(inbound); } iPdmBiContainerinboundService.save(pdmBiContainerinbound); @@ -370,17 +379,17 @@ public class PdmBiSubpackagerelationServiceImpl extends ServiceImpl subList = this.list(new QueryWrapper() .eq("status", "0") .in("container_name", split)); - if (CollectionUtils.isEmpty(subList)){ + if (CollectionUtils.isEmpty(subList)) { throw new BadRequestException("当前子卷还为组盘"); } - if (subList.size() != split.length){ + if (subList.size() != split.length) { throw new BadRequestException("子卷包装信息与子卷不相符合"); } return subList; @@ -390,7 +399,7 @@ public class PdmBiSubpackagerelationServiceImpl extends ServiceImpl subList = this.list(new QueryWrapper() .eq("status", "0") .in("container_name", split)); - if (subList.size() != split.length){ + if (subList.size() != split.length) { throw new BadRequestException("子卷包装信息与子卷不相符合"); } Set collect = subList.stream().map(PdmBiSubpackagerelation::getPackage_box_sn).collect(Collectors.toSet()); List containerList = subList.stream().map(PdmBiSubpackagerelation::getContainer_name).collect(Collectors.toList()); - if (collect.size() == 0){ + if (collect.size() == 0) { throw new BadRequestException("当前子卷还未进行装箱组盘操作"); } - if (collect.size()>1){ - throw new BadRequestException("当前子卷不属于同一组"+ collect); + if (collect.size() > 1) { + throw new BadRequestException("当前子卷不属于同一组" + collect); } - if (subList.get(0).getQuanlity_in_box().intValue()!= split.length){ - throw new BadRequestException("当前木箱"+subList.get(0).getQuanlity_in_box()+"要装箱的子卷"+split.length+"未装完"); + if (subList.get(0).getQuanlity_in_box().intValue() != split.length) { + throw new BadRequestException("当前木箱" + subList.get(0).getQuanlity_in_box() + "要装箱的子卷" + split.length + "未装完"); } - PdmProductSpecServiceImpl.doRecord(SpecEnum.ZXRK,null,Boolean.TRUE,null,containerList); + PdmProductSpecServiceImpl.doRecord(SpecEnum.ZXRK, null, Boolean.TRUE, null, containerList); } @@ -421,13 +430,14 @@ public class PdmBiSubpackagerelationServiceImpl extends ServiceImpl workIdList, Set containerNameList, String deviceCode, Integer maxBoxGroup, JSONObject whereJson, BigDecimal totalWeight) { - JSONObject boxInfo = new JSONObject(); - //确定木箱出库装箱区 - boxInfo.put("device_code", deviceCode); - boxInfo.put("material_code", whereJson.getString("checked")); - boxInfo.put("num", workIdList.size()); - String boxSn = outBoxManageService.outBoxNoTask(boxInfo); - BstIvtBoxinfo boxDao = iBstIvtBoxinfoService.getOne( - new QueryWrapper().lambda() - .eq(BstIvtBoxinfo::getBox_no, boxSn) - ); - //木箱重量 - BigDecimal boxWeight = new BigDecimal(boxDao.getBox_weight()); + public void outBox(List workIdList, Integer maxBoxGroup, JSONObject whereJson, BigDecimal totalWeight) { + + //查看对接位是否有同种规格的木箱,有的话生成木箱行架任务,没有生成agv搬运任务 + List bstIvtBoxstacks = boxstackMapper.selectList(new QueryWrapper() + .eq("box_spec", whereJson.getString("checked")) + .gt("current_layer_count", 0) + .eq("point_status", BoxStackEnum.POINT_STATUS.code("对接区")) + .orderByAsc("update_time")); + if (CollUtil.isEmpty(bstIvtBoxstacks)) { + List bstIvtBoxstacks1 = boxstackMapper.selectList(new QueryWrapper().eq("box_spec", whereJson.getString("checked")).eq("point_status", BoxStackEnum.POINT_STATUS.code("缓存区"))); + if (CollUtil.isEmpty(bstIvtBoxstacks1)) { + throw new BadRequestException("缓存区无可用木箱,请新建备货计划"); + } + //查看是否有相同物料类型的任务,如果有合并任务组,三个为一组 + List taskList = taskService.list(new LambdaQueryWrapper().eq(SchBaseTask::getTask_type, BoxStackEnum.TASK_TYPE.code("木箱缓存区到对接位")) + .eq(SchBaseTask::getTask_status, TaskStatusEnum.SURE_END.getCode()) + .eq(SchBaseTask::getMaterial_code, whereJson.getString("checked"))); + if (!taskList.isEmpty()) { + List taskSort = taskList.stream().filter(task -> task.getSort_seq().compareTo(BigDecimal.valueOf(3)) > 0).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(taskSort)) { + SchBaseTask schBaseTask = taskSort.get(0); + schBaseTask.setSort_seq(schBaseTask.getSort_seq().add(BigDecimal.valueOf(1))); + taskService.updateById(schBaseTask); + } else { + //创建确定终点的半任务 + createTask(whereJson, bstIvtBoxstacks1); + } + } else { + createTask(whereJson, bstIvtBoxstacks1); + } + } else { + InBoxTrussTask inBoxTrussTask = new InBoxTrussTask(); + JSONObject taskParam = new JSONObject(); + + taskParam.put("task_type", BoxStackEnum.TASK_TYPE.code("木箱行架")); + taskParam.put("acs_task_type", IOSEnum.ACS_TYPE.code("子卷装箱行架任务")); + taskParam.put("start_device_code", bstIvtBoxstacks.get(0).getStack_code()); + taskParam.put("next_device_code", IOSEnum.SPECIAL_POINTS.code("退货行架对接位")); + taskParam.put("material_code", whereJson.getString("checked")); + taskParam.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + if (StrUtil.isEmpty(bstIvtBoxstacks.get(0).getBox_no())){ + throw new BadRequestException("未找到对接位木箱信息"); + } + String[] split = bstIvtBoxstacks.get(0).getBox_no().split(","); + // 根据当前层查询木箱信息 + BstIvtBoxinfo boxDao = iBstIvtBoxinfoService.getOne( + new QueryWrapper().lambda() + .eq(BstIvtBoxinfo::getBox_no, split[bstIvtBoxstacks.get(0).getCurrent_layer_count()])); + if (boxDao == null) { + throw new BadRequestException("木箱不存在!"); + } + JSONObject boxParam = new JSONObject(); + boxParam.put("layer", whereJson.getString("layer")); + boxParam.put("length", boxDao.getBox_length()); + boxParam.put("width", boxDao.getBox_width()); + boxParam.put("height", boxDao.getBox_high()); + boxParam.put("containerType", boxDao.getVehicle_type()); + boxParam.put("barcode",boxDao.getBox_no()); + taskParam.put("request_param", boxParam.toString()); + inBoxTrussTask.createTask(taskParam); + } + List bstIvtBoxinfos = bstIvtBoxinfoMapper.selectList(new QueryWrapper().eq("material_code", whereJson.getString("checked"))); + if (bstIvtBoxinfos.isEmpty()) { + throw new BadRequestException("物料信息未维护"); + } + + //维护包装关系 + BstIvtBoxinfo boxinfo = bstIvtBoxinfos.get(0); + BigDecimal boxWeight = (boxinfo.getBox_weight() != null) + ? new BigDecimal(boxinfo.getBox_weight()) + : BigDecimal.ZERO; totalWeight = totalWeight.add(boxWeight); //更新及子卷包装状态已分配规格及木箱规格组 - String weightTotal = totalWeight.toString(); UpdateWrapper updateWrapper = new UpdateWrapper<>(); //理论毛重 updateWrapper.set("box_weight", NumberUtil.round(totalWeight, 2).toString()); - updateWrapper.set("package_box_sn", boxDao.getBox_no()); + updateWrapper.set("package_box_sn", bstIvtBoxinfos.get(0).getBox_no()); updateWrapper.set("quanlity_in_box", workIdList.size()); - updateWrapper.set("box_type", boxDao.getMaterial_code()); - updateWrapper.set("box_length", boxDao.getBox_length()); - updateWrapper.set("box_width", boxDao.getBox_width()); - updateWrapper.set("box_high", boxDao.getBox_high()); + updateWrapper.set("box_type", bstIvtBoxinfos.get(0).getMaterial_code()); + updateWrapper.set("box_length", bstIvtBoxinfos.get(0).getBox_length()); + updateWrapper.set("box_width", bstIvtBoxinfos.get(0).getBox_width()); + updateWrapper.set("box_high", bstIvtBoxinfos.get(0).getBox_high()); updateWrapper.set("box_group", maxBoxGroup); updateWrapper.set("status", "0"); updateWrapper.in("workorder_id", workIdList); pdmBiSubpackagerelationMapper.update(null, updateWrapper); - String isOnMes = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("is_on_mes").getValue(); - if (isOnMes.equals(IOSEnum.IS_NOTANDYES.code("是"))) { - //给MES传输子卷包装关系 - PdmProductSpecServiceImpl.doRecord(SpecEnum.BZ, null, Boolean.TRUE, null, containerNameList.stream().collect(Collectors.toList())); - CompletableFuture.runAsync(() -> { - try { - log.error("----回传子卷包装关系----"); - String isConnect2 = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("IS_CONNECT_MES2").getValue(); - if ("1".equals(isConnect2)) { - transferBoxPackageToMes(false, whereJson, containerNameList, boxSn, weightTotal); - } - } catch (Exception e) { - log.error("子卷装箱异常,transferBoxPackageToMes给MES传输子卷包装关系异常,木箱号为:" + boxSn + ",异常信息:" + e); - } - }, pool); - } + } + + private void createTask(JSONObject whereJson, List bstIvtBoxstacks1) { + + JSONObject taskParam = new JSONObject(); + taskParam.put("task_type", BoxStackEnum.TASK_TYPE.code("木箱缓存区到对接位")); + taskParam.put("point_code1", bstIvtBoxstacks1.get(0).getStack_code()); + taskParam.put("material_code", whereJson.getString("checked")); + taskParam.put("task_status", TaskStatusEnum.SURE_END.getCode()); + mxOutTask.createTask(taskParam); } /** @@ -601,7 +660,6 @@ public class PdmBiSubpackagerelationServiceImpl extends ServiceImpl containerNameList, String deviceCode) { + protected void agvTransfer(Set containerNameList) { //待检区点位 List djqPointList = packageinfoivtService .list(new LambdaUpdateWrapper() .eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用")) - .in(BstIvtPackageinfoivt::getContainer_name,containerNameList)); - if (CollectionUtils.isEmpty(djqPointList)){ - throw new BadRequestException(containerNameList+"子卷信息不存在"); + .in(BstIvtPackageinfoivt::getContainer_name, containerNameList)); + if (CollectionUtils.isEmpty(djqPointList)) { + throw new BadRequestException(containerNameList + "子卷信息不存在"); } boolean hasNo = djqPointList.stream().anyMatch(a -> !a.getIvt_status().equals(PackageInfoIvtEnum.IVT_STATUS.code("合格品"))); - if (hasNo){ - throw new BadRequestException(containerNameList+"子卷未质检合格"); + if (hasNo) { + throw new BadRequestException(containerNameList + "子卷未质检合格"); } List djqPoints = djqPointList.stream().filter(a -> a.getPoint_status().equals(PackageInfoIvtEnum.POINT_STATUS.code("待检区"))).collect(Collectors.toList()); - //任务组id - String groupId = deviceCode.substring(deviceCode.indexOf("_") + 1, deviceCode.indexOf("_", deviceCode.indexOf("_") + 1)); + String now = DateUtil.now(); for (int i1 = 0; i1 < djqPoints.size(); i1++) { BstIvtPackageinfoivt item = djqPoints.get(i1); @@ -698,17 +755,22 @@ public class PdmBiSubpackagerelationServiceImpl extends ServiceImpl taskList = taskService.list(new LambdaQueryWrapper() .eq(SchBaseTask::getVehicle_code, item.getContainer_name()).eq(SchBaseTask::getTask_type, PackageInfoIvtEnum.TASK_TYPE.code("待检区->装箱区")) .eq(SchBaseTask::getIs_delete, IOSEnum.IS_NOTANDYES.code("否")).lt(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode())); - if (CollectionUtils.isEmpty(taskList)){ + + //装箱区有空位且过滤未完成任务 + List zxqPackageinfoivtList = packageinfoivtService.selectEmpPoints(PackageInfoIvtEnum.POINT_STATUS.code("装箱区"), PackageInfoIvtEnum.IVT_STATUS.code("空")); + if (ObjectUtils.isEmpty(zxqPackageinfoivtList)) { + throw new BadRequestException(containerNameList + "装箱区无可用点位,请稍后再试"); + } + if (CollectionUtils.isEmpty(taskList)) { JSONObject jo = new JSONObject(); //确定搬运任务不执行 jo.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("待检区->装箱区")); jo.put("vehicle_code", item.getContainer_name()); jo.put("point_code1", item.getPoint_code()); - jo.put("date",now); - jo.put("task_step",i1); + jo.put("point_code2", zxqPackageinfoivtList.get(0).getPoint_code()); + jo.put("date", now); jo.put("task_status", TaskStatusEnum.SURE_START.getCode()); - jo.put("vehicle_code2", groupId); - zxqTask.createTaskReturnTask(jo); + zxqTask.createTask(jo); } } @@ -717,39 +779,39 @@ public class PdmBiSubpackagerelationServiceImpl extends ServiceImpl().eq("container_name", code)); - if (containerName==null){ - throw new BadRequestException("当前子卷"+code+"还未生成子卷包装"); + if (containerName == null) { + throw new BadRequestException("当前子卷" + code + "还未生成子卷包装"); } if (SUBEnum.STATUS.code("入库").equals(containerName.getStatus()) - ||SUBEnum.STATUS.code("出库").equals(containerName.getStatus())){ - throw new BadRequestException("当前子卷"+code+"已完成出入库不允许手动解除"); + || SUBEnum.STATUS.code("出库").equals(containerName.getStatus())) { + throw new BadRequestException("当前子卷" + code + "已完成出入库不允许手动解除"); } - if (StringUtils.isNotEmpty(containerName.getPackage_box_sn())){ + if (StringUtils.isNotEmpty(containerName.getPackage_box_sn())) { String packageBoxSn = containerName.getPackage_box_sn(); WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); JSONObject attr = attrTab.query("storagevehicle_code = '" + packageBoxSn + "'").uniqueResult(0); - if (ObjectUtils.isNotEmpty(attr)){ + if (ObjectUtils.isNotEmpty(attr)) { String structCode = attr.getString("struct_code"); int count = taskService.count(new QueryWrapper() .eq("task_type", "010704") .eq("is_delete", "0") .eq("point_code1", structCode) .lt("task_status", TaskStatusEnum.FINISHED.getCode())); - if (count>0){ + if (count > 0) { throw new BadRequestException("当前子卷已经生成装箱入库任务,不允许直接解绑"); } - attr.put("lock_type","1"); + attr.put("lock_type", "1"); attrTab.update(attr); } } this.removeById(containerName.getWorkorder_id()); - result.put("message", code+"子卷包装解除成功,同时确认MES装箱以解绑定"); - PdmProductSpecServiceImpl.doRecord(SpecEnum.BZ_REMOVE,MapOf.of("子卷编号",code),Boolean.TRUE,null,code); + result.put("message", code + "子卷包装解除成功,同时确认MES装箱以解绑定"); + PdmProductSpecServiceImpl.doRecord(SpecEnum.BZ_REMOVE, MapOf.of("子卷编号", code), Boolean.TRUE, null, code); return result; } @@ -767,12 +829,12 @@ public class PdmBiSubpackagerelationServiceImpl extends ServiceImpl() .eq("container_name", whereJson.getString("container_name"))); - if (one!=null){ + if (one != null) { throw new BadRequestException("包装关系存在,请先在MES和LMS解绑包装关系"); } BstIvtBoxinfo bstIvtBoxinfo = bstIvtBoxinfoMapper.selectOne(new LambdaQueryWrapper() @@ -792,16 +854,16 @@ public class PdmBiSubpackagerelationServiceImpl extends ServiceImpl3){ + if (day > 3) { throw new BadRequestException("只能导出前三天数据"); } Date time = DateUtil.offsetDay(new Date(), -day); @@ -815,57 +877,57 @@ public class PdmBiSubpackagerelationServiceImpl extends ServiceImpl> log = new ArrayList<>(); - if (total>0){ - PageResult page = (PageResult)logPage.get("page"); + List> log = new ArrayList<>(); + if (total > 0) { + PageResult page = (PageResult) logPage.get("page"); for (LogRepositoryDTO dto : page) { String message = dto.getMessage(); - if (!StringUtils.isEmpty(message)){ + if (!StringUtils.isEmpty(message)) { String requestTime = dto.getRequestTime(); int start = message.indexOf("{"); int end = message.lastIndexOf("}"); - if (start>0 && end>start){ + if (start > 0 && end > start) { String substring = message.substring(start, end + 1); JSONObject object = JSONObject.parseObject(substring); String deviceCode = object.getString("device_code"); - log.add(MapOf.of("呼叫时间",requestTime,"设备",deviceCode)); + log.add(MapOf.of("呼叫时间", requestTime, "设备", deviceCode)); } } } } - List> databases = this.baseMapper.downloadData(time.toString()); + List> databases = this.baseMapper.downloadData(time.toString()); List> ioData = new ArrayList<>(); int max = Math.max(databases.size(), log.size()); for (int i = 0; i < max; i++) { Map item = new HashMap<>(); - if (databases.size()>i){ + if (databases.size() > i) { Map item1 = databases.get(i); item.putAll(item1); - }else { - item.put("下卷设备",""); - item.put("下卷开始",""); - item.put("下卷结束",""); + } else { + item.put("下卷设备", ""); + item.put("下卷开始", ""); + item.put("下卷结束", ""); } - if (log.size()>i){ + if (log.size() > i) { Map item2 = log.get(i); item.putAll(item2); - }else { - item.put("设备",""); - item.put("呼叫时间",""); + } else { + item.put("设备", ""); + item.put("呼叫时间", ""); } - item.put("分割",""); - if (item.keySet().size()==6){ + item.put("分割", ""); + if (item.keySet().size() == 6) { ioData.add(item); } } String[] strings = new String[6]; strings[0] = "下卷设备"; - strings[1] ="下卷开始"; - strings[2] ="下卷结束"; + strings[1] = "下卷开始"; + strings[2] = "下卷结束"; strings[3] = "分割"; strings[4] = "设备"; strings[5] = "呼叫时间"; - new FileUtil().downloadExcelIO(ioData,strings,response); + new FileUtil().downloadExcelIO(ioData, strings, response); } @Override @@ -881,7 +943,7 @@ public class PdmBiSubpackagerelationServiceImpl extends ServiceImpl Integer.valueOf(TaskStatusEnum.ISSUE.getCode())) { throw new BadRequestException("任务已执行不能取消"); } - // 更新任务表删除字段 map.put("is_delete", IOSEnum.IS_NOTANDYES.code("是")); - // 解锁仓位 JSONObject jsonAttr = attrTab.query("struct_code = '" + jsonTask.getString("point_code1") + "'").uniqueResult(0); jsonAttr.put("lock_type",IOSEnum.LOCK_TYPE.code("未锁定")); diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutHeapTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutHeapTask.java index 1d8549b..267b808 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutHeapTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutHeapTask.java @@ -1,5 +1,6 @@ package org.nl.b_lms.sch.tasks; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; @@ -7,6 +8,12 @@ import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import org.nl.b_lms.sch.point.dao.SchBasePoint; +import org.nl.b_lms.sch.point.dao.mapper.SchBasePointMapper; +import org.nl.b_lms.sch.task.dao.SchBaseTask; +import org.nl.b_lms.sch.task.dao.mapper.SchBaseTaskMapper; import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl.LashManageServiceImpl; import org.nl.common.utils.RedissonUtils; @@ -19,11 +26,13 @@ import org.nl.wms.sch.AcsTaskDto; import org.nl.wms.sch.AcsUtil; import org.nl.wms.sch.manage.AbstractAcsTask; import org.nl.wms.sch.manage.TaskStatusEnum; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -34,126 +43,75 @@ import java.util.List; public class TwoOutHeapTask extends AbstractAcsTask { private final String THIS_CLASS = TwoOutHeapTask.class.getName(); - @Override - public List addTask() { - /* - * 下发给ACS时需要特殊处理 - */ - //任务表 - WQLObject wo_Task = WQLObject.getWQLObject("sch_base_task"); - List taskArrAll = wo_Task - .query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0' ORDER BY create_time") - .getResultJSONArray(0).toJavaList(JSONObject.class); + @Autowired + private SchBaseTaskMapper schBaseTaskMapper; - // 是否下发多个AGV输送出库任务 - String is_send_many = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("is_send_many").getValue(); - // 是否异常出库口任务 - String TWO_EXCEP = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("TWO_EXCEP").getValue(); - - List taskArr; - if (TWO_EXCEP.equals(IOSEnum.IS_NOTANDYES.code("否"))) { - if (is_send_many.equals(IOSEnum.IS_NOTANDYES.code("否"))) { - // 只允许每个行架点位有一条任务 - taskArr = sendTask(taskArrAll); - } else { - taskArr = taskArrAll; - } - } else { - taskArr = taskArrAll; - } + @Autowired + private SchBasePointMapper schPointMapper; - ArrayList resultList = new ArrayList<>(); - for (int i = 0; i < taskArr.size(); i++) { - JSONObject json = taskArr.get(i); - char dtl_type = json.getString("task_type").charAt(json.getString("task_type").length() - 1); - AcsTaskDto dto = AcsTaskDto.builder() - .ext_task_id(json.getString("task_id")) - .task_code(json.getString("task_code")) - .task_type(json.getString("acs_task_type")) - .start_device_code(json.getString("point_code1")) - .next_device_code(json.getString("point_code2")) - .vehicle_code(json.getString("vehicle_code2")) - .vehicle_code2(json.getString("vehicle_code")) - .interaction_json(json.getJSONObject("request_param")) - .priority(json.getString("priority")) - .class_type(IOSEnum.ACS_TYPE.code("RGV输送任务")) - .dtl_type(String.valueOf(dtl_type)) - .product_area(IOSEnum.PRODUCT_AREA.code("BLK")) - .remark(json.getString("remark")) - .build(); - if (json.getString("vehicle_code2").contains("A")) { - dto.setRoute_plan_code("two"); - } else { - dto.setRoute_plan_code("normal"); - } - resultList.add(dto); - - // 更新任务为下发 - JSONObject paramMap = new JSONObject(); - paramMap.put("task_status", TaskStatusEnum.ISSUE.getCode()); - wo_Task.update(paramMap, "task_id ='" + json.getString("task_id") + "'"); - } - return resultList; - } - - private List sendTask(List taskArrAll) { + private List sendTask(List taskArrAll) { /* * 一个行架点位只允许一个任务正在执行或下发中 */ - WQLObject wo_Task = WQLObject.getWQLObject("sch_base_task"); - // 点位表 - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); +// WQLObject wo_Task = WQLObject.getWQLObject("sch_base_task"); +// // 点位表 +// WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - ArrayList taskArr = new ArrayList<>(); + List taskArr = new ArrayList<>(); // 判断这两个点位是否有任务:如果没有则下发任务 - List pointJson = wo_Task.query("handle_class = '" + THIS_CLASS + "' AND task_status IN ('05','06') AND is_delete = '0' ORDER BY point_code2") - .getResultJSONArray(0).toJavaList(JSONObject.class); +// List pointJson = wo_Task.query("handle_class = '" + THIS_CLASS + "' AND task_status IN ('05','06') AND is_delete = '0' ORDER BY point_code2") +// .getResultJSONArray(0).toJavaList(JSONObject.class); + + List taskList = schBaseTaskMapper.selectList(new LambdaQueryWrapper().eq(SchBaseTask::getHandle_class, THIS_CLASS).eq(SchBaseTask::getIs_delete, "0") + .in(SchBaseTask::getTask_status, "05", "06").orderByAsc(SchBaseTask::getPoint_code2)); + - if (ObjectUtil.isEmpty(pointJson)) { + if (CollUtil.isEmpty(taskList)) { // 下发两个的任务 - JSONObject oneJson = taskArrAll.stream() - .filter(row -> row.getString("point_code2").equals(IOSEnum.OUT_HANGER.code("行架位1"))) + SchBaseTask oneTask = taskArrAll.stream() + .filter(row -> row.getPoint_code2().equals(IOSEnum.OUT_HANGER.code("行架位1"))) .findFirst().orElse(null); - if (ObjectUtil.isNotEmpty(oneJson)) { - taskArr.add(oneJson); + if (ObjectUtil.isNotEmpty(oneTask)) { + taskArr.add(oneTask); } - JSONObject twoJson = taskArrAll.stream() - .filter(row -> row.getString("point_code2").equals(IOSEnum.OUT_HANGER.code("行架位2"))) + SchBaseTask towTask = taskArrAll.stream() + .filter(row -> row.getPoint_code2().equals(IOSEnum.OUT_HANGER.code("行架位2"))) .findFirst().orElse(null); - if (ObjectUtil.isNotEmpty(twoJson)) { - taskArr.add(twoJson); + if (ObjectUtil.isNotEmpty(towTask)) { + taskArr.add(towTask); } } else { // 哪里空了就下发哪里的 - if (pointJson.size() == 1) { - JSONObject json = pointJson.get(0); - if (json.getString("point_code2").equals(IOSEnum.OUT_HANGER.code("行架位1"))) { + if (taskList.size() == 1) { + SchBaseTask schBaseTask = taskList.get(0); + if (schBaseTask.getPoint_code2().equals(IOSEnum.OUT_HANGER.code("行架位1"))) { // 行架位1有任务则下发行架位2的任务 - JSONObject twoJson = taskArrAll.stream() - .filter(row -> row.getString("point_code2").equals(IOSEnum.OUT_HANGER.code("行架位2"))) + SchBaseTask towTask = taskArrAll.stream() + .filter(row -> row.getPoint_code2().equals(IOSEnum.OUT_HANGER.code("行架位2"))) .findFirst().orElse(null); - if (ObjectUtil.isNotEmpty(twoJson)) { + if (ObjectUtil.isNotEmpty(towTask)) { // 如果能找到去行架位2的任务则下发当前任务 - taskArr.add(twoJson); + taskArr.add(towTask); } else { // 如果不能找到去行架位2则找去行架位1的任务进行二次分配到行架位2 - JSONObject twoJsonOne = taskArrAll.stream() - .filter(row -> row.getString("point_code2").equals(IOSEnum.OUT_HANGER.code("行架位1"))) + SchBaseTask twoJsonOne = taskArrAll.stream() + .filter(row -> row.getPoint_code2().equals(IOSEnum.OUT_HANGER.code("行架位1"))) .findFirst().orElse(null); - if (ObjectUtil.isNotEmpty(twoJsonOne)) { + if (twoJsonOne != null) { // 进行二次分配 // 判断点位是否启用 - JSONObject jsonOne = pointTab.query("point_code = '" + IOSEnum.OUT_HANGER.code("行架位2") + "'") - .uniqueResult(0); - if (jsonOne.getString("is_used").equals("1")) { - twoJsonOne.put("point_code2",IOSEnum.OUT_HANGER.code("行架位2")); - wo_Task.update(twoJsonOne); +// JSONObject jsonOne = pointTab.query("point_code = '" + IOSEnum.OUT_HANGER.code("行架位2") + "'") +// .uniqueResult(0); + SchBasePoint point = schPointMapper.selectOne(new LambdaQueryWrapper().eq(SchBasePoint::getPoint_code, IOSEnum.OUT_HANGER.code("行架位2"))); + if (point.getIs_used().equals("1")) { + twoJsonOne.setPoint_code2(IOSEnum.OUT_HANGER.code("行架位2")); + schBaseTaskMapper.updateById(twoJsonOne); taskArr.add(twoJsonOne); } } @@ -161,25 +119,27 @@ public class TwoOutHeapTask extends AbstractAcsTask { } } else { // 行架位2有任务则下发行架位1的任务 - JSONObject oneJson = taskArrAll.stream() - .filter(row -> row.getString("point_code2").equals(IOSEnum.OUT_HANGER.code("行架位1"))) + SchBaseTask oneJson = taskArrAll.stream() + .filter(row -> row.getPoint_code2().equals(IOSEnum.OUT_HANGER.code("行架位1"))) .findFirst().orElse(null); if (ObjectUtil.isNotEmpty(oneJson)) { // 如果能找到去行架位1的任务则下发当前任务 taskArr.add(oneJson); } else { // 如果不能找到去行架位1则找去行架位2的任务进行二次分配到行架位1 - JSONObject twoJsonTwo = taskArrAll.stream() - .filter(row -> row.getString("point_code2").equals(IOSEnum.OUT_HANGER.code("行架位2"))) + SchBaseTask twoJsonTwo = taskArrAll.stream() + .filter(row -> row.getPoint_code2().equals(IOSEnum.OUT_HANGER.code("行架位2"))) .findFirst().orElse(null); - if (ObjectUtil.isNotEmpty(twoJsonTwo)) { + if (twoJsonTwo!=null) { // 进行二次分配 - JSONObject jsonTwo = pointTab.query("point_code = '" + IOSEnum.OUT_HANGER.code("行架位1") + "'") - .uniqueResult(0); - if (jsonTwo.getString("is_used").equals("1")) { - twoJsonTwo.put("point_code2",IOSEnum.OUT_HANGER.code("行架位1")); - wo_Task.update(twoJsonTwo); +// JSONObject jsonTwo = pointTab.query("point_code = '" + IOSEnum.OUT_HANGER.code("行架位1") + "'") +// .uniqueResult(0); + SchBasePoint point = schPointMapper.selectOne(new LambdaQueryWrapper().eq(SchBasePoint::getPoint_code, IOSEnum.OUT_HANGER.code("行架位1"))); + + if (point.getIs_used().equals("1")) { + twoJsonTwo.setPoint_code2(IOSEnum.OUT_HANGER.code("行架位1")); + schBaseTaskMapper.updateById(twoJsonTwo); taskArr.add(twoJsonTwo); } } @@ -191,6 +151,11 @@ public class TwoOutHeapTask extends AbstractAcsTask { return taskArr; } + @Override + public List addTask() { + return Collections.emptyList(); + } + @Override @Transactional(rollbackFor = Exception.class) public void updateTaskStatus(JSONObject taskObj, String status) { @@ -206,20 +171,20 @@ public class TwoOutHeapTask extends AbstractAcsTask { JSONObject param = new JSONObject(); param.put("is_delete", "1"); param.put("update_time", DateUtil.now()); - taskTab.update(param,"task_id = '" + task_id+ "'"); + taskTab.update(param, "task_id = '" + task_id + "'"); } if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { JSONObject param = new JSONObject(); param.put("task_status", TaskStatusEnum.EXECUTING.getCode()); param.put("update_time", DateUtil.now()); - taskTab.update(param,"task_id = '" + task_id+ "'"); + taskTab.update(param, "task_id = '" + task_id + "'"); } if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { // 更新任务完成 JSONObject param = new JSONObject(); param.put("task_status", TaskStatusEnum.FINISHED.getCode()); param.put("update_time", DateUtil.now()); - taskTab.update(param,"task_id = '" + task_id+ "'"); + taskTab.update(param, "task_id = '" + task_id + "'"); // 如果是异常出库口则不需要下发行架任务 if (jsonTask.getString("point_code2").equals(IOSEnum.EXCEP_OUT.code("异常出库口"))) { WQLObject veExtTab = WQLObject.getWQLObject("md_pb_storagevehicleext"); @@ -300,50 +265,80 @@ public class TwoOutHeapTask extends AbstractAcsTask { } @Transactional - public void sendTaskAcs(String groupTaskId,boolean retry) { - WQLObject wo_Task = WQLObject.getWQLObject("sch_base_task"); - List taskArrAll = wo_Task - .query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0' ORDER BY create_time") - .getResultJSONArray(0).toJavaList(JSONObject.class); + public void sendTaskAcs(String groupTaskId, boolean retry) { +// WQLObject wo_Task = WQLObject.getWQLObject("sch_base_task"); +// List taskArrAll = wo_Task +// .query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0' ORDER BY create_time") +// .getResultJSONArray(0).toJavaList(JSONObject.class); + + + List taskList = schBaseTaskMapper.selectList(new LambdaQueryWrapper().eq(SchBaseTask::getHandle_class, THIS_CLASS) + .eq(SchBaseTask::getTask_status, TaskStatusEnum.START_AND_POINT.getCode()) + .eq(SchBaseTask::getIs_delete, "0").orderByAsc(SchBaseTask::getCreate_time)); + + // 是否下发多个AGV输送出库任务 - if (CollectionUtils.isEmpty(taskArrAll)){ + if (CollectionUtils.isEmpty(taskList)) { return; } - List taskArr; + List taskArr; // 是否异常出库口任务 String TWO_EXCEP = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("TWO_EXCEP").getValue(); if (TWO_EXCEP.equals(IOSEnum.IS_NOTANDYES.code("否"))) { String is_send_many = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("is_send_many").getValue(); if (is_send_many.equals(IOSEnum.IS_NOTANDYES.code("否"))) { // 只允许每个行架点位有一条任务 - taskArr = sendTask(taskArrAll); + taskArr = sendTask(taskList); } else { - taskArr = taskArrAll; + taskArr = taskList; } } else { - taskArr = taskArrAll; + taskArr = taskList; } ArrayList resultList = new ArrayList<>(); for (int i = 0; i < taskArr.size(); i++) { - JSONObject json = taskArr.get(i); - char dtl_type = json.getString("task_type").charAt(json.getString("task_type").length() - 1); +// SchBaseTask schBaseTask = taskArr.get(i); +// char dtl_type = json.getString("task_type").charAt(json.getString("task_type").length() - 1); +// AcsTaskDto dto = AcsTaskDto.builder() +// .ext_task_id(json.getString("task_id")) +// .task_code(json.getString("task_code")) +// .task_type(json.getString("acs_task_type")) +// .start_device_code(json.getString("point_code1")) +// .next_device_code(json.getString("point_code2")) +// .vehicle_code(json.getString("vehicle_code2")) +// .vehicle_code2(json.getString("vehicle_code")) +// .interaction_json(json.getJSONObject("request_param")) +// .priority(json.getString("priority")) +// .class_type(IOSEnum.ACS_TYPE.code("RGV输送任务")) +// .dtl_type(String.valueOf(dtl_type)) +// .product_area(IOSEnum.PRODUCT_AREA.code("BLK")) +// .remark(json.getString("remark")) +// .build(); + + SchBaseTask schBaseTask = taskArr.get(i); + char dtl_type = schBaseTask.getTask_type().charAt(schBaseTask.getTask_type().length() - 1); + // 处理request_param转换为JSONObject + JSONObject requestParamJson = null; + if (schBaseTask.getRequest_param() != null && !schBaseTask.getRequest_param().isEmpty()) { + requestParamJson = JSONObject.parseObject(schBaseTask.getRequest_param()); + } AcsTaskDto dto = AcsTaskDto.builder() - .ext_task_id(json.getString("task_id")) - .task_code(json.getString("task_code")) - .task_type(json.getString("acs_task_type")) - .start_device_code(json.getString("point_code1")) - .next_device_code(json.getString("point_code2")) - .vehicle_code(json.getString("vehicle_code2")) - .vehicle_code2(json.getString("vehicle_code")) - .interaction_json(json.getJSONObject("request_param")) - .priority(json.getString("priority")) + .ext_task_id(schBaseTask.getTask_id()) + .task_code(schBaseTask.getTask_code()) + .task_type(schBaseTask.getAcs_task_type()) + .start_device_code(schBaseTask.getPoint_code1()) + .next_device_code(schBaseTask.getPoint_code2()) + .vehicle_code(schBaseTask.getVehicle_code2()) + .vehicle_code2(schBaseTask.getVehicle_code()) + .interaction_json(requestParamJson) + .priority(schBaseTask.getPriority()) .class_type(IOSEnum.ACS_TYPE.code("RGV输送任务")) .dtl_type(String.valueOf(dtl_type)) .product_area(IOSEnum.PRODUCT_AREA.code("BLK")) - .remark(json.getString("remark")) + .remark(schBaseTask.getRemark()) .build(); - if (json.getString("vehicle_code2").contains("A")) { + if (schBaseTask.getVehicle_code2().contains("A")) { dto.setRoute_plan_code("two"); } else { dto.setRoute_plan_code("normal"); diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutTask.java index a5a30c7..a3de0ad 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoOutTask.java @@ -1,15 +1,23 @@ package org.nl.b_lms.sch.tasks; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.extern.slf4j.Slf4j; +import org.nl.b_lms.sch.task.dao.SchBaseTask; +import org.nl.b_lms.sch.task.dao.mapper.SchBaseTaskMapper; import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdis; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.mapper.StIvtIostorinvdisMapper; import org.nl.b_lms.storage_manage.ios.service.iostorInv.impl.StIvtIostorinvOutServiceImpl; import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl.LashManageServiceImpl; +import org.nl.b_lms.storage_manage.st.dao.StIvtStructattr; +import org.nl.b_lms.storage_manage.st.dao.mapper.StIvtStructattrMapper; import org.nl.common.utils.RedissonUtils; import org.nl.common.utils.SecurityUtils; import org.nl.modules.common.exception.BadRequestException; @@ -19,9 +27,11 @@ import org.nl.modules.wql.util.SpringContextHolder; import org.nl.wms.sch.AcsTaskDto; import org.nl.wms.sch.manage.AbstractAcsTask; import org.nl.wms.sch.manage.TaskStatusEnum; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; @@ -35,6 +45,18 @@ import static org.nl.wms.util.TaskUtil.getRoutePlanCode; public class TwoOutTask extends AbstractAcsTask { private final String THIS_CLASS = TwoOutTask.class.getName(); + + @Autowired + SchBaseTaskMapper schBaseTaskMapper; + + @Autowired + StIvtIostorinvdisMapper stIvtIostorinvdisMapper; + + @Autowired + StIvtStructattrMapper stIvtStructattrMapper; + + + @Override public List addTask() { /* @@ -160,58 +182,79 @@ public class TwoOutTask extends AbstractAcsTask { @Override @Transactional(rollbackFor = Exception.class) public void updateTaskStatus(JSONObject taskObj, String status) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject disTab = WQLObject.getWQLObject("st_ivt_iostorinvdis"); // 出入库分配表 - WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); // 仓位表 + String task_id = taskObj.getString("task_id"); - JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "' and task_status < '07'").uniqueResult(0); + + SchBaseTask jsonTask = schBaseTaskMapper.selectOne(new QueryWrapper() + .eq("task_id", task_id) + .lt("task_status", "07")); + if (ObjectUtil.isEmpty(jsonTask)){ return; } if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { - if (jsonTask.getIntValue("task_status") > Integer.parseInt(TaskStatusEnum.ISSUE.getCode())) { - throw new BadRequestException("任务:" + jsonTask.getString("task_code") + "已执行,不可取消"); + if (Integer.parseInt(jsonTask.getTask_status()) > Integer.parseInt(TaskStatusEnum.ISSUE.getCode())) { + throw new BadRequestException("任务:" + jsonTask.getTask_code() + "已执行,不可取消"); } - jsonTask.put("is_delete", "1"); - jsonTask.put("update_time", DateUtil.now()); - taskTab.update(jsonTask); - JSONObject map = new JSONObject(); - map.put("work_status", IOSEnum.WORK_STATUS.code("未生成")); - map.put("point_id", ""); - map.put("task_id", ""); - disTab.update(map, "task_id = '" + task_id + "'"); + jsonTask.setIs_delete("1"); + jsonTask.setUpdate_time(DateUtil.now()); + schBaseTaskMapper.updateById(jsonTask); + + StIvtIostorinvdis stIvtIostorinvdis = new StIvtIostorinvdis(); + stIvtIostorinvdis.setWork_status(IOSEnum.WORK_STATUS.code("未生成")); + stIvtIostorinvdis.setPoint_id(""); + stIvtIostorinvdis.setTask_id(""); + stIvtIostorinvdisMapper.update(stIvtIostorinvdis, new QueryWrapper().eq("task_id", task_id)); + +// map.put("work_status", IOSEnum.WORK_STATUS.code("未生成")); +// map.put("point_id", ""); +// map.put("task_id", ""); +// disTab.update(map, "task_id = '" + task_id + "'"); } if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { - jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - jsonTask.put("update_time", DateUtil.now()); - taskTab.update(jsonTask); + jsonTask.setUpdate_time(DateUtil.now()); + jsonTask.setTask_status(TaskStatusEnum.EXECUTING.getCode()); + schBaseTaskMapper.updateById(jsonTask); } if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { RedissonUtils.lock(c -> { StIvtIostorinvOutServiceImpl bean = SpringContextHolder.getBean(StIvtIostorinvOutServiceImpl.class); - bean.finishTask(jsonTask); + JSONObject jsonObject = (JSONObject) JSONObject.toJSON(jsonTask); + bean.finishTask(jsonObject); // 判断是否有异常货位的需要更新 - JSONObject jsonExt = attrTab.query("inv_code = '" + jsonTask.getString("vehicle_code") + "' AND lock_type = '"+IOSEnum.LOCK_TYPE.code("出库异常锁")+"'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonExt)) { - jsonExt.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定")); - jsonExt.put("inv_code", ""); - attrTab.update(jsonExt); +// JSONObject jsonExt = attrTab.query("inv_code = '" + jsonTask.getString("vehicle_code") + "' AND lock_type = '"+IOSEnum.LOCK_TYPE.code("出库异常锁")+"'").uniqueResult(0); + + StIvtStructattr stIvtStructattr = stIvtStructattrMapper.selectOne(new QueryWrapper().eq("inv_code", jsonTask.getVehicle_code()).eq("lock_type", IOSEnum.LOCK_TYPE.code("出库异常锁"))); + + + if (ObjectUtil.isNotEmpty(stIvtStructattr)) { +// jsonExt.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定")); +// jsonExt.put("inv_code", ""); + stIvtStructattr.setLock_type(IOSEnum.LOCK_TYPE.code("未锁定")); + stIvtStructattr.setInv_code(""); + stIvtStructattrMapper.updateById(stIvtStructattr); } + + JSONObject parse = (JSONObject) JSONObject.parse(jsonTask.getRequest_param()); JSONObject jsonParam = new JSONObject(); - jsonParam.put("device_code",jsonTask.getString("point_code2")); - jsonParam.put("vehicle_code",jsonTask.getString("vehicle_code")); - jsonParam.put("task_group_id",jsonTask.getString("task_group_id")); - jsonParam.put("vehicle_type",jsonTask.getJSONObject("request_param").getString("containerType")); - jsonParam.put("bill_type",jsonTask.getJSONObject("request_param").getString("bill_type")); + jsonParam.put("device_code",jsonTask.getPoint_code2()); + jsonParam.put("vehicle_code",jsonTask.getVehicle_code()); + jsonParam.put("task_group_id",jsonTask.getTask_group_id()); + jsonParam.put("vehicle_type",parse.getString("containerType")); + jsonParam.put("bill_type",parse.getString("bill_type")); LashManageServiceImpl bean1 = SpringContextHolder.getBean(LashManageServiceImpl.class); bean1.createHeapTask(jsonParam); // 判断此任务组是否全部完成 - JSONArray resultJSONArray = taskTab.query("task_group_id = '" + jsonTask.getString("task_group_id") + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "' and handle_class = '"+THIS_CLASS+"'") - .getResultJSONArray(0); - if (ObjectUtil.isEmpty(resultJSONArray)) { +// JSONArray resultJSONArray = taskTab.query("task_group_id = '" + jsonTask.getString("task_group_id") + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "' and handle_class = '"+THIS_CLASS+"'") +// .getResultJSONArray(0); + + List schBaseTasks = schBaseTaskMapper.selectList(new QueryWrapper().eq("task_group_id", jsonTask.getTask_group_id()).ne("task_status", TaskStatusEnum.FINISHED.getCode()).eq("handle_class", THIS_CLASS)); + + + if (CollUtil.isEmpty(schBaseTasks)) { try { this.immediateNotifyAcs(null); - }catch (Exception ex){ + } catch (Exception ex){ log.warn("载具出库批量下发异常",ex.getMessage()); if (!ex.getMessage().equals("存在相同的任务号")){ throw new BadRequestException(ex.getMessage()); @@ -237,33 +280,37 @@ public class TwoOutTask extends AbstractAcsTask { String currentUserId = SecurityUtils.getCurrentUserId(); String currentUsername = SecurityUtils.getCurrentUsername(); - JSONObject json = new JSONObject(); - json.put("task_id", IdUtil.getSnowflake(1, 1).nextId()); - json.put("task_code", IdUtil.getSnowflake(1, 1).nextId()); - - json.put("task_type", form.getString("task_type")); - json.put("vehicle_code", form.getString("vehicle_code")); - json.put("vehicle_code2", form.getString("vehicle_code2")); - json.put("vehicle_type", form.getString("vehicle_type")); - json.put("task_name", form.getString("task_name")); - json.put("point_code1", form.getString("point_code1")); - json.put("point_code2", form.getString("point_code2")); - json.put("material_id", form.getString("material_id")); - json.put("task_group_id", form.getString("task_group_id")); - json.put("is_auto_issue", form.getString("is_auto_issue")); - json.put("table_fk", form.getString("table_fk")); - json.put("request_param", form.getString("request_param")); - json.put("sort_seq", form.getIntValue("sort_seq")); - - json.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - json.put("handle_class", THIS_CLASS); - json.put("create_id", currentUserId); - json.put("create_name", currentUsername); - json.put("create_time", DateUtil.now()); - json.put("acs_task_type", "7"); - WQLObject.getWQLObject("SCH_BASE_Task").insert(json); - - return json.getString("task_id"); + SchBaseTask task = new SchBaseTask(); + task.setTask_id(IdUtil.getSnowflake(1, 1).nextId() + ""); + task.setTask_code(IdUtil.getSnowflake(1, 1).nextId() + ""); + task.setTask_type(form.getString("task_type")); + task.setVehicle_code(form.getString("vehicle_code")); + task.setVehicle_code2(form.getString("vehicle_code2")); + task.setVehicle_type(form.getString("vehicle_type")); + task.setTask_name(form.getString("task_name")); + task.setMaterial_id(form.getString("material_id")); + task.setTask_group_id(form.getString("task_group_id")); + task.setIs_auto_issue(form.getString("is_auto_issue")); + task.setTable_fk(form.getString("table_fk")); + task.setRequest_param(form.getString("request_param")); + if (form.getString("sort_seq")!= null) { + BigDecimal decimal = new BigDecimal(form.getString("sort_seq")); + task.setSort_seq(decimal); + } + task.setTask_status(TaskStatusEnum.START_AND_POINT.getCode()); + task.setPoint_code1(form.getString("start_device_code")); + task.setPoint_code2(form.getString("next_device_code")); + task.setHandle_class(this.getClass().getName()); + task.setCreate_id(SecurityUtils.getCurrentUserId()); + task.setCreate_name(SecurityUtils.getCurrentUsername()); + task.setCreate_time(DateUtil.now()); + task.setAcs_task_type("7"); + + + + schBaseTaskMapper.insert(task); + + return task.getTask_id(); } @Override diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/BoxSSXTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/BoxSSXTask.java new file mode 100644 index 0000000..df9e7f0 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/BoxSSXTask.java @@ -0,0 +1,181 @@ +package org.nl.b_lms.sch.tasks.boxstack; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstack; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.mapper.BstIvtBoxstackMapper; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.sch.AcsTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +import static org.nl.wms.util.TaskUtil.getRoutePlanCode; + +/** + * 木箱输送线任务类 + * Created by Lxy on 2024/1/19. + */ +@Service +public class BoxSSXTask extends AbstractAcsTask { + + /** + * 处理类 + */ + private final String THIS_CLASS = BoxSSXTask.class.getName(); + + @Resource + private BstIvtBoxstackMapper boxstackMapper; + + @Override + public List addTask() { + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + ArrayList resultList = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { + JSONObject json = arr.getJSONObject(i); + //JSONObject params = json.getJSONObject("params"); + char dtl_type = json.getString("task_type").charAt(json.getString("task_type").length() - 1); + AcsTaskDto dto = AcsTaskDto.builder() + .ext_task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .route_plan_code(getRoutePlanCode(json.getString("point_code2"))) + .vehicle_code(json.getString("vehicle_code")) + .priority(json.getString("priority")) + .class_type(IOSEnum.ACS_TYPE.code("装箱行架任务")) + .dtl_type(String.valueOf(dtl_type)) + .interaction_json(json.getJSONObject("request_param")) + .remark(json.getString("remark")) + .product_area(IOSEnum.PRODUCT_AREA.code("BLK")) + .build(); + + + resultList.add(dto); + } + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + // 任务表 + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); + + // 更新任务的参数 + JSONObject map = new JSONObject(); + + /* + * 1-执行中, 2-完成 ,0-acs取消 + */ + // 执行中 + if (status.equals(TaskStatusEnum.EXECUTING.getCode())) { + + map.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + } + // 完成 + if (status.equals(TaskStatusEnum.FINISHED.getCode())) { + + map.put("task_status", TaskStatusEnum.FINISHED.getCode()); + } + + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + + if (taskObj.getIntValue("task_status") > Integer.valueOf(TaskStatusEnum.ISSUE.getCode())) { + throw new BadRequestException("任务已执行不能取消"); + } + + // 更新任务表删除字段 + map.put("is_delete", IOSEnum.IS_NOTANDYES.code("是")); + + } + + map.put("update_optid", SecurityUtils.getCurrentUserId()); + map.put("update_optname", SecurityUtils.getCurrentNickName()); + map.put("update_time", DateUtil.now()); + + WQLObject.getWQLObject("SCH_BASE_Task").update(map, "task_id = '" + taskObj.getString("task_id") + "'"); + } + + @Override + public void findStartPoint() { + + } + + @Override + public void findNextPoint() { + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String createTask(JSONObject form) { + + if (StrUtil.isBlank(form.getString("task_type"))) { + throw new BadRequestException("业务类型不能为空!"); + } + + if (StrUtil.isBlank(form.getString("start_device_code"))) { + throw new BadRequestException("起点不能为空!"); + } + + if (StrUtil.isBlank(form.getString("next_device_code"))) { + throw new BadRequestException("终点不能为空!"); + } + //创建任务点位层数要扣减 + BstIvtBoxstack bstIvtBoxstackUpdate = boxstackMapper.selectOne(new QueryWrapper().eq("stack_code", form.getString("start_device_code"))); + BstIvtBoxstack bstIvtBoxstack = new BstIvtBoxstack(); + bstIvtBoxstack.setCurrent_layer_count(bstIvtBoxstackUpdate.getCurrent_layer_count() - 1); + JSONObject json = new JSONObject(); + json.put("task_id", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_code", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_type", form.getString("task_type")); + json.put("vehicle_code", form.getString("vehicle_code")); + json.put("vehicle_code2", form.getString("vehicle_code2")); + json.put("vehicle_type", form.getString("vehicle_type")); + json.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + json.put("task_group_id", form.getLongValue("task_group_id")); + json.put("point_code1", form.getString("start_device_code")); + json.put("point_code2", form.getString("next_device_code")); + json.put("product_area", "BLK"); + json.put("handle_class", this.getClass().getName()); + json.put("create_id", SecurityUtils.getCurrentUserId()); + json.put("create_name", SecurityUtils.getCurrentUsername()); + json.put("create_time", DateUtil.now()); + json.put("priority", "1"); + json.put("acs_task_type", "6"); + json.put("request_param", form.getString("request_param")); + WQLObject.getWQLObject("SCH_BASE_Task").insert(json); + return json.getString("task_id"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void forceFinish(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + } + + @Override + public void cancel(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, IOSEnum.ACS_RESULT.code("取消")); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/InBoxTrussTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/InBoxTrussTask.java new file mode 100644 index 0000000..29778c7 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/InBoxTrussTask.java @@ -0,0 +1,215 @@ +package org.nl.b_lms.sch.tasks.boxstack; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxstackService; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstack; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.mapper.BstIvtBoxstackMapper; +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.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.sch.AcsTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.util.TaskUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +import static org.nl.wms.util.TaskUtil.getRoutePlanCode; + +/** + * 二期木箱行架任务类 + * Created by Lxy on 2024/1/19. + */ +@Service +public class InBoxTrussTask extends AbstractAcsTask { + + /** + * 处理类 + */ + private final String THIS_CLASS = InBoxTrussTask.class.getName(); + + @Resource + private BstIvtBoxstackMapper boxstackMapper; + + @Resource + private IschBaseTaskService taskService; + + @Resource + private IBstIvtBoxstackService boxstackService; + + @Override + public List addTask() { + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + ArrayList resultList = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { + JSONObject json = arr.getJSONObject(i); + //JSONObject params = json.getJSONObject("params"); + char dtl_type = json.getString("task_type").charAt(json.getString("task_type").length() - 1); + AcsTaskDto dto = AcsTaskDto.builder() + .ext_task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .route_plan_code(getRoutePlanCode(json.getString("point_code2"))) + .vehicle_code(json.getString("vehicle_code")) + .priority(json.getString("priority")) + .class_type(IOSEnum.ACS_TYPE.code("装箱行架任务")) + .dtl_type(String.valueOf(dtl_type)) + .interaction_json(json.getJSONObject("request_param")) + .remark(json.getString("remark")) + .product_area(IOSEnum.PRODUCT_AREA.code("BLK")) + .build(); + + + resultList.add(dto); + } + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + String now = DateUtil.now(); + String currentUserId = SecurityUtils.getCurrentUserId(); + String currentNickName = SecurityUtils.getCurrentNickName(); + SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper().eq(SchBaseTask::getTask_id, taskObj.getString("task_id")), false); + if (TaskUtil.checkParams(schBaseTask, THIS_CLASS, TaskStatusEnum.FINISHED.getCode())) return; + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper() + .eq(SchBaseTask::getTask_id, taskObj.getString("task_id")) + .set(SchBaseTask::getUpdate_optid, currentUserId) + .set(SchBaseTask::getUpdate_optname, currentNickName) + .set(SchBaseTask::getUpdate_time, now); + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + // 更新任务状态为执行中 + if (TaskUtil.checkParams(schBaseTask, THIS_CLASS, TaskStatusEnum.EXECUTING.getCode())) return; + updateWrapper.set(SchBaseTask::getTask_status, TaskStatusEnum.EXECUTING.getCode()); + } + // 完成 + if (status.equals(TaskStatusEnum.FINISHED.getCode())) { + //更新木箱当前层数和木箱编码 + BstIvtBoxstack boxstack = boxstackService.getOne(new LambdaQueryWrapper() + .eq(BstIvtBoxstack::getStack_code, schBaseTask.getPoint_code1())); + + String originalString = boxstack.getBox_no(); + String itemToRemove = schBaseTask.getVehicle_code(); + + // 分割字符串,过滤掉指定项,然后重新组合 + String[] items = originalString.split(","); + List itemList = new ArrayList<>(); + for (String item : items) { + if (!item.equals(itemToRemove)) { + itemList.add(item); + } + } + String modifiedString = String.join(",", itemList); + boxstack.setBox_no(modifiedString); + boxstack.setCurrent_layer_count(boxstack.getCurrent_layer_count() - 1); + boxstack.setUpdate_id(currentUserId); + boxstack.setUpdate_name(currentNickName); + boxstack.setUpdate_time(DateUtil.now()); + boxstackMapper.updateById(boxstack); + + //3.更改任务状态为完成 + updateWrapper.set(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode()); + + } + + // 取消 + if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { + + if (Integer.parseInt(schBaseTask.getTask_status()) > Integer.parseInt(TaskStatusEnum.ISSUE.getCode())) { + throw new BadRequestException("任务已执行不能取消"); + } + //任务被标记为取消 + updateWrapper.set(SchBaseTask::getIs_delete, IOSEnum.IS_NOTANDYES.code("是")); + updateWrapper.set(SchBaseTask::getTask_status, TaskStatusEnum.CANCEL.getCode()); + updateWrapper.set(SchBaseTask::getRemark, "任务被ACS在:" + schBaseTask.getUpdate_time() + "调用接口强制取消。"); + + } + + taskService.update(null, updateWrapper); + } + + @Override + public void findStartPoint() { + + } + + @Override + public void findNextPoint() { + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String createTask(JSONObject form) { + + if (StrUtil.isBlank(form.getString("task_type"))) { + throw new BadRequestException("业务类型不能为空!"); + } + + if (StrUtil.isBlank(form.getString("start_device_code"))) { + throw new BadRequestException("起点不能为空!"); + } + + if (StrUtil.isBlank(form.getString("next_device_code"))) { + throw new BadRequestException("终点不能为空!"); + } + //创建任务点位层数要扣减 + BstIvtBoxstack bstIvtBoxstackUpdate = boxstackMapper.selectOne(new QueryWrapper().eq("stack_code", form.getString("start_device_code"))); + BstIvtBoxstack bstIvtBoxstack = new BstIvtBoxstack(); + bstIvtBoxstack.setCurrent_layer_count(bstIvtBoxstackUpdate.getCurrent_layer_count() - 1); + JSONObject json = new JSONObject(); + json.put("task_id", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_code", IdUtil.getSnowflake(1, 1).nextId()); + json.put("task_type", form.getString("task_type")); + json.put("vehicle_code", form.getString("vehicle_code")); + json.put("vehicle_code2", form.getString("vehicle_code2")); + json.put("vehicle_type", form.getString("vehicle_type")); + json.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + json.put("task_group_id", form.getLongValue("task_group_id")); + json.put("point_code1", form.getString("start_device_code")); + json.put("point_code2", form.getString("next_device_code")); + json.put("product_area", "BLK"); + json.put("handle_class", this.getClass().getName()); + json.put("create_id", SecurityUtils.getCurrentUserId()); + json.put("create_name", SecurityUtils.getCurrentUsername()); + json.put("create_time", DateUtil.now()); + json.put("priority", "1"); + json.put("acs_task_type", "6"); + json.put("request_param", form.getString("request_param")); + WQLObject.getWQLObject("SCH_BASE_Task").insert(json); + return json.getString("task_id"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void forceFinish(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + } + + @Override + public void cancel(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, IOSEnum.ACS_RESULT.code("取消")); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/MxOutTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/MxOutTask.java index 75cc784..5d44633 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/MxOutTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/MxOutTask.java @@ -3,20 +3,28 @@ package org.nl.b_lms.sch.tasks.boxstack; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.ObjectUtil; 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.query.QueryWrapper; 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.lang3.ObjectUtils; +import org.nl.b_lms.bst.ivt.boxstack.enums.BoxStackEnum; +import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxstackService; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstack; 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.dao.mapper.SchBaseTaskMapper; 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.database.service.IBstIvtBoxinfoService; +import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxinfo; import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; import org.nl.common.enums.PackageInfoIvtEnum; import org.nl.common.utils.SecurityUtils; @@ -26,6 +34,7 @@ import org.nl.wms.sch.manage.AbstractAcsTask; import org.nl.wms.sch.manage.TaskStatusEnum; import org.nl.wms.util.TaskUtil; import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -41,8 +50,7 @@ import java.util.stream.Collectors; * @author gbx * @since 2024-01-24 */ -@Service() -@RequiredArgsConstructor +@Service @Slf4j public class MxOutTask extends AbstractAcsTask { @@ -51,9 +59,22 @@ public class MxOutTask extends AbstractAcsTask { @Resource private IschBaseTaskService taskService; + @Resource + private IBstIvtBoxstackService boxstackService; + + @Resource private IbstIvtPackageinfoivtService packageinfoivtService; + @Resource + private IBstIvtBoxinfoService iBstIvtBoxinfoService; + + @Autowired + private SchBaseTaskMapper schBaseTaskMapper; + + + + @Override public List addTask() { @@ -86,6 +107,8 @@ public class MxOutTask extends AbstractAcsTask { @Transactional(rollbackFor = Exception.class) public void updateTaskStatus(JSONObject taskObj, String status) { String now = DateUtil.now(); + String currentUserId = SecurityUtils.getCurrentUserId(); + String currentNickName = SecurityUtils.getCurrentNickName(); SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper().eq(SchBaseTask::getTask_id, taskObj.getString("task_id")), false); if (TaskUtil.checkParams(schBaseTask, THIS_CLASS, TaskStatusEnum.FINISHED.getCode())) return; LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper() @@ -100,12 +123,57 @@ public class MxOutTask extends AbstractAcsTask { } if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { log.info("任务编号为:" + schBaseTask.getTask_code() + "的任务完成接口在" + now + "被调用---------------------------------------------"); - //1.改变起点点位状态 - packageinfoivtService.update(null, new UpdateWrapper().set("update_time", now).set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("空")).set("container_name", null).eq("point_code", schBaseTask.getPoint_code1())); - //2.更新库存记录 - packageinfoivtService.update(null, new UpdateWrapper().set("update_time", now).set("ivt_status", PackageInfoIvtEnum.IVT_STATUS.code("空载具")).eq("point_code", schBaseTask.getPoint_code2())); - //3.更改任务状态为完成 - updateWrapper.set(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode()); + //更新终点库存 + String box_spec = schBaseTask.getMaterial_code(); + String vehicle_code = schBaseTask.getVehicle_code(); + String[] boxNos = vehicle_code.split(","); + //修改木箱库木箱规格信息 + BstIvtBoxstack boxstack = boxstackService.getOne(new LambdaQueryWrapper() + .eq(BstIvtBoxstack::getStack_code, schBaseTask.getPoint_code2())); + if (!ObjectUtil.isEmpty(boxstack)) { + boxstack.setBox_no(vehicle_code); + boxstack.setCurrent_layer_count(boxNos.length); + boxstack.setBox_spec(box_spec); + boxstack.setUpdate_time(now); + boxstack.setUpdate_id(currentUserId); + boxstack.setUpdate_name(currentNickName); + boxstackService.updateById(boxstack); + BstIvtBoxstack boxstackStart = boxstackService.getOne(new LambdaQueryWrapper() + .eq(BstIvtBoxstack::getStack_code, schBaseTask.getPoint_code1())); + //agv任务完成生成行架任务 + InBoxTrussTask inBoxTrussTask = new InBoxTrussTask(); + JSONObject taskParam = new JSONObject(); + taskParam.put("task_type", BoxStackEnum.TASK_TYPE.code("木箱行架")); + taskParam.put("acs_task_type", IOSEnum.ACS_TYPE.code("子卷装箱行架任务")); + taskParam.put("start_device_code", schBaseTask.getPoint_code2()); + taskParam.put("next_device_code", IOSEnum.SPECIAL_POINTS.code("退货行架对接位")); + taskParam.put("material_code", schBaseTask.getMaterial_code()); + taskParam.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + if (StrUtil.isEmpty(boxstackStart.getBox_no())){ + throw new BadRequestException("未找到对接位木箱信息"); + } + String[] split = boxstackStart.getBox_no().split(","); + // 根据当前层查询木箱信息 + BstIvtBoxinfo boxDao = iBstIvtBoxinfoService.getOne( + new QueryWrapper().lambda() + .eq(BstIvtBoxinfo::getBox_no, split[boxstackStart.getCurrent_layer_count()])); + if (boxDao == null) { + throw new BadRequestException("木箱不存在!"); + } + + JSONObject boxParam = new JSONObject(); + boxParam.put("length", boxDao.getBox_length()); + boxParam.put("width", boxDao.getBox_width()); + boxParam.put("height", boxDao.getBox_high()); + boxParam.put("containerType", boxDao.getVehicle_type()); + boxParam.put("barcode", boxDao.getBox_no()); + taskParam.put("request_param", boxParam.toString()); + taskParam.put("vehicle_code", boxDao.getBox_no()); + inBoxTrussTask.createTask(taskParam); + + + } + } // 取消 if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { @@ -155,10 +223,7 @@ public class MxOutTask extends AbstractAcsTask { if (StrUtil.isBlank(pointCode1)) { throw new BadRequestException("起点不能为空"); } - String pointCode2 = form.getString("point_code2"); - if (StrUtil.isBlank(pointCode2)) { - throw new BadRequestException("下一点不能为空"); - } + String pointCode3 = form.getString("point_code3"); //是否立即下发 boolean isSend = !StrUtil.isNotBlank(form.getString("is_send")) || BooleanUtil.toBoolean(form.getString("is_send")); @@ -167,7 +232,6 @@ public class MxOutTask extends AbstractAcsTask { .vehicle_code(vehicleCode) .vehicle_code2(form.getString("vehicle_code2")) .point_code1(pointCode1) - .point_code2(pointCode2) .point_code3(pointCode3) .point_code4(form.getString("point_code4")) .task_group_id(form.getString("task_group_id")) @@ -179,7 +243,7 @@ public class MxOutTask extends AbstractAcsTask { .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")) + .task_status(form.getString("task_status")) .product_area(StrUtil.isEmpty(form.getString("product_area")) ? "BLK" : form.getString("product_area")) .build(); SchBaseTask task = new SchBaseTask(); diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/auto/AutoMxZxTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/auto/AutoMxZxTask.java new file mode 100644 index 0000000..466c277 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/auto/AutoMxZxTask.java @@ -0,0 +1,121 @@ +package org.nl.b_lms.sch.tasks.boxstack.auto; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import groovyjarjarpicocli.CommandLine; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.nl.b_lms.bst.ivt.boxstack.enums.BoxStackEnum; +import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxstackService; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstack; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.mapper.BstIvtBoxstackMapper; +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.boxstack.MxMoveTask; +import org.nl.common.utils.IdUtil; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + + +/** + * 自动将木箱从缓存区到装箱位 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class AutoMxZxTask { + + @Resource + private IschBaseTaskService taskService; + private final String THIS_CLASS = AutoMxZxTask.class.getName(); + @Resource + private RedissonClient redissonClient; + @Resource + private MxMoveTask mxMoveTask; + @Resource + private IBstIvtBoxstackService boxstackService; + + @Resource + private BstIvtBoxstackMapper boxstackMapper; + + //缓存区->装箱位agv自动搬运任务 + public void run() { + try { + this.sendMxMove(); + } catch (Exception ex) { + log.error(ex.getMessage()); + } + } + + + @SneakyThrows + public void sendMxMove() { + log.info(THIS_CLASS + "-根据装箱计划木箱库移库定时任务开始执行扫描。"); + RLock lock = redissonClient.getLock("boxMove"); + boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); + try { + if (tryLock) { + //查找木箱转运agv任务 + List taskList = taskService.list(new QueryWrapper() + .eq("task_type", BoxStackEnum.TASK_TYPE.code("木箱缓存区到对接位")) + .eq("task_status",TaskStatusEnum.SURE_END.getCode()) + .orderByDesc("create_time","sort_seq")); + if (CollectionUtil.isEmpty(taskList)){ + return; + } + //确定终点,有位置生成agv任务 ,无位置生成移库任务 + List bstIvtBoxstacks = boxstackMapper.selectAndNoTask( BoxStackEnum.POINT_STATUS.code("对接区")); + if (CollectionUtil.isEmpty(bstIvtBoxstacks)){ + //获取对接区没有任务的对接位 + BstIvtBoxstack bstIvtBoxstack = new BstIvtBoxstack(); + bstIvtBoxstack.setPoint_status(BoxStackEnum.POINT_STATUS.code("对接区")); + List bstIvtBoxstackDJList = boxstackMapper.selectDJAndNoTask(bstIvtBoxstack); + if (CollectionUtil.isEmpty(bstIvtBoxstackDJList)){ + log.error("对接区有行架任务执行,需要等待执行完"); + return; + } + BstIvtBoxstack bstIvtBoxstackMove = bstIvtBoxstackDJList.get(0); + List bstIvtBoxstackHCList = boxstackMapper.selectHCAndNoTask(bstIvtBoxstack); + if (CollUtil.isEmpty(bstIvtBoxstackHCList)){ + log.error("缓存区无可用位置"); + return; + } + //对接位到缓存位 + MxMoveTask mxMoveDJtoHCTask = new MxMoveTask(); + JSONObject taskParam = new JSONObject(); + taskParam.put("task_type", BoxStackEnum.TASK_TYPE.code("木箱对接位到缓存区")); + taskParam.put("start_device_code", bstIvtBoxstackMove.getStack_code()); + taskParam.put("next_device_code", bstIvtBoxstackHCList.get(0).getStack_code()); + taskParam.put("material_code",bstIvtBoxstackMove.getBox_spec()); + taskParam.put("task_status", TaskStatusEnum.SURE_END.getCode()); + taskParam.put("is_send", "1"); + mxMoveDJtoHCTask.createTask(taskParam); + } else { + //下发缓存位到对接位agv任务 + SchBaseTask schBaseTask = taskList.get(0); + schBaseTask.setTask_status(TaskStatusEnum.START_AND_POINT.getCode()); + schBaseTask.setPoint_code2(bstIvtBoxstacks.get(0).getStack_code()); + taskService.updateById(schBaseTask); + } + } else { + log.info("木箱移库自动搬运任务正在创建被锁住。"); + } + } finally { + if (lock.isLocked() && lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + + } +} 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 829573d..97f4e67 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 @@ -65,7 +65,7 @@ public class AutoSendMzToDjq { } JSONObject task = new JSONObject(); //满轴有子卷且过滤未完成任务 - List mzqPackageinfoivtList = packageinfoivtService.selectEmpPoints(PackageInfoIvtEnum.POINT_STATUS.code("子卷缓存位"), PackageInfoIvtEnum.IVT_STATUS.code("有子卷")); + List mzqPackageinfoivtList = packageinfoivtService.selectEmpPoints(PackageInfoIvtEnum.POINT_STATUS.code("满轴缓存位"), PackageInfoIvtEnum.IVT_STATUS.code("有子卷")); if (ObjectUtils.isEmpty(mzqPackageinfoivtList)) { return; } 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 f27cb7d..a213b48 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 @@ -78,8 +78,8 @@ public class AutoSendToZxq extends Prun{ task.put("vehicle_code2", PackageInfoIvtEnum.AGV_ACTION_TYPE.code("普通任务")); task.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("待检区->装箱区")); task.put("vehicle_code", selectEmpPoints.get(0).getContainer_name()); - task.put("point_code1", zxqPackageinfoivtList.get(0).getPoint_code()); - task.put("point_code2", selectEmpPoints.get(0).getPoint_code()); + task.put("point_code1", selectEmpPoints.get(0).getPoint_code()); + task.put("point_code2", zxqPackageinfoivtList.get(0).getPoint_code()); zxqTask.createTask(task); } else { 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 index 57f19f3..b02e5b4 100644 --- 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 @@ -51,7 +51,7 @@ public class AutoSendVehicleToKzj extends Prun{ @SneakyThrows public void toKzjHcw() { - log.info(THIS_CLASS + "-待检区->子卷缓存位补空任务开始执行扫描。"); + log.info(THIS_CLASS + "-待检区->满轴缓存位补空任务开始执行扫描。"); RLock lock = redissonClient.getLock(THIS_CLASS); boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); try { @@ -63,8 +63,8 @@ public class AutoSendVehicleToKzj extends Prun{ if (ObjectUtils.isEmpty(djqPackageinfoivtList)) { return; } - //子卷缓存位为空位且过滤未完成任务 - List selectEmpPoints = packageinfoivtService.selectEmpPoints(PackageInfoIvtEnum.POINT_STATUS.code("子卷缓存位"), PackageInfoIvtEnum.IVT_STATUS.code("空")); + //满轴缓存位为空位且过滤未完成任务 + List selectEmpPoints = packageinfoivtService.selectEmpPoints(PackageInfoIvtEnum.POINT_STATUS.code("满轴缓存位"), PackageInfoIvtEnum.IVT_STATUS.code("空")); if (ObjectUtils.isEmpty(selectEmpPoints)) { return; } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/enums/IOSEnum.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/enums/IOSEnum.java index 65aeb2d..86d891a 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/enums/IOSEnum.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/enums/IOSEnum.java @@ -110,13 +110,13 @@ public enum IOSEnum { "6","B_FH06_0")), // 行架点位 - OUT_HANGER(MapOf.of("行架位1", "CK2013","行架位2", "CK2017")), + OUT_HANGER(MapOf.of("行架位1", "CK2013","行架位2", "CK2017","木箱出库位", "CK2017")), // 点位 - POINT_CODE(MapOf.of("退货入库位", "THRKDJW1", "2020","CK2020", "2022","CK2022")), + POINT_CODE(MapOf.of("退货入库位", "THRKDJW1", "2020","CK2020", "2022","CK2022","木箱扫码位","CK2024")), //acs申请任务 - ACSTOLMS_TYPE(MapOf.of("成品入库任务", "1","空盘入库","2","空盘出库","3","异常处理位","4","木箱入库","5","退货入库","6","贴标","1","捆扎","2")), + ACSTOLMS_TYPE(MapOf.of("成品入库任务", "1","空盘入库","2","空盘出库","3","异常处理位","4","木箱入库","5","退货入库","6","贴标","1","捆扎","2","子卷装箱","7")), // acs外部系统用户 EXT_ACS(MapOf.of("acs", "2","kc","康成")), @@ -127,13 +127,15 @@ public enum IOSEnum { CHANGE_OUT(MapOf.of("换标出库口", "CK1020")), // 下发acs任务类型(明细) - ACS_TYPE(MapOf.of("木箱入库行架任务", "12","装箱入库行架任务", "13", + ACS_TYPE(MapOf.of("子卷装箱行架任务", "12","装箱入库行架任务", "13", "子卷下线行架任务", "16","退货入库行架任务", "14","RGV输送任务", "15", "木箱堆叠行架任务", "17" )), //特殊出入库点位 - SPECIAL_POINTS(MapOf.of("异常出库口", "CKYC","退货入库口","CKTH")), + SPECIAL_POINTS(MapOf.of("异常出库口", "CKYC","退货入库口","CKTH","退货行架对接位","THHJDJ")), + + // acs反馈异常出库 ACS_EXCEPTIONAL_TYPE(MapOf.of("入库满入", "1","浅货位有货(入库)", "4", diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvOutServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvOutServiceImpl.java index 57bab4b..298e2c4 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvOutServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvOutServiceImpl.java @@ -1008,14 +1008,13 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl '" + TaskStatusEnum.FINISHED.getCode() + "' and task_id = '" + whereJson.getString("task_id") + "'") - .uniqueResult(0); + SchBaseTask schBaseTask = schBaseTaskMapper.selectOne(new QueryWrapper().eq("task_id", whereJson.getString("task_id")).eq("task_status", TaskStatusEnum.FINISHED.getCode())); + - if (jsonTask == null) { + if (schBaseTask == null) { throw new BadRequestException("查询不到操作的任务记录!" + whereJson.getString("task_id")); } @@ -1068,9 +1067,9 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl map = new HashMap<>(); map.put("need_delete", IOSEnum.IS_NOTANDYES.code("是")); - WQLObject.getWQLObject("pdm_bi_subpackagerelation").update(map, "package_box_sn = '" + jsonTask.getString("vehicle_code") + "'"); + WQLObject.getWQLObject("pdm_bi_subpackagerelation").update(map, "package_box_sn = '" + schBaseTask.getVehicle_code() + "'"); - JSONArray rows = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("package_box_sn = '" + jsonTask.getString("vehicle_code") + "'").getResultJSONArray(0); + JSONArray rows = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("package_box_sn = '" + schBaseTask.getVehicle_code() + "'").getResultJSONArray(0); for (int i = 0; i < rows.size(); i++) { JSONObject row = rows.getJSONObject(i); //插入包装关系出入库记录表 @@ -1085,13 +1084,14 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl map = new HashMap<>(); - map.put("task_status", TaskStatusEnum.FINISHED.getCode()); - map.put("update_optid", SecurityUtils.getCurrentUserId()); - map.put("update_optname", SecurityUtils.getCurrentNickName()); - map.put("update_time", DateUtil.now()); - - wo_Task.update(map, "task_id='" + whereJson.getString("task_id") + "'"); + SchBaseTask schBaseTaskUpdate = new SchBaseTask(); + schBaseTaskUpdate.setTask_status(TaskStatusEnum.FINISHED.getCode()); + schBaseTaskUpdate.setTask_id(whereJson.getString("task_id")); + schBaseTaskUpdate.setUpdate_optid(SecurityUtils.getCurrentUserId()); + schBaseTaskUpdate.setUpdate_optname(SecurityUtils.getCurrentNickName()); + schBaseTaskUpdate.setUpdate_time(DateUtil.now()); + + schBaseTaskMapper.updateById(schBaseTaskUpdate); // 查询此任务下所有的分配明细 disDaoList.forEach(row -> { diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvServiceImpl.java index f101f73..4d29bab 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvServiceImpl.java @@ -1,5 +1,6 @@ package org.nl.b_lms.storage_manage.ios.service.iostorInv.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjectUtil; @@ -16,6 +17,9 @@ import com.github.pagehelper.PageHelper; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.nl.b_lms.pdm.storagevehicleext.dao.MdPbStoragevehicleext; +import org.nl.b_lms.pdm.storagevehicleext.dao.mapper.MdPbStoragevehicleextMapper; +import org.nl.b_lms.pdm.storagevehicleext.service.IMdPbStoragevehicleextService; import org.nl.b_lms.pdm.subpackagerelation.dao.PdmBiSubpackagerelation; import org.nl.b_lms.pdm.subpackagerelation.dao.mapper.PdmBiSubpackagerelationMapper; import org.nl.b_lms.pdm.subpackagerelation.service.IpdmBiSubpackagerelationService; @@ -157,6 +161,9 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl page = PageHelper.startPage(pageQuery.getPageNumber() + 1, pageQuery.getPageSize()); @@ -558,8 +565,7 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl list = (ArrayList) whereJson.get("tableMater"); @@ -580,19 +586,22 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl mdPbStoragevehicleexts = mdPbStoragevehicleextMapper.selectList(new QueryWrapper() + .eq("pcsn", jsonDis.get("storagevehicle_code")) + .orderByDesc("UPDATE_TIME")); + if (CollUtil.isEmpty(mdPbStoragevehicleexts)){ throw new BadRequestException("此木箱没有绑定托盘号!"+whereJson.get("vehicle_code")); } - JSONObject jsonVeExt = storagevehicleCodes.getJSONObject(0); + MdPbStoragevehicleext mdPbStoragevehicleext = mdPbStoragevehicleexts.get(0); // 创建任务 JSONObject jsonTaskParam = new JSONObject(); jsonTaskParam.put("task_type", "010703"); jsonTaskParam.put("start_device_code", pointDto.getPoint_code()); jsonTaskParam.put("next_device_code", jsonDis.getString("struct_code")); jsonTaskParam.put("vehicle_code", jsonDis.get("storagevehicle_code")); - jsonTaskParam.put("vehicle_code2", jsonVeExt.getString("storagevehicle_code")); + jsonTaskParam.put("vehicle_code2", mdPbStoragevehicleext.getStoragevehicle_code()); jsonTaskParam.put("inv_type", mstDao.getBill_type()); jsonTaskParam.put("inv_id", mstDao.getIostorinv_id()); jsonTaskParam.put("inv_code", mstDao.getBill_code()); diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/LashManageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/LashManageServiceImpl.java index 8366d8b..0803079 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/LashManageServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/LashManageServiceImpl.java @@ -1,16 +1,19 @@ package org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.RequiredArgsConstructor; import org.nl.b_lms.sch.point.dao.SchBasePoint; import org.nl.b_lms.sch.point.dao.mapper.SchBasePointMapper; import org.nl.b_lms.sch.task.dao.SchBaseTask; +import org.nl.b_lms.sch.task.dao.mapper.SchBaseTaskMapper; import org.nl.b_lms.sch.task.service.IschBaseTaskService; import org.nl.b_lms.sch.tasks.TwoLashTask; import org.nl.b_lms.sch.tasks.TwoOutHeapTask; @@ -24,6 +27,8 @@ import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; import org.nl.b_lms.storage_manage.ios.enums.TASKEnum; import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.mapper.StIvtIostorinvOutMapper; import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.LashManageService; +import org.nl.b_lms.storage_manage.md.dao.MdPdStoragevehicleext; +import org.nl.b_lms.storage_manage.md.dao.mapper.MdPdStoragevehicleextMapper; import org.nl.common.utils.IdUtil; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.core.bean.WQLObject; @@ -40,6 +45,7 @@ import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; /** *

@@ -63,6 +69,11 @@ public class LashManageServiceImpl implements LashManageService { */ private final SchBasePointMapper schBasePointMapper; + /** + * 存储车辆扩展信息 + */ + private final MdPdStoragevehicleextMapper mdPdStoragevehicleextMapper; + /** * 木箱捆扎绑定服务 */ @@ -92,6 +103,7 @@ public class LashManageServiceImpl implements LashManageService { * 任务服务 */ private final ISysParamService iSysParamService; + private final SchBaseTaskMapper schBaseTaskMapper; @Override @Transactional @@ -256,19 +268,26 @@ public class LashManageServiceImpl implements LashManageService { @Override public void createHeapTask(JSONObject whereJson) { - // 载具扩展属性表 - WQLObject extTab = WQLObject.getWQLObject("md_pb_storagevehicleext"); - // 点位表 - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); +// // 载具扩展属性表 +// WQLObject extTab = WQLObject.getWQLObject("md_pb_storagevehicleext"); +// // 点位表 +// WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 比较两行架点位的任务个数 - List executeArr = WQLObject.getWQLObject("SCH_BASE_Task") - .query("handle_class = '" + TwoOutHeapTask.class.getName() + "' and task_status IN ('04','05','06') and is_delete = '0' ") - .getResultJSONArray(0).toJavaList(JSONObject.class); +// List executeArr = WQLObject.getWQLObject("SCH_BASE_Task") +// .query("handle_class = '" + TwoOutHeapTask.class.getName() + "' and task_status IN ('04','05','06') and is_delete = '0' ") +// .getResultJSONArray(0).toJavaList(JSONObject.class); + + + List status = Stream.of("04","05","06") + .collect(Collectors.toList()); + List taskList = schBaseTaskMapper.selectList(new LambdaQueryWrapper().eq(SchBaseTask::getHandle_class, TwoOutHeapTask.class.getName()) + .in(SchBaseTask::getTask_status, status).eq(SchBaseTask::getIs_delete, "0")); + // 根据终点点位进行分组 - Map> groupPointMap = executeArr.stream() - .collect(Collectors.groupingBy(row -> row.getString("point_code2"))); + Map> groupPointMap = taskList.stream() + .collect(Collectors.groupingBy(SchBaseTask::getPoint_code2)); // 终点: 如果是异常口则直接生成到异常口的任务 String next_device_code = IOSEnum.OUT_HANGER.code("行架位1"); @@ -279,30 +298,37 @@ public class LashManageServiceImpl implements LashManageService { next_device_code = IOSEnum.CHANGE_OUT.code("换标出库口"); } else { // 判断是否是启用状态 - List jsonList = pointTab.query("region_code = 'BLKCK' AND is_used = '1'") - .getResultJSONArray(0).toJavaList(JSONObject.class); +// List jsonList = pointTab.query("region_code = 'BLKCK' AND is_used = '1'") +// .getResultJSONArray(0).toJavaList(JSONObject.class); + + List schBasePoints = schBasePointMapper.selectList(new LambdaQueryWrapper().eq(SchBasePoint::getRegion_code, "BLKCK").eq(SchBasePoint::getIs_used, "1")); - if (ObjectUtil.isEmpty(jsonList)) { + + if (CollUtil.isEmpty(schBasePoints)) { throw new BadRequestException("请检查CK2012/CK2017是否启用!"); } - if (jsonList.size() == 2) { - List heapOne = Optional.ofNullable(groupPointMap.get(IOSEnum.OUT_HANGER.code("行架位1"))).orElse(new ArrayList<>()); - List heapTwo = Optional.ofNullable(groupPointMap.get(IOSEnum.OUT_HANGER.code("行架位2"))).orElse(new ArrayList<>()); + if (schBasePoints.size() == 2) { + List heapOne = Optional.ofNullable(groupPointMap.get(IOSEnum.OUT_HANGER.code("行架位1"))).orElse(new ArrayList<>()); + List heapTwo = Optional.ofNullable(groupPointMap.get(IOSEnum.OUT_HANGER.code("行架位2"))).orElse(new ArrayList<>()); if (heapOne.size() > heapTwo.size()) { next_device_code = IOSEnum.OUT_HANGER.code("行架位2"); } } else { - next_device_code = jsonList.get(0).getString("point_code"); + next_device_code = schBasePoints.get(0).getPoint_code(); } } // 查询木箱对应的载具 - JSONObject jsonVeExt = extTab.query("pcsn = '" + whereJson.getString("vehicle_code") + "'") - .uniqueResult(0); - if (ObjectUtil.isEmpty(jsonVeExt)) { +// JSONObject jsonVeExt = extTab.query("pcsn = '" + whereJson.getString("vehicle_code") + "'") +// .uniqueResult(0); + + MdPdStoragevehicleext mdPdStoragevehicleext = mdPdStoragevehicleextMapper.selectOne(new LambdaQueryWrapper().eq(MdPdStoragevehicleext::getPcsn, whereJson.getString("vehicle_code"))); + + + if (ObjectUtil.isEmpty(mdPdStoragevehicleext)) { throw new BadRequestException("此木箱没有绑定托盘号!" + whereJson.getString("vehicle_code")); } @@ -314,7 +340,7 @@ public class LashManageServiceImpl implements LashManageService { jsonTaskParam.put("task_group_id", whereJson.getString("task_group_id")); jsonTaskParam.put("point_code2", next_device_code); jsonTaskParam.put("vehicle_code", whereJson.getString("vehicle_code")); - jsonTaskParam.put("vehicle_code2", jsonVeExt.getString("storagevehicle_code")); + jsonTaskParam.put("vehicle_code2",mdPdStoragevehicleext.getStoragevehicle_code()); jsonTaskParam.put("request_param", whereJson); TwoOutHeapTask bean = SpringContextHolder.getBean(TwoOutHeapTask.class); bean.createTask(jsonTaskParam); 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 ff6fad0..5776a6e 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 @@ -18,7 +18,7 @@ import java.util.Map; @Getter public enum PackageInfoIvtEnum { //点位类型 - POINT_STATUS(MapOf.of("子卷缓存位", "1", "空载具缓存位", "2", "待检区", "3", "管制区", "4", "装箱位", "5", "装箱区", "6","等待点", "7")), + POINT_STATUS(MapOf.of("满轴缓存位", "1", "空载具缓存位", "2", "待检区", "3", "管制区", "4", "装箱位", "5", "装箱区", "6","等待点", "7")), //深浅位类型 DEPTH_TYPE(MapOf.of("浅货位", "0", "深货位", "1")), 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 5e7953d..749936e 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 @@ -26,12 +26,15 @@ import org.nl.b_lms.pdm.bi.slittingproductionplan.service.dao.PdmBiSlittingprodu import org.nl.b_lms.pdm.info.dao.PdmBiContainerinbound; import org.nl.b_lms.pdm.info.service.IPdmBiContainerinboundService; import org.nl.b_lms.pdm.productSpec.service.impl.PdmProductSpecServiceImpl; +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.service.IbstIvtPackageinfoivtService; 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.TwoBoxExcepTask; import org.nl.b_lms.sch.tasks.TwoExceptionInTask; +import org.nl.b_lms.sch.tasks.boxstack.BoxSSXTask; import org.nl.b_lms.sch.tasks.boxstack.MxInTask; import org.nl.b_lms.sch.tasks.boxstack.MxMoveTask; import org.nl.b_lms.sch.tasks.slitter.service.SlitterService; @@ -42,11 +45,14 @@ import org.nl.b_lms.storage_manage.database.service.dao.MdpbBoxtype; import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; import org.nl.b_lms.storage_manage.ios.enums.TASKEnum; import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvOutService; +import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl.LashManageServiceImpl; import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.*; import org.nl.b_lms.storage_manage.md.dao.MdPdStorageVehicleInfo; import org.nl.b_lms.storage_manage.md.dao.MdPdStoragevehicleext; import org.nl.b_lms.storage_manage.md.dao.mapper.MdPdStoragevehicleextMapper; import org.nl.b_lms.storage_manage.md.dao.mapper.MdStorageVehicleInfoMapper; +import org.nl.b_lms.storage_manage.st.dao.StIvtStructattr; +import org.nl.b_lms.storage_manage.st.dao.mapper.StIvtStructattrMapper; import org.nl.common.enums.NoticeTypeEnum; import org.nl.common.enums.PackageInfoIvtEnum; import org.nl.common.enums.SpecEnum; @@ -179,6 +185,10 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { @Autowired private MdPdStoragevehicleextMapper mdPdStoragevehicleextMapper; + @Autowired + private PdmBiSubpackagerelationMapper pdmBiSubpackagerelationMapper; + @Autowired + private StIvtStructattrMapper stIvtStructattrMapper; @Autowired private MxInTask mxInTask; @@ -1273,9 +1283,9 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { } else { String pcsn = mdPdStoragevehicleext.getPcsn(); if (StringUtils.isNotEmpty(pcsn)) { - JSONArray stIvtStructattr = WQLObject.getWQLObject("st_ivt_structattr").query("storagevehicle_code = '" + pcsn + "'").getResultJSONArray(0); - if (stIvtStructattr != null && stIvtStructattr.size() > 0) { + List storagevehicleCode = stIvtStructattrMapper.selectList(new QueryWrapper().eq("storagevehicle_code", pcsn)); + if (storagevehicleCode != null && storagevehicleCode.size() > 0) { errorMsg.add("载具" + whereJson.getString("vehicle_code") + "已绑定" + pcsn); } } @@ -1321,11 +1331,9 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { throw new BadRequestException("托盘号有误,无法找到对应的托盘类型!"); } // 更新子卷包装关系为生成 - JSONObject param = new JSONObject(); - param.put("status", IOSEnum.IS_NOTANDYES.code("否")); - WQLObject.getWQLObject("pdm_bi_subpackagerelation") - .update(param, "package_box_sn = '" + jsonObject.getString("box_no") + "'"); - + PdmBiSubpackagerelation pdmBiSubpackagerelation = new PdmBiSubpackagerelation(); + pdmBiSubpackagerelation.setStatus(IOSEnum.IS_NOTANDYES.code("否")); + pdmBiSubpackagerelationMapper.update(pdmBiSubpackagerelation, new QueryWrapper().eq("package_box_sn", jsonObject.getString("box_no"))); jsonTaskParam.put("request_param", request_param); TwoExceptionInTask bean = SpringContextHolder.getBean(TwoExceptionInTask.class); bean.createTask(jsonTaskParam); @@ -1426,6 +1434,23 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { whereJson.put("material_barcode", material_barcode); inBussManageService.inTask(whereJson); + } else if (type.equals(IOSEnum.ACSTOLMS_TYPE.code("子卷装箱"))) { + //校验 + List pdmBiSubpackagerelations = pdmBiSubpackagerelationMapper.selectList(new QueryWrapper().eq("package_box_sn", whereJson.getString("box_no")).eq("status", "0")); + if (ObjectUtil.isEmpty(pdmBiSubpackagerelations)){ + throw new BadRequestException("未查询到子卷包装信息!"); + } + MdPdStorageVehicleInfo mdPdStorageVehicleInfo = mdStorageVehicleInfoMapper.selectOne(new QueryWrapper().eq("storagevehicle_code", whereJson.getString("vehicle_code"))); + if (ObjectUtil.isEmpty(mdPdStorageVehicleInfo)) { + throw new BadRequestException("载具不存在!"); + } + BoxSSXTask boxSSXTask = new BoxSSXTask(); + JSONObject jsonParam = new JSONObject(); + jsonParam.put("start_device_code",IOSEnum.OUT_HANGER.code("木箱出库位")); + jsonParam.put("next_device_code",IOSEnum.POINT_CODE.code("木箱扫码位")); + jsonParam.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + boxSSXTask.createTask(jsonParam); + } result.put("status", HttpStatus.OK.value()); result.put("message", "下发成功!"); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java index b120125..247987a 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java @@ -22,6 +22,7 @@ import java.util.List; public abstract class AbstractAcsTask { @Autowired AcsUtil acsUtil; + /** * @discription 在如果任务无法形成会一直定时刷新判断 * @author ldjun @@ -113,19 +114,18 @@ public abstract class AbstractAcsTask { public JSONObject immediateNotifyAcs(String task_id) { try { Thread.sleep(1000); - }catch (Exception ex){ + } catch (Exception ex) { } - - List taskList = this.schedule(); - if (ObjectUtil.isNotEmpty(taskList)) { - JSONArray arr = JSONArray.parseArray(JSON.toJSONString(taskList)); - if (acsUtil == null){ - return AcsUtil.notifyAcs("api/wms/task", arr); - }else { - return acsUtil.notifyAcs3("api/wms/task", arr); - } - } + List taskList = this.schedule(); + if (ObjectUtil.isNotEmpty(taskList)) { + JSONArray arr = JSONArray.parseArray(JSON.toJSONString(taskList)); + if (acsUtil == null) { + return AcsUtil.notifyAcs("api/wms/task", arr); + } else { + return acsUtil.notifyAcs3("api/wms/task", arr); + } + } return null; } diff --git a/lms/nladmin-system/src/main/resources/config/application-dev.yml b/lms/nladmin-system/src/main/resources/config/application-dev.yml index ca5e617..c2a472b 100644 --- a/lms/nladmin-system/src/main/resources/config/application-dev.yml +++ b/lms/nladmin-system/src/main/resources/config/application-dev.yml @@ -187,6 +187,8 @@ logging: file: path: C:\log\wms config: classpath:logback-spring.xml + level: + org.springframework: DEBUG # Sa-Token配置 sa-token: @@ -233,3 +235,4 @@ management: system: false jvm: false logback: false + diff --git a/lms/nladmin-system/src/main/resources/config/application.yml b/lms/nladmin-system/src/main/resources/config/application.yml index 559ee0e..3b2d3e2 100644 --- a/lms/nladmin-system/src/main/resources/config/application.yml +++ b/lms/nladmin-system/src/main/resources/config/application.yml @@ -6,7 +6,7 @@ spring: freemarker: check-template-location: false profiles: - active: localDev + active: dev jackson: time-zone: GMT+8 data: diff --git a/lms/nladmin-ui/src/views/b_lms/bst/ivt/paper/index.vue b/lms/nladmin-ui/src/views/b_lms/bst/ivt/paper/index.vue index 9cc51e9..7e56e17 100644 --- a/lms/nladmin-ui/src/views/b_lms/bst/ivt/paper/index.vue +++ b/lms/nladmin-ui/src/views/b_lms/bst/ivt/paper/index.vue @@ -23,7 +23,7 @@ - + - + @@ -78,7 +78,7 @@ - + diff --git a/lms/nladmin-ui/src/views/wms/pdm/order/rawfoilworkorder/index.vue b/lms/nladmin-ui/src/views/wms/pdm/order/rawfoilworkorder/index.vue index aca3c09..fb85f0b 100644 --- a/lms/nladmin-ui/src/views/wms/pdm/order/rawfoilworkorder/index.vue +++ b/lms/nladmin-ui/src/views/wms/pdm/order/rawfoilworkorder/index.vue @@ -265,7 +265,7 @@ - + diff --git a/lms/nladmin-ui/src/views/wms/pdm/order/slittingplan/index.vue b/lms/nladmin-ui/src/views/wms/pdm/order/slittingplan/index.vue index 728a082..c09d14f 100644 --- a/lms/nladmin-ui/src/views/wms/pdm/order/slittingplan/index.vue +++ b/lms/nladmin-ui/src/views/wms/pdm/order/slittingplan/index.vue @@ -357,10 +357,10 @@ - - - - + + + + diff --git a/lms/nladmin-ui/src/views/wms/st/inStor/check/AddDialog.vue b/lms/nladmin-ui/src/views/wms/st/inStor/check/AddDialog.vue index ee1c8aa..5398a34 100644 --- a/lms/nladmin-ui/src/views/wms/st/inStor/check/AddDialog.vue +++ b/lms/nladmin-ui/src/views/wms/st/inStor/check/AddDialog.vue @@ -93,59 +93,59 @@ 添加盘点物料 已盘点 未盘点 导出 补录信息 @@ -170,11 +170,11 @@ {{ scope.row.storagevehicle_code }} - + - - + + diff --git a/lms/nladmin-ui/src/views/wms/st/inStor/check/CheckDialog.vue b/lms/nladmin-ui/src/views/wms/st/inStor/check/CheckDialog.vue index 9b6d9f3..14b2b96 100644 --- a/lms/nladmin-ui/src/views/wms/st/inStor/check/CheckDialog.vue +++ b/lms/nladmin-ui/src/views/wms/st/inStor/check/CheckDialog.vue @@ -123,7 +123,7 @@ 确认 - + diff --git a/lms/nladmin-ui/src/views/wms/st/inStor/check/RepairDialog.vue b/lms/nladmin-ui/src/views/wms/st/inStor/check/RepairDialog.vue index 2c90ecf..50e86ac 100644 --- a/lms/nladmin-ui/src/views/wms/st/inStor/check/RepairDialog.vue +++ b/lms/nladmin-ui/src/views/wms/st/inStor/check/RepairDialog.vue @@ -19,7 +19,7 @@ - + @@ -52,6 +52,12 @@ export default { default: null } }, + data() { + return { + dialogVisible: false, + form1: {} + } + }, watch: { dialogShow: { handler(newValue, oldValue) { @@ -59,12 +65,6 @@ export default { } } }, - data() { - return { - dialogVisible: false, - form1: {} - } - }, methods: { handleClose(done) { this.$confirm('确认关闭?')