From 4bc513be11e671caf20ec6013a51dee42c2ed96e Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期六, 07 十一月 2026 18:31:26 +0800
Subject: [PATCH] fix(crm): 禁止物料类合同开票

---
 yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/salesTarget/CrmSalesTargetServiceImpl.java |   96 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 96 insertions(+), 0 deletions(-)

diff --git a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/salesTarget/CrmSalesTargetServiceImpl.java b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/salesTarget/CrmSalesTargetServiceImpl.java
index 9784da9..ba9331b 100644
--- a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/salesTarget/CrmSalesTargetServiceImpl.java
+++ b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/salesTarget/CrmSalesTargetServiceImpl.java
@@ -2,9 +2,13 @@
 
 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.salesTarget.vo.CrmSalesTargetChangeStatusReqVO;
+import cn.iocoder.yudao.module.crm.controller.admin.salesTarget.vo.CrmSalesTargetImportExcelVO;
+import cn.iocoder.yudao.module.crm.controller.admin.salesTarget.vo.CrmSalesTargetImportReqVO;
+import cn.iocoder.yudao.module.crm.controller.admin.salesTarget.vo.CrmSalesTargetImportRespVO;
 import cn.iocoder.yudao.module.crm.controller.admin.salesTarget.vo.CrmSalesTargetPageReqVO;
 import cn.iocoder.yudao.module.crm.controller.admin.salesTarget.vo.CrmSalesTargetRespVO;
 import cn.iocoder.yudao.module.crm.controller.admin.salesTarget.vo.CrmSalesTargetSaveReqVO;
@@ -35,6 +39,7 @@
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -45,6 +50,7 @@
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
 import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*;
 
 /**
@@ -155,6 +161,96 @@
         return convertListToRespVO(list);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public CrmSalesTargetImportRespVO importSalesTargetList(List<CrmSalesTargetImportExcelVO> importSalesTargets,
+                                                            CrmSalesTargetImportReqVO importReqVO) {
+        // 1. 鏍¢獙闈炵┖
+        importSalesTargets = filterList(importSalesTargets, item -> StrUtil.isNotBlank(item.getName()));
+        if (CollUtil.isEmpty(importSalesTargets)) {
+            throw exception(CRM_SALES_TARGET_IMPORT_LIST_IS_EMPTY);
+        }
+
+        // 2. 閫愭潯澶勭悊
+        CrmSalesTargetImportRespVO respVO = CrmSalesTargetImportRespVO.builder()
+                .createSalesTargetNames(new ArrayList<>())
+                .updateSalesTargetNames(new ArrayList<>())
+                .failureSalesTargetNames(new LinkedHashMap<>())
+                .build();
+        importSalesTargets.forEach(importSalesTarget -> {
+            try {
+                // 2.1 瑙f瀽鐩爣缁村害瀵硅薄锛堜釜浜�/閮ㄩ棬/浜у搧锛�
+                Long targetUserId = null;
+                Long targetDeptId = null;
+                Long targetItemId = null;
+                if (Objects.equals(importSalesTarget.getTargetDimension(), CrmSalesTargetDimensionEnum.USER.getType())) {
+                    if (StrUtil.isBlank(importSalesTarget.getTargetUserName())) {
+                        throw exception(CRM_SALES_TARGET_DIMENSION_TARGET_MISSING, "鐢ㄦ埛");
+                    }
+                    List<AdminUserRespDTO> users = adminUserApi.getUserListByNickname(importSalesTarget.getTargetUserName());
+                    if (CollUtil.isEmpty(users)) {
+                        throw exception(CRM_SALES_TARGET_IMPORT_DIMENSION_TARGET_NOT_FOUND, "鐢ㄦ埛", importSalesTarget.getTargetUserName());
+                    }
+                    targetUserId = users.get(0).getId();
+                } else if (Objects.equals(importSalesTarget.getTargetDimension(), CrmSalesTargetDimensionEnum.DEPT.getType())) {
+                    if (StrUtil.isBlank(importSalesTarget.getTargetDeptName())) {
+                        throw exception(CRM_SALES_TARGET_DIMENSION_TARGET_MISSING, "閮ㄩ棬");
+                    }
+                    DeptRespDTO dept = deptApi.getDeptList().stream()
+                            .filter(d -> d.getName().equals(importSalesTarget.getTargetDeptName()))
+                            .findFirst().orElse(null);
+                    if (dept == null) {
+                        throw exception(CRM_SALES_TARGET_IMPORT_DIMENSION_TARGET_NOT_FOUND, "閮ㄩ棬", importSalesTarget.getTargetDeptName());
+                    }
+                    targetDeptId = dept.getId();
+                } else if (Objects.equals(importSalesTarget.getTargetDimension(), CrmSalesTargetDimensionEnum.ITEM.getType())) {
+                    if (StrUtil.isBlank(importSalesTarget.getTargetItemCode())) {
+                        throw exception(CRM_SALES_TARGET_DIMENSION_TARGET_MISSING, "鐗╂枡");
+                    }
+                    MdmItemRespDTO item = mdmItemApi.getItemByCode(importSalesTarget.getTargetItemCode()).getCheckedData();
+                    if (item == null) {
+                        throw exception(CRM_SALES_TARGET_IMPORT_DIMENSION_TARGET_NOT_FOUND, "鐗╂枡", importSalesTarget.getTargetItemCode());
+                    }
+                    targetItemId = item.getId();
+                }
+
+                // 2.2 璁$畻鍛ㄦ湡璧锋涓庣姸鎬�
+                LocalDateTime[] period = calculatePeriod(importSalesTarget.getPeriodType(), importSalesTarget.getPeriodValue());
+                Integer status = calcStatusByPeriod(period[0], period[1]);
+
+                // 2.3 鍒ゆ柇鏄惁宸插瓨鍦ㄥ悓鍚嶇洰鏍�
+                CrmSalesTargetDO existTarget = salesTargetMapper.selectByName(importSalesTarget.getName());
+                if (existTarget == null) {
+                    // 2.3.1 鏂板
+                    CrmSalesTargetDO target = BeanUtils.toBean(importSalesTarget, CrmSalesTargetDO.class)
+                            .setTargetUserId(targetUserId).setTargetDeptId(targetDeptId).setTargetItemId(targetItemId)
+                            .setStartTime(period[0]).setEndTime(period[1]).setStatus(status);
+                    salesTargetMapper.insert(target);
+                    respVO.getCreateSalesTargetNames().add(importSalesTarget.getName());
+                    return;
+                }
+                // 2.3.2 宸插瓨鍦紝鍒ゆ柇鏄惁鍏佽鏇存柊
+                if (!importReqVO.getUpdateSupport()) {
+                    respVO.getFailureSalesTargetNames().put(importSalesTarget.getName(),
+                            StrUtil.format(CRM_SALES_TARGET_NAME_EXISTS.getMsg(), importSalesTarget.getName()));
+                    return;
+                }
+                CrmSalesTargetDO updateDO = BeanUtils.toBean(importSalesTarget, CrmSalesTargetDO.class)
+                        .setId(existTarget.getId())
+                        .setTargetUserId(targetUserId).setTargetDeptId(targetDeptId).setTargetItemId(targetItemId)
+                        .setStartTime(period[0]).setEndTime(period[1]);
+                // 鎵嬪姩浣滃簾鐨勭姸鎬佷笉鍥犲鍏ヨ鐩�
+                updateDO.setStatus(Objects.equals(existTarget.getStatus(), CrmSalesTargetStatusEnum.INVALID.getStatus())
+                        ? CrmSalesTargetStatusEnum.INVALID.getStatus() : status);
+                salesTargetMapper.updateById(updateDO);
+                respVO.getUpdateSalesTargetNames().add(importSalesTarget.getName());
+            } catch (ServiceException ex) {
+                respVO.getFailureSalesTargetNames().put(importSalesTarget.getName(), ex.getMessage());
+            }
+        });
+        return respVO;
+    }
+
     // ========== 绉佹湁鏂规硶 ==========
 
     private CrmSalesTargetDO validateSalesTargetExists(Long id) {

--
Gitblit v1.9.3