From 4a4a287fb70cc9cc4e5f2129b2203d2580b52f4a Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 15 Feb 2026 15:43:27 +0800 Subject: [PATCH] feat(mes): 完善物料分类与物料产品后端功能 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemController.java | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemTypeController.java | 18 ------------------ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/item/MesMdItemMapper.java | 5 +++-- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java | 2 ++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemService.java | 36 +++++++++++++++++++++++------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemTypeService.java | 8 ++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemTypeServiceImpl.java | 40 ++++++++++++++++++++++++++-------------- 8 files changed, 224 insertions(+), 91 deletions(-) diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemController.java index cb89fac..0dffbe1 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemController.java @@ -1,19 +1,26 @@ package cn.iocoder.yudao.module.mes.controller.admin.md.item; +import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; +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; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +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; @@ -21,13 +28,17 @@ 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.Collections; import java.util.List; +import java.util.Map; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; @Tag(name = "管理后台 - MES 物料产品") @RestController @@ -38,6 +49,9 @@ public class MesMdItemController { @Resource private MesMdItemService itemService; + @Resource + private MesMdItemTypeService itemTypeService; + @PostMapping("/create") @Operation(summary = "创建物料产品") @PreAuthorize("@ss.hasPermission('mes:md-item:create')") @@ -75,14 +89,15 @@ public class MesMdItemController { @Operation(summary = "获得物料产品分页") @PreAuthorize("@ss.hasPermission('mes:md-item:query')") public CommonResult> getItemPage(@Valid MesMdItemPageReqVO pageReqVO) { - return success(itemService.getItemVOPage(pageReqVO)); + PageResult pageResult = itemService.getItemPage(pageReqVO); + return success(new PageResult<>(buildItemVOList(pageResult.getList()), pageResult.getTotal())); } @GetMapping("/simple-list") @Operation(summary = "获得物料产品精简列表", description = "只包含被开启的物料,主要用于前端的下拉选项") public CommonResult> getItemSimpleList() { - List list = itemService.getItemVOListByStatus(CommonStatusEnum.ENABLE.getStatus()); - return success(convertList(list, item -> new MesMdItemRespVO() + List list = itemService.getItemListByStatus(CommonStatusEnum.ENABLE.getStatus()); + return success(convertList(buildItemVOList(list), item -> new MesMdItemRespVO() .setId(item.getId()).setName(item.getName()).setCode(item.getCode()) .setItemTypeId(item.getItemTypeId()).setItemTypeName(item.getItemTypeName()) .setUnitOfMeasure(item.getUnitOfMeasure()))); @@ -95,12 +110,52 @@ public class MesMdItemController { public void exportItemExcel(@Valid MesMdItemPageReqVO pageReqVO, HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - PageResult pageResult = itemService.getItemVOPage(pageReqVO); + PageResult pageResult = itemService.getItemPage(pageReqVO); // 导出 Excel ExcelUtils.write(response, "物料产品.xls", "数据", MesMdItemRespVO.class, - pageResult.getList()); + buildItemVOList(pageResult.getList())); } - // TODO @AI:缺少批量导入; + @GetMapping("/get-import-template") + @Operation(summary = "获得物料导入模板") + public void importTemplate(HttpServletResponse response) throws IOException { + // 手动创建导出 demo + List list = Collections.singletonList( + MesMdItemImportExcelVO.builder().code("ITEM001").name("螺丝").specification("M6*20") + .unitOfMeasure("PCS").itemTypeId(1L).status(0).build() + ); + // 输出 + ExcelUtils.write(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:create')") + public CommonResult importExcel(@RequestParam("file") MultipartFile file, + @RequestParam(value = "updateSupport", required = false, + defaultValue = "false") Boolean updateSupport) throws Exception { + List list = ExcelUtils.read(file, MesMdItemImportExcelVO.class); + return success(itemService.importItemList(list, updateSupport)); + } + + // ==================== 拼接 VO ==================== + + private List buildItemVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + Map itemTypeMap = itemTypeService.getItemTypeMap( + convertSet(list, MesMdItemDO::getItemTypeId)); + return BeanUtils.toBean(list, MesMdItemRespVO.class, item -> + MapUtils.findAndThen(itemTypeMap, item.getItemTypeId(), + itemType -> { + item.setItemTypeName(itemType.getName()); + item.setItemOrProduct(itemType.getItemOrProduct()); + })); + } } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemTypeController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemTypeController.java index dc1db0e..2cbf2f8 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemTypeController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemTypeController.java @@ -1,10 +1,8 @@ package cn.iocoder.yudao.module.mes.controller.admin.md.item; -import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; 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.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; @@ -14,16 +12,13 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; 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 java.io.IOException; import java.util.List; -import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; @@ -86,17 +81,4 @@ public class MesMdItemTypeController { .setId(itemType.getId()).setName(itemType.getName()).setParentId(itemType.getParentId()))); } - // TODO @AI:不需要导出; - @GetMapping("/export-excel") - @Operation(summary = "导出物料产品分类 Excel") - @PreAuthorize("@ss.hasPermission('mes:md-item-type:export')") - @ApiAccessLog(operateType = EXPORT) - public void exportItemTypeExcel(@Valid MesMdItemTypeListReqVO listReqVO, - HttpServletResponse response) throws IOException { - List list = itemTypeService.getItemTypeList(listReqVO); - // 导出 Excel - ExcelUtils.write(response, "物料产品分类.xls", "数据", MesMdItemTypeRespVO.class, - BeanUtils.toBean(list, MesMdItemTypeRespVO.class)); - } - } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/item/MesMdItemMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/item/MesMdItemMapper.java index 173a9fe..eac8271 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/item/MesMdItemMapper.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/item/MesMdItemMapper.java @@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemPageReqV import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import org.apache.ibatis.annotations.Mapper; +import java.util.Collection; import java.util.List; /** @@ -17,11 +18,11 @@ import java.util.List; @Mapper public interface MesMdItemMapper extends BaseMapperX { - default PageResult selectPage(MesMdItemPageReqVO reqVO) { + default PageResult selectPage(MesMdItemPageReqVO reqVO, Collection itemTypeIds) { return selectPage(reqVO, new LambdaQueryWrapperX() .likeIfPresent(MesMdItemDO::getCode, reqVO.getCode()) .likeIfPresent(MesMdItemDO::getName, reqVO.getName()) - .eqIfPresent(MesMdItemDO::getItemTypeId, reqVO.getItemTypeId()) + .inIfPresent(MesMdItemDO::getItemTypeId, itemTypeIds) .eqIfPresent(MesMdItemDO::getStatus, reqVO.getStatus()) .betweenIfPresent(MesMdItemDO::getCreateTime, reqVO.getCreateTime()) .orderByDesc(MesMdItemDO::getId)); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index 17d7b3f..91f01a5 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -21,11 +21,13 @@ public interface ErrorCodeConstants { // ========== MES 基础数据-计量单位(1-040-101-000) ========== ErrorCode MD_UNIT_MEASURE_NOT_EXISTS = new ErrorCode(1_040_101_000, "计量单位不存在"); + ErrorCode MD_UNIT_MEASURE_CODE_DUPLICATE = new ErrorCode(1_040_101_001, "计量单位编码已存在"); // ========== MES 基础数据-物料(1-040-102-000) ========== ErrorCode MD_ITEM_NOT_EXISTS = new ErrorCode(1_040_102_000, "物料不存在"); ErrorCode MD_ITEM_CODE_DUPLICATE = new ErrorCode(1_040_102_001, "物料编码已存在"); ErrorCode MD_ITEM_NAME_DUPLICATE = new ErrorCode(1_040_102_002, "物料名称已存在"); + ErrorCode MD_ITEM_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_040_102_003, "导入物料数据不能为空"); // ========== MES 基础数据-客户(1-040-103-000) ========== ErrorCode MD_CLIENT_NOT_EXISTS = new ErrorCode(1_040_103_000, "客户不存在"); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemService.java index c85fb66..f2b7c26 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemService.java @@ -1,8 +1,9 @@ package cn.iocoder.yudao.module.mes.service.md.item; import cn.iocoder.yudao.framework.common.pojo.PageResult; +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; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import jakarta.validation.Valid; @@ -51,37 +52,37 @@ public interface MesMdItemService { MesMdItemDO getItem(Long id); /** - * 获得物料产品 VO 分页 + * 获得物料产品分页 * * @param pageReqVO 分页查询 * @return 物料产品分页 */ - PageResult getItemVOPage(MesMdItemPageReqVO pageReqVO); + PageResult getItemPage(MesMdItemPageReqVO pageReqVO); /** - * 获得指定状态的物料产品 VO 列表 + * 获得指定状态的物料产品列表 * * @param status 状态 - * @return 物料产品 VO 列表 + * @return 物料产品列表 */ - List getItemVOListByStatus(Integer status); + List getItemListByStatus(Integer status); /** - * 获得物料产品 VO 列表 + * 获得物料产品列表 * * @param ids 编号数组 - * @return 物料产品 VO 列表 + * @return 物料产品列表 */ - List getItemVOList(Collection ids); + List getItemList(Collection ids); /** - * 获得物料产品 VO Map + * 获得物料产品 Map * * @param ids 编号数组 - * @return 物料产品 VO Map + * @return 物料产品 Map */ - default Map getItemVOMap(Collection ids) { - return convertMap(getItemVOList(ids), MesMdItemRespVO::getId); + default Map getItemMap(Collection ids) { + return convertMap(getItemList(ids), MesMdItemDO::getId); } /** @@ -92,4 +93,13 @@ public interface MesMdItemService { */ Long getItemCountByItemTypeId(Long itemTypeId); + /** + * 批量导入物料 + * + * @param importItems 导入物料列表 + * @param updateSupport 是否支持更新 + * @return 导入结果 + */ + MesMdItemImportRespVO importItemList(List importItems, boolean updateSupport); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java index 6dced80..fe6a8e8 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java @@ -1,25 +1,25 @@ package cn.iocoder.yudao.module.mes.service.md.item; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.collection.MapUtils; 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.MesMdItemRespVO; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO; import cn.iocoder.yudao.module.mes.dal.mysql.md.item.MesMdItemMapper; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; @@ -51,10 +51,8 @@ public class MesMdItemServiceImpl implements MesMdItemService { // 插入 MesMdItemDO item = BeanUtils.toBean(createReqVO, MesMdItemDO.class); - // 如果未启用安全库存,清零库存上下限 - clearStockIfNotSafe(item); + clearStockIfNotSafe(item); // 如果未启用安全库存,清零库存上下限 itemMapper.insert(item); - // 返回 return item.getId(); } @@ -71,8 +69,7 @@ public class MesMdItemServiceImpl implements MesMdItemService { // 更新 MesMdItemDO updateObj = BeanUtils.toBean(updateReqVO, MesMdItemDO.class); - // 如果未启用安全库存,清零库存上下限 - clearStockIfNotSafe(updateObj); + clearStockIfNotSafe(updateObj); // 如果未启用安全库存,清零库存上下限 itemMapper.updateById(updateObj); } @@ -129,8 +126,7 @@ public class MesMdItemServiceImpl implements MesMdItemService { if (Boolean.TRUE.equals(item.getSafeStockFlag())) { return; } - item.setMinStock(BigDecimal.ZERO); - item.setMaxStock(BigDecimal.ZERO); + item.setMinStock(BigDecimal.ZERO).setMaxStock(BigDecimal.ZERO); } @Override @@ -139,39 +135,30 @@ public class MesMdItemServiceImpl implements MesMdItemService { } @Override - public PageResult getItemVOPage(MesMdItemPageReqVO pageReqVO) { - PageResult pageResult = itemMapper.selectPage(pageReqVO); - return new PageResult<>(buildItemVOList(pageResult.getList()), pageResult.getTotal()); + public PageResult getItemPage(MesMdItemPageReqVO pageReqVO) { + // 查找时,如果查找某个分类编号,则包含它的子分类 + Set itemTypeIds = null; + if (pageReqVO.getItemTypeId() != null) { + itemTypeIds = new HashSet<>(); + itemTypeIds.add(pageReqVO.getItemTypeId()); + List children = itemTypeService.getItemTypeChildrenList(pageReqVO.getItemTypeId()); + itemTypeIds.addAll(convertSet(children, MesMdItemTypeDO::getId)); + } + // 分页查询 + return itemMapper.selectPage(pageReqVO, itemTypeIds); } @Override - public List getItemVOListByStatus(Integer status) { - List list = itemMapper.selectListByStatus(status); - return buildItemVOList(list); + public List getItemListByStatus(Integer status) { + return itemMapper.selectListByStatus(status); } @Override - public List getItemVOList(Collection ids) { + public List getItemList(Collection ids) { if (CollUtil.isEmpty(ids)) { return Collections.emptyList(); } - List list = itemMapper.selectByIds(ids); - return buildItemVOList(list); - } - - private List buildItemVOList(List list) { - if (CollUtil.isEmpty(list)) { - return Collections.emptyList(); - } - Map itemTypeMap = itemTypeService.getItemTypeMap( - convertSet(list, MesMdItemDO::getItemTypeId)); - return BeanUtils.toBean(list, MesMdItemRespVO.class, item -> { - MapUtils.findAndThen(itemTypeMap, item.getItemTypeId(), - itemType -> { - item.setItemTypeName(itemType.getName()); - item.setItemOrProduct(itemType.getItemOrProduct()); - }); - }); + return itemMapper.selectByIds(ids); } @Override @@ -179,4 +166,80 @@ public class MesMdItemServiceImpl implements MesMdItemService { return itemMapper.selectCountByItemTypeId(itemTypeId); } + @Override + @Transactional(rollbackFor = Exception.class) + public MesMdItemImportRespVO importItemList(List importItems, boolean updateSupport) { + // 1. 参数校验 + if (CollUtil.isEmpty(importItems)) { + throw exception(MD_ITEM_IMPORT_LIST_IS_EMPTY); + } + + // 2. 遍历,逐个创建 or 更新 + MesMdItemImportRespVO respVO = MesMdItemImportRespVO.builder() + .createCodes(new ArrayList<>()).updateCodes(new ArrayList<>()) + .failureCodes(new LinkedHashMap<>()).build(); + AtomicInteger index = new AtomicInteger(1); + importItems.forEach(importItem -> { + int currentIndex = index.getAndIncrement(); + // 2.1 校验字段 + String key = StrUtil.blankToDefault(importItem.getCode(), "第 " + currentIndex + " 行"); + if (StrUtil.isBlank(importItem.getCode())) { + respVO.getFailureCodes().put(key, "物料编码不能为空"); + return; + } + if (StrUtil.isBlank(importItem.getName())) { + respVO.getFailureCodes().put(key, "物料名称不能为空"); + return; + } + if (StrUtil.isBlank(importItem.getUnitOfMeasure())) { + respVO.getFailureCodes().put(key, "单位编码不能为空"); + return; + } + if (importItem.getItemTypeId() == null) { + respVO.getFailureCodes().put(key, "物料分类编号不能为空"); + return; + } + // 2.2 校验分类是否存在 + try { + validateItemTypeExists(importItem.getItemTypeId()); + } catch (ServiceException ex) { + respVO.getFailureCodes().put(key, ex.getMessage()); + return; + } + + // 2.3 判断:创建 or 更新 + MesMdItemDO existItem = itemMapper.selectByCode(importItem.getCode()); + if (existItem == null) { + // 2.3.1 创建 + try { + validateItemNameUnique(null, importItem.getName()); + } catch (ServiceException ex) { + respVO.getFailureCodes().put(key, ex.getMessage()); + return; + } + MesMdItemDO item = BeanUtils.toBean(importItem, MesMdItemDO.class); + clearStockIfNotSafe(item); + itemMapper.insert(item); + respVO.getCreateCodes().add(importItem.getCode()); + } else if (updateSupport) { + // 2.3.2 更新 + try { + validateItemNameUnique(existItem.getId(), importItem.getName()); + } catch (ServiceException ex) { + respVO.getFailureCodes().put(key, ex.getMessage()); + return; + } + MesMdItemDO updateObj = BeanUtils.toBean(importItem, MesMdItemDO.class); + updateObj.setId(existItem.getId()); + clearStockIfNotSafe(updateObj); + itemMapper.updateById(updateObj); + respVO.getUpdateCodes().add(importItem.getCode()); + } else { + // 不支持更新 + respVO.getFailureCodes().put(key, "物料编码已存在"); + } + }); + return respVO; + } + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemTypeService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemTypeService.java index e756e4e..56ca66e 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemTypeService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemTypeService.java @@ -74,4 +74,12 @@ public interface MesMdItemTypeService { return convertMap(getItemTypeList(ids), MesMdItemTypeDO::getId); } + /** + * 获得指定分类的所有子分类列表(递归) + * + * @param parentId 父分类编号 + * @return 子分类列表 + */ + List getItemTypeChildrenList(Long parentId); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemTypeServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemTypeServiceImpl.java index 0fbccb9..e43d29b 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemTypeServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemTypeServiceImpl.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.mes.service.md.item; +import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 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; @@ -10,9 +11,7 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import java.util.Collection; -import java.util.List; -import java.util.Objects; +import java.util.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; @@ -45,7 +44,6 @@ public class MesMdItemTypeServiceImpl implements MesMdItemTypeService { // 插入 MesMdItemTypeDO itemType = BeanUtils.toBean(createReqVO, MesMdItemTypeDO.class); itemTypeMapper.insert(itemType); - // 返回 return itemType.getId(); } @@ -77,6 +75,7 @@ public class MesMdItemTypeServiceImpl implements MesMdItemTypeService { if (itemService.getItemCountByItemTypeId(id) > 0) { throw exception(MD_ITEM_TYPE_EXITS_ITEM); } + // 2. 删除 itemTypeMapper.deleteById(id); } @@ -126,11 +125,7 @@ public class MesMdItemTypeServiceImpl implements MesMdItemTypeService { if (itemType == null) { return; } - // 如果 id 为空,说明不用比较是否为相同 id 的分类 - if (id == null) { - throw exception(MD_ITEM_TYPE_NAME_DUPLICATE); - } - if (!Objects.equals(itemType.getId(), id)) { + if (ObjUtil.notEqual(itemType.getId(), id)) { throw exception(MD_ITEM_TYPE_NAME_DUPLICATE); } } @@ -140,11 +135,7 @@ public class MesMdItemTypeServiceImpl implements MesMdItemTypeService { if (itemType == null) { return; } - // 如果 id 为空,说明不用比较是否为相同 id 的分类 - if (id == null) { - throw exception(MD_ITEM_TYPE_CODE_DUPLICATE); - } - if (!Objects.equals(itemType.getId(), id)) { + if (ObjUtil.notEqual(itemType.getId(), id)) { throw exception(MD_ITEM_TYPE_CODE_DUPLICATE); } } @@ -164,4 +155,25 @@ public class MesMdItemTypeServiceImpl implements MesMdItemTypeService { return itemTypeMapper.selectByIds(ids); } + @Override + public List getItemTypeChildrenList(Long parentId) { + List allList = itemTypeMapper.selectList(); // 分类总量小,全量查 + // 递归收集所有子分类 + List result = new ArrayList<>(); + collectItemTypeChildren(result, parentId, allList); + return result; + } + + /** + * 递归收集所有子分类 + */ + private void collectItemTypeChildren(List result, Long parentId, List allList) { + for (MesMdItemTypeDO itemType : allList) { + if (Objects.equals(itemType.getParentId(), parentId)) { + result.add(itemType); + collectItemTypeChildren(result, itemType.getId(), allList); + } + } + } + } -- libgit2 0.21.4