Browse Source

✨ CRM:完善商机的新增、修改逻辑

YunaiV 1 year ago
parent
commit
77f98c4d12

+ 13 - 5
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessStatusController.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.crm.controller.admin.business;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
@@ -29,6 +30,7 @@ import java.util.Map;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 
 @Tag(name = "管理后台 - CRM 商机状态")
 @RestController
@@ -62,7 +64,7 @@ public class CrmBusinessStatusController {
     @DeleteMapping("/delete")
     @Operation(summary = "删除商机状态")
     @Parameter(name = "id", description = "编号", required = true)
-    @PreAuthorize("@ss.hasPermission('crm:business-status-type:delete')")
+    @PreAuthorize("@ss.hasPermission('crm:business-status:delete')")
     public CommonResult<Boolean> deleteBusinessStatusType(@RequestParam("id") Long id) {
         businessStatusTypeService.deleteBusinessStatusType(id);
         return success(true);
@@ -71,7 +73,7 @@ public class CrmBusinessStatusController {
     @GetMapping("/get")
     @Operation(summary = "获得商机状态")
     @Parameter(name = "id", description = "编号", required = true, example = "1024")
-    @PreAuthorize("@ss.hasPermission('crm:business-status-type:query')")
+    @PreAuthorize("@ss.hasPermission('crm:business-status:query')")
     public CommonResult<CrmBusinessStatusRespVO> getBusinessStatusType(@RequestParam("id") Long id) {
         CrmBusinessStatusTypeDO statusType = businessStatusTypeService.getBusinessStatusType(id);
         if (statusType == null) {
@@ -84,10 +86,13 @@ public class CrmBusinessStatusController {
 
     @GetMapping("/page")
     @Operation(summary = "获得商机状态分页")
-    @PreAuthorize("@ss.hasPermission('crm:business-status-type:query')")
-    public CommonResult<PageResult<CrmBusinessStatusRespVO>> getBusinessStatusTypePage(@Valid PageParam pageReqVO) {
+    @PreAuthorize("@ss.hasPermission('crm:business-status:query')")
+    public CommonResult<PageResult<CrmBusinessStatusRespVO>> getBusinessStatusPage(@Valid PageParam pageReqVO) {
         // 1. 查询数据
         PageResult<CrmBusinessStatusTypeDO> pageResult = businessStatusTypeService.getBusinessStatusTypePage(pageReqVO);
+        if (CollUtil.isEmpty(pageResult.getList())) {
+            return success(PageResult.empty(pageResult.getTotal()));
+        }
         // 2. 拼接数据
         Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
                 convertSet(pageResult.getList(), statusType -> Long.parseLong(statusType.getCreator())));
@@ -101,9 +106,12 @@ public class CrmBusinessStatusController {
     }
 
     @GetMapping("/type-simple-list")
-    @Operation(summary = "获得商机状态列表")
+    @Operation(summary = "获得商机状态列表")
     public CommonResult<List<CrmBusinessStatusRespVO>> getBusinessStatusTypeSimpleList() {
         List<CrmBusinessStatusTypeDO> list = businessStatusTypeService.getBusinessStatusTypeList();
+        // 过滤掉部门不匹配的
+        Long deptId = adminUserApi.getUser(getLoginUserId()).getDeptId();
+        list.removeIf(statusType -> CollUtil.isNotEmpty(statusType.getDeptIds()) && !statusType.getDeptIds().contains(deptId));
         return success(BeanUtils.toBean(list, CrmBusinessStatusRespVO.class));
     }
 

+ 2 - 0
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/status/CrmBusinessStatusSaveReqVO.java

@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.module.crm.controller.admin.business.vo.status;
 
 import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.Valid;
 import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
@@ -24,6 +25,7 @@ public class CrmBusinessStatusSaveReqVO {
 
     @Schema(description = "商机状态集合", requiredMode = Schema.RequiredMode.REQUIRED)
     @NotEmpty(message = "商机状态集合不能为空")
+    @Valid
     private List<Status> statuses;
 
     @Data

+ 41 - 2
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java

@@ -19,11 +19,14 @@ import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
 import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission;
 import cn.iocoder.yudao.module.crm.service.business.bo.CrmBusinessUpdateProductReqBO;
 import cn.iocoder.yudao.module.crm.service.contact.CrmContactBusinessService;
+import cn.iocoder.yudao.module.crm.service.contact.CrmContactService;
 import cn.iocoder.yudao.module.crm.service.contract.CrmContractService;
+import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService;
 import cn.iocoder.yudao.module.crm.service.followup.bo.CrmUpdateFollowUpReqBO;
 import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
 import cn.iocoder.yudao.module.crm.service.product.CrmProductService;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
 import com.mzt.logapi.context.LogRecordContext;
 import com.mzt.logapi.service.impl.DiffParseFunction;
 import com.mzt.logapi.starter.annotation.LogRecord;
@@ -57,16 +60,26 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
     @Resource
     private CrmBusinessProductMapper businessProductMapper;
 
+    @Resource
+    private CrmBusinessStatusService businessStatusService;
     @Resource
     @Lazy // 延迟加载,避免循环依赖
     private CrmContractService contractService;
     @Resource
+    private CrmCustomerService customerService;
+    @Resource
+    @Lazy // 延迟加载,避免循环依赖
+    private CrmContactService contactService;
+    @Resource
     private CrmPermissionService permissionService;
     @Resource
     private CrmContactBusinessService contactBusinessService;
     @Resource
     private CrmProductService productService;
 
+    @Resource
+    private AdminUserApi adminUserApi;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     @LogRecord(type = CRM_BUSINESS_TYPE, subType = CRM_BUSINESS_CREATE_SUB_TYPE, bizNo = "{{#business.id}}",
@@ -74,10 +87,12 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
     public Long createBusiness(CrmBusinessSaveReqVO createReqVO, Long userId) {
         // 1.1 校验产品项的有效性
         List<CrmBusinessProductDO> businessProducts = validateBusinessProducts(createReqVO.getProducts());
-        // 1.2 TODO 芋艿:校验关联字
+        // 1.2 校验关联字段
+        validateBusinessForCreate(createReqVO);
 
         // 2.1 插入商机
         CrmBusinessDO business = BeanUtils.toBean(createReqVO, CrmBusinessDO.class).setOwnerUserId(userId);
+        business.setStatusId(businessStatusService.getBusinessStatusListByTypeId(createReqVO.getStatusTypeId()).get(0).getId()); // 默认状态
         calculateTotalPrice(business, businessProducts);
         businessMapper.insert(business);
         // 2.2 插入商机关联商品
@@ -101,6 +116,9 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
 
     // TODO @lzxhqs:CrmContactBusinessService 调用这个;这样逻辑才能收敛哈;
     private void createContactBusiness(Long businessId, Long contactId) {
+        if  (contactId == null) {
+            return;
+        }
         CrmContactBusinessDO contactBusiness = new CrmContactBusinessDO();
         contactBusiness.setBusinessId(businessId);
         contactBusiness.setContactId(contactId);
@@ -113,11 +131,13 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
             success = CRM_BUSINESS_UPDATE_SUCCESS)
     @CrmPermission(bizType = CrmBizTypeEnum.CRM_BUSINESS, bizId = "#updateReqVO.id", level = CrmPermissionLevelEnum.WRITE)
     public void updateBusiness(CrmBusinessSaveReqVO updateReqVO) {
+        updateReqVO.setOwnerUserId(null).setStatusTypeId(null); // 不允许更新的字段
         // 1.1 校验存在
         CrmBusinessDO oldBusiness = validateBusinessExists(updateReqVO.getId());
         // 1.2 校验产品项的有效性
         List<CrmBusinessProductDO> businessProducts = validateBusinessProducts(updateReqVO.getProducts());
-        // 1.3 TODO 芋艿:校验关联字
+        // 1.3 校验关联字段
+        validateBusinessForCreate(updateReqVO);
 
         // 2.1 更新商机
         CrmBusinessDO updateObj = BeanUtils.toBean(updateReqVO, CrmBusinessDO.class);
@@ -148,6 +168,25 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
         }
     }
 
+    private void validateBusinessForCreate(CrmBusinessSaveReqVO saveReqVO) {
+        // 校验商机状态
+        if (saveReqVO.getStatusTypeId() != null) {
+            businessStatusService.validateBusinessStatusType(saveReqVO.getStatusTypeId());
+        }
+        // 校验客户
+        if (saveReqVO.getCustomerId() != null) {
+            customerService.validateCustomer(saveReqVO.getCustomerId());
+        }
+        // 校验联系人
+        if (saveReqVO.getContactId() != null) {
+            contactService.validateContact(saveReqVO.getContactId());
+        }
+        // 校验负责人
+        if (saveReqVO.getOwnerUserId() != null) {
+            adminUserApi.validateUser(saveReqVO.getOwnerUserId());
+        }
+    }
+
     private List<CrmBusinessProductDO> validateBusinessProducts(List<CrmBusinessSaveReqVO.Product> list) {
         // 1. 校验产品存在
          productService.validProductList(convertSet(list, CrmBusinessSaveReqVO.Product::getProductId));

+ 7 - 0
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusService.java

@@ -50,6 +50,13 @@ public interface CrmBusinessStatusService {
      */
     CrmBusinessStatusTypeDO getBusinessStatusType(Long id);
 
+    /**
+     * 校验商机状态组
+     *
+     * @param id 编号
+     */
+    void validateBusinessStatusType(Long id);
+
     /**
      * 获得商机状态组列表
      *

+ 9 - 4
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusServiceImpl.java

@@ -68,7 +68,7 @@ public class CrmBusinessStatusServiceImpl implements CrmBusinessStatusService {
     @Transactional(rollbackFor = Exception.class)
     public void updateBusinessStatus(CrmBusinessStatusSaveReqVO updateReqVO) {
         // 1.1 校验存在
-        validateBusinessStatusTypeNameUnique(updateReqVO.getId());
+        validateBusinessStatusTypeExists(updateReqVO.getId());
         // 1.2 校验名称是否存在
         validateBusinessStatusTypeNameUnique(updateReqVO.getName(), updateReqVO.getId());
         // 1.3 设置状态的排序
@@ -104,7 +104,7 @@ public class CrmBusinessStatusServiceImpl implements CrmBusinessStatusService {
         }
     }
 
-    private void validateBusinessStatusTypeNameUnique(Long id) {
+    private void validateBusinessStatusTypeExists(Long id) {
         if (businessStatusTypeMapper.selectById(id) == null) {
             throw exception(BUSINESS_STATUS_TYPE_NOT_EXISTS);
         }
@@ -123,7 +123,7 @@ public class CrmBusinessStatusServiceImpl implements CrmBusinessStatusService {
     @Transactional(rollbackFor = Exception.class)
     public void deleteBusinessStatusType(Long id) {
         // 1.1 校验存在
-        validateBusinessStatusTypeNameUnique(id);
+        validateBusinessStatusTypeExists(id);
         // 1.2 已经使用,无法更新
         if (businessService.getBusinessCountByStatusTypeId(id) > 0) {
             throw exception(BUSINESS_STATUS_DELETE_FAIL_USED);
@@ -140,6 +140,11 @@ public class CrmBusinessStatusServiceImpl implements CrmBusinessStatusService {
         return businessStatusTypeMapper.selectById(id);
     }
 
+    @Override
+    public void validateBusinessStatusType(Long id) {
+        validateBusinessStatusTypeExists(id);
+    }
+
     @Override
     public List<CrmBusinessStatusTypeDO> getBusinessStatusTypeList() {
         return businessStatusTypeMapper.selectList();
@@ -147,7 +152,7 @@ public class CrmBusinessStatusServiceImpl implements CrmBusinessStatusService {
 
     @Override
     public PageResult<CrmBusinessStatusTypeDO> getBusinessStatusTypePage(PageParam pageReqVO) {
-        return null;
+        return businessStatusTypeMapper.selectPage(pageReqVO);
     }
 
     @Override

+ 7 - 0
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactService.java

@@ -87,6 +87,13 @@ public interface CrmContactService {
      */
     CrmContactDO getContact(Long id);
 
+    /**
+     * 校验联系人
+     *
+     * @param id 编号
+     */
+    void validateContact(Long id);
+
     /**
      * 获得联系人列表
      *

+ 5 - 0
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactServiceImpl.java

@@ -229,6 +229,11 @@ public class CrmContactServiceImpl implements CrmContactService {
         return contactMapper.selectById(id);
     }
 
+    @Override
+    public void validateContact(Long id) {
+        validateContactExists(id);
+    }
+
     @Override
     public List<CrmContactDO> getContactListByIds(Collection<Long> ids, Long userId) {
         if (CollUtil.isEmpty(ids)) {