yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemController.java
@@ -8,6 +8,8 @@ import cn.iocoder.yudao.framework.common.util.collection.MapUtils; 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.MesMdItemImportExcelVO; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemImportRespVO; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemRespVO; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemSaveReqVO; @@ -19,6 +21,7 @@ import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; 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; @@ -26,8 +29,11 @@ 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.math.BigDecimal; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; @@ -103,6 +109,37 @@ buildItemVOList(pageResult.getList())); } @GetMapping("/get-import-template") @Operation(summary = "è·å¾ç©æå¯¼å ¥æ¨¡æ¿") @PreAuthorize("@ss.hasPermission('mes:md-item:import')") public void importTemplate(HttpServletResponse response) throws IOException { List<MesMdItemImportExcelVO> list = Arrays.asList( MesMdItemImportExcelVO.builder() .code("ITEM_RAW_001").name("éæ").specification("Φ8mm").color("红è²") .unitMeasureName("åå ").itemTypeName("åææ") .safeStockFlag(true).minStock(new BigDecimal("100")).maxStock(new BigDecimal("10000")) .highValue(false).batchFlag(true).remark("示ä¾ï¼è®¡éåä½ãç©æå类请填åç³»ç»ä¸å·²åå¨çåç§°").build(), MesMdItemImportExcelVO.builder() .code("ITEM_RAW_002").name("éæ").specification("Φ9.5mm").color("èè²") .unitMeasureName("åå ").itemTypeName("åææ") .safeStockFlag(false).highValue(false).batchFlag(false).remark("示ä¾ï¼é¢è²ç¨äºåºåååå·ä¸åé¢è²çç©æ").build() ); ExcelUtils.writeTemplate(response, "ç©æå¯¼å ¥æ¨¡æ¿.xls", "ç©æ", MesMdItemImportExcelVO.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:import')") public CommonResult<MesMdItemImportRespVO> importExcel(@RequestParam("file") MultipartFile file, @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { List<MesMdItemImportExcelVO> list = ExcelUtils.read(file, MesMdItemImportExcelVO.class); return success(itemService.importItemList(list, updateSupport)); } // ==================== æ¼æ¥ VO ==================== private List<MesMdItemRespVO> buildItemVOList(List<MesMdItemDO> list) { yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemImportExcelVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,58 @@ package cn.iocoder.yudao.module.mes.controller.admin.md.item.vo; import cn.idev.excel.annotation.ExcelProperty; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.math.BigDecimal; /** * MES ç©æäº§åå¯¼å ¥ Excel VO * * @author è¶ çº§ç®¡çå */ @Data @Builder @AllArgsConstructor @NoArgsConstructor public class MesMdItemImportExcelVO { @ExcelProperty("ç©æç¼ç ") private String code; @ExcelProperty("ç©æåç§°") private String name; @ExcelProperty("è§æ ¼åå·") private String specification; @ExcelProperty("é¢è²") private String color; @ExcelProperty("计éåä½") private String unitMeasureName; @ExcelProperty("ç©æåç±»") private String itemTypeName; @ExcelProperty("æ¯å¦å¯ç¨å®å ¨åºå") private Boolean safeStockFlag; @ExcelProperty("æä½åºåé") private BigDecimal minStock; @ExcelProperty("æé«åºåé") private BigDecimal maxStock; @ExcelProperty("æ¯å¦é«å¼ç©æ") private Boolean highValue; @ExcelProperty("æ¯å¦å¯ç¨æ¹æ¬¡ç®¡ç") private Boolean batchFlag; @ExcelProperty("夿³¨") private String remark; } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemImportRespVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,34 @@ package cn.iocoder.yudao.module.mes.controller.admin.md.item.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import lombok.Data; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @Schema(description = "管çåå° - MES ç©æäº§åå¯¼å ¥ Response VO") @Data @Builder public class MesMdItemImportRespVO { @Schema(description = "å建æåçç©æç¼ç æ°ç»", requiredMode = Schema.RequiredMode.REQUIRED) private List<String> createCodes; @Schema(description = "æ´æ°æåçç©æç¼ç æ°ç»", requiredMode = Schema.RequiredMode.REQUIRED) private List<String> updateCodes; @Schema(description = "å¯¼å ¥å¤±è´¥çç©æç¼ç éå key ä¸ºç©æç¼ç ï¼æè¡å·ï¼ï¼value 为失败åå ", requiredMode = Schema.RequiredMode.REQUIRED) private Map<String, String> failureCodes; public static MesMdItemImportRespVO empty() { return MesMdItemImportRespVO.builder() .createCodes(new ArrayList<>()) .updateCodes(new ArrayList<>()) .failureCodes(new LinkedHashMap<>()) .build(); } } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemPageReqVO.java
@@ -26,6 +26,9 @@ @Schema(description = "è§æ ¼åå·", example = "60g") private String specification; @Schema(description = "é¢è²", example = "红è²") private String color; @Schema(description = "ç©æåç±»ç¼å·", example = "1") private Long itemTypeId; yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemRespVO.java
@@ -32,6 +32,10 @@ @ExcelProperty("è§æ ¼åå·") private String specification; @Schema(description = "é¢è²", example = "红è²") @ExcelProperty("é¢è²") private String color; @Schema(description = "计éåä½ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "202") private Long unitMeasureId; @Schema(description = "计éåä½åç§°", example = "个") yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemSaveReqVO.java
@@ -25,6 +25,9 @@ @Schema(description = "è§æ ¼åå·", example = "M6*20") private String specification; @Schema(description = "é¢è²", example = "红è²") private String color; @Schema(description = "计éåä½ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "202") @NotNull(message = "计éåä½ä¸è½ä¸ºç©º") private Long unitMeasureId; yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdItemDO.java
@@ -48,6 +48,12 @@ */ private String specification; /** * é¢è² * * ç¨äºåºåååå·ä¸åé¢è²çç©æ */ private String color; /** * 计éåä½ç¼å· * * å ³è {@link MesMdUnitMeasureDO#getId()} yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/item/MesMdItemMapper.java
@@ -37,6 +37,7 @@ .inIfPresent(MesMdItemDO::getItemTypeId, itemTypeIds) .inIfPresent(MesMdItemDO::getId, StrUtil.isBlank(reqVO.getIds()) ? null : StrUtils.splitToLong(reqVO.getIds(), ",")) .likeIfPresent(MesMdItemDO::getColor, reqVO.getColor()) .eqIfPresent(MesMdItemDO::getStatus, reqVO.getStatus()) .betweenIfPresent(MesMdItemDO::getCreateTime, reqVO.getCreateTime()) .orderByAsc(MesMdItemTypeDO::getSort) yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemService.java
@@ -2,6 +2,8 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemImportExcelVO; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemImportRespVO; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import jakarta.validation.Valid; @@ -140,4 +142,13 @@ */ MesMdItemDO validateItemExistsByMdmItemId(Long mdmItemId); /** * æ¹éå¯¼å ¥ç©æäº§å * * @param importList å¯¼å ¥æ°æ® * @param updateSupport æ¯å¦æ¯ææ´æ°å·²åå¨çç©æ * @return å¯¼å ¥ç»æ */ MesMdItemImportRespVO importItemList(List<MesMdItemImportExcelVO> importList, Boolean updateSupport); } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.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.mes.controller.admin.md.item.vo.MesMdItemImportExcelVO; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemImportRespVO; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemSaveReqVO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; @@ -12,6 +15,7 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; import cn.iocoder.yudao.module.mes.dal.mysql.md.item.MesMdItemMapper; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeListReqVO; import cn.iocoder.yudao.module.mes.enums.md.MesMdItemTypeEnum; import cn.iocoder.yudao.module.mes.enums.wm.BarcodeBizTypeEnum; @@ -408,4 +412,82 @@ return item; } } @Override @Transactional(rollbackFor = Exception.class) public MesMdItemImportRespVO importItemList(List<MesMdItemImportExcelVO> importList, Boolean updateSupport) { MesMdItemImportRespVO respVO = MesMdItemImportRespVO.empty(); if (CollUtil.isEmpty(importList)) { return respVO; } // é¢å 载计éåä½ãç©æåç±»ï¼æå称建索å¼ï¼é¿å éè¡æ¥åº Map<String, Long> unitMeasureMap = new HashMap<>(); unitMeasureService.getUnitMeasureListByStatus(CommonStatusEnum.ENABLE.getStatus()) .forEach(unit -> unitMeasureMap.put(unit.getName().trim(), unit.getId())); Map<String, Long> itemTypeMap = new HashMap<>(); itemTypeService.getItemTypeList(new MesMdItemTypeListReqVO()) .forEach(type -> itemTypeMap.put(type.getName().trim(), type.getId())); int index = 0; for (MesMdItemImportExcelVO row : importList) { index++; String key = StrUtil.isNotBlank(row.getCode()) ? row.getCode().trim() : "第 " + index + " è¡"; // 1. åºç¡æ ¡éª if (StrUtil.isBlank(row.getCode())) { respVO.getFailureCodes().put(key, "ç©æç¼ç ä¸è½ä¸ºç©º"); continue; } if (StrUtil.isBlank(row.getName())) { respVO.getFailureCodes().put(key, "ç©æåç§°ä¸è½ä¸ºç©º"); continue; } String code = row.getCode().trim(); String unitName = StrUtil.trim(row.getUnitMeasureName()); Long unitMeasureId = unitName == null ? null : unitMeasureMap.get(unitName); if (unitMeasureId == null) { respVO.getFailureCodes().put(key, "计éåä½[" + unitName + "]ä¸åå¨"); continue; } String typeName = StrUtil.trim(row.getItemTypeName()); Long itemTypeId = typeName == null ? null : itemTypeMap.get(typeName); if (itemTypeId == null) { respVO.getFailureCodes().put(key, "ç©æåç±»[" + typeName + "]ä¸åå¨"); continue; } // 2. ç»è£ ä¿å对象ï¼é¢è²ä¸å¹¶åå ¥ï¼ MesMdItemSaveReqVO saveReqVO = new MesMdItemSaveReqVO(); saveReqVO.setCode(code); saveReqVO.setName(row.getName().trim()); saveReqVO.setSpecification(StrUtil.trim(row.getSpecification())); saveReqVO.setColor(StrUtil.trim(row.getColor())); saveReqVO.setUnitMeasureId(unitMeasureId); saveReqVO.setItemTypeId(itemTypeId); saveReqVO.setSafeStockFlag(row.getSafeStockFlag()); saveReqVO.setMinStock(row.getMinStock()); saveReqVO.setMaxStock(row.getMaxStock()); saveReqVO.setHighValue(row.getHighValue()); saveReqVO.setBatchFlag(row.getBatchFlag()); saveReqVO.setRemark(StrUtil.trim(row.getRemark())); // 3. æ°å¢ææ´æ°ï¼åè¡å¤±è´¥ä¸å½±åæ´æ¹ MesMdItemDO existItem = itemMapper.selectByCode(code); try { if (existItem == null) { createItem(saveReqVO); respVO.getCreateCodes().add(code); } else if (!Boolean.TRUE.equals(updateSupport)) { respVO.getFailureCodes().put(key, "ç©æç¼ç å·²åå¨ï¼å¾éãæ¯å¦è¦çã坿´æ°ï¼"); } else { saveReqVO.setId(existItem.getId()); saveReqVO.setMdmItemId(existItem.getMdmItemId()); updateItem(saveReqVO); respVO.getUpdateCodes().add(code); } } catch (Exception e) { respVO.getFailureCodes().put(key, e.getMessage() == null ? "å¯¼å ¥å¤±è´¥" : e.getMessage()); } } return respVO; } }