From 48506ecb4ac5ae00180c201deef3dd7f7d9d6358 Mon Sep 17 00:00:00 2001 From: zhangzq Date: Tue, 19 Aug 2025 14:48:44 +0800 Subject: [PATCH] =?UTF-8?q?add:=E5=A2=9E=E5=8A=A0=E5=87=BA=E5=BA=93?= =?UTF-8?q?=E5=88=86=E9=85=8D=E6=94=AF=E6=8C=81=E5=90=8C=E5=8D=95=E5=88=86?= =?UTF-8?q?=E9=85=8D=E5=88=B0=E5=90=8C=E4=B8=80=E4=B8=AA=E6=89=98=E7=9B=98?= =?UTF-8?q?=E9=80=BB=E8=BE=91=20fix:=E5=87=BA=E5=BA=93=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E5=8F=98=E5=8A=A8=E6=97=B6=E5=A6=82=E6=9E=9C=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E6=95=B00=E5=88=99=E5=8F=98=E6=88=90=E5=87=BA=E5=BA=93?= =?UTF-8?q?=E7=8A=B6=E6=80=81=EF=BC=8C=E4=B8=8D=E4=B8=BA0=E7=9A=84?= =?UTF-8?q?=E4=B8=BA=E7=BB=84=E7=9B=98=E7=8A=B6=E6=80=81=E7=AD=89=E5=BE=85?= =?UTF-8?q?=E5=90=8E=E7=BB=AD=E8=B5=B0=E5=9B=9E=E5=BA=93=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/IStructattrService.java | 2 + .../service/dao/mapper/StructattrMapper.xml | 3 + .../service/dto/StrategyStructParam.java | 4 + .../service/impl/StructattrServiceImpl.java | 6 +- .../service/impl/BigScreenServiceImpl.java | 24 +++--- .../decisioner/impl/diy/FIFO2RuleHandler.java | 76 +++++++++++++++++++ .../impl/diy/SameBlockNumRuleHandler.java | 2 +- .../service/impl/OutBillServiceImpl.java | 70 ++++++++--------- .../src/views/wms/st/outbill/DivDialog.vue | 8 +- nladmin-ui/src/views/wms/st/outbill/index.vue | 6 +- 10 files changed, 146 insertions(+), 55 deletions(-) create mode 100644 nladmin-system/nlsso-server/src/main/java/org/nl/wms/decision_manage/service/strategyConfig/decisioner/impl/diy/FIFO2RuleHandler.java diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/IStructattrService.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/IStructattrService.java index a019e9c..b2ee031 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/IStructattrService.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/IStructattrService.java @@ -113,6 +113,8 @@ public interface IStructattrService extends IService { /** * 生成库存变动记录表,更新载具冻结数量 + * 如果是拣选出库,则库存数为0的变成出库状态 + * 拣选的,扣减冻结数之后变成组盘状态,如果需要回库则通过余料回库回去 * @param changeDto */ void changeStruct(StructattrChangeDto changeDto); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/StructattrMapper.xml b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/StructattrMapper.xml index 3028084..6bd6d15 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/StructattrMapper.xml +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/StructattrMapper.xml @@ -51,6 +51,9 @@ and ivt.lock_type = '0' and gro.frozen_qty = 0 + + and gro.frozen_qty = 0 and ( ivt.lock_type = '0' or ivt.inv_code = #{inv_code}) + order by ${order_by} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dto/StrategyStructParam.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dto/StrategyStructParam.java index 9009f95..764c6da 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dto/StrategyStructParam.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dto/StrategyStructParam.java @@ -24,6 +24,10 @@ public class StrategyStructParam { * 同步单号 */ private String ext_code; + /** + * 分配的单号 + */ + private String inv_code; /** * 来源单据类型 */ diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/StructattrServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/StructattrServiceImpl.java index 3821107..55349b1 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/StructattrServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/StructattrServiceImpl.java @@ -313,6 +313,7 @@ public class StructattrServiceImpl extends ServiceImpl outBoundSectDiv(StrategyStructParam param) { @@ -403,8 +404,11 @@ public class StructattrServiceImpl extends ServiceImpl { + + /** + * 出入库明细服务 + */ + @Autowired + private IStructattrService iStructattrService; + + @Override + public List handler(List list, StrategyStructParam param) { + //分配数量 + //当前条件只有id,批次 + log.info("---------执行fifo出库分配规则相同单据允许分配在同一个货位---------"); + List maters = param.getStrategyMaters(); + StrategyMater strategyMater = maters.get(0); + BigDecimal planQty = strategyMater.getQty(); + List vechielDtos = + iStructattrService.collectVechicle(MapOf.of("material_id", strategyMater.getMaterial_id() + , "pcsn", strategyMater.getPcsn() + , "inv_code", param.getInv_code() + , "stor_code", param.getStor_code() + , "sect_code", param.getSect_code() + , "plan_qty", planQty + , "order_by", "gro.update_time asc") + ); + if (ObjectUtils.isEmpty(vechielDtos)) { + throw new BadRequestException("当前出库策略:先进先出,库存分配失败,失败原因:库存不足!"); + } + List divStruct = new ArrayList<>(); + for (StructattrVechielDto vechielDto : vechielDtos) { + if (planQty.intValue()<=0){ + break; + } + BigDecimal qty = vechielDto.getQty(); + BigDecimal subQty = planQty.subtract(qty); + if (subQty.doubleValue()>=0){ + vechielDto.setFrozen_qty(vechielDto.getQty()); + }else { + vechielDto.setFrozen_qty(planQty); + } + planQty=subQty; + StrategyStructMaterialVO materialVO = new StrategyStructMaterialVO(); + BeanUtils.copyProperties(vechielDto,materialVO); + divStruct.add(materialVO); + } + return divStruct; + } + +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/decision_manage/service/strategyConfig/decisioner/impl/diy/SameBlockNumRuleHandler.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/decision_manage/service/strategyConfig/decisioner/impl/diy/SameBlockNumRuleHandler.java index 431ada6..293063d 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/decision_manage/service/strategyConfig/decisioner/impl/diy/SameBlockNumRuleHandler.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/decision_manage/service/strategyConfig/decisioner/impl/diy/SameBlockNumRuleHandler.java @@ -17,7 +17,7 @@ import java.util.stream.Collectors; * @Date 2025/2/1 16:18 * 相同巷道,自下而上分配,左右相邻 */ -@Service("sameBlockNum") +//@Service("sameBlockNum") @Slf4j public class SameBlockNumRuleHandler extends Decisioner { diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/OutBillServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/OutBillServiceImpl.java index e6d8fa3..4020479 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/OutBillServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/OutBillServiceImpl.java @@ -563,6 +563,7 @@ public class OutBillServiceImpl extends ServiceImpl i StrategyStructParam.builder() .stor_code(ioStorInv.getStor_code()) .sect_code(sectCode) + .inv_code(ioStorInv.getBill_code()) .strategyMaters(list) .build() ); @@ -921,21 +922,18 @@ public class OutBillServiceImpl extends ServiceImpl i } @Override + @Transactional public void allSetPoint(JSONObject whereJson) { //出库点 - String point_code = whereJson.getString("point_code"); - - if (StrUtil.isBlank(point_code)){ + if (StrUtil.isBlank(whereJson.getString("point_code"))){ throw new BadRequestException("未选择出库点"); } String iostorinv_id = whereJson.getString("iostorinv_id"); - //查询主表信息 IOStorInv ioStorInv = ioStorInvMapper.selectById(iostorinv_id); if (ObjectUtil.isEmpty(ioStorInv)) { throw new BadRequestException("未查到相关出库单"); } - List ioStorInvDisList = ioStorInvDisMapper.selectList(new LambdaQueryWrapper<>(IOStorInvDis.class) .eq(IOStorInvDis::getIostorinv_id,iostorinv_id) .eq(IOStorInvDis::getIs_issued,BaseDataEnum.IS_YES_NOT.code("否")) @@ -944,28 +942,30 @@ public class OutBillServiceImpl extends ServiceImpl i if (ObjectUtil.isEmpty(ioStorInvDisList)){ throw new BadRequestException("当前没有可设置的分配明细"); } - - for (IOStorInvDis ioStorInvDis:ioStorInvDisList){ + //分配明细中同分配到同载具的进行合并 + Map> groupDis = ioStorInvDisList.stream().collect(Collectors.groupingBy(dis -> dis.getStoragevehicle_code())); + for (String storageVehicleCode : groupDis.keySet()) { + List disList = groupDis.get(storageVehicleCode); + IOStorInvDis item = disList.get(0); //创建任务 JSONObject task_form = new JSONObject(); task_form.put("task_type", "STOutTask"); task_form.put("TaskCode",CodeUtil.getNewCode("TASK_CODE")); - task_form.put("PickingLocation", ioStorInvDis.getStruct_code()); - task_form.put("PlacedLocation", point_code); - task_form.put("vehicle_code", ioStorInvDis.getStoragevehicle_code()); - + task_form.put("PickingLocation", item.getStruct_code()); + task_form.put("PlacedLocation", whereJson.getString("point_code")); + task_form.put("vehicle_code", item.getStoragevehicle_code()); StOutTask stOutTask = SpringContextHolder.getBean("STOutTask"); - String task_id = stOutTask.create(task_form); - - //分配明细表更新任务相关数据 - IOStorInvDis dis = new IOStorInvDis(); - dis.setIostorinvdis_id(ioStorInvDis.getIostorinvdis_id()); - dis.setWork_status(IOSEnum.INBILL_DIS_STATUS.code("生成")); - dis.setTask_id(task_id); - dis.setIs_issued(BaseDataEnum.IS_YES_NOT.code("是")); - dis.setPoint_code(point_code); - ioStorInvDisMapper.updateById(dis); + for (IOStorInvDis itemDis : disList) { + //分配明细表更新任务相关数据 + IOStorInvDis dis = new IOStorInvDis(); + dis.setIostorinvdis_id(itemDis.getIostorinvdis_id()); + dis.setWork_status(IOSEnum.INBILL_DIS_STATUS.code("生成")); + dis.setTask_id(task_id); + dis.setIs_issued(BaseDataEnum.IS_YES_NOT.code("是")); + dis.setPoint_code(whereJson.getString("point_code")); + ioStorInvDisMapper.updateById(dis); + } } } @@ -1103,20 +1103,22 @@ public class OutBillServiceImpl extends ServiceImpl i String currentUserId = SecurityUtils.getCurrentUserId(); String nickName = SecurityUtils.getCurrentNickName(); String now = DateUtil.now(); - IOStorInvDis ioStorInvDis = ioStorInvDisMapper.selectOne(new LambdaQueryWrapper<>(IOStorInvDis.class) + List disList = ioStorInvDisMapper.selectList(new LambdaQueryWrapper<>(IOStorInvDis.class) .eq(IOStorInvDis::getTask_id, task.getTask_id()) ); - if (ObjectUtil.isEmpty(ioStorInvDis)) { + if (ObjectUtil.isEmpty(disList)) { throw new BadRequestException("未找到任务对应的分配明细"); } - // 完成当前分配明细 - ioStorInvDisMapper.update(ioStorInvDis,new LambdaUpdateWrapper<>(IOStorInvDis.class) - .set(IOStorInvDis::getWork_status,IOSEnum.INBILL_DIS_STATUS.code("完成")) - .eq(IOStorInvDis::getIostorinvdis_id,ioStorInvDis.getIostorinvdis_id()) - ); + // 完成当前任务对应的所有分配明细 + for (IOStorInvDis ioStorInvDis : disList) { + ioStorInvDisMapper.update(ioStorInvDis,new LambdaUpdateWrapper<>(IOStorInvDis.class) + .set(IOStorInvDis::getWork_status,IOSEnum.INBILL_DIS_STATUS.code("完成")) + .eq(IOStorInvDis::getIostorinvdis_id,ioStorInvDis.getIostorinvdis_id())); + } + IOStorInvDis item = disList.get(0); //解锁库位 JSONObject finish_map = new JSONObject(); - finish_map.put("struct_code",ioStorInvDis.getStruct_code()); + finish_map.put("struct_code", item.getStruct_code()); finish_map.put("storagevehicle_code",null); finish_map.put("inv_type", null); finish_map.put("inv_id", null); @@ -1124,17 +1126,17 @@ public class OutBillServiceImpl extends ServiceImpl i iStructattrService.updateStatusByCode("1",finish_map); //库存变动:根据冻结数更新物料库存 StructattrChangeDto changeDto = StructattrChangeDto.builder() - .inv(ioStorInvDis.getIostorinv_id()) - .storagevehicleCode(ioStorInvDis.getStoragevehicle_code()) - .structCode(ioStorInvDis.getStruct_code()).taskType(task.getConfig_code()).inBound(false).build(); + .inv(item.getIostorinv_id()) + .storagevehicleCode(item.getStoragevehicle_code()) + .structCode(item.getStruct_code()).taskType(task.getConfig_code()).inBound(false).build(); iStructattrService.changeStruct(changeDto); // 查询该明细下是否还有未完成的分配明细 int countDis = ioStorInvDisMapper.selectCount(new LambdaQueryWrapper<>(IOStorInvDis.class) - .eq(IOStorInvDis::getIostorinvdtl_id,ioStorInvDis.getIostorinvdtl_id()) + .eq(IOStorInvDis::getIostorinvdtl_id,item.getIostorinvdtl_id()) .ne(IOStorInvDis::getWork_status,IOSEnum.INBILL_DIS_STATUS.code("完成")) ); // 明细 - IOStorInvDtl ioStorInvDtl = ioStorInvDtlMapper.selectById(ioStorInvDis.getIostorinvdtl_id()); + IOStorInvDtl ioStorInvDtl = ioStorInvDtlMapper.selectById(item.getIostorinvdtl_id()); if (ObjectUtil.isEmpty(ioStorInvDtl)){ throw new BadRequestException("未找到明细"); } diff --git a/nladmin-ui/src/views/wms/st/outbill/DivDialog.vue b/nladmin-ui/src/views/wms/st/outbill/DivDialog.vue index 953040e..52e8406 100644 --- a/nladmin-ui/src/views/wms/st/outbill/DivDialog.vue +++ b/nladmin-ui/src/views/wms/st/outbill/DivDialog.vue @@ -261,7 +261,7 @@ export default { type: Array, default: () => { return [] } }, - storId: { + storCode: { type: String, default: null } @@ -298,7 +298,7 @@ export default { sects: [], pointList: [], rules: { - }, + } } }, watch: { @@ -321,7 +321,7 @@ export default { }, methods: { open() { - crudSectattr.getSect({ 'stor_id': this.storId }).then(res => { + crudSectattr.getSectCode({ 'stor_code': this.storCode }).then(res => { this.sects = res.content }) @@ -344,7 +344,7 @@ export default { }, openStructIvt() { this.currentRow.remark = '' - this.currentRow.stor_id = this.storId + this.currentRow.stor_code = this.storCode this.loadingAlldiv = true checkoutbill.getStructIvt(this.currentRow).then(res => { this.openParam = res diff --git a/nladmin-ui/src/views/wms/st/outbill/index.vue b/nladmin-ui/src/views/wms/st/outbill/index.vue index 9cedadc..8dea97e 100644 --- a/nladmin-ui/src/views/wms/st/outbill/index.vue +++ b/nladmin-ui/src/views/wms/st/outbill/index.vue @@ -203,7 +203,7 @@ - + @@ -262,7 +262,7 @@ export default { checkrows: [], storlist: [], billtypelist: [], - storId: null + storCode: null } }, mounted: function() { @@ -382,7 +382,7 @@ export default { divOpen() { checkoutbill.getOutBillDtl({ 'iostorinv_id': this.currentRow.iostorinv_id }).then(res => { this.openParam = res - this.storId = this.currentRow.stor_id + this.storCode = this.currentRow.stor_code this.divShow = true this.mstrow = this.currentRow })