From 940c8481d2fdcf51341db4ccd6fd6fcc2d43debb Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 29 六月 2026 15:32:58 +0800
Subject: [PATCH] 初始化项目

---
 yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductServiceImpl.java |  279 ++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 222 insertions(+), 57 deletions(-)

diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductServiceImpl.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductServiceImpl.java
index 88599a8..cf7cb5c 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductServiceImpl.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductServiceImpl.java
@@ -8,10 +8,15 @@
 import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductPageReqVO;
 import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductRespVO;
 import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ProductSaveReqVO;
-import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductCategoryDO;
 import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO;
-import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO;
-import cn.iocoder.yudao.module.erp.dal.mysql.product.ErpProductMapper;
+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.category.MdmItemCategoryApi;
+import cn.iocoder.yudao.module.mdm.api.category.dto.MdmItemCategoryRespDTO;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
 import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
@@ -25,46 +30,57 @@
 /**
  * ERP 浜у搧 Service 瀹炵幇绫�
  *
+ * 鏀归�犺鏄庯細ERP 浜у搧鏁版嵁鏉ユ簮浜� MDM 鐗╂枡涓绘暟鎹�
+ * - 鎵�鏈変骇鍝佹搷浣滃潎璋冪敤 MDM API
+ * - ERP 浜у搧瀵瑰簲 MDM 鐗╂枡绫诲瀷 = 鎴愬搧锛坕temType = 2锛�
+ *
  * @author 鑺嬮亾婧愮爜
  */
 @Service
 @Validated
 public class ErpProductServiceImpl implements ErpProductService {
 
-    @Resource
-    private ErpProductMapper productMapper;
+    /** ERP 浜у搧瀵瑰簲鐨� MDM 鐗╂枡绫诲瀷锛氭垚鍝� */
+    private static final int MDM_ITEM_TYPE_PRODUCT = 2;
 
     @Resource
-    private ErpProductCategoryService productCategoryService;
+    private MdmItemApi mdmItemApi;
+
     @Resource
-    private ErpProductUnitService productUnitService;
+    private MdmItemCategoryApi mdmItemCategoryApi;
+
+    @Resource
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
 
     @Override
     public Long createProduct(ProductSaveReqVO createReqVO) {
-        // TODO 鑺嬭壙锛氭牎楠屽垎绫�
-        // 鎻掑叆
-        ErpProductDO product = BeanUtils.toBean(createReqVO, ErpProductDO.class);
-        productMapper.insert(product);
-        // 杩斿洖
-        return product.getId();
+        // 1. 鏍¢獙鏉$爜鍞竴
+        validateProductBarCodeUnique(null, createReqVO.getBarCode());
+
+        // 2. 鏋勫缓鍒涘缓璇锋眰骞惰皟鐢� MDM API
+        MdmItemCreateReqDTO createReqDTO = buildCreateReqDTO(createReqVO);
+        return mdmItemApi.createItem(createReqDTO).getCheckedData();
     }
 
     @Override
     public void updateProduct(ProductSaveReqVO updateReqVO) {
-        // TODO 鑺嬭壙锛氭牎楠屽垎绫�
-        // 鏍¢獙瀛樺湪
+        // 1. 鏍¢獙瀛樺湪
         validateProductExists(updateReqVO.getId());
-        // 鏇存柊
-        ErpProductDO updateObj = BeanUtils.toBean(updateReqVO, ErpProductDO.class);
-        productMapper.updateById(updateObj);
+
+        // 2. 鏍¢獙鏉$爜鍞竴
+        validateProductBarCodeUnique(updateReqVO.getId(), updateReqVO.getBarCode());
+
+        // 3. 鏋勫缓鏇存柊璇锋眰骞惰皟鐢� MDM API
+        MdmItemUpdateReqDTO updateReqDTO = buildUpdateReqDTO(updateReqVO);
+        mdmItemApi.updateItem(updateReqDTO);
     }
 
     @Override
     public void deleteProduct(Long id) {
         // 鏍¢獙瀛樺湪
         validateProductExists(id);
-        // 鍒犻櫎
-        productMapper.deleteById(id);
+        // ERP 浜у搧鍒犻櫎瀹為檯涓虹鐢紙MDM 鐗╂枡涓嶈兘鐗╃悊鍒犻櫎锛�
+        mdmItemApi.updateItemStatus(id, CommonStatusEnum.DISABLE.getStatus());
     }
 
     @Override
@@ -72,35 +88,36 @@
         if (CollUtil.isEmpty(ids)) {
             return Collections.emptyList();
         }
-        List<ErpProductDO> list = productMapper.selectByIds(ids);
-        Map<Long, ErpProductDO> productMap = convertMap(list, ErpProductDO::getId);
+
+        // 1. 璋冪敤 MDM API 鑾峰彇鐗╂枡鍒楄〃
+        List<MdmItemRespDTO> itemList = mdmItemApi.getItemList(ids).getCheckedData();
+        Map<Long, MdmItemRespDTO> itemMap = convertMap(itemList, MdmItemRespDTO::getId);
+
+        // 2. 鏍¢獙姣忎釜浜у搧
         for (Long id : ids) {
-            ErpProductDO product = productMap.get(id);
-            if (productMap.get(id) == null) {
+            MdmItemRespDTO item = itemMap.get(id);
+            if (item == null) {
                 throw exception(PRODUCT_NOT_EXISTS);
             }
-            if (CommonStatusEnum.isDisable(product.getStatus())) {
-                throw exception(PRODUCT_NOT_ENABLE, product.getName());
+            if (CommonStatusEnum.isDisable(item.getStatus())) {
+                throw exception(PRODUCT_NOT_ENABLE, item.getName());
             }
         }
-        return list;
-    }
 
-    private void validateProductExists(Long id) {
-        if (productMapper.selectById(id) == null) {
-            throw exception(PRODUCT_NOT_EXISTS);
-        }
+        // 3. 杞崲涓� ERP Product DO锛堟墜鍔ㄦ槧灏勫瓧娈碉級
+        return convertToErpProductDOList(itemList);
     }
 
     @Override
     public ErpProductDO getProduct(Long id) {
-        return productMapper.selectById(id);
+        MdmItemRespDTO item = mdmItemApi.getItem(id).getCheckedData();
+        return convertToErpProductDO(item);
     }
 
     @Override
     public List<ErpProductRespVO> getProductVOListByStatus(Integer status) {
-        List<ErpProductDO> list = productMapper.selectListByStatus(status);
-        return buildProductVOList(list);
+        List<MdmItemRespDTO> itemList = mdmItemApi.getItemListByStatus(status).getCheckedData();
+        return buildProductVOList(itemList);
     }
 
     @Override
@@ -108,40 +125,188 @@
         if (CollUtil.isEmpty(ids)) {
             return Collections.emptyList();
         }
-        List<ErpProductDO> list = productMapper.selectByIds(ids);
-        return buildProductVOList(list);
+        List<MdmItemRespDTO> itemList = mdmItemApi.getItemList(ids).getCheckedData();
+        return buildProductVOList(itemList);
     }
 
     @Override
     public PageResult<ErpProductRespVO> getProductVOPage(ErpProductPageReqVO pageReqVO) {
-        PageResult<ErpProductDO> pageResult = productMapper.selectPage(pageReqVO);
-        return new PageResult<>(buildProductVOList(pageResult.getList()), pageResult.getTotal());
-    }
+        // 璋冪敤 MDM API 鍒嗛〉鏌ヨ
+        PageResult<MdmItemRespDTO> mdmPageResult = mdmItemApi.getItemPage(
+                MDM_ITEM_TYPE_PRODUCT,
+                pageReqVO.getStatus(),
+                pageReqVO.getPageNo(),
+                pageReqVO.getPageSize()
+        ).getCheckedData();
 
-    private List<ErpProductRespVO> buildProductVOList(List<ErpProductDO> list) {
-        if (CollUtil.isEmpty(list)) {
-            return Collections.emptyList();
-        }
-        Map<Long, ErpProductCategoryDO> categoryMap = productCategoryService.getProductCategoryMap(
-                convertSet(list, ErpProductDO::getCategoryId));
-        Map<Long, ErpProductUnitDO> unitMap = productUnitService.getProductUnitMap(
-                convertSet(list, ErpProductDO::getUnitId));
-        return BeanUtils.toBean(list, ErpProductRespVO.class, product -> {
-            MapUtils.findAndThen(categoryMap, product.getCategoryId(),
-                    category -> product.setCategoryName(category.getName()));
-            MapUtils.findAndThen(unitMap, product.getUnitId(),
-                    unit -> product.setUnitName(unit.getName()));
-        });
+        List<ErpProductRespVO> productVOList = buildProductVOList(mdmPageResult.getList());
+        return new PageResult<>(productVOList, mdmPageResult.getTotal());
     }
 
     @Override
     public Long getProductCountByCategoryId(Long categoryId) {
-        return productMapper.selectCountByCategoryId(categoryId);
+        return mdmItemApi.getItemCountByCategoryId(categoryId).getCheckedData();
     }
 
     @Override
     public Long getProductCountByUnitId(Long unitId) {
-        return productMapper.selectCountByUnitId(unitId);
+        return mdmItemApi.getItemCountByUnitMeasureId(unitId).getCheckedData();
     }
 
-}
+    // ==================== 绉佹湁鏂规硶 ====================
+
+    /**
+     * 鏍¢獙浜у搧瀛樺湪
+     */
+    private void validateProductExists(Long id) {
+        mdmItemApi.validateItemExists(id).getCheckedData();
+    }
+
+    /**
+     * 鏍¢獙浜у搧鏉$爜鍞竴
+     */
+    private void validateProductBarCodeUnique(Long id, String barCode) {
+        if (barCode == null) {
+            return;
+        }
+        MdmItemRespDTO existItem = mdmItemApi.getItemByBarCode(barCode).getCheckedData();
+        if (existItem != null && !existItem.getId().equals(id)) {
+            throw exception(PRODUCT_BAR_CODE_EXISTS);
+        }
+    }
+
+    /**
+     * 鏋勫缓鍒涘缓璇锋眰 DTO
+     * 娉ㄦ剰锛歅roductSaveReqVO 浣跨敤 standard 瀛楁浣滀负瑙勬牸锛孧DM 浣跨敤 specification
+     */
+    private MdmItemCreateReqDTO buildCreateReqDTO(ProductSaveReqVO saveReqVO) {
+        MdmItemCreateReqDTO createReqDTO = new MdmItemCreateReqDTO();
+        createReqDTO.setCode(saveReqVO.getBarCode()); // 浣跨敤鏉$爜浣滀负缂栫爜
+        createReqDTO.setName(saveReqVO.getName());
+        createReqDTO.setBarCode(saveReqVO.getBarCode());
+        createReqDTO.setSpecification(saveReqVO.getStandard()); // standard -> specification
+        createReqDTO.setCategoryId(saveReqVO.getCategoryId());
+        createReqDTO.setUnitMeasureId(saveReqVO.getUnitId()); // unitId -> unitMeasureId
+        createReqDTO.setItemType(MDM_ITEM_TYPE_PRODUCT);
+        createReqDTO.setStatus(saveReqVO.getStatus() != null ? saveReqVO.getStatus() : CommonStatusEnum.ENABLE.getStatus());
+        createReqDTO.setPurchasePrice(saveReqVO.getPurchasePrice());
+        createReqDTO.setSalesPrice(saveReqVO.getSalePrice());
+        createReqDTO.setCostPrice(saveReqVO.getMinPrice()); // minPrice -> costPrice
+        createReqDTO.setExpiryDay(saveReqVO.getExpiryDay());
+        createReqDTO.setWeight(saveReqVO.getWeight());
+        createReqDTO.setRemark(saveReqVO.getRemark());
+        return createReqDTO;
+    }
+
+    /**
+     * 鏋勫缓鏇存柊璇锋眰 DTO
+     */
+    private MdmItemUpdateReqDTO buildUpdateReqDTO(ProductSaveReqVO saveReqVO) {
+        MdmItemUpdateReqDTO updateReqDTO = new MdmItemUpdateReqDTO();
+        updateReqDTO.setId(saveReqVO.getId());
+        updateReqDTO.setCode(saveReqVO.getBarCode());
+        updateReqDTO.setName(saveReqVO.getName());
+        updateReqDTO.setBarCode(saveReqVO.getBarCode());
+        updateReqDTO.setSpecification(saveReqVO.getStandard()); // standard -> specification
+        updateReqDTO.setCategoryId(saveReqVO.getCategoryId());
+        updateReqDTO.setUnitMeasureId(saveReqVO.getUnitId()); // unitId -> unitMeasureId
+        updateReqDTO.setStatus(saveReqVO.getStatus());
+        updateReqDTO.setPurchasePrice(saveReqVO.getPurchasePrice());
+        updateReqDTO.setSalesPrice(saveReqVO.getSalePrice());
+        updateReqDTO.setCostPrice(saveReqVO.getMinPrice());
+        updateReqDTO.setExpiryDay(saveReqVO.getExpiryDay());
+        updateReqDTO.setWeight(saveReqVO.getWeight());
+        updateReqDTO.setRemark(saveReqVO.getRemark());
+        return updateReqDTO;
+    }
+
+    /**
+     * 鏋勫缓浜у搧 VO 鍒楄〃锛堝寘鍚垎绫诲拰鍗曚綅鍚嶇О锛�
+     * 娉ㄦ剰锛歁DM 鍜� ERP 瀛楁鍚嶆湁宸紓锛岄渶瑕佹墜鍔ㄦ槧灏�
+     */
+    private List<ErpProductRespVO> buildProductVOList(List<MdmItemRespDTO> itemList) {
+        if (CollUtil.isEmpty(itemList)) {
+            return Collections.emptyList();
+        }
+
+        // 1. 鑾峰彇鍒嗙被鍜屽崟浣嶄俊鎭�
+        Set<Long> categoryIds = convertSet(itemList, MdmItemRespDTO::getCategoryId);
+        Set<Long> unitIds = convertSet(itemList, MdmItemRespDTO::getUnitMeasureId);
+
+        Map<Long, MdmItemCategoryRespDTO> categoryMap = CollUtil.isEmpty(categoryIds)
+                ? Collections.emptyMap()
+                : convertMap(mdmItemCategoryApi.getItemCategoryList(categoryIds).getCheckedData(), MdmItemCategoryRespDTO::getId);
+
+        Map<Long, MdmUnitMeasureRespDTO> unitMap = CollUtil.isEmpty(unitIds)
+                ? Collections.emptyMap()
+                : convertMap(mdmUnitMeasureApi.getUnitMeasureList(unitIds).getCheckedData(), MdmUnitMeasureRespDTO::getId);
+
+        // 2. 鎵嬪姩杞崲骞跺~鍏呭叧鑱斾俊鎭紙澶勭悊瀛楁鍚嶅樊寮傦級
+        List<ErpProductRespVO> result = new ArrayList<>();
+        for (MdmItemRespDTO mdmItem : itemList) {
+            ErpProductRespVO product = new ErpProductRespVO();
+            product.setId(mdmItem.getId());
+            product.setName(mdmItem.getName());
+            product.setBarCode(mdmItem.getBarCode());
+            product.setStandard(mdmItem.getSpecification()); // specification -> standard
+            product.setCategoryId(mdmItem.getCategoryId());
+            product.setUnitId(mdmItem.getUnitMeasureId()); // unitMeasureId -> unitId
+            product.setStatus(mdmItem.getStatus());
+            product.setPurchasePrice(mdmItem.getPurchasePrice());
+            product.setSalePrice(mdmItem.getSalesPrice()); // salesPrice -> salePrice
+            product.setMinPrice(mdmItem.getCostPrice()); // costPrice -> minPrice
+            product.setExpiryDay(mdmItem.getExpiryDay());
+            product.setWeight(mdmItem.getWeight());
+            product.setRemark(mdmItem.getRemark());
+
+            // 璁剧疆鍒嗙被鍜屽崟浣嶅悕绉�
+            MapUtils.findAndThen(categoryMap, mdmItem.getCategoryId(),
+                    category -> product.setCategoryName(category.getName()));
+            MapUtils.findAndThen(unitMap, mdmItem.getUnitMeasureId(),
+                    unit -> product.setUnitName(unit.getName()));
+
+            result.add(product);
+        }
+        return result;
+    }
+
+    /**
+     * 杞崲 MDM 鐗╂枡涓� ERP 浜у搧 DO
+     * 娉ㄦ剰锛氬瓧娈靛悕宸紓闇�瑕佹墜鍔ㄦ槧灏�
+     */
+    private ErpProductDO convertToErpProductDO(MdmItemRespDTO mdmItem) {
+        if (mdmItem == null) {
+            return null;
+        }
+        ErpProductDO product = new ErpProductDO();
+        product.setId(mdmItem.getId());
+        product.setName(mdmItem.getName());
+        product.setBarCode(mdmItem.getBarCode());
+        product.setStandard(mdmItem.getSpecification()); // specification -> standard
+        product.setCategoryId(mdmItem.getCategoryId());
+        product.setUnitId(mdmItem.getUnitMeasureId()); // unitMeasureId -> unitId
+        product.setStatus(mdmItem.getStatus());
+        product.setPurchasePrice(mdmItem.getPurchasePrice());
+        product.setSalePrice(mdmItem.getSalesPrice()); // salesPrice -> salePrice
+        product.setMinPrice(mdmItem.getCostPrice()); // costPrice -> minPrice
+        product.setExpiryDay(mdmItem.getExpiryDay());
+        product.setWeight(mdmItem.getWeight());
+        product.setRemark(mdmItem.getRemark());
+        return product;
+    }
+
+    /**
+     * 鎵归噺杞崲 MDM 鐗╂枡鍒楄〃涓� ERP 浜у搧鍒楄〃
+     */
+    private List<ErpProductDO> convertToErpProductDOList(List<MdmItemRespDTO> mdmItemList) {
+        if (CollUtil.isEmpty(mdmItemList)) {
+            return Collections.emptyList();
+        }
+        List<ErpProductDO> result = new ArrayList<>();
+        for (MdmItemRespDTO mdmItem : mdmItemList) {
+            result.add(convertToErpProductDO(mdmItem));
+        }
+        return result;
+    }
+
+}
\ No newline at end of file

--
Gitblit v1.9.3