From 77f98c4d129307a1128af4ba6e88d8bfb52d8737 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 21 Feb 2024 21:49:49 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20CRM=EF=BC=9A=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E5=95=86=E6=9C=BA=E7=9A=84=E6=96=B0=E5=A2=9E=E3=80=81=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../business/CrmBusinessStatusController.java | 18 +++++--- .../vo/status/CrmBusinessStatusSaveReqVO.java | 2 + .../business/CrmBusinessServiceImpl.java | 43 ++++++++++++++++++- .../business/CrmBusinessStatusService.java | 7 +++ .../CrmBusinessStatusServiceImpl.java | 13 ++++-- .../service/contact/CrmContactService.java | 7 +++ .../contact/CrmContactServiceImpl.java | 5 +++ 7 files changed, 84 insertions(+), 11 deletions(-) diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessStatusController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessStatusController.java index bdc44679d..0663d1f28 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessStatusController.java +++ b/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 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 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> getBusinessStatusTypePage(@Valid PageParam pageReqVO) { + @PreAuthorize("@ss.hasPermission('crm:business-status:query')") + public CommonResult> getBusinessStatusPage(@Valid PageParam pageReqVO) { // 1. 查询数据 PageResult pageResult = businessStatusTypeService.getBusinessStatusTypePage(pageReqVO); + if (CollUtil.isEmpty(pageResult.getList())) { + return success(PageResult.empty(pageResult.getTotal())); + } // 2. 拼接数据 Map 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> getBusinessStatusTypeSimpleList() { List 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)); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/status/CrmBusinessStatusSaveReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/status/CrmBusinessStatusSaveReqVO.java index 05ea279af..e93305c6a 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/status/CrmBusinessStatusSaveReqVO.java +++ b/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 statuses; @Data diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java index 2b4e09e2f..9206f741a 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java +++ b/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 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 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 validateBusinessProducts(List list) { // 1. 校验产品存在 productService.validProductList(convertSet(list, CrmBusinessSaveReqVO.Product::getProductId)); diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusService.java index c813f37cf..cc527ec3e 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusService.java +++ b/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); + /** * 获得商机状态组列表 * diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusServiceImpl.java index 349b112c2..580b431aa 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusServiceImpl.java +++ b/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 getBusinessStatusTypeList() { return businessStatusTypeMapper.selectList(); @@ -147,7 +152,7 @@ public class CrmBusinessStatusServiceImpl implements CrmBusinessStatusService { @Override public PageResult getBusinessStatusTypePage(PageParam pageReqVO) { - return null; + return businessStatusTypeMapper.selectPage(pageReqVO); } @Override diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactService.java index a096ed232..4f7c6de22 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactService.java +++ b/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); + /** * 获得联系人列表 * diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactServiceImpl.java index 7b89167e0..b073889cd 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactServiceImpl.java +++ b/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 getContactListByIds(Collection ids, Long userId) { if (CollUtil.isEmpty(ids)) {