From 7081c41bc3beb0ab49a22974ea4b010ae6854afe Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期五, 16 十月 2026 13:07:52 +0800
Subject: [PATCH] feat: 全量列表页补 Excel 导入接口,清理 crm/mdm 重复 FQCN 类

---
 yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/credit/CrmCreditRatingServiceImpl.java |   79 +++++++++++++++++++++++++++++++++++++++
 1 files changed, 79 insertions(+), 0 deletions(-)

diff --git a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/credit/CrmCreditRatingServiceImpl.java b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/credit/CrmCreditRatingServiceImpl.java
index adcb534..2769277 100644
--- a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/credit/CrmCreditRatingServiceImpl.java
+++ b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/credit/CrmCreditRatingServiceImpl.java
@@ -1,8 +1,13 @@
 package cn.iocoder.yudao.module.crm.service.credit;
 
+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.object.BeanUtils;
+import cn.iocoder.yudao.module.crm.controller.admin.credit.vo.CrmCreditRatingImportExcelVO;
+import cn.iocoder.yudao.module.crm.controller.admin.credit.vo.CrmCreditRatingImportReqVO;
+import cn.iocoder.yudao.module.crm.controller.admin.credit.vo.CrmCreditRatingImportRespVO;
 import cn.iocoder.yudao.module.crm.controller.admin.credit.vo.CrmCreditRatingPageReqVO;
 import cn.iocoder.yudao.module.crm.controller.admin.credit.vo.CrmCreditRatingRespVO;
 import cn.iocoder.yudao.module.crm.controller.admin.credit.vo.CrmCreditRatingSaveReqVO;
@@ -17,9 +22,14 @@
 import org.springframework.validation.annotation.Validated;
 
 import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
 import java.util.List;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
+import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*;
 
 @Service
 @Validated
@@ -106,4 +116,73 @@
         return entity == null ? null : BeanUtils.toBean(entity, CrmCreditRatingRespVO.class);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public CrmCreditRatingImportRespVO importCreditRatingList(List<CrmCreditRatingImportExcelVO> importCreditRatings,
+                                                              CrmCreditRatingImportReqVO importReqVO) {
+        // 1. 鏍¢獙闈炵┖
+        importCreditRatings = filterList(importCreditRatings, item -> StrUtil.isNotBlank(item.getCustomerName()));
+        if (CollUtil.isEmpty(importCreditRatings)) {
+            throw exception(CRM_CREDIT_RATING_IMPORT_LIST_IS_EMPTY);
+        }
+        // 2. 鎿嶄綔浜猴細涓虹┖鍒欓粯璁ゅ綋鍓嶆搷浣滀汉
+        Long operatorId = importReqVO.getOperatorId() != null ? importReqVO.getOperatorId() : getLoginUserId();
+
+        // 3. 閫愭潯澶勭悊
+        CrmCreditRatingImportRespVO respVO = CrmCreditRatingImportRespVO.builder()
+                .createCreditRatingNames(new ArrayList<>())
+                .updateCreditRatingNames(new ArrayList<>())
+                .failureCreditRatingNames(new LinkedHashMap<>())
+                .build();
+        importCreditRatings.forEach(importCreditRating -> {
+            try {
+                // 3.1 瑙f瀽瀹㈡埛
+                CrmCustomerDO customer = customerMapper.selectByCustomerName(importCreditRating.getCustomerName());
+                if (customer == null) {
+                    throw exception(CRM_CREDIT_RATING_IMPORT_CUSTOMER_NOT_EXISTS, importCreditRating.getCustomerName());
+                }
+                // 3.2 鍒ゆ柇璇ュ鎴锋槸鍚﹀凡瀛樺湪璇勭骇
+                CrmCreditRatingDO existRating = creditRatingMapper.selectLatestByCustomerId(customer.getId());
+                if (existRating == null) {
+                    // 3.2.1 鏂板
+                    if (StrUtil.isBlank(importCreditRating.getOperatorName())) {
+                        importCreditRating.setOperatorName(customer.getName());
+                    }
+                    if (importCreditRating.getOperateTime() == null) {
+                        importCreditRating.setOperateTime(LocalDateTime.now());
+                    }
+                    CrmCreditRatingDO entity = BeanUtils.toBean(importCreditRating, CrmCreditRatingDO.class,
+                            vo -> vo.setCustomerId(customer.getId()).setCustomerName(customer.getName())
+                                    .setOperatorId(operatorId));
+                    creditRatingMapper.insert(entity);
+                    customer.setCreditLevel(entity.getLevel());
+                    customer.setCreditScore(entity.getScore());
+                    customerMapper.updateById(customer);
+                    respVO.getCreateCreditRatingNames().add(importCreditRating.getCustomerName());
+                    return;
+                }
+                // 3.2.2 宸插瓨鍦紝鍒ゆ柇鏄惁鍏佽鏇存柊
+                if (!importReqVO.getUpdateSupport()) {
+                    respVO.getFailureCreditRatingNames().put(importCreditRating.getCustomerName(),
+                            StrUtil.format(CRM_CREDIT_RATING_NAME_EXISTS.getMsg(), importCreditRating.getCustomerName()));
+                    return;
+                }
+                CrmCreditRatingDO entity = BeanUtils.toBean(importCreditRating, CrmCreditRatingDO.class,
+                        vo -> vo.setId(existRating.getId()).setCustomerId(customer.getId())
+                                .setCustomerName(customer.getName()).setOperatorId(operatorId));
+                creditRatingMapper.updateById(entity);
+                CrmCreditRatingDO latest = creditRatingMapper.selectLatestByCustomerId(customer.getId());
+                if (latest != null && latest.getId().equals(entity.getId())) {
+                    customer.setCreditLevel(latest.getLevel());
+                    customer.setCreditScore(latest.getScore());
+                    customerMapper.updateById(customer);
+                }
+                respVO.getUpdateCreditRatingNames().add(importCreditRating.getCustomerName());
+            } catch (ServiceException ex) {
+                respVO.getFailureCreditRatingNames().put(importCreditRating.getCustomerName(), ex.getMessage());
+            }
+        });
+        return respVO;
+    }
+
 }
\ No newline at end of file

--
Gitblit v1.9.3