yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/controller/admin/item/MdmItemController.java
@@ -3,6 +3,9 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemImportExcelVO; import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemImportRespVO; import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemPageReqVO; import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemRespVO; import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemSaveReqVO; @@ -22,13 +25,17 @@ import cn.iocoder.yudao.module.mes.api.wm.warehouse.dto.MesWmWarehouseRespDTO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.*; import java.util.stream.Collectors; @@ -268,4 +275,26 @@ } } @GetMapping("/get-import-template") @Operation(summary = "è·å¾å¯¼å ¥ç©ææ¨¡æ¿") public void importTemplate(HttpServletResponse response) throws IOException { List<MdmItemImportExcelVO> list = Arrays.asList( MdmItemImportExcelVO.builder().code("ITEM001").name("示ä¾ç©æ").specification("è§æ ¼").status(0).isBatchManaged(false).build() ); ExcelUtils.write(response, "ç©æå¯¼å ¥æ¨¡æ¿.xls", "ç©æ", MdmItemImportExcelVO.class, list); } @PostMapping("/import") @Operation(summary = "å¯¼å ¥ç©æ") @Parameters({ @Parameter(name = "file", description = "Excel æä»¶", required = true), @Parameter(name = "updateSupport", description = "æ¯å¦æ¯ææ´æ°ï¼é»è®¤ä¸º false", example = "true") }) @PreAuthorize("@ss.hasPermission('mdm:item:import')") public CommonResult<MdmItemImportRespVO> importExcel(@RequestParam("file") MultipartFile file, @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { List<MdmItemImportExcelVO> list = ExcelUtils.read(file, MdmItemImportExcelVO.class); return success(itemService.importItemList(list, updateSupport)); } } yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/controller/admin/item/vo/MdmItemImportExcelVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,86 @@ package cn.iocoder.yudao.module.mdm.controller.admin.item.vo; import cn.idev.excel.annotation.ExcelProperty; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.math.BigDecimal; /** * MDM ç©æå¯¼å ¥ Excel VO */ @Data @Builder @AllArgsConstructor @NoArgsConstructor public class MdmItemImportExcelVO { @ExcelProperty("ç©æç¼ç ") private String code; @ExcelProperty("ç©æåç§°") private String name; @ExcelProperty("æ¡ç ") private String barCode; @ExcelProperty("è§æ ¼åå·") private String specification; @ExcelProperty("ç©æåç±»ç¼ç ") private String categoryCode; @ExcelProperty("计éåä½ç¼ç ") private String unitMeasureCode; @ExcelProperty("è¾ åä½1ç¼ç ") private String unitMeasureCode2; @ExcelProperty("è¾ åä½1æ¢ç®æ¯ç") private BigDecimal unitMeasureRate1; @ExcelProperty("è¾ åä½2ç¼ç ") private String unitMeasureCode3; @ExcelProperty("è¾ åä½2æ¢ç®æ¯ç") private BigDecimal unitMeasureRate2; @ExcelProperty("é»è®¤ä»åºç¼ç ") private String warehouseCode; @ExcelProperty("éè´ä»·") private BigDecimal purchasePrice; @ExcelProperty("éå®ä»·") private BigDecimal salesPrice; @ExcelProperty("ææ¬ä»·") private BigDecimal costPrice; @ExcelProperty("å®å ¨åºå") private BigDecimal safetyStock; @ExcelProperty("æä½åºå") private BigDecimal minStock; @ExcelProperty("æé«åºå") private BigDecimal maxStock; @ExcelProperty("æ¯å¦æ¹æ¬¡ç®¡ç") private Boolean isBatchManaged; @ExcelProperty("ä¿è´¨æ(天)") private Integer expiryDay; @ExcelProperty("ç¶æ") private Integer status; @ExcelProperty("æ¯å¦åæ¥å°MES") private Boolean syncMes; @ExcelProperty("夿³¨") private String remark; } yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/controller/admin/item/vo/MdmItemImportRespVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,24 @@ package cn.iocoder.yudao.module.mdm.controller.admin.item.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import lombok.Data; import java.util.List; import java.util.Map; @Schema(description = "管çåå° - MDM ç©æå¯¼å ¥ Response VO") @Data @Builder public class MdmItemImportRespVO { @Schema(description = "å建æåçç©ææ°ç»", requiredMode = Schema.RequiredMode.REQUIRED) private List<String> createList; @Schema(description = "æ´æ°æåçç©ææ°ç»", requiredMode = Schema.RequiredMode.REQUIRED) private List<String> updateList; @Schema(description = "å¯¼å ¥å¤±è´¥çç©æéå key ä¸ºç©æåï¼value 为失败åå ", requiredMode = Schema.RequiredMode.REQUIRED) private Map<String, String> failureList; } yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/controller/admin/unit/MdmUnitMeasureController.java
@@ -3,19 +3,27 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasureImportExcelVO; import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasureImportRespVO; import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasurePageReqVO; import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasureSaveReqVO; import cn.iocoder.yudao.module.mdm.dal.dataobject.unit.MdmUnitMeasureDO; import cn.iocoder.yudao.module.mdm.service.unit.MdmUnitMeasureService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.Arrays; import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @@ -93,4 +101,27 @@ return success(unitMeasureService.getUnitMeasureList(ids)); } @GetMapping("/get-import-template") @Operation(summary = "è·å¾å¯¼å ¥è®¡éå使¨¡æ¿") public void importTemplate(HttpServletResponse response) throws IOException { List<MdmUnitMeasureImportExcelVO> list = Arrays.asList( MdmUnitMeasureImportExcelVO.builder().code("PC").name("ç").primaryFlag(true).changeRate(new java.math.BigDecimal("1")).status(0).remark("示ä¾ï¼ä¸»åä½").build(), MdmUnitMeasureImportExcelVO.builder().code("XIA").name("ç®±").primaryFlag(false).primaryCode("PC").changeRate(new java.math.BigDecimal("100")).status(0).remark("示ä¾ï¼1ç®±=100ç").build() ); ExcelUtils.write(response, "计éåä½å¯¼å ¥æ¨¡æ¿.xls", "计éåä½", MdmUnitMeasureImportExcelVO.class, list); } @PostMapping("/import") @Operation(summary = "å¯¼å ¥è®¡éåä½") @Parameters({ @Parameter(name = "file", description = "Excel æä»¶", required = true), @Parameter(name = "updateSupport", description = "æ¯å¦æ¯ææ´æ°ï¼é»è®¤ä¸º false", example = "true") }) @PreAuthorize("@ss.hasPermission('mdm:unit-measure:import')") public CommonResult<MdmUnitMeasureImportRespVO> importExcel(@RequestParam("file") MultipartFile file, @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { List<MdmUnitMeasureImportExcelVO> list = ExcelUtils.read(file, MdmUnitMeasureImportExcelVO.class); return success(unitMeasureService.importUnitMeasureList(list, updateSupport)); } } yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/controller/admin/unit/vo/MdmUnitMeasureImportExcelVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,45 @@ package cn.iocoder.yudao.module.mdm.controller.admin.unit.vo; import cn.idev.excel.annotation.ExcelProperty; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; import cn.iocoder.yudao.module.system.enums.DictTypeConstants; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.math.BigDecimal; /** * MDM 计éåä½å¯¼å ¥ Excel VO */ @Data @Builder @AllArgsConstructor @NoArgsConstructor public class MdmUnitMeasureImportExcelVO { @ExcelProperty("åä½ç¼ç ") private String code; @ExcelProperty("åä½åç§°") private String name; @ExcelProperty("æ¯å¦ä¸»åä½") private Boolean primaryFlag; @ExcelProperty("主åä½ç¼ç ") private String primaryCode; @ExcelProperty("ä¸ä¸»å使¢ç®æ¯ä¾") private BigDecimal changeRate; @ExcelProperty(value = "ç¶æ", converter = DictConvert.class) @DictFormat(DictTypeConstants.COMMON_STATUS) private Integer status; @ExcelProperty("夿³¨") private String remark; } yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/controller/admin/unit/vo/MdmUnitMeasureImportRespVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,24 @@ package cn.iocoder.yudao.module.mdm.controller.admin.unit.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import lombok.Data; import java.util.List; import java.util.Map; @Schema(description = "管çåå° - MDM 计éåä½å¯¼å ¥ Response VO") @Data @Builder public class MdmUnitMeasureImportRespVO { @Schema(description = "å建æåçå使°ç»", requiredMode = Schema.RequiredMode.REQUIRED) private List<String> createList; @Schema(description = "æ´æ°æåçå使°ç»", requiredMode = Schema.RequiredMode.REQUIRED) private List<String> updateList; @Schema(description = "å¯¼å ¥å¤±è´¥çåä½éå key 为åä½åï¼value 为失败åå ", requiredMode = Schema.RequiredMode.REQUIRED) private Map<String, String> failureList; } yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/enums/ErrorCodeConstants.java
@@ -17,6 +17,7 @@ ErrorCode MDM_ITEM_SKU_IS_DISABLE = new ErrorCode(1_050_005, "ç©æSKUå·²ç¦ç¨"); ErrorCode MDM_ITEM_SKU_CODE_DUPLICATE = new ErrorCode(1_050_006, "SKUç¼ç å·²åå¨"); ErrorCode MDM_ITEM_EXISTS_REFERENCE = new ErrorCode(1_050_007, "ç©æå·²è¢«ä¸å¡å¼ç¨ï¼æ æ³å é¤"); ErrorCode MDM_ITEM_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_050_008, "å¯¼å ¥çç©ææ°æ®ä¸è½ä¸ºç©º"); // ========== ç©æåç±»ç¸å ³ 1-050-051 ~ 1-050-100 ========== ErrorCode MDM_ITEM_CATEGORY_NOT_EXISTS = new ErrorCode(1_050_051, "ç©æåç±»ä¸åå¨"); @@ -31,6 +32,7 @@ ErrorCode MDM_UNIT_MEASURE_CODE_DUPLICATE = new ErrorCode(1_050_102, "计éåä½ç¼ç å·²åå¨"); ErrorCode MDM_UNIT_MEASURE_NAME_DUPLICATE = new ErrorCode(1_050_103, "计éåä½åç§°å·²åå¨"); ErrorCode MDM_UNIT_MEASURE_EXISTS_ITEM = new ErrorCode(1_050_104, "计éåä½è¢«ç©æä½¿ç¨ï¼æ æ³å é¤"); ErrorCode MDM_UNIT_MEASURE_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_050_105, "å¯¼å ¥ç计éå使°æ®ä¸è½ä¸ºç©º"); // ========== åçç¸å ³ 1-050-151 ~ 1-050-200 ========== ErrorCode MDM_BRAND_NOT_EXISTS = new ErrorCode(1_050_151, "åçä¸åå¨"); yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/item/MdmItemService.java
@@ -1,6 +1,8 @@ package cn.iocoder.yudao.module.mdm.service.item; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemImportExcelVO; import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemImportRespVO; import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemPageReqVO; import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemSaveReqVO; import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemDO; @@ -153,4 +155,13 @@ */ List<MdmItemDO> getItemSimpleList(); /** * å¯¼å ¥ç©æ * * @param importList å¯¼å ¥å表 * @param isUpdateSupport æ¯å¦æ¯ææ´æ° * @return å¯¼å ¥ç»æ */ MdmItemImportRespVO importItemList(List<MdmItemImportExcelVO> importList, Boolean isUpdateSupport); } yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/item/MdmItemServiceImpl.java
@@ -2,18 +2,23 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemImportExcelVO; import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemImportRespVO; import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemPageReqVO; import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemSaveReqVO; import cn.iocoder.yudao.module.mdm.dal.dataobject.category.MdmItemCategoryDO; import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemBatchConfigDO; import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemDO; import cn.iocoder.yudao.module.mdm.dal.dataobject.unit.MdmUnitMeasureDO; import cn.iocoder.yudao.module.mdm.dal.mysql.category.MdmItemCategoryMapper; import cn.iocoder.yudao.module.mdm.dal.mysql.item.MdmItemBatchConfigMapper; import cn.iocoder.yudao.module.mdm.dal.mysql.item.MdmItemMapper; import cn.iocoder.yudao.module.mdm.dal.mysql.unit.MdmUnitMeasureMapper; import cn.iocoder.yudao.module.mdm.service.brand.MdmBrandService; import cn.iocoder.yudao.module.mdm.service.category.MdmItemCategoryService; import cn.iocoder.yudao.module.mdm.service.unit.MdmUnitMeasureService; @@ -60,6 +65,12 @@ private MesMdItemApi mesMdItemApi; @Resource private MdmItemBatchConfigMapper itemBatchConfigMapper; @Resource private MdmItemCategoryMapper itemCategoryMapper; @Resource private MdmUnitMeasureMapper unitMeasureMapper; @Resource private MesMdItemTypeApi mesMdItemTypeApi; @@ -422,4 +433,121 @@ } } @Override @Transactional(rollbackFor = Exception.class) public MdmItemImportRespVO importItemList(List<MdmItemImportExcelVO> importList, Boolean isUpdateSupport) { if (CollUtil.isEmpty(importList)) { throw exception(MDM_ITEM_IMPORT_LIST_IS_EMPTY); } MdmItemImportRespVO respVO = MdmItemImportRespVO.builder() .createList(new ArrayList<>()).updateList(new ArrayList<>()) .failureList(new LinkedHashMap<>()).build(); // 1. é¢çï¼åç±»ç¼ç -> IDãåä½ç¼ç -> ID Map<String, Long> categoryCodeIdMap = new HashMap<>(); for (MdmItemCategoryDO category : itemCategoryMapper.selectList()) { if (category.getCode() != null) { categoryCodeIdMap.put(category.getCode(), category.getId()); } } Map<String, Long> unitCodeIdMap = new HashMap<>(); for (MdmUnitMeasureDO unit : unitMeasureMapper.selectList()) { unitCodeIdMap.put(unit.getCode(), unit.getId()); } // 2. éåå¯¼å ¥ for (MdmItemImportExcelVO importVO : importList) { // 2.1 åºç¡æ ¡éª if (StrUtil.isBlank(importVO.getCode()) || StrUtil.isBlank(importVO.getName())) { respVO.getFailureList().put(StrUtil.blankToDefault(importVO.getName(), importVO.getCode()), "ç©æç¼ç åç©æåç§°ä¸è½ä¸ºç©º"); continue; } // 2.2 è§£æåç±» Long categoryId = null; if (StrUtil.isNotBlank(importVO.getCategoryCode())) { categoryId = categoryCodeIdMap.get(importVO.getCategoryCode()); if (categoryId == null) { respVO.getFailureList().put(importVO.getName(), "ç©æåç±»ç¼ç ä¸åå¨ï¼" + importVO.getCategoryCode()); continue; } } // 2.3 è§£æä¸»åä½ Long unitMeasureId = null; if (StrUtil.isNotBlank(importVO.getUnitMeasureCode())) { unitMeasureId = unitCodeIdMap.get(importVO.getUnitMeasureCode()); if (unitMeasureId == null) { respVO.getFailureList().put(importVO.getName(), "计éåä½ç¼ç ä¸åå¨ï¼" + importVO.getUnitMeasureCode()); continue; } } // 2.4 è§£æè¾ åä½1 Long unitMeasureId2 = null; if (StrUtil.isNotBlank(importVO.getUnitMeasureCode2())) { unitMeasureId2 = unitCodeIdMap.get(importVO.getUnitMeasureCode2()); if (unitMeasureId2 == null) { respVO.getFailureList().put(importVO.getName(), "è¾ åä½1ç¼ç ä¸åå¨ï¼" + importVO.getUnitMeasureCode2()); continue; } } // 2.5 è§£æè¾ åä½2 Long unitMeasureId3 = null; if (StrUtil.isNotBlank(importVO.getUnitMeasureCode3())) { unitMeasureId3 = unitCodeIdMap.get(importVO.getUnitMeasureCode3()); if (unitMeasureId3 == null) { respVO.getFailureList().put(importVO.getName(), "è¾ åä½2ç¼ç ä¸åå¨ï¼" + importVO.getUnitMeasureCode3()); continue; } } // 2.6 ç»è£ SaveReqVOï¼å¤ç¨ create/update é»è¾ï¼ MdmItemSaveReqVO saveReqVO = new MdmItemSaveReqVO(); saveReqVO.setCode(importVO.getCode()); saveReqVO.setName(importVO.getName()); saveReqVO.setBarCode(importVO.getBarCode()); saveReqVO.setSpecification(importVO.getSpecification()); saveReqVO.setCategoryId(categoryId); saveReqVO.setUnitMeasureId(unitMeasureId); saveReqVO.setUnitMeasureId2(unitMeasureId2); saveReqVO.setUnitMeasureRate1(importVO.getUnitMeasureRate1()); saveReqVO.setUnitMeasureId3(unitMeasureId3); saveReqVO.setUnitMeasureRate2(importVO.getUnitMeasureRate2()); saveReqVO.setPurchasePrice(importVO.getPurchasePrice()); saveReqVO.setSalesPrice(importVO.getSalesPrice()); saveReqVO.setCostPrice(importVO.getCostPrice()); saveReqVO.setSafetyStock(importVO.getSafetyStock()); saveReqVO.setMinStock(importVO.getMinStock()); saveReqVO.setMaxStock(importVO.getMaxStock()); saveReqVO.setIsBatchManaged(importVO.getIsBatchManaged()); saveReqVO.setExpiryDay(importVO.getExpiryDay()); saveReqVO.setStatus(importVO.getStatus() != null ? importVO.getStatus() : cn.iocoder.yudao.framework.common.enums.CommonStatusEnum.ENABLE.getStatus()); saveReqVO.setSyncMes(importVO.getSyncMes() != null ? importVO.getSyncMes() : false); saveReqVO.setRemark(importVO.getRemark()); saveReqVO.setItemType(1); // é»è®¤ç©æç±»åï¼ç©æ // 2.7 å·²åå¨ï¼æç¼ç å¤æï¼ MdmItemDO existByCode = itemMapper.selectByCode(importVO.getCode()); try { if (existByCode != null) { if (!Boolean.TRUE.equals(isUpdateSupport)) { respVO.getFailureList().put(importVO.getName(), "ç©æç¼ç å·²åå¨"); continue; } saveReqVO.setId(existByCode.getId()); updateItem(saveReqVO); respVO.getUpdateList().add(importVO.getName()); } else { createItem(saveReqVO); respVO.getCreateList().add(importVO.getName()); } } catch (Exception ex) { // åæ¡å¤±è´¥ï¼è®°å½å¹¶ç»§ç» String reason = ex instanceof cn.iocoder.yudao.framework.common.exception.ServiceException ? ((cn.iocoder.yudao.framework.common.exception.ServiceException) ex).getMessage() : ex.getMessage(); respVO.getFailureList().put(importVO.getName(), reason == null ? "å¯¼å ¥å¤±è´¥" : reason); } } return respVO; } } yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/unit/MdmUnitMeasureService.java
@@ -1,6 +1,8 @@ package cn.iocoder.yudao.module.mdm.service.unit; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasureImportExcelVO; import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasureImportRespVO; import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasurePageReqVO; import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasureSaveReqVO; import cn.iocoder.yudao.module.mdm.dal.dataobject.unit.MdmUnitMeasureDO; @@ -99,4 +101,13 @@ */ MdmUnitMeasureDO getUnitMeasureByCode(String code); /** * å¯¼å ¥è®¡éåä½ * * @param importList å¯¼å ¥å表 * @param isUpdateSupport æ¯å¦æ¯ææ´æ° * @return å¯¼å ¥ç»æ */ MdmUnitMeasureImportRespVO importUnitMeasureList(List<MdmUnitMeasureImportExcelVO> importList, Boolean isUpdateSupport); } yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/unit/MdmUnitMeasureServiceImpl.java
@@ -2,8 +2,11 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasureImportExcelVO; import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasureImportRespVO; import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasurePageReqVO; import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasureSaveReqVO; import cn.iocoder.yudao.module.mdm.dal.dataobject.unit.MdmUnitMeasureDO; @@ -125,4 +128,73 @@ return unitMeasureMapper.selectByCode(code); } @Override @Transactional(rollbackFor = Exception.class) public MdmUnitMeasureImportRespVO importUnitMeasureList(List<MdmUnitMeasureImportExcelVO> importList, Boolean isUpdateSupport) { if (CollUtil.isEmpty(importList)) { throw exception(MDM_UNIT_MEASURE_IMPORT_LIST_IS_EMPTY); } MdmUnitMeasureImportRespVO respVO = MdmUnitMeasureImportRespVO.builder() .createList(new ArrayList<>()).updateList(new ArrayList<>()) .failureList(new LinkedHashMap<>()).build(); // 1. 建ç«ç¼ç -> ID æ å°ï¼å å è½½ç°æåä½ï¼åå å æ¬æ¬¡æ°å»ºçåä½ï¼ï¼ç¨äºè§£æ"主åä½ç¼ç "å Map<String, Long> codeIdMap = new HashMap<>(); for (MdmUnitMeasureDO unit : unitMeasureMapper.selectList()) { codeIdMap.put(unit.getCode(), unit.getId()); } // è®°å½æ¬æ¬¡å¯¼å ¥å·²å¤çè¿çç¼ç ï¼é¿å å䏿件å åç»è¡æ¾ä¸å°åå¯¼å ¥ç主åä½ Map<String, Long> importedCodeIdMap = new HashMap<>(); // 2. éåå¯¼å ¥ for (MdmUnitMeasureImportExcelVO importVO : importList) { // 2.1 åºç¡æ ¡éª if (StrUtil.isBlank(importVO.getCode()) || StrUtil.isBlank(importVO.getName())) { respVO.getFailureList().put(StrUtil.blankToDefault(importVO.getName(), importVO.getCode()), "åä½ç¼ç ååä½åç§°ä¸è½ä¸ºç©º"); continue; } // 2.2 è§£æä¸»åä½ IDï¼é主å使¶å¿ 填主åä½ç¼ç ï¼ Long primaryId = null; if (StrUtil.isNotBlank(importVO.getPrimaryCode())) { primaryId = importedCodeIdMap.get(importVO.getPrimaryCode()) != null ? importedCodeIdMap.get(importVO.getPrimaryCode()) : codeIdMap.get(importVO.getPrimaryCode()); if (primaryId == null) { respVO.getFailureList().put(importVO.getName(), "主åä½ç¼ç ä¸åå¨ï¼" + importVO.getPrimaryCode()); continue; } } // 2.3 å·²åå¨ï¼æç¼ç å¤æï¼ MdmUnitMeasureDO existByCode = unitMeasureMapper.selectByCode(importVO.getCode()); if (existByCode != null) { if (!Boolean.TRUE.equals(isUpdateSupport)) { respVO.getFailureList().put(importVO.getName(), "åä½ç¼ç å·²åå¨"); continue; } // æ¯ææ´æ°ï¼ä»¥ç¼ç ä¸ºåæ´æ° MdmUnitMeasureDO updateObj = BeanUtils.toBean(importVO, MdmUnitMeasureDO.class); updateObj.setId(existByCode.getId()); updateObj.setPrimaryId(primaryId); unitMeasureMapper.updateById(updateObj); respVO.getUpdateList().add(importVO.getName()); } else { // 2.4 æ ¡éªåç§°å¯ä¸ï¼æ°å¢åºæ¯ï¼ MdmUnitMeasureDO existByName = unitMeasureMapper.selectByName(importVO.getName()); if (existByName != null) { respVO.getFailureList().put(importVO.getName(), "åä½åç§°å·²åå¨"); continue; } // 2.5 æ°å¢ MdmUnitMeasureDO newObj = BeanUtils.toBean(importVO, MdmUnitMeasureDO.class); newObj.setPrimaryId(primaryId); unitMeasureMapper.insert(newObj); respVO.getCreateList().add(importVO.getName()); // è®°å½æ¬æ¬¡æ°å»ºçç¼ç ï¼ä¾åæä»¶åç»è¡å¼ç¨ importedCodeIdMap.put(importVO.getCode(), newObj.getId()); } } return respVO; } } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemTypeController.java
@@ -3,6 +3,9 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeImportExcelVO; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeImportRespVO; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeListReqVO; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeRespVO; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeSaveReqVO; @@ -10,13 +13,18 @@ import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemTypeService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.Arrays; import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @@ -83,4 +91,27 @@ .setItemOrProduct(itemType.getItemOrProduct()))); } @GetMapping("/get-import-template") @Operation(summary = "è·å¾å¯¼å ¥ç©æäº§åå类模æ¿") public void importTemplate(HttpServletResponse response) throws IOException { List<MesMdItemTypeImportExcelVO> list = Arrays.asList( MesMdItemTypeImportExcelVO.builder().code("RAW").name("åææ").itemOrProduct("ITEM").sort(1).status(0).remark("示ä¾ï¼é¡¶çº§åç±»").build(), MesMdItemTypeImportExcelVO.builder().code("METAL").name("é屿æ").parentCode("RAW").itemOrProduct("ITEM").sort(1).status(0).remark("示ä¾ï¼ç¶åç±»ç¼ç 为 RAW").build() ); ExcelUtils.write(response, "ç©æåç±»å¯¼å ¥æ¨¡æ¿.xls", "ç©æåç±»", MesMdItemTypeImportExcelVO.class, list); } @PostMapping("/import") @Operation(summary = "å¯¼å ¥ç©æäº§ååç±»") @Parameters({ @Parameter(name = "file", description = "Excel æä»¶", required = true), @Parameter(name = "updateSupport", description = "æ¯å¦æ¯ææ´æ°ï¼é»è®¤ä¸º false", example = "true") }) @PreAuthorize("@ss.hasPermission('mes:md-item-type:import')") public CommonResult<MesMdItemTypeImportRespVO> importExcel(@RequestParam("file") MultipartFile file, @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { List<MesMdItemTypeImportExcelVO> list = ExcelUtils.read(file, MesMdItemTypeImportExcelVO.class); return success(itemTypeService.importItemTypeList(list, updateSupport)); } } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/type/MesMdItemTypeImportExcelVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,39 @@ package cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type; import cn.idev.excel.annotation.ExcelProperty; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; /** * MES ç©æäº§ååç±»å¯¼å ¥ Excel VO */ @Data @Builder @AllArgsConstructor @NoArgsConstructor public class MesMdItemTypeImportExcelVO { @ExcelProperty("åç±»ç¼ç ") private String code; @ExcelProperty("åç±»åç§°") private String name; @ExcelProperty("ç¶åç±»ç¼ç ") private String parentCode; @ExcelProperty("ç©æ/äº§åæ è¯") private String itemOrProduct; @ExcelProperty("æ¾ç¤ºæåº") private Integer sort; @ExcelProperty("ç¶æ") private Integer status; @ExcelProperty("夿³¨") private String remark; } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/type/MesMdItemTypeImportRespVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,24 @@ package cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import lombok.Data; import java.util.List; import java.util.Map; @Schema(description = "管çåå° - MES ç©æäº§ååç±»å¯¼å ¥ Response VO") @Data @Builder public class MesMdItemTypeImportRespVO { @Schema(description = "å建æåçåç±»æ°ç»", requiredMode = Schema.RequiredMode.REQUIRED) private List<String> createList; @Schema(description = "æ´æ°æåçåç±»æ°ç»", requiredMode = Schema.RequiredMode.REQUIRED) private List<String> updateList; @Schema(description = "å¯¼å ¥å¤±è´¥çåç±»éå key 为åç±»åï¼value 为失败åå ", requiredMode = Schema.RequiredMode.REQUIRED) private Map<String, String> failureList; } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
@@ -18,6 +18,7 @@ ErrorCode MD_ITEM_TYPE_CODE_DUPLICATE = new ErrorCode(1_040_100_005, "åä¸ç¶åç±»ä¸å·²åå¨è¯¥ç¼ç çåç±»"); ErrorCode MD_ITEM_TYPE_PARENT_IS_CHILD = new ErrorCode(1_040_100_006, "ä¸è½è®¾ç½®èªå·±çåå类为ç¶åç±»"); ErrorCode MD_ITEM_TYPE_EXITS_ITEM = new ErrorCode(1_040_100_007, "该åç±»ä¸åå¨ç©æï¼æ æ³å é¤"); ErrorCode MD_ITEM_TYPE_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_040_100_008, "å¯¼å ¥çç©æåç±»æ°æ®ä¸è½ä¸ºç©º"); // ========== MES åºç¡æ°æ®-计éåä½ï¼1-040-101-000ï¼ ========== ErrorCode MD_UNIT_MEASURE_NOT_EXISTS = new ErrorCode(1_040_101_000, "计éåä½ä¸åå¨"); yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemTypeService.java
@@ -1,5 +1,7 @@ package cn.iocoder.yudao.module.mes.service.md.item; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeImportExcelVO; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeImportRespVO; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeListReqVO; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO; @@ -90,4 +92,13 @@ */ List<MesMdItemTypeDO> getItemTypeChildrenList(Long parentId); /** * å¯¼å ¥ç©æäº§ååç±» * * @param importList å¯¼å ¥å表 * @param isUpdateSupport æ¯å¦æ¯ææ´æ° * @return å¯¼å ¥ç»æ */ MesMdItemTypeImportRespVO importItemTypeList(List<MesMdItemTypeImportExcelVO> importList, Boolean isUpdateSupport); } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemTypeServiceImpl.java
@@ -2,10 +2,13 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mdm.api.category.MdmItemCategoryApi; import cn.iocoder.yudao.module.mdm.api.category.dto.MdmItemCategoryRespDTO; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeImportExcelVO; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeImportRespVO; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeListReqVO; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO; @@ -230,4 +233,77 @@ return mesDO; } @Override @org.springframework.transaction.annotation.Transactional(rollbackFor = Exception.class) public MesMdItemTypeImportRespVO importItemTypeList(List<MesMdItemTypeImportExcelVO> importList, Boolean isUpdateSupport) { if (CollUtil.isEmpty(importList)) { throw exception(MD_ITEM_TYPE_IMPORT_LIST_IS_EMPTY); } MesMdItemTypeImportRespVO respVO = MesMdItemTypeImportRespVO.builder() .createList(new ArrayList<>()).updateList(new ArrayList<>()) .failureList(new LinkedHashMap<>()).build(); // 1. 建ç«ç¼ç -> ID æ å°ï¼ç°æåç±» + æ¬æ¬¡æ°å»ºåç±»ï¼ï¼ç¨äºè§£æ"ç¶åç±»ç¼ç "å Map<String, Long> codeIdMap = new HashMap<>(); for (MesMdItemTypeDO itemType : itemTypeMapper.selectList()) { codeIdMap.put(itemType.getCode(), itemType.getId()); } Map<String, Long> importedCodeIdMap = new HashMap<>(); // 2. éåå¯¼å ¥ for (MesMdItemTypeImportExcelVO importVO : importList) { // 2.1 åºç¡æ ¡éª if (StrUtil.isBlank(importVO.getCode()) || StrUtil.isBlank(importVO.getName())) { respVO.getFailureList().put(StrUtil.blankToDefault(importVO.getName(), importVO.getCode()), "åç±»ç¼ç ååç±»åç§°ä¸è½ä¸ºç©º"); continue; } // 2.2 è§£æç¶åç±» ID Long parentId = MesMdItemTypeDO.PARENT_ID_ROOT; if (StrUtil.isNotBlank(importVO.getParentCode())) { Long pid = importedCodeIdMap.get(importVO.getParentCode()) != null ? importedCodeIdMap.get(importVO.getParentCode()) : codeIdMap.get(importVO.getParentCode()); if (pid == null) { respVO.getFailureList().put(importVO.getName(), "ç¶åç±»ç¼ç ä¸åå¨ï¼" + importVO.getParentCode()); continue; } parentId = pid; } // 2.3 å·²åå¨ï¼æç¼ç å¤æï¼ MesMdItemTypeDO existByCode = itemTypeMapper.selectByCode(importVO.getCode()); if (existByCode != null) { if (!Boolean.TRUE.equals(isUpdateSupport)) { respVO.getFailureList().put(importVO.getName(), "åç±»ç¼ç å·²åå¨"); continue; } MesMdItemTypeDO updateObj = BeanUtils.toBean(importVO, MesMdItemTypeDO.class); updateObj.setId(existByCode.getId()); updateObj.setParentId(parentId); itemTypeMapper.updateById(updateObj); respVO.getUpdateList().add(importVO.getName()); } else { // 2.4 æ ¡éªåä¸ç¶åç±»ä¸åç§°å¯ä¸ MesMdItemTypeDO existByName = itemTypeMapper.selectByParentIdAndName(parentId, importVO.getName()); if (existByName != null) { respVO.getFailureList().put(importVO.getName(), "åä¸ç¶åç±»ä¸å·²åå¨è¯¥åç§°çåç±»"); continue; } // 2.5 æ ¡éªåä¸ç¶åç±»ä¸ç¼ç å¯ä¸ MesMdItemTypeDO existByParentCode = itemTypeMapper.selectByParentIdAndCode(parentId, importVO.getCode()); if (existByParentCode != null) { respVO.getFailureList().put(importVO.getName(), "åä¸ç¶åç±»ä¸å·²åå¨è¯¥ç¼ç çåç±»"); continue; } // 2.6 æ°å¢ MesMdItemTypeDO newObj = BeanUtils.toBean(importVO, MesMdItemTypeDO.class); newObj.setParentId(parentId); itemTypeMapper.insert(newObj); respVO.getCreateList().add(importVO.getName()); importedCodeIdMap.put(importVO.getCode(), newObj.getId()); } } return respVO; } }