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

This commit is contained in:
YunaiV 2024-02-21 21:49:49 +08:00
parent f76a7cd941
commit 77f98c4d12
7 changed files with 84 additions and 11 deletions

View File

@ -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));
}

View File

@ -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

View File

@ -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 @lzxhqsCrmContactBusinessService 调用这个这样逻辑才能收敛哈
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));

View File

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

View File

@ -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

View File

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

View File

@ -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)) {