diff --git a/win-module-wms/win-module-wms-api/src/main/java/com/win/module/wms/enums/ErrorCodeConstants.java b/win-module-wms/win-module-wms-api/src/main/java/com/win/module/wms/enums/ErrorCodeConstants.java index 953834bb..56e54c2f 100644 --- a/win-module-wms/win-module-wms-api/src/main/java/com/win/module/wms/enums/ErrorCodeConstants.java +++ b/win-module-wms/win-module-wms-api/src/main/java/com/win/module/wms/enums/ErrorCodeConstants.java @@ -22,7 +22,7 @@ public interface ErrorCodeConstants { ErrorCode ITEMBASIC_IS_PHANTOM_NOT_EXISTS = new ErrorCode(1_000_020_010, "虚零件不存在"); ErrorCode ITEMBASIC_ABC_CLASS_NOT_EXISTS = new ErrorCode(1_000_020_011, "ABC类不存在"); ErrorCode ITEMBASIC_TYPE_NOT_EXISTS = new ErrorCode(1_000_020_012, "类型不存在"); - ErrorCode ITEMBASIC_VALIDITY_DAYS_NOT_EXISTS = new ErrorCode(1_000_020_013, "有效天数不存在{}"); + ErrorCode ITEMBASIC_VALIDITY_DAYS_NOT_EXISTS = new ErrorCode(1_000_020_013, "有效天数不存在"); ErrorCode ITEMBASIC_AVAIABLE_NOT_EXISTS = new ErrorCode(1_000_020_014, "是否可用不存在"); ErrorCode ITEMBASIC_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_000_020_015, "导入物品基础信息不能为空"); ErrorCode ITEMBASIC_EXCEPTION = new ErrorCode(1_000_020_016, "物品基础信息错误:【{}】"); @@ -428,6 +428,8 @@ public interface ErrorCodeConstants { ErrorCode PURCHASERETURN_REQUEST_MAIN_NOT_EXISTS = new ErrorCode(1_000_075_000, "采购退货申请主不存在"); //采购退货申请子ErrorCode ErrorCode PURCHASERETURN_REQUEST_DETAIL_NOT_EXISTS = new ErrorCode(1_000_075_001, "采购退货申请子不存在"); + + ErrorCode PURCHASERETURN_REQUEST_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_000_075_002, "采购退货申请导入数据不能为空"); //采购退货任务主ErrorCode ErrorCode PURCHASERETURN_JOB_MAIN_NOT_EXISTS = new ErrorCode(1_000_076_000, "采购退货任务主不存在"); //采购退货任务子ErrorCode @@ -441,6 +443,7 @@ public interface ErrorCodeConstants { ErrorCode INSPECT_REQUEST_MAIN_NOT_EXISTS = new ErrorCode(1_000_078_000, "检验申请主不存在"); //检验申请子ErrorCode ErrorCode INSPECT_REQUEST_DETAIL_NOT_EXISTS = new ErrorCode(1_000_078_001, "检验申请子不存在"); + ErrorCode INSPECT_REQUEST_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_000_078_002, "检验申请导入数据不能为空"); //检验任务主ErrorCode ErrorCode INSPECT_JOB_MAIN_NOT_EXISTS = new ErrorCode(1_000_079_000, "检验任务主不存在"); //检验任务子ErrorCode @@ -454,6 +457,7 @@ public interface ErrorCodeConstants { ErrorCode PUTAWAY_REQUEST_MAIN_NOT_EXISTS = new ErrorCode(1_000_081_000, "上架申请主不存在"); //上架申请子ErrorCode ErrorCode PUTAWAY_REQUEST_DETAIL_NOT_EXISTS = new ErrorCode(1_000_081_001, "上架申请子不存在"); + ErrorCode PUTAWAY_REQUEST_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_000_081_002, "上架申请导入数据不能为空"); //上架任务主ErrorCode ErrorCode PUTAWAY_JOB_MAIN_NOT_EXISTS = new ErrorCode(1_000_082_000, "上架任务主不存在"); //上架任务子ErrorCode diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/inspectRequest/InspectRequestMainController.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/inspectRequest/InspectRequestMainController.java index e0541a86..1341e082 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/inspectRequest/InspectRequestMainController.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/inspectRequest/InspectRequestMainController.java @@ -1,9 +1,13 @@ package com.win.module.wms.controller.inspectRequest; import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.dict.core.util.DictFrameworkUtils; +import com.win.framework.excel.core.util.ConvertUtil; import com.win.module.system.api.user.AdminUserApi; import com.win.module.system.api.user.dto.AdminUserRespDTO; import com.win.module.wms.controller.inspectRequest.vo.*; +import com.win.module.wms.enums.DictTypeConstants; +import io.swagger.v3.oas.annotations.Parameters; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -14,6 +18,8 @@ import io.swagger.v3.oas.annotations.Operation; import javax.validation.*; import javax.servlet.http.*; +import java.time.LocalDateTime; +import java.time.ZoneOffset; import java.util.*; import java.io.IOException; @@ -29,6 +35,7 @@ import static com.win.framework.operatelog.core.enums.OperateTypeEnum.*; import com.win.module.wms.dal.dataobject.inspectRequest.InspectRequestMainDO; import com.win.module.wms.convert.inspectRequest.InspectRequestMainConvert; import com.win.module.wms.service.inspectRequest.InspectRequestMainService; +import org.springframework.web.multipart.MultipartFile; @Tag(name = "管理后台 - 检验申请主") @RestController @@ -120,4 +127,43 @@ public class InspectRequestMainController { ExcelUtils.write(response, "检验申请主.xls", "数据", InspectRequestMainExcelVO.class, datas); } + @GetMapping("/get-import-template") + @Operation(summary = "获得导入检验申请信息模板") + public void importTemplate(HttpServletResponse response) throws IOException { + // 手动创建导出 demo + List list = new ArrayList<>(); + Map mapDropDown = new HashMap<>(); + String[] uom = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.UOM); + mapDropDown.put(8, uom); + String[] inventoryStatus = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.INVENTORY_STATUS); + mapDropDown.put(9, inventoryStatus); + // 输出 + ExcelUtils.write(response, "检验申请信息导入模板.xlsx", "检验申请信息列表", InspectRequestImportVO.class, list, mapDropDown); + } + + + @PostMapping("/import") + @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:inspect-request-main:import')") + public CommonResult> importExcel(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, InspectRequestImportVO.class); + ConvertUtil convertUtil = new ConvertUtil<>(InspectRequestMainCreateReqVO.class); + List createReqVOList = convertUtil.invoke(list).getDataList(); + List errorList = inspectRequestMainService.importInspectRequestList(createReqVOList, mode, updatePart); + 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); + } } diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/inspectRequest/vo/InspectRequestImportErrorVO.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/inspectRequest/vo/InspectRequestImportErrorVO.java new file mode 100644 index 00000000..c59d9706 --- /dev/null +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/inspectRequest/vo/InspectRequestImportErrorVO.java @@ -0,0 +1,25 @@ +package com.win.module.wms.controller.inspectRequest.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + + +/** + * 供应商发票申请 Excel VO + * + * @author 超级管理员 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class InspectRequestImportErrorVO extends InspectRequestImportVO { + + @ExcelProperty(value = "导入状态", index = 0) + private String importStatus; + + @ExcelProperty(value = "导入说明", index = 1) + private String importRemark; + +} diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/inspectRequest/vo/InspectRequestImportVO.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/inspectRequest/vo/InspectRequestImportVO.java new file mode 100644 index 00000000..72d479ef --- /dev/null +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/inspectRequest/vo/InspectRequestImportVO.java @@ -0,0 +1,60 @@ +package com.win.module.wms.controller.inspectRequest.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.wms.enums.DictTypeConstants; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + + +/** + * 供应商发票申请子 Excel VO + * + * @author 超级管理员 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题 +public class InspectRequestImportVO { + + @ExcelProperty("单据号") + private String number; + + @ExcelProperty("采购收货记录单号") + private String purchaseReceiptRecordNumber; + + @ExcelProperty("订单号") + private String poNumber; + + @ExcelProperty("订单行") + private String poLine; + + @ExcelProperty("物品代码") + private String itemCode; + + @ExcelProperty("包装号") + private String packingNumber; + + @ExcelProperty("器具号") + private String containerNumber; + + @ExcelProperty("批次") + private String batch; + + @ExcelProperty(value = "计量单位", converter = DictConvert.class) + @DictFormat(DictTypeConstants.UOM) + private String uom; + + @ExcelProperty(value = "库存状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.INVENTORY_STATUS) + private String inventoryStatus; + + @ExcelProperty("来源库位") + private String fromLocationCode; +} diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/inspectRequest/vo/InspectRequestMainBaseVO.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/inspectRequest/vo/InspectRequestMainBaseVO.java index 8bad1d49..225d2bea 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/inspectRequest/vo/InspectRequestMainBaseVO.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/inspectRequest/vo/InspectRequestMainBaseVO.java @@ -1,5 +1,6 @@ package com.win.module.wms.controller.inspectRequest.vo; +import com.win.framework.excel.core.annotations.OnlyOne; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.util.*; @@ -30,6 +31,7 @@ public class InspectRequestMainBaseVO { @NotNull(message = "供应商代码不能为空") private String supplierCode; + @OnlyOne @Schema(description = "单据号", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "单据号不能为空") private String number; diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/inspectRequest/vo/InspectRequestMainCreateReqVO.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/inspectRequest/vo/InspectRequestMainCreateReqVO.java index eb0a5df6..90fce131 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/inspectRequest/vo/InspectRequestMainCreateReqVO.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/inspectRequest/vo/InspectRequestMainCreateReqVO.java @@ -1,12 +1,20 @@ package com.win.module.wms.controller.inspectRequest.vo; +import com.win.framework.excel.core.annotations.SubObject; +import com.win.module.wms.controller.purchasereturnRequest.vo.PurchasereturnRequestDetailCreateReqVO; import lombok.*; import io.swagger.v3.oas.annotations.media.Schema; +import java.util.List; + @Schema(description = "管理后台 - 检验申请主创建 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) public class InspectRequestMainCreateReqVO extends InspectRequestMainBaseVO { + @SubObject + @Schema(description = "子表数据") + private List subList; + } diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/inspectRequest/vo/InspectRequestMainUpdateReqVO.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/inspectRequest/vo/InspectRequestMainUpdateReqVO.java index 517ac583..dc1e1793 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/inspectRequest/vo/InspectRequestMainUpdateReqVO.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/inspectRequest/vo/InspectRequestMainUpdateReqVO.java @@ -1,12 +1,19 @@ package com.win.module.wms.controller.inspectRequest.vo; +import com.win.framework.excel.core.annotations.SubObject; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; +import java.util.List; + @Schema(description = "管理后台 - 检验申请主更新 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) public class InspectRequestMainUpdateReqVO extends InspectRequestMainBaseVO { + @SubObject + @Schema(description = "子表数据") + private List subList; + } diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/convert/inspectRequest/InspectRequestDetailConvert.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/convert/inspectRequest/InspectRequestDetailConvert.java index 4f5c064a..d23a2bdd 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/convert/inspectRequest/InspectRequestDetailConvert.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/convert/inspectRequest/InspectRequestDetailConvert.java @@ -4,11 +4,11 @@ import java.util.*; import com.win.framework.common.pojo.PageResult; -import com.win.module.wms.controller.inspectRequest.vo.InspectRequestDetailCreateReqVO; -import com.win.module.wms.controller.inspectRequest.vo.InspectRequestDetailExcelVO; -import com.win.module.wms.controller.inspectRequest.vo.InspectRequestDetailRespVO; -import com.win.module.wms.controller.inspectRequest.vo.InspectRequestDetailUpdateReqVO; +import com.win.module.wms.controller.inspectRequest.vo.*; +import com.win.module.wms.dal.dataobject.inspectRequest.InspectRequestMainDO; import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; import org.mapstruct.factory.Mappers; import com.win.module.wms.dal.dataobject.inspectRequest.InspectRequestDetailDO; @@ -27,6 +27,7 @@ public interface InspectRequestDetailConvert { InspectRequestDetailDO convert(InspectRequestDetailUpdateReqVO bean); InspectRequestDetailRespVO convert(InspectRequestDetailDO bean); + InspectRequestDetailCreateReqVO convert1(InspectRequestDetailDO detailDO); List convertList(List list); @@ -34,4 +35,25 @@ public interface InspectRequestDetailConvert { List convertList02(List list); + List convertList03(List list); + + List convertList05(List subList); + + @Mappings({ + @Mapping(source = "mainDO.createTime", target = "createTime"), + @Mapping(source = "mainDO.creator", target = "creator"), + @Mapping(source = "mainDO.updateTime", target = "updateTime"), + @Mapping(source = "mainDO.updater", target = "updater"), + @Mapping(source = "mainDO.itemCode", target = "itemCode"), + @Mapping(source = "mainDO.uom", target = "uom"), + }) + InspectRequestDetailExcelVO convert(InspectRequestMainDO mainDO, InspectRequestDetailDO detailDO); + + @Mappings({ + @Mapping(source = "mainVo.number", target = "number"), + @Mapping(source = "mainVo.itemCode", target = "itemCode"), + @Mapping(source = "mainVo.uom", target = "uom"), + }) + InspectRequestImportErrorVO convert(InspectRequestMainCreateReqVO mainVo, InspectRequestDetailCreateReqVO detailVo); + } diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/convert/inspectRequest/InspectRequestMainConvert.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/convert/inspectRequest/InspectRequestMainConvert.java index 40e7d8fe..ca027c93 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/convert/inspectRequest/InspectRequestMainConvert.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/convert/inspectRequest/InspectRequestMainConvert.java @@ -4,10 +4,7 @@ import java.util.*; import com.win.framework.common.pojo.PageResult; -import com.win.module.wms.controller.inspectRequest.vo.InspectRequestMainCreateReqVO; -import com.win.module.wms.controller.inspectRequest.vo.InspectRequestMainExcelVO; -import com.win.module.wms.controller.inspectRequest.vo.InspectRequestMainRespVO; -import com.win.module.wms.controller.inspectRequest.vo.InspectRequestMainUpdateReqVO; +import com.win.module.wms.controller.inspectRequest.vo.*; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; import com.win.module.wms.dal.dataobject.inspectRequest.InspectRequestMainDO; @@ -34,4 +31,5 @@ public interface InspectRequestMainConvert { List convertList02(List list); + InspectRequestMainDO convert(InspectRequestMainBaseVO baseVO); } diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/customerreturnRequest/CustomerreturnRequestDetailMapper.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/customerreturnRequest/CustomerreturnRequestDetailMapper.java index c6b9fa7b..1142b905 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/customerreturnRequest/CustomerreturnRequestDetailMapper.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/customerreturnRequest/CustomerreturnRequestDetailMapper.java @@ -51,7 +51,6 @@ public interface CustomerreturnRequestDetailMapper extends BaseMapperX selectList(CustomerreturnRequestDetailExportReqVO reqVO) { return selectList(new LambdaQueryWrapperX() - .eqIfPresent(CustomerreturnRequestDetailDO::getMasterId, reqVO.getMasterId()) .eqIfPresent(CustomerreturnRequestDetailDO::getSoNumber, reqVO.getSoNumber()) .eqIfPresent(CustomerreturnRequestDetailDO::getSoLine, reqVO.getSoLine()) .eqIfPresent(CustomerreturnRequestDetailDO::getPackingNumber, reqVO.getPackingNumber()) diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/deliverRequest/DeliverRequestDetailMapper.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/deliverRequest/DeliverRequestDetailMapper.java index a3ca18cc..8d9c8f31 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/deliverRequest/DeliverRequestDetailMapper.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/deliverRequest/DeliverRequestDetailMapper.java @@ -53,7 +53,6 @@ public interface DeliverRequestDetailMapper extends BaseMapperX selectList(DeliverRequestDetailExportReqVO reqVO) { return selectList(new LambdaQueryWrapperX() - .eqIfPresent(DeliverRequestDetailDO::getMasterId, reqVO.getMasterId()) .eqIfPresent(DeliverRequestDetailDO::getSoNumber, reqVO.getSoNumber()) .eqIfPresent(DeliverRequestDetailDO::getSoLine, reqVO.getSoLine()) .eqIfPresent(DeliverRequestDetailDO::getPackingNumber, reqVO.getPackingNumber()) diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/inspectRequest/InspectRequestMainMapper.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/inspectRequest/InspectRequestMainMapper.java index be64ad21..557e9982 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/inspectRequest/InspectRequestMainMapper.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/inspectRequest/InspectRequestMainMapper.java @@ -10,6 +10,7 @@ import com.win.framework.mybatis.core.util.QueryWrapperUtils; import com.win.module.wms.controller.inspectRequest.vo.InspectRequestMainExportReqVO; import com.win.module.wms.controller.inspectRequest.vo.InspectRequestMainPageReqVO; import com.win.module.wms.dal.dataobject.inspectRequest.InspectRequestMainDO; +import com.win.module.wms.dal.dataobject.purchasereturnRequest.PurchasereturnRequestMainDO; import org.apache.ibatis.annotations.Mapper; /** @@ -94,4 +95,7 @@ public interface InspectRequestMainMapper extends BaseMapperX getInspectRequestMainList(InspectRequestMainExportReqVO exportReqVO); + /** + * @author chenfang + * @param datas 主子表数据 + * @param mode 导入模式 1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return + */ + public List importInspectRequestList(List datas, Integer mode, boolean updatePart); } diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/inspectRequest/InspectRequestMainServiceImpl.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/inspectRequest/InspectRequestMainServiceImpl.java index ee28b26f..5bcebbf2 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/inspectRequest/InspectRequestMainServiceImpl.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/inspectRequest/InspectRequestMainServiceImpl.java @@ -1,21 +1,52 @@ package com.win.module.wms.service.inspectRequest; -import com.win.framework.common.pojo.CustomConditions; -import com.win.module.wms.controller.inspectRequest.vo.InspectRequestMainCreateReqVO; -import com.win.module.wms.controller.inspectRequest.vo.InspectRequestMainExportReqVO; -import com.win.module.wms.controller.inspectRequest.vo.InspectRequestMainPageReqVO; -import com.win.module.wms.controller.inspectRequest.vo.InspectRequestMainUpdateReqVO; -import org.springframework.stereotype.Service; -import javax.annotation.Resource; -import org.springframework.validation.annotation.Validated; - -import java.util.*; -import com.win.module.wms.dal.dataobject.inspectRequest.InspectRequestMainDO; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.exceptions.UtilException; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.win.framework.common.pojo.CustomConditions; import com.win.framework.common.pojo.PageResult; - +import com.win.framework.common.util.validation.ValidationUtils; +import com.win.framework.dict.core.util.DictFrameworkUtils; +import com.win.module.infra.api.trends.TrendsApi; +import com.win.module.infra.enums.TrendsTypeEnum; +import com.win.module.system.api.dict.DictDataApi; +import com.win.module.system.api.dict.dto.DictDataRespDTO; +import com.win.module.system.api.serialnumber.SerialNumberApi; +import com.win.module.system.enums.serialNumber.RuleCodeEnum; +import com.win.module.wms.controller.inspectRequest.vo.*; +import com.win.module.wms.controller.rule.vo.RuleRespVO; +import com.win.module.wms.convert.inspectRequest.InspectRequestDetailConvert; import com.win.module.wms.convert.inspectRequest.InspectRequestMainConvert; +import com.win.module.wms.dal.dataobject.businesstype.BusinesstypeDO; +import com.win.module.wms.dal.dataobject.inspectRequest.InspectRequestDetailDO; +import com.win.module.wms.dal.dataobject.inspectRequest.InspectRequestMainDO; +import com.win.module.wms.dal.dataobject.itembasic.ItembasicDO; +import com.win.module.wms.dal.dataobject.purchasereceiptRecord.PurchasereceiptRecordDetailDO; +import com.win.module.wms.dal.dataobject.requestsetting.RequestsettingDO; +import com.win.module.wms.dal.mysql.inspectRequest.InspectRequestDetailMapper; import com.win.module.wms.dal.mysql.inspectRequest.InspectRequestMainMapper; +import com.win.module.wms.enums.DictTypeConstants; +import com.win.module.wms.enums.request.RequestStatusEnum; +import com.win.module.wms.service.itembasic.ItembasicService; +import com.win.module.wms.service.location.LocationService; +import com.win.module.wms.service.purchasereceiptRecord.PurchasereceiptRecordMainService; +import com.win.module.wms.service.requestsetting.RequestsettingService; +import com.win.module.wms.service.rule.RuleService; +import com.win.module.wms.util.JobUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; +import javax.validation.Validator; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.win.module.wms.enums.ErrorCodeConstants.*; @@ -31,23 +62,53 @@ public class InspectRequestMainServiceImpl implements InspectRequestMainService @Resource private InspectRequestMainMapper inspectRequestMainMapper; - + @Resource + private InspectRequestDetailMapper inspectRequestDetailMapper; + @Resource + private PurchasereceiptRecordMainService purchasereceiptRecordMainService; + @Resource + private SerialNumberApi serialNumberApi; + @Resource + private DictDataApi dictDataApi; + @Resource + private ItembasicService itembasicService; + @Resource + private Validator validator; + @Resource + private LocationService locationService; + @Resource + private JobUtils jobUtils; + @Resource + private RuleService ruleService; + @Resource + private RequestsettingService requestsettingService; + @Resource + private TrendsApi trendsApi; @Override public Long createInspectRequestMain(InspectRequestMainCreateReqVO createReqVO) { - // 插入 - InspectRequestMainDO inspectRequestMain = InspectRequestMainConvert.INSTANCE.convert(createReqVO); - inspectRequestMainMapper.insert(inspectRequestMain); - // 返回 - return inspectRequestMain.getId(); + RequestsettingDO requestsettingDO = requestsettingService.selectRequestsettingExist("InspectRequest"); + BusinesstypeDO businesstypeDO = jobUtils.selectDocumentSettingFromBusinessType("InspectRequest"); + InspectRequestMainDO inspectRequestMainDO = validatorToCreate(createReqVO, businesstypeDO); + //调用自动执行方法 + if(RequestStatusEnum.HANDLING.getCode().equals(inspectRequestMainDO.getStatus())) { + + } + trendsApi.createTrends(requestsettingDO.getId(), "InspectRequest", "增加了到货校验申请", TrendsTypeEnum.CREATE); + return inspectRequestMainDO.getId(); } @Override public void updateInspectRequestMain(InspectRequestMainUpdateReqVO updateReqVO) { + RequestsettingDO requestsettingDO = requestsettingDO = requestsettingService.selectRequestsettingExist("InspectRequest"); + BusinesstypeDO businesstypeDO = jobUtils.selectDocumentSettingFromBusinessType("InspectRequest"); // 校验存在 validateInspectRequestMainExists(updateReqVO.getId()); - // 更新 - InspectRequestMainDO updateObj = InspectRequestMainConvert.INSTANCE.convert(updateReqVO); - inspectRequestMainMapper.updateById(updateObj); + // 更新主表 + InspectRequestMainDO inspectRequestMainDO = validatorToUpdate(updateReqVO, businesstypeDO); + if(RequestStatusEnum.HANDLING.getCode().equals(inspectRequestMainDO.getStatus())) { + + } + trendsApi.createTrends(requestsettingDO.getId(), "InspectRequest", "增加了到货校验申请", TrendsTypeEnum.CREATE); } @Override @@ -87,4 +148,339 @@ public class InspectRequestMainServiceImpl implements InspectRequestMainService return inspectRequestMainMapper.selectList(exportReqVO); } + //判断导入单位是否正确 + private void ifUomSuccess(String itemUom,String uom) { + DictDataRespDTO dictDataRespDTO = dictDataApi.selectDictLabel(uom); + if(dictDataRespDTO != null){ + if(!itemUom.equals(dictDataRespDTO.getLabel())){ + throw new UtilException("提示单位"+ uom + "错误,应该是" + itemUom); + } + } + } + //查询检验类型 + private Integer selectInspectType(Integer sampleQty, HashMap ruleAll) { + String inspectType = ruleAll.get("InspectType"); + if("EXEMPT".equals(inspectType)){ + return 0; + } else if ("FULL".equals(inspectType)) { + return sampleQty; + }else if("SAMPLING".equals(inspectType)){ + return selectSampleMethod(ruleAll, sampleQty); + }else { + return 0; + } + } + //查询抽检方式 计算抽检数量并返回 + private Integer selectSampleMethod(HashMap ruleAll,Integer sampleQty) { + String sampleMethod = ruleAll.get("SampleMethod"); + JSONArray aplList = JSONUtil.parseArray(ruleAll.get("AplList")); + //获取最大校验规则范围 + Integer maxFloorQty = 0; + Integer maxCeilingQty = 0; + Integer maxSampleValue = 0; + Integer result = 0; + for (Object o : aplList) { + JSONObject parse = JSONUtil.parseObj(o); + Integer floorQty = Integer.valueOf(parse.get("FloorQty").toString()); + Integer ceilingQty = Integer.valueOf(parse.get("CeilingQty").toString()); + Integer sampleValue = Integer.valueOf(parse.get("SampleValue").toString()); + if (maxFloorQty < floorQty){ + maxFloorQty = floorQty; + } + if (maxCeilingQty < ceilingQty){ + maxCeilingQty = ceilingQty; + } + if (maxSampleValue < sampleValue){ + maxSampleValue = sampleValue; + } + //根据校验规则计算出抽样数量 + if(sampleQty != null && sampleQty != 0){ + if(floorQty <= sampleQty && sampleQty <= ceilingQty){ + if("QTY".equals(sampleMethod)){ + result = sampleValue; + }else if ("PERCENT".equals(sampleMethod)) { + double doubleSampleQty = sampleQty * (sampleValue * 0.01); + result = (int) Math.round(doubleSampleQty); + } + } + }else { + throw new UtilException("当前到货数量为空,不能进行校验"); + } + } + if (maxCeilingQty < sampleQty) { + throw new UtilException("当前到货数量已超出校验规则范围"); + }else { + return result; + } + } + + //获取策略里的参数进行字段对应 + private HashMap selectRule(String supplierCode,String itemCode){ + RuleRespVO inspect = ruleService.inspect(supplierCode,itemCode ); + if(inspect == null){ + throw new UtilException("未找到该策略"); + } + JSONArray configuration = JSONUtil.parseArray(inspect.getConfiguration()); + HashMap mapRule = new HashMap<>(); + for (Object o : configuration) { + JSONObject entries = JSONUtil.parseObj(o); + mapRule.put(entries.get("ParamCode").toString(),entries.get("Value").toString()); + } + String aqlList = mapRule.get("AqlList"); + if(aqlList !=null){ + JSONArray objects = JSONUtil.parseArray(aqlList); + for (int i = 0; i < objects.size(); i++) { + JSONObject entries = JSONUtil.parseObj(objects.getObj(i)); + mapRule.put("FloorQty" + (i+1),entries.get("FloorQty").toString()); + mapRule.put("CeilingQty" + (i+1),entries.get("CeilingQty").toString()); + mapRule.put("SampleValue" + (i+1),entries.get("SampleValue").toString()); + } + } + return mapRule; + } + private PurchasereceiptRecordDetailDO validatorPurchasereceiptExist(String purchaseReceiptRecordNumber, String poNumber, String poLine, String itemCode){ + return purchasereceiptRecordMainService.selectPurchasereceiptExist(poNumber, null, purchaseReceiptRecordNumber, poLine, itemCode); + } + private void validatorRule(InspectRequestMainDO mainDO){ + HashMap rule = selectRule(null, mainDO.getItemCode()); + selectInspectType(mainDO.getReceiveQty(),rule); + } + private ItembasicDO validatorItembasic(String itemCode){ + return itembasicService.selectItembasic(itemCode); + } + private void validatorLocation(String fromLocationCode){ + locationService.selectLocation(fromLocationCode); + } + private void validatorIfInType(String itemType, BusinesstypeDO businesstypeDO){ + jobUtils.ifInType(itemType, businesstypeDO); + } + private void validatorIfOutInventoryStatuses(String inventoryStatus,BusinesstypeDO businesstypeDO){ + jobUtils.ifOutInventoryStatuses(inventoryStatus, businesstypeDO); + } + private void validatorIfInFromLocationType(String fromLocationCode,BusinesstypeDO businesstypeDO){ + jobUtils.ifInFromLocationType(fromLocationCode, businesstypeDO); + } + private void validatorLlocationReturnManagementAccuracy(String itemCode,String packingNumber,String batch,String fromLocationCode,String inventoryStatu){ + ArrayList inventoryStatus = new ArrayList(); + inventoryStatus.add(inventoryStatu); + jobUtils.selectlocationReturnManagementAccuracy(itemCode, packingNumber, batch, fromLocationCode, inventoryStatus); + + } + + @Override + @Transactional + public List importInspectRequestList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + throw exception(INSPECT_REQUEST_IMPORT_LIST_IS_EMPTY); + } + List errorList = new ArrayList<>(); + datas.forEach(createReqVO -> { + String messageMain = ""; + //主表校验方法 + List subList = createReqVO.getSubList(); + List subDOList = InspectRequestDetailConvert.INSTANCE.convertList03(subList); + for (InspectRequestDetailDO detailDO : subDOList) { + String messageDetail = ""; + try { + BusinesstypeDO businesstypeDO = jobUtils.selectDocumentSettingFromBusinessType("InspectRequest"); + createReqVO.setBusinessType(businesstypeDO.getCode()); + createReqVO.setFromLocationTypes(businesstypeDO.getOutLocationTypes()); + createReqVO.setFromLocationTypes(businesstypeDO.getOutLocationTypes()); + }catch (Exception ex) { + messageDetail += ex.getMessage() + ","; + } + + InspectRequestDetailCreateReqVO inspectRequestDetailCreateReqVO = InspectRequestDetailConvert.INSTANCE.convert1(detailDO); + InspectRequestImportErrorVO importVO = InspectRequestDetailConvert.INSTANCE.convert(createReqVO, inspectRequestDetailCreateReqVO); + if(!messageMain.equals("") || !messageDetail.equals("")){ + importVO.setImportStatus("失败"); + messageMain = messageMain + messageDetail; + importVO.setImportRemark(messageMain.substring(0,messageMain.length()-1)); + errorList.add(importVO); + }else { + detailDO.setMasterId(createReqVO.getId()); + } + } + createReqVO.setStatus(DictFrameworkUtils.parseDictDataValue(DictTypeConstants.REQUEST_STATUS, "新增")); + + InspectRequestMainDO createobj = InspectRequestMainConvert.INSTANCE.convert(createReqVO); + if(errorList.isEmpty()){ + InspectRequestMainDO existInspectRequestMainDO = inspectRequestMainMapper.selectPurchaseReceiptNumber(createReqVO.getPurchaseReceiptRecordNumber()); + if(existInspectRequestMainDO == null && mode != 3){ + inspectRequestMainMapper.insert(createobj); + inspectRequestDetailMapper.insertBatch(subDOList); + }else if(existInspectRequestMainDO != null && mode != 2){ + inspectRequestMainMapper.updateById(createobj); + inspectRequestDetailMapper.updateBatch(subDOList); + } + } + }); + //错误不为空并非部分更新,手工回滚 + if(!errorList.isEmpty() && !updatePart) { + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + } + return errorList; + } + // 新增校验 + private InspectRequestMainDO validatorToCreate(InspectRequestMainCreateReqVO createReqVO, BusinesstypeDO businesstypeDO) { + InspectRequestMainDO mainDo = validatorMainMethod(createReqVO,businesstypeDO); + //子表校验 + List subList = createReqVO.getSubList(); + List subDOList = InspectRequestDetailConvert.INSTANCE.convertList03(subList); + for (InspectRequestDetailDO detailDO : subDOList) { + validatorDetailMethod(detailDO,mainDo,businesstypeDO); + } + String number = serialNumberApi.generateCode(RuleCodeEnum.PURCHASE_CLAIM_RECORD.getCode()); + mainDo.setNumber(number); + mainDo.setStatus(DictFrameworkUtils.parseDictDataValue(DictTypeConstants.REQUEST_STATUS, "新增")); + inspectRequestMainMapper.insert(mainDo); + inspectRequestDetailMapper.insertBatch(subDOList); + return mainDo; + } + + //修改校验 + private InspectRequestMainDO validatorToUpdate(InspectRequestMainUpdateReqVO updateReqVO, BusinesstypeDO businesstypeDO) { + InspectRequestMainDO mainDo = validatorMainMethod(updateReqVO,businesstypeDO); + //子表校验 + List subList = updateReqVO.getSubList(); + List subDOList = InspectRequestDetailConvert.INSTANCE.convertList05(subList); + for (InspectRequestDetailDO detailDO : subDOList) { + validatorDetailMethod(detailDO,mainDo,businesstypeDO); + } + inspectRequestMainMapper.updateById(mainDo); + inspectRequestDetailMapper.updateBatch(subDOList); + return mainDo; + } + //校验主表公共方法(适用于新增/修改) + private InspectRequestMainDO validatorMainMethod(InspectRequestMainBaseVO baseVO, BusinesstypeDO businesstypeDO){ + InspectRequestMainDO mainDo = InspectRequestMainConvert.INSTANCE.convert(baseVO); + PurchasereceiptRecordDetailDO purchasereceiptRecordDetailDO = validatorPurchasereceiptExist(mainDo.getPurchaseReceiptRecordNumber(), mainDo.getPoNumber(), mainDo.getPoLine(), mainDo.getItemCode()); + mainDo.setReceiveQty(purchasereceiptRecordDetailDO.getQty().intValue()); + validatorRule(mainDo); + businesstypeDO = jobUtils.selectDocumentSettingFromBusinessType("InspectRequest"); + mainDo.setBusinessType(businesstypeDO.getCode()); + mainDo.setFromLocationTypes(businesstypeDO.getOutLocationTypes()); + mainDo.setFromAreaCodes(businesstypeDO.getOutAreaCodes()); + RequestsettingDO requestsettingDO = requestsettingService.selectRequestsettingExist("InspectRequest"); + mainDo.setAutoAgree(requestsettingDO.getAutoAgree()); + mainDo.setAutoCommit(requestsettingDO.getAutoCommit()); + mainDo.setAutoExecute(requestsettingDO.getAutoExecute()); + mainDo.setDirectCreateRecord(requestsettingDO.getDirectCreateRecord()); + return mainDo; + } + //校验子表公共方法(适用于新增/修改) + private void validatorDetailMethod(InspectRequestDetailDO detailDo,InspectRequestMainDO mainDo, BusinesstypeDO businesstypeDO) { + ItembasicDO itembasicDO = validatorItembasic(detailDo.getItemCode()); + detailDo.setItemDesc1(itembasicDO.getDesc1()); + detailDo.setItemDesc2(itembasicDO.getDesc2()); + detailDo.setItemName(itembasicDO.getName()); + detailDo.setProjectCode(itembasicDO.getProject()); + this.ifUomSuccess(itembasicDO.getUom(), detailDo.getUom()); + validatorIfInType(itembasicDO.getType(), businesstypeDO); + validatorLocation(detailDo.getFromLocationCode()); + validatorIfOutInventoryStatuses(detailDo.getInventoryStatus(), businesstypeDO); + validatorIfInFromLocationType(detailDo.getFromLocationCode(), businesstypeDO); + validatorLlocationReturnManagementAccuracy(detailDo.getItemCode(), detailDo.getPackingNumber(), mainDo.getBatch(), detailDo.getFromLocationCode(), detailDo.getInventoryStatus()); + } + + /** + * 校验主表导入,并赋值一些参数 + * + * @param mainDo + * @return + */ + private String validatorInspectRequestMainImport(InspectRequestMainDO mainDo,BusinesstypeDO businesstypeDO) { + StringBuilder message = new StringBuilder(); + try { + PurchasereceiptRecordDetailDO purchasereceiptRecordDetailDO = validatorPurchasereceiptExist(mainDo.getPurchaseReceiptRecordNumber(), mainDo.getPoNumber(), mainDo.getPoLine(), mainDo.getItemCode()); + mainDo.setReceiveQty(purchasereceiptRecordDetailDO.getQty().intValue()); + }catch (Exception ex) { + message.append(ex.getMessage()).append(","); + } + try { + validatorRule(mainDo); + }catch (Exception ex) { + message.append(ex.getMessage()).append(","); + } + businesstypeDO = jobUtils.selectDocumentSettingFromBusinessType("InspectRequest"); + if (businesstypeDO == null) { + message.append("根据业务类型设置未查找到采购退货申请的相关业务类型"); + } + else { + mainDo.setBusinessType(businesstypeDO.getCode()); + mainDo.setFromLocationTypes(businesstypeDO.getOutLocationTypes()); + mainDo.setFromAreaCodes(businesstypeDO.getOutAreaCodes()); + } + RequestsettingDO requestsettingDO = requestsettingService.selectRequestsettingExist("InspectRequest"); + if (requestsettingDO == null) { + message.append("根据申请单设置未查找到采购退货申请的相关业务类型"); + } + else { + mainDo.setAutoAgree(requestsettingDO.getAutoAgree()); + mainDo.setAutoCommit(requestsettingDO.getAutoCommit()); + mainDo.setAutoExecute(requestsettingDO.getAutoExecute()); + mainDo.setDirectCreateRecord(requestsettingDO.getDirectCreateRecord()); + } + try { + ValidationUtils.validate(validator, mainDo); + } catch (Exception ex) { + message.append(ex.getMessage()).append(","); + } + return message.toString(); + } + + /** + * 校验子表导入,并赋值一些参数 + * + * @param detailDo + * @return + */ + private String validatorInspectRequestDetailImport(InspectRequestDetailDO detailDo, InspectRequestMainDO mainDo,BusinesstypeDO businesstypeDO) { + StringBuilder message = new StringBuilder(); + try { + ItembasicDO itembasicDO = validatorItembasic(detailDo.getItemCode()); + detailDo.setItemDesc1(itembasicDO.getDesc1()); + detailDo.setItemDesc2(itembasicDO.getDesc2()); + detailDo.setItemName(itembasicDO.getName()); + detailDo.setProjectCode(itembasicDO.getProject()); + try { + this.ifUomSuccess(itembasicDO.getUom(), detailDo.getUom()); + } catch (Exception ex) { + message.append(ex.getMessage()).append(","); + } + try{ + validatorIfInType(itembasicDO.getType(), businesstypeDO); + }catch (Exception ex) { + message.append(ex.getMessage()).append(","); + } + } catch (Exception ex) { + message.append(ex.getMessage()).append(","); + } + try { + this.validatorLocation(detailDo.getFromLocationCode()); + } catch (Exception ex) { + message.append(ex.getMessage()).append(","); + } + try{ + validatorIfOutInventoryStatuses(detailDo.getInventoryStatus(), businesstypeDO); + }catch (Exception ex) { + message.append(ex.getMessage()).append(","); + } + try{ + validatorIfInFromLocationType(detailDo.getFromLocationCode(), businesstypeDO); + }catch (Exception ex) { + message.append(ex.getMessage()).append(","); + } + try { + validatorLlocationReturnManagementAccuracy(detailDo.getItemCode(), detailDo.getPackingNumber(), mainDo.getBatch(), detailDo.getFromLocationCode(), detailDo.getInventoryStatus()); + } catch (Exception ex) { + message.append(ex.getMessage()).append(","); + } + try { + ValidationUtils.validate(validator, detailDo); + } catch (Exception ex) { + message.append(ex.getMessage()).append(","); + } + return message.toString(); + } } 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 fa1f1064..c58da913 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 @@ -592,21 +592,12 @@ public class JobUtils { } } - //查询库位BQ-QL - public boolean selectlocation(String code) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("code", code); - queryWrapper.eq("available", "TRUE"); - LocationDO locationDO = locationMapper.selectOne(queryWrapper); - return locationDO != null; - } - //从库位未被其他任务占用,有可用库存 public boolean locationUsable(String itemcode, String packingnumber, String batch, String fromlocationcode, List inventoryStatus, BigDecimal requstqty) { if (fromlocationcode.isEmpty()) { return true; } - if (selectlocation(fromlocationcode)) { + if (locationService.selectLocation(fromlocationcode) != null) { return warehouseStockExist(itemcode, packingnumber, batch, fromlocationcode, inventoryStatus, requstqty); } else { throw exception(LOCATION_NOT_CUST,fromlocationcode); @@ -727,7 +718,7 @@ public class JobUtils { */ public Boolean fromInventoryEffectiveCustomer(String locationCode, String itemCode, String packingNumber, String batch, List inventoryStatus) { Boolean returnRes = false; - if (selectlocation(locationCode)) { + if (locationService.selectLocation(locationCode) != null) { fromInventoryEffective(itemCode, packingNumber, batch, locationCode, inventoryStatus); } else{ return returnRes;