From 104e79afe6edb08ce1b57b6577b7e5354d7c3c5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E8=96=AA=E5=90=8D?= <942005050@qq.com> Date: Wed, 29 Nov 2023 19:00:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ProductionreturnRequestMainController.java | 41 +++++++++++++++---- .../vo/ProductionreturnRequestImportVO.java | 4 ++ .../DeliverRequestMainServiceImpl.java | 2 +- .../IssueRequestMainServiceImpl.java | 19 +++++---- .../ProductionreturnRequestMainService.java | 2 +- ...roductionreturnRequestMainServiceImpl.java | 16 ++++---- .../RepleinshRequestMainServiceImpl.java | 2 +- .../com/win/module/wms/util/JobUtils.java | 16 +++++++- 8 files changed, 74 insertions(+), 28 deletions(-) diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/productionreturnRequest/ProductionreturnRequestMainController.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/productionreturnRequest/ProductionreturnRequestMainController.java index faac4b1d..f5e3f243 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/productionreturnRequest/ProductionreturnRequestMainController.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/productionreturnRequest/ProductionreturnRequestMainController.java @@ -158,16 +158,16 @@ public class ProductionreturnRequestMainController { // 手动创建导出 demo List list = new ArrayList<>(); Map mapDropDown = new HashMap<>(); + String[] uom = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.UOM); + mapDropDown.put(7, uom); String[] inventoryStatus = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.INVENTORY_STATUS); mapDropDown.put(8, inventoryStatus); - String[] uom = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.UOM); - mapDropDown.put(10, uom); // 输出 - ExcelUtils.write(response, "生产退料信息导入模板.xlsx", "生产退料申请信息列表", ProductionreturnRequestImportVO.class, list, mapDropDown); + ExcelUtils.write(response, "生产退料导入模板.xlsx", "生产退料申请列表", ProductionreturnRequestImportVO.class, list, mapDropDown); } @PostMapping("/import") - @Operation(summary = "导入生产退料基本信息") + @Operation(summary = "导入合格生产退料") @Parameters({ @Parameter(name = "file", description = "Excel 文件", required = true), @Parameter(name = "mode", description = "导入模式1更新2追加3覆盖", example = "1"), @@ -177,17 +177,40 @@ public class ProductionreturnRequestMainController { public CommonResult> importExcel(HttpServletResponse response, @RequestParam("file") MultipartFile file, @RequestParam(value = "mode") Integer mode, - @RequestParam(value = "updatePart", required = false, defaultValue = "false") Boolean updatePart, - @RequestParam(value = "businesstypeDO")BusinesstypeDO businesstypeDO, - @RequestParam(value = "requestsettingDO")RequestsettingDO requestsettingDO) throws Exception { + @RequestParam(value = "updatePart", required = false, defaultValue = "false") Boolean updatePart) throws Exception { + List list = ExcelUtils.read(file, ProductionreturnRequestImportVO.class); + ConvertUtil convertUtil = new ConvertUtil<>(ProductionreturnRequestMainCreateReqVO.class); + List createReqVOList = convertUtil.invoke(list).getDataList(); + List errorList = productionreturnRequestMainService.importProductionreturnRequestList(createReqVOList, mode, updatePart, true); + Map returnMap = new HashMap<>(); + returnMap.put("errorCount", errorList.size()); + if(!errorList.isEmpty()) { + String url = ExcelUtils.writeLocalFile("生产退料导入错误数据" + LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + return success(returnMap); + } + + @PostMapping("/importNO") + @Operation(summary = "导入不合格生产退料") + @Parameters({ + @Parameter(name = "file", description = "Excel 文件", required = true), + @Parameter(name = "mode", description = "导入模式1更新2追加3覆盖", example = "1"), + @Parameter(name = "updatePart", description = "部分更新,默认为 true", example = "true") + }) + @PreAuthorize("@ss.hasPermission('wms:productionreturn-request-main:import')") + public CommonResult> importExcelNO(HttpServletResponse response, + @RequestParam("file") MultipartFile file, + @RequestParam(value = "mode") Integer mode, + @RequestParam(value = "updatePart", required = false, defaultValue = "false") Boolean updatePart) throws Exception { List list = ExcelUtils.read(file, ProductionreturnRequestImportVO.class); ConvertUtil convertUtil = new ConvertUtil<>(ProductionreturnRequestMainCreateReqVO.class); List createReqVOList = convertUtil.invoke(list).getDataList(); - List errorList = productionreturnRequestMainService.importProductionreturnRequestList(createReqVOList, mode, updatePart,businesstypeDO,requestsettingDO); + List errorList = productionreturnRequestMainService.importProductionreturnRequestList(createReqVOList, mode, updatePart, false); Map returnMap = new HashMap<>(); returnMap.put("errorCount", errorList.size()); if(!errorList.isEmpty()) { - String url = ExcelUtils.writeLocalFile("生产退料基本信息导入错误数据" + LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")) + ".xlsx", "错误列表", errorList); + String url = ExcelUtils.writeLocalFile("生产退料导入错误数据" + LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")) + ".xlsx", "错误列表", errorList); returnMap.put("errorFile", url); } return success(returnMap); diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/productionreturnRequest/vo/ProductionreturnRequestImportVO.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/productionreturnRequest/vo/ProductionreturnRequestImportVO.java index e82d361e..d7889b97 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/productionreturnRequest/vo/ProductionreturnRequestImportVO.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/productionreturnRequest/vo/ProductionreturnRequestImportVO.java @@ -27,6 +27,9 @@ public class ProductionreturnRequestImportVO { @ExcelProperty("车间代码") private String workshopCode; + @ExcelProperty("截止时间") + private String dueTime; + @ExcelProperty("生产线代码") private String productionLineCode; @@ -42,4 +45,5 @@ public class ProductionreturnRequestImportVO { @ExcelProperty(value = "计量单位", converter = DictConvert.class) @DictFormat(DictTypeConstants.UOM) private String uom; + } diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/deliverRequest/DeliverRequestMainServiceImpl.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/deliverRequest/DeliverRequestMainServiceImpl.java index 330a7d96..f1d580f2 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/deliverRequest/DeliverRequestMainServiceImpl.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/deliverRequest/DeliverRequestMainServiceImpl.java @@ -358,7 +358,7 @@ public class DeliverRequestMainServiceImpl implements DeliverRequestMainService List deliverJobDetailDOList = new ArrayList<>(); detailDOList.forEach(item -> { // 根据批次策略/下架策略 返回 库存余额DO - List balanceDOListJob = jobUtils.getBalanceByBatchOffShelf(item.getItemCode(),"OK",item.getProjectCode(),item.getQty()); + List balanceDOListJob = jobUtils.getBalanceByBatchOffShelf(item.getItemCode(),"OK",item.getProjectCode(),item.getQty(),mainDO.getFromLocationTypes()); // 根据 查询出所需数据 解析成 任务子表数据 balanceDOListJob.forEach(balanceDOItem -> { DeliverJobDetailDO deliverJobDetailDo = new DeliverJobDetailDO(); diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/issueRequest/IssueRequestMainServiceImpl.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/issueRequest/IssueRequestMainServiceImpl.java index 6db1f602..c64b3d82 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/issueRequest/IssueRequestMainServiceImpl.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/issueRequest/IssueRequestMainServiceImpl.java @@ -357,7 +357,7 @@ public class IssueRequestMainServiceImpl implements IssueRequestMainService { } try { ProductionlineDO productionlineDO = this.validatorProductionLineCode(detailDo.getProductionLineCode()); - detailDo.setToLocationCode(productionlineDO.getRawLocationCode()); +// detailDo.setToLocationCode(productionlineDO.getRawLocationCode()); } catch (Exception ex) { message.append(ex.getMessage()).append(","); } @@ -460,8 +460,10 @@ public class IssueRequestMainServiceImpl implements IssueRequestMainService { this.ifUomSuccess(itembasicDO.getUom(), issueRequestDetailDO.getUom()); validatorProductionLineCode(issueRequestDetailDO.getProductionLineCode()); validatorWorkstation(issueRequestDetailDO.getWorkStationCode(), issueRequestMainDO.getWorkshopCode(), issueRequestDetailDO.getProductionLineCode()); - ProductionlineitemDO productionlineitemDO = this.validatorProductionLineCodeAndpItemCodeExist(issueRequestDetailDO.getProductionLineCode(), issueRequestDetailDO.getItemCode()); - issueRequestDetailDO.setToLocationCode(productionlineitemDO.getRawLocationCode()); +// 暂时不校验 生产线物品关系 +// ProductionlineitemDO productionlineitemDO = this.validatorProductionLineCodeAndpItemCodeExist(issueRequestDetailDO.getProductionLineCode(), issueRequestDetailDO.getItemCode()); +// issueRequestDetailDO.setToLocationCode(productionlineitemDO.getRawLocationCode()); + // RuleRespVO grounding = ruleService.grounding(null, null, null, null, null, null, issueRequestDetailDO.getItemCode(), null, null, null, null, null, null); // if (grounding == null) { // throw exception(555, "未查找到该条上架策略"); @@ -669,13 +671,14 @@ public class IssueRequestMainServiceImpl implements IssueRequestMainService { issueJobMainDO.setAllowModifyBatch(jobsettingDO.getAllowModifyBach()); issueJobMainMapper.insert(issueJobMainDO); + List issueJobDetailDOList = new ArrayList<>(); List expectinCreateReqVOList = new ArrayList<>(); List expectoutCreateReqVOList = new ArrayList<>(); // 根据发料申请子表数据进行分析 detailDO.forEach(item -> { // 根据批次策略/下架策略 返回 库存余额DO - List balanceDOListJob = jobUtils.getBalanceByBatchOffShelf(item.getItemCode(),item.getInventoryStatus(),item.getProjectCode(),item.getQty()); + List balanceDOListJob = jobUtils.getBalanceByBatchOffShelf(item.getItemCode(),item.getInventoryStatus(),item.getProjectCode(),item.getQty(),mainDO.getFromLocationTypes()); // 根据 查询出所需数据 解析成 任务子表数据 balanceDOListJob.forEach(balanceDOItem -> { IssueJobDetailDO issueJobDetailDO = new IssueJobDetailDO(); @@ -710,16 +713,16 @@ public class IssueRequestMainServiceImpl implements IssueRequestMainService { BeanUtils.copyProperties(issueJobDetailDO, expectinCreateReqVO); expectinCreateReqVO.setJobNumber(number); expectinCreateReqVO.setBusinessType(issueJobMainDO.getBusinessType()); - expectinCreateReqVO.setLocationCode(issueJobDetailDO.getFromLocationCode()); - expectinCreateReqVO.setOwnerCode(issueJobDetailDO.getFromOwnerCode()); + expectinCreateReqVO.setLocationCode(item.getToLocationCode()); + expectinCreateReqVO.setOwnerCode(item.getToOwnerCode()); expectinCreateReqVOList.add(expectinCreateReqVO); //预计出 ExpectoutCreateReqVO expectoutCreateReqVO = new ExpectoutCreateReqVO(); BeanUtils.copyProperties(issueJobDetailDO, expectoutCreateReqVO); expectoutCreateReqVO.setJobNumber(number); expectoutCreateReqVO.setBusinessType(issueJobMainDO.getBusinessType()); - expectoutCreateReqVO.setLocationCode(issueJobDetailDO.getFromLocationCode()); - expectoutCreateReqVO.setOwnerCode(issueJobDetailDO.getFromOwnerCode()); + expectoutCreateReqVO.setLocationCode(balanceDOItem.getLocationCode()); + expectoutCreateReqVO.setOwnerCode(item.getFromOwnerCode()); expectoutCreateReqVOList.add(expectoutCreateReqVO); }); }); diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/productionreturnRequest/ProductionreturnRequestMainService.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/productionreturnRequest/ProductionreturnRequestMainService.java index 926b9640..7ead4738 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/productionreturnRequest/ProductionreturnRequestMainService.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/productionreturnRequest/ProductionreturnRequestMainService.java @@ -81,5 +81,5 @@ public interface ProductionreturnRequestMainService { */ PageResult getProductionreturnRequestMainSenior(CustomConditions conditions); - List importProductionreturnRequestList(List createReqVOList, Integer mode, Boolean updatePart, BusinesstypeDO businesstypeDO, RequestsettingDO requestsettingDO); + List importProductionreturnRequestList(List createReqVOList, Integer mode, Boolean updatePart, Boolean isOK); } diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/productionreturnRequest/ProductionreturnRequestMainServiceImpl.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/productionreturnRequest/ProductionreturnRequestMainServiceImpl.java index e71b316d..64110ecb 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/productionreturnRequest/ProductionreturnRequestMainServiceImpl.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/productionreturnRequest/ProductionreturnRequestMainServiceImpl.java @@ -158,20 +158,22 @@ public class ProductionreturnRequestMainServiceImpl implements ProductionreturnR @Override public List importProductionreturnRequestList(List createReqVOList - , Integer mode, Boolean updatePart,BusinesstypeDO businesstypeDO,RequestsettingDO requestsettingDO) { + , Integer mode, Boolean updatePart, Boolean isOK) { if (CollUtil.isEmpty(createReqVOList)) { throw exception(PRODUCTIONRETURN_REQUEST_IMPORT_LIST_IS_EMPTY); } + BusinesstypeDO businesstypeDO = jobUtils.selectDocumentSettingFromBusinessType("ReturnToStoreRequest"); + RequestsettingDO requestsettingDO = requestsettingService.selectRequestsettingExist("MaterialReturnRequest"); List errorList = new ArrayList<>(); createReqVOList.forEach(createReqVO -> { ProductionreturnRequestMainDO mainDo = ProductionreturnRequestMainConvert.INSTANCE.convert(createReqVO); - String messageMain = validatorProductionreturnRequestMainImport(mainDo,businesstypeDO,requestsettingDO); + String messageMain = validatorProductionreturnRequestMainImport(mainDo,businesstypeDO, requestsettingDO); List subList = createReqVO.getSubList(); List subDOList = ProductionreturnRequestDetailConvert.INSTANCE.convertList03(subList); // 是否有错误数据 boolean flag = true; for (ProductionreturnRequestDetailDO detailDO : subDOList) { - String messageDetail = validatorProductionreturnRequestDetailImport(detailDO, mainDo,businesstypeDO); + String messageDetail = validatorProductionreturnRequestDetailImport(detailDO, mainDo); if (!messageMain.isEmpty() || messageDetail.isEmpty()) { ProductionreturnRequestImportErrorVO importErrorVO = ProductionreturnRequestMainConvert.INSTANCE.convert(createReqVO, detailDO); importErrorVO.setImportStatus("失败"); @@ -257,7 +259,7 @@ public class ProductionreturnRequestMainServiceImpl implements ProductionreturnR * @param mainDo * @return */ - private String validatorProductionreturnRequestMainImport(ProductionreturnRequestMainDO mainDo,BusinesstypeDO businesstypeDO,RequestsettingDO requestsettingDO) { + private String validatorProductionreturnRequestMainImport(ProductionreturnRequestMainDO mainDo,BusinesstypeDO businesstypeDO, RequestsettingDO requestsettingDO) { StringBuilder message = new StringBuilder(); try { validatorWorkshop(mainDo.getWorkshopCode()); @@ -265,7 +267,7 @@ public class ProductionreturnRequestMainServiceImpl implements ProductionreturnR message.append(ex.getMessage()).append(","); } if (businesstypeDO == null) { - message.append("根据业务类型设置未查找到采购退货申请的相关业务类型"); + message.append("根据业务类型设置未查找到相关业务类型"); } else { mainDo.setBusinessType(businesstypeDO.getCode()); @@ -275,7 +277,7 @@ public class ProductionreturnRequestMainServiceImpl implements ProductionreturnR mainDo.setToAreaCodes(businesstypeDO.getInAreaCodes()); } if (requestsettingDO == null) { - message.append("根据申请单设置未查找到采购退货申请的相关业务类型"); + message.append("根据申请单设置未查找相关业务类型"); } else { mainDo.setAutoAgree(requestsettingDO.getAutoAgree()); @@ -297,7 +299,7 @@ public class ProductionreturnRequestMainServiceImpl implements ProductionreturnR * @param detailDo * @return */ - private String validatorProductionreturnRequestDetailImport(ProductionreturnRequestDetailDO detailDo, ProductionreturnRequestMainDO mainDo, BusinesstypeDO businesstypeDO) { + private String validatorProductionreturnRequestDetailImport(ProductionreturnRequestDetailDO detailDo, ProductionreturnRequestMainDO mainDo) { StringBuilder message = new StringBuilder(); try { ItembasicDO itembasicDO = validatorItembasic(detailDo.getItemCode()); diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/repleinshRequest/RepleinshRequestMainServiceImpl.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/repleinshRequest/RepleinshRequestMainServiceImpl.java index 8742f234..c0e71f98 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/repleinshRequest/RepleinshRequestMainServiceImpl.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/repleinshRequest/RepleinshRequestMainServiceImpl.java @@ -540,7 +540,7 @@ public class RepleinshRequestMainServiceImpl implements RepleinshRequestMainServ // 根据发料申请子表数据进行分析 detailDO.forEach(item -> { // 根据批次策略/下架策略 返回 库存余额DO - List balanceDOListJob = jobUtils.getBalanceByBatchOffShelf(item.getItemCode(),item.getInventoryStatus(),item.getProjectCode(),item.getQty()); + List balanceDOListJob = jobUtils.getBalanceByBatchOffShelf(item.getItemCode(),item.getInventoryStatus(),item.getProjectCode(),item.getQty(),mainDO.getFromLocationTypes()); // 根据 查询出所需数据 解析成 任务子表数据 balanceDOListJob.forEach(balanceDOItem -> { RepleinshJobDetailDO repleinshJobDetailDO = new RepleinshJobDetailDO(); diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/util/JobUtils.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/util/JobUtils.java index 137d4b53..557675d4 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/util/JobUtils.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/util/JobUtils.java @@ -1,5 +1,6 @@ package com.win.module.wms.util; +import cn.hutool.core.exceptions.UtilException; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -733,9 +734,10 @@ public class JobUtils { * @param inventoryStatus * @param projectCode * @param qty + * @param locationTypes * @return */ - public List getBalanceByBatchOffShelf(String itemCode, String inventoryStatus, String projectCode, BigDecimal qty) { + public List getBalanceByBatchOffShelf(String itemCode, String inventoryStatus, String projectCode, BigDecimal qty, String locationTypes ) { // 批次策略 RuleRespVO ruleRespVOBatch = ruleService.batch(null, null,null,null,null,projectCode,itemCode); JSONObject jsonObjectBatch = JSONUtil.parseObj(ruleRespVOBatch.getConfiguration()); @@ -858,6 +860,12 @@ public class JobUtils { } BigDecimal countQty = new BigDecimal(0.000000); for (BalanceDO balanceDO: balanceDOList) { + // 根据库位类型进行过滤 + if (locationTypes != null && !locationTypes.equals("")) { + if(locationTypes.indexOf(locationService.selectLocation(balanceDO.getLocationCode()).getType()) == -1) { + continue; + } + } // 查询 预计出 求和 数量 // TODO: 后续完善 根据 管理精度查询 QueryWrapper queryWrapperExpectout = new QueryWrapper(); @@ -873,12 +881,18 @@ public class JobUtils { } // balanceDO.getQty().subtract(countQtyExpectout) 扣减预计出数量 countQty = countQty.add(balanceDO.getQty().subtract(countQtyExpectout)); + if (balanceDO.getLocationCode().isEmpty()) { + throw new UtilException("物品代码:" + balanceDO.getItemCode() + " 库存余额不足"); + } balanceDOListJob.add(balanceDO); // 数据列表循环累加 直到总和大于等于当前物品的qty {countQty >= balanceDO.getQty()} if (countQty.compareTo(qty) != -1) { break; } } + if (balanceDOListJob == null || balanceDOListJob.size() == 0) { + throw new UtilException("没有找到推荐的库存"); + } return balanceDOListJob; }