package cn.iocoder.yudao.module.wms.service.md.item; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi; import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemCreateReqDTO; import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO; import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemUpdateReqDTO; import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi; import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO; import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.item.WmsItemListReqVO; import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.item.WmsItemPageReqVO; import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.item.WmsItemSaveReqVO; import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.util.*; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.*; /** * WMS 商品 Service 实现类 * * 改造说明:WMS 商品数据来源于 MDM 物料主数据 * - 所有操作调用 MDM API * - WMS 商品对应 MDM 物料类型 = 物料(itemType = 1) * - 字段映射:WmsItemDO.unit <- MDM 计量单位名称 * * @author 芋道源码 */ @Service @Validated public class WmsItemServiceImpl implements WmsItemService { /** WMS 商品对应的 MDM 物料类型:物料 */ private static final int MDM_ITEM_TYPE_MATERIAL = 1; @Resource private MdmItemApi mdmItemApi; @Resource private MdmUnitMeasureApi mdmUnitMeasureApi; @Override public Long createItem(WmsItemSaveReqVO createReqVO) { // 校验数据 validateItemSaveData(createReqVO); // 构建创建请求并调用 MDM API MdmItemCreateReqDTO createReqDTO = buildCreateReqDTO(createReqVO); return mdmItemApi.createItem(createReqDTO).getCheckedData(); } @Override public void updateItem(WmsItemSaveReqVO updateReqVO) { // 校验存在 validateItemExists(updateReqVO.getId()); // 校验数据 validateItemSaveData(updateReqVO); // 构建更新请求并调用 MDM API MdmItemUpdateReqDTO updateReqDTO = buildUpdateReqDTO(updateReqVO); mdmItemApi.updateItem(updateReqDTO); } @Override public void deleteItem(Long id) { // 校验存在 validateItemExists(id); // WMS 商品删除实际为禁用(MDM 物料不能物理删除) mdmItemApi.updateItemStatus(id, CommonStatusEnum.DISABLE.getStatus()); } @Override public WmsItemDO validateItemExists(Long id) { MdmItemRespDTO item = mdmItemApi.validateItemExists(id).getCheckedData(); return convertToWmsItemDO(item); } @Override public WmsItemDO getItem(Long id) { MdmItemRespDTO item = mdmItemApi.getItem(id).getCheckedData(); if (item == null) { return null; } return convertToWmsItemDO(item); } @Override public PageResult getItemPage(WmsItemPageReqVO pageReqVO) { // 调用 MDM API 分页查询 PageResult mdmPageResult = mdmItemApi.getItemPage( MDM_ITEM_TYPE_MATERIAL, pageReqVO.getStatus(), pageReqVO.getPageNo(), pageReqVO.getPageSize() ).getCheckedData(); // 转换结果 List itemList = convertToWmsItemDOList(mdmPageResult.getList()); return new PageResult<>(itemList, mdmPageResult.getTotal()); } @Override public List getItemList(WmsItemListReqVO listReqVO) { // 调用 MDM API 获取列表 List itemList = mdmItemApi.getItemListByStatus(listReqVO.getStatus()).getCheckedData(); return convertToWmsItemDOList(itemList); } @Override public List getItemList(Collection ids) { if (CollUtil.isEmpty(ids)) { return Collections.emptyList(); } List itemList = mdmItemApi.getItemList(ids).getCheckedData(); return convertToWmsItemDOList(itemList); } @Override public long getItemCountByCategoryId(Long categoryId) { return mdmItemApi.getItemCountByCategoryId(categoryId).getCheckedData(); } @Override public long getItemCountByBrandId(Long brandId) { // MDM 暂无按品牌统计方法,返回 0 return 0L; } // ==================== 私有方法 ==================== /** * 校验商品保存数据 */ private void validateItemSaveData(WmsItemSaveReqVO reqVO) { // 校验商品编码唯一 if (reqVO.getCode() != null) { MdmItemRespDTO existItem = mdmItemApi.getItemByCode(reqVO.getCode()).getCheckedData(); if (existItem != null && !existItem.getId().equals(reqVO.getId())) { throw exception(ITEM_CODE_DUPLICATE); } } // 校验商品名称唯一 if (reqVO.getName() != null) { // MDM 暂无按名称查询方法,跳过此校验 } } /** * 构建创建请求 DTO */ private MdmItemCreateReqDTO buildCreateReqDTO(WmsItemSaveReqVO saveReqVO) { MdmItemCreateReqDTO createReqDTO = new MdmItemCreateReqDTO(); createReqDTO.setCode(saveReqVO.getCode()); createReqDTO.setName(saveReqVO.getName()); createReqDTO.setCategoryId(saveReqVO.getCategoryId()); createReqDTO.setBrandId(saveReqVO.getBrandId()); createReqDTO.setUnitMeasureId(saveReqVO.getUnitMeasureId()); createReqDTO.setItemType(MDM_ITEM_TYPE_MATERIAL); createReqDTO.setStatus(CommonStatusEnum.ENABLE.getStatus()); createReqDTO.setRemark(saveReqVO.getRemark()); return createReqDTO; } /** * 构建更新请求 DTO */ private MdmItemUpdateReqDTO buildUpdateReqDTO(WmsItemSaveReqVO saveReqVO) { MdmItemUpdateReqDTO updateReqDTO = new MdmItemUpdateReqDTO(); updateReqDTO.setId(saveReqVO.getId()); updateReqDTO.setCode(saveReqVO.getCode()); updateReqDTO.setName(saveReqVO.getName()); updateReqDTO.setCategoryId(saveReqVO.getCategoryId()); updateReqDTO.setBrandId(saveReqVO.getBrandId()); updateReqDTO.setUnitMeasureId(saveReqVO.getUnitMeasureId()); updateReqDTO.setStatus(CommonStatusEnum.ENABLE.getStatus()); updateReqDTO.setRemark(saveReqVO.getRemark()); return updateReqDTO; } /** * 转换 MDM 物料为 WMS 商品 */ private WmsItemDO convertToWmsItemDO(MdmItemRespDTO mdmItem) { if (mdmItem == null) { return null; } WmsItemDO item = new WmsItemDO(); item.setId(mdmItem.getId()); item.setCode(mdmItem.getCode()); item.setName(mdmItem.getName()); item.setCategoryId(mdmItem.getCategoryId()); item.setBrandId(mdmItem.getBrandId()); item.setRemark(mdmItem.getRemark()); // 获取计量单位名称 if (mdmItem.getUnitMeasureId() != null) { MdmUnitMeasureRespDTO unit = mdmUnitMeasureApi.getUnitMeasure(mdmItem.getUnitMeasureId()).getCheckedData(); if (unit != null) { item.setUnit(unit.getName()); } } return item; } /** * 批量转换 MDM 物料列表为 WMS 商品列表 */ private List convertToWmsItemDOList(List mdmItemList) { if (CollUtil.isEmpty(mdmItemList)) { return Collections.emptyList(); } // 批量获取计量单位 Set unitIds = mdmItemList.stream() .map(MdmItemRespDTO::getUnitMeasureId) .filter(Objects::nonNull) .collect(Collectors.toSet()); Map unitMap = new HashMap<>(); if (!unitIds.isEmpty()) { List units = mdmUnitMeasureApi.getUnitMeasureList(unitIds).getCheckedData(); for (MdmUnitMeasureRespDTO unit : units) { unitMap.put(unit.getId(), unit); } } // 转换列表 List result = new ArrayList<>(); for (MdmItemRespDTO mdmItem : mdmItemList) { WmsItemDO item = new WmsItemDO(); item.setId(mdmItem.getId()); item.setCode(mdmItem.getCode()); item.setName(mdmItem.getName()); item.setCategoryId(mdmItem.getCategoryId()); item.setBrandId(mdmItem.getBrandId()); item.setRemark(mdmItem.getRemark()); // 设置单位名称 if (mdmItem.getUnitMeasureId() != null) { MdmUnitMeasureRespDTO unit = unitMap.get(mdmItem.getUnitMeasureId()); if (unit != null) { item.setUnit(unit.getName()); } } result.add(item); } return result; } }