mirror of
https://gitee.com/huangge1199_admin/vue-pro.git
synced 2024-11-23 07:41:53 +08:00
📖 CRM:code review 商机模块
This commit is contained in:
parent
2d0537387b
commit
9e3055ee1e
@ -24,7 +24,7 @@ public interface ErrorCodeConstants {
|
|||||||
// ========== 联系人管理 1-020-003-000 ==========
|
// ========== 联系人管理 1-020-003-000 ==========
|
||||||
ErrorCode CONTACT_NOT_EXISTS = new ErrorCode(1_020_003_000, "联系人不存在");
|
ErrorCode CONTACT_NOT_EXISTS = new ErrorCode(1_020_003_000, "联系人不存在");
|
||||||
ErrorCode CONTACT_BUSINESS_LINK_NOT_EXISTS = new ErrorCode( 1_020_003_001, "联系人商机关联不存在");
|
ErrorCode CONTACT_BUSINESS_LINK_NOT_EXISTS = new ErrorCode( 1_020_003_001, "联系人商机关联不存在");
|
||||||
ErrorCode CONTACT_BUSINESS_LINK_CREATE_EMPTY = new ErrorCode( 1_020_003_002, "联系人商机关联参数为空");
|
|
||||||
// ========== 回款 1-020-004-000 ==========
|
// ========== 回款 1-020-004-000 ==========
|
||||||
ErrorCode RECEIVABLE_NOT_EXISTS = new ErrorCode(1_020_004_000, "回款不存在");
|
ErrorCode RECEIVABLE_NOT_EXISTS = new ErrorCode(1_020_004_000, "回款不存在");
|
||||||
|
|
||||||
|
@ -4,14 +4,9 @@ import cn.hutool.core.collection.CollUtil;
|
|||||||
import cn.hutool.core.lang.Assert;
|
import cn.hutool.core.lang.Assert;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
|
|
||||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.*;
|
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.*;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.status.CrmBusinessStatusQueryVO;
|
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypeQueryVO;
|
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactBusinessLinkPageReqVO;
|
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractPageReqVO;
|
|
||||||
import cn.iocoder.yudao.module.crm.convert.business.CrmBusinessConvert;
|
import cn.iocoder.yudao.module.crm.convert.business.CrmBusinessConvert;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO;
|
||||||
@ -33,13 +28,10 @@ import org.springframework.web.bind.annotation.*;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.PageParam.PAGE_SIZE_NONE;
|
import static cn.iocoder.yudao.framework.common.pojo.PageParam.PAGE_SIZE_NONE;
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
|
||||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
||||||
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
||||||
|
|
||||||
@ -51,13 +43,10 @@ public class CrmBusinessController {
|
|||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private CrmBusinessService businessService;
|
private CrmBusinessService businessService;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private CrmCustomerService customerService;
|
private CrmCustomerService customerService;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private CrmBusinessStatusTypeService businessStatusTypeService;
|
private CrmBusinessStatusTypeService businessStatusTypeService;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private CrmBusinessStatusService businessStatusService;
|
private CrmBusinessStatusService businessStatusService;
|
||||||
|
|
||||||
@ -99,27 +88,7 @@ public class CrmBusinessController {
|
|||||||
@PreAuthorize("@ss.hasPermission('crm:business:query')")
|
@PreAuthorize("@ss.hasPermission('crm:business:query')")
|
||||||
public CommonResult<PageResult<CrmBusinessRespVO>> getBusinessPage(@Valid CrmBusinessPageReqVO pageVO) {
|
public CommonResult<PageResult<CrmBusinessRespVO>> getBusinessPage(@Valid CrmBusinessPageReqVO pageVO) {
|
||||||
PageResult<CrmBusinessDO> pageResult = businessService.getBusinessPage(pageVO, getLoginUserId());
|
PageResult<CrmBusinessDO> pageResult = businessService.getBusinessPage(pageVO, getLoginUserId());
|
||||||
if (CollUtil.isEmpty(pageResult.getList())) {
|
return success(buildBusinessDetailPageResult(pageResult));
|
||||||
return success(PageResult.empty(pageResult.getTotal()));
|
|
||||||
}
|
|
||||||
// 处理客户名称回显
|
|
||||||
// TODO @ljlleo:可以使用 CollectionUtils.convertSet 替代常用的 stream 操作,更简洁一点;下面几个也是哈;
|
|
||||||
Set<Long> customerIds = pageResult.getList().stream()
|
|
||||||
.map(CrmBusinessDO::getCustomerId).filter(Objects::nonNull).collect(Collectors.toSet());
|
|
||||||
List<CrmCustomerDO> customerList = customerService.getCustomerList(customerIds, getLoginUserId());
|
|
||||||
// 处理商机状态类型名称回显
|
|
||||||
Set<Long> statusTypeIds = pageResult.getList().stream()
|
|
||||||
.map(CrmBusinessDO::getStatusTypeId).filter(Objects::nonNull).collect(Collectors.toSet());
|
|
||||||
CrmBusinessStatusTypeQueryVO queryStatusTypeVO = new CrmBusinessStatusTypeQueryVO();
|
|
||||||
queryStatusTypeVO.setIdList(statusTypeIds);
|
|
||||||
List<CrmBusinessStatusTypeDO> statusTypeList = businessStatusTypeService.selectList(queryStatusTypeVO);
|
|
||||||
// 处理商机状态名称回显
|
|
||||||
Set<Long> statusIds = pageResult.getList().stream()
|
|
||||||
.map(CrmBusinessDO::getStatusId).filter(Objects::nonNull).collect(Collectors.toSet());
|
|
||||||
CrmBusinessStatusQueryVO queryVO = new CrmBusinessStatusQueryVO();
|
|
||||||
queryVO.setIdList(statusIds);
|
|
||||||
List<CrmBusinessStatusDO> statusList = businessStatusService.selectList(queryVO);
|
|
||||||
return success(CrmBusinessConvert.INSTANCE.convertPage(pageResult, customerList, statusTypeList, statusList));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/page-by-customer")
|
@GetMapping("/page-by-customer")
|
||||||
@ -127,24 +96,16 @@ public class CrmBusinessController {
|
|||||||
public CommonResult<PageResult<CrmBusinessRespVO>> getBusinessPageByCustomer(@Valid CrmBusinessPageReqVO pageReqVO) {
|
public CommonResult<PageResult<CrmBusinessRespVO>> getBusinessPageByCustomer(@Valid CrmBusinessPageReqVO pageReqVO) {
|
||||||
Assert.notNull(pageReqVO.getCustomerId(), "客户编号不能为空");
|
Assert.notNull(pageReqVO.getCustomerId(), "客户编号不能为空");
|
||||||
PageResult<CrmBusinessDO> pageResult = businessService.getBusinessPageByCustomerId(pageReqVO);
|
PageResult<CrmBusinessDO> pageResult = businessService.getBusinessPageByCustomerId(pageReqVO);
|
||||||
// 处理客户名称回显
|
return success(buildBusinessDetailPageResult(pageResult));
|
||||||
// TODO @ljlleo:可以使用 CollectionUtils.convertSet 替代常用的 stream 操作,更简洁一点;下面几个也是哈;
|
}
|
||||||
Set<Long> customerIds = pageResult.getList().stream()
|
|
||||||
.map(CrmBusinessDO::getCustomerId).filter(Objects::nonNull).collect(Collectors.toSet());
|
|
||||||
List<CrmCustomerDO> customerList = customerService.getCustomerList(customerIds, getLoginUserId());
|
@GetMapping("/page-by-contact")
|
||||||
// 处理商机状态类型名称回显
|
@Operation(summary = "获得联系人的商机分页")
|
||||||
Set<Long> statusTypeIds = pageResult.getList().stream()
|
@PreAuthorize("@ss.hasPermission('crm:business:query')")
|
||||||
.map(CrmBusinessDO::getStatusTypeId).filter(Objects::nonNull).collect(Collectors.toSet());
|
public CommonResult<PageResult<CrmBusinessRespVO>> getBusinessContactPage(@Valid CrmBusinessPageReqVO pageReqVO) {
|
||||||
CrmBusinessStatusTypeQueryVO queryStatusTypeVO = new CrmBusinessStatusTypeQueryVO();
|
PageResult<CrmBusinessDO> pageResult = businessService.getBusinessPageByContact(pageReqVO);
|
||||||
queryStatusTypeVO.setIdList(statusTypeIds);
|
return success(buildBusinessDetailPageResult(pageResult));
|
||||||
List<CrmBusinessStatusTypeDO> statusTypeList = businessStatusTypeService.selectList(queryStatusTypeVO);
|
|
||||||
// 处理商机状态名称回显
|
|
||||||
Set<Long> statusIds = pageResult.getList().stream()
|
|
||||||
.map(CrmBusinessDO::getStatusId).filter(Objects::nonNull).collect(Collectors.toSet());
|
|
||||||
CrmBusinessStatusQueryVO queryVO = new CrmBusinessStatusQueryVO();
|
|
||||||
queryVO.setIdList(statusIds);
|
|
||||||
List<CrmBusinessStatusDO> statusList = businessStatusService.selectList(queryVO);
|
|
||||||
return success(CrmBusinessConvert.INSTANCE.convertPage(pageResult, customerList, statusTypeList, statusList));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/export-excel")
|
@GetMapping("/export-excel")
|
||||||
@ -156,8 +117,21 @@ public class CrmBusinessController {
|
|||||||
exportReqVO.setPageSize(PAGE_SIZE_NONE);
|
exportReqVO.setPageSize(PAGE_SIZE_NONE);
|
||||||
PageResult<CrmBusinessDO> pageResult = businessService.getBusinessPage(exportReqVO, getLoginUserId());
|
PageResult<CrmBusinessDO> pageResult = businessService.getBusinessPage(exportReqVO, getLoginUserId());
|
||||||
// 导出 Excel
|
// 导出 Excel
|
||||||
ExcelUtils.write(response, "商机.xls", "数据", CrmBusinessExcelVO.class,
|
ExcelUtils.write(response, "商机.xls", "数据", CrmBusinessRespVO.class,
|
||||||
CrmBusinessConvert.INSTANCE.convertList02(pageResult.getList()));
|
buildBusinessDetailPageResult(pageResult).getList());
|
||||||
|
}
|
||||||
|
|
||||||
|
private PageResult<CrmBusinessRespVO> buildBusinessDetailPageResult(PageResult<CrmBusinessDO> pageResult) {
|
||||||
|
if (CollUtil.isEmpty(pageResult.getList())) {
|
||||||
|
return PageResult.empty(pageResult.getTotal());
|
||||||
|
}
|
||||||
|
List<CrmBusinessStatusTypeDO> statusTypeList = businessStatusTypeService.getBusinessStatusTypeList(
|
||||||
|
convertSet(pageResult.getList(), CrmBusinessDO::getStatusTypeId));
|
||||||
|
List<CrmBusinessStatusDO> statusList = businessStatusService.getBusinessStatusList(
|
||||||
|
convertSet(pageResult.getList(), CrmBusinessDO::getStatusId));
|
||||||
|
List<CrmCustomerDO> customerList = customerService.getCustomerList(
|
||||||
|
convertSet(pageResult.getList(), CrmBusinessDO::getCustomerId));
|
||||||
|
return CrmBusinessConvert.INSTANCE.convertPage(pageResult, customerList, statusTypeList, statusList);
|
||||||
}
|
}
|
||||||
|
|
||||||
@PutMapping("/transfer")
|
@PutMapping("/transfer")
|
||||||
@ -167,34 +141,5 @@ public class CrmBusinessController {
|
|||||||
businessService.transferBusiness(reqVO, getLoginUserId());
|
businessService.transferBusiness(reqVO, getLoginUserId());
|
||||||
return success(true);
|
return success(true);
|
||||||
}
|
}
|
||||||
@GetMapping("/page-by-contact")
|
|
||||||
@Operation(summary = "获得联系人的商机分页")
|
|
||||||
@PreAuthorize("@ss.hasPermission('crm:business:query')")
|
|
||||||
public CommonResult<PageResult<CrmBusinessRespVO>> getBusinessContactPage(@Valid CrmContactBusinessLinkPageReqVO pageVO) {
|
|
||||||
PageResult<CrmBusinessRespVO> pageResult = businessService.getBusinessPageByContact(pageVO);
|
|
||||||
// 处理商机状态类型名称回显
|
|
||||||
Set<Long> statusTypeIds = pageResult.getList().stream()
|
|
||||||
.map(CrmBusinessRespVO::getStatusTypeId).filter(Objects::nonNull).collect(Collectors.toSet());
|
|
||||||
CrmBusinessStatusTypeQueryVO queryStatusTypeVO = new CrmBusinessStatusTypeQueryVO();
|
|
||||||
queryStatusTypeVO.setIdList(statusTypeIds);
|
|
||||||
List<CrmBusinessStatusTypeDO> statusTypeList = businessStatusTypeService.selectList(queryStatusTypeVO);
|
|
||||||
Map<Long,String> statusTypeMap = CollectionUtils.convertMap(statusTypeList,CrmBusinessStatusTypeDO::getId,CrmBusinessStatusTypeDO::getName);
|
|
||||||
// 处理商机状态名称回显
|
|
||||||
Set<Long> statusIds = pageResult.getList().stream()
|
|
||||||
.map(CrmBusinessRespVO::getStatusId).filter(Objects::nonNull).collect(Collectors.toSet());
|
|
||||||
CrmBusinessStatusQueryVO queryVO = new CrmBusinessStatusQueryVO();
|
|
||||||
queryVO.setIdList(statusIds);
|
|
||||||
List<CrmBusinessStatusDO> statusList = businessStatusService.selectList(queryVO);
|
|
||||||
Map<Long,String> statusMap = CollectionUtils.convertMap(statusList,CrmBusinessStatusDO::getId,CrmBusinessStatusDO::getName);
|
|
||||||
// 处理客户名称回显
|
|
||||||
Set<Long> customerIds = CollectionUtils.convertSet(pageResult.getList(),CrmBusinessRespVO::getCustomerId);
|
|
||||||
List<CrmCustomerDO> customerList = customerService.getCustomerList(customerIds);
|
|
||||||
Map<Long,String> customerMap = CollectionUtils.convertMap(customerList,CrmCustomerDO::getId,CrmCustomerDO::getName);
|
|
||||||
pageResult.getList().forEach(item -> {
|
|
||||||
item.setStatusTypeName(statusTypeMap.get(item.getStatusTypeId()));
|
|
||||||
item.setStatusName(statusMap.get(item.getStatusId()));
|
|
||||||
item.setCustomerName(customerMap.get(item.getCustomerId()));
|
|
||||||
});
|
|
||||||
return success(pageResult);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,9 @@ public class CrmBusinessPageReqVO extends PageParam {
|
|||||||
@Schema(description = "客户编号", example = "10795")
|
@Schema(description = "客户编号", example = "10795")
|
||||||
private Long customerId;
|
private Long customerId;
|
||||||
|
|
||||||
|
@Schema(description = "联系人编号", example = "10795")
|
||||||
|
private Long contactId;
|
||||||
|
|
||||||
@Schema(description = "场景类型", example = "1")
|
@Schema(description = "场景类型", example = "1")
|
||||||
@InEnum(CrmSceneTypeEnum.class)
|
@InEnum(CrmSceneTypeEnum.class)
|
||||||
private Integer sceneType; // 场景类型,为 null 时则表示全部
|
private Integer sceneType; // 场景类型,为 null 时则表示全部
|
||||||
|
@ -25,6 +25,4 @@ public class CrmBusinessRespVO extends CrmBusinessBaseVO {
|
|||||||
@Schema(description = "状态名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "跟进中")
|
@Schema(description = "状态名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "跟进中")
|
||||||
private String statusName;
|
private String statusName;
|
||||||
|
|
||||||
@Schema(description = "联系人商机关联ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "32129")
|
|
||||||
private Long businessContactId;
|
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@ import cn.iocoder.yudao.module.crm.convert.contact.CrmContactConvert;
|
|||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
|
||||||
import cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants;
|
import cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants;
|
||||||
import cn.iocoder.yudao.module.crm.service.contact.CrmContactBusinessLinkService;
|
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.contact.CrmContactService;
|
||||||
import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService;
|
import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService;
|
||||||
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
||||||
@ -30,10 +30,6 @@ import org.springframework.security.access.prepost.PreAuthorize;
|
|||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
import javax.validation.Valid;
|
|
||||||
import javax.validation.constraints.NotEmpty;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -63,7 +59,7 @@ public class CrmContactController {
|
|||||||
private AdminUserApi adminUserApi;
|
private AdminUserApi adminUserApi;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private CrmContactBusinessLinkService contactBusinessLinkService;
|
private CrmContactBusinessService contactBusinessLinkService;
|
||||||
|
|
||||||
@PostMapping("/create")
|
@PostMapping("/create")
|
||||||
@Operation(summary = "创建联系人")
|
@Operation(summary = "创建联系人")
|
||||||
@ -103,7 +99,7 @@ public class CrmContactController {
|
|||||||
NumberUtil.parseLong(contact.getCreator()), contact.getOwnerUserId())));
|
NumberUtil.parseLong(contact.getCreator()), contact.getOwnerUserId())));
|
||||||
// 2. 获取客户信息
|
// 2. 获取客户信息
|
||||||
List<CrmCustomerDO> customerList = customerService.getCustomerList(
|
List<CrmCustomerDO> customerList = customerService.getCustomerList(
|
||||||
Collections.singletonList(contact.getCustomerId()), getLoginUserId());
|
Collections.singletonList(contact.getCustomerId()));
|
||||||
// 3. 直属上级
|
// 3. 直属上级
|
||||||
List<CrmContactDO> parentContactList = contactService.getContactList(
|
List<CrmContactDO> parentContactList = contactService.getContactList(
|
||||||
Collections.singletonList(contact.getParentId()), getLoginUserId());
|
Collections.singletonList(contact.getParentId()), getLoginUserId());
|
||||||
@ -148,23 +144,6 @@ public class CrmContactController {
|
|||||||
convertDetailContactPage(pageResult).getList());
|
convertDetailContactPage(pageResult).getList());
|
||||||
}
|
}
|
||||||
|
|
||||||
@DeleteMapping("/delete-batch-business")
|
|
||||||
@Operation(summary = "批量删除联系人商机关联")
|
|
||||||
@PreAuthorize("@ss.hasPermission('crm:contact-business-link:delete')")
|
|
||||||
public CommonResult<Boolean> deleteContactBusinessLinkBatch(@Valid @RequestBody List<Long> businessContactIds) {
|
|
||||||
contactBusinessLinkService.deleteContactBusinessLink(businessContactIds);
|
|
||||||
return success(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping("/create-batch-business")
|
|
||||||
@Operation(summary = "创建联系人商机关联")
|
|
||||||
@PreAuthorize("@ss.hasPermission('crm:contact-business-link:create')")
|
|
||||||
public CommonResult<Boolean> createContactBusinessLinkBatch(
|
|
||||||
@Valid @NotEmpty @RequestBody List<CrmContactBusinessLinkSaveReqVO> createReqVO) {
|
|
||||||
contactBusinessLinkService.createContactBusinessLinkBatch(createReqVO);
|
|
||||||
return success(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 转换成详细的联系人分页,即读取关联信息
|
* 转换成详细的联系人分页,即读取关联信息
|
||||||
*
|
*
|
||||||
@ -178,7 +157,7 @@ public class CrmContactController {
|
|||||||
}
|
}
|
||||||
// 1. 获取客户列表
|
// 1. 获取客户列表
|
||||||
List<CrmCustomerDO> crmCustomerDOList = customerService.getCustomerList(
|
List<CrmCustomerDO> crmCustomerDOList = customerService.getCustomerList(
|
||||||
convertSet(contactList, CrmContactDO::getCustomerId), getLoginUserId());
|
convertSet(contactList, CrmContactDO::getCustomerId));
|
||||||
// 2. 获取创建人、负责人列表
|
// 2. 获取创建人、负责人列表
|
||||||
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertListByFlatMap(contactList,
|
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertListByFlatMap(contactList,
|
||||||
contact -> Stream.of(NumberUtils.parseLong(contact.getCreator()), contact.getOwnerUserId())));
|
contact -> Stream.of(NumberUtils.parseLong(contact.getCreator()), contact.getOwnerUserId())));
|
||||||
@ -196,4 +175,22 @@ public class CrmContactController {
|
|||||||
return success(true);
|
return success(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ================== 关联/取关商机 ===================
|
||||||
|
|
||||||
|
@PostMapping("/create-business-list")
|
||||||
|
@Operation(summary = "创建联系人与商机的关联")
|
||||||
|
@PreAuthorize("@ss.hasPermission('crm:contact:create-business')")
|
||||||
|
public CommonResult<Boolean> createContactBusinessList(@Valid @RequestBody CrmContactBusinessReqVO createReqVO) {
|
||||||
|
contactBusinessLinkService.createContactBusinessList(createReqVO);
|
||||||
|
return success(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@DeleteMapping("/delete-business-list")
|
||||||
|
@Operation(summary = "删除联系人与商机的关联")
|
||||||
|
@PreAuthorize("@ss.hasPermission('crm:contact:delete-business')")
|
||||||
|
public CommonResult<Boolean> deleteContactBusinessList(@Valid @RequestBody CrmContactBusinessReqVO deleteReqVO) {
|
||||||
|
contactBusinessLinkService.deleteContactBusinessList(deleteReqVO);
|
||||||
|
return success(true);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,30 +0,0 @@
|
|||||||
package cn.iocoder.yudao.module.crm.controller.admin.contact.vo;
|
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.EqualsAndHashCode;
|
|
||||||
import lombok.ToString;
|
|
||||||
import org.springframework.format.annotation.DateTimeFormat;
|
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
|
||||||
|
|
||||||
@Schema(description = "管理后台 - CRM 联系人商机关联分页 Request VO")
|
|
||||||
@Data
|
|
||||||
@EqualsAndHashCode(callSuper = true)
|
|
||||||
@ToString(callSuper = true)
|
|
||||||
public class CrmContactBusinessLinkPageReqVO extends PageParam {
|
|
||||||
|
|
||||||
@Schema(description = "联系人编号", example = "20878")
|
|
||||||
private Long contactId;
|
|
||||||
|
|
||||||
@Schema(description = "商机编号", example = "7638")
|
|
||||||
private Long businessId;
|
|
||||||
|
|
||||||
@Schema(description = "创建时间")
|
|
||||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
|
||||||
private LocalDateTime[] createTime;
|
|
||||||
|
|
||||||
}
|
|
@ -1,26 +0,0 @@
|
|||||||
package cn.iocoder.yudao.module.crm.controller.admin.contact.vo;
|
|
||||||
|
|
||||||
import com.alibaba.excel.annotation.ExcelProperty;
|
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
|
|
||||||
@Schema(description = "管理后台 - CRM 联系人商机关联 Response VO")
|
|
||||||
@Data
|
|
||||||
public class CrmContactBusinessLinkRespVO {
|
|
||||||
|
|
||||||
@Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "17220")
|
|
||||||
@ExcelProperty("主键")
|
|
||||||
private Long id;
|
|
||||||
|
|
||||||
@Schema(description = "联系人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20878")
|
|
||||||
private Long contactId;
|
|
||||||
|
|
||||||
@Schema(description = "商机编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "7638")
|
|
||||||
private Long businessId;
|
|
||||||
|
|
||||||
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
|
||||||
private LocalDateTime createTime;
|
|
||||||
|
|
||||||
}
|
|
@ -1,23 +0,0 @@
|
|||||||
package cn.iocoder.yudao.module.crm.controller.admin.contact.vo;
|
|
||||||
|
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
import jakarta.validation.constraints.NotNull;
|
|
||||||
|
|
||||||
@Schema(description = "管理后台 - CRM 联系人商机关联新增/修改 Request VO")
|
|
||||||
@Data
|
|
||||||
public class CrmContactBusinessLinkSaveReqVO {
|
|
||||||
|
|
||||||
@Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "17220")
|
|
||||||
private Long id;
|
|
||||||
|
|
||||||
@Schema(description = "联系人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20878")
|
|
||||||
@NotNull(message="联系人不能为空")
|
|
||||||
private Long contactId;
|
|
||||||
|
|
||||||
@Schema(description = "商机编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "7638")
|
|
||||||
@NotNull(message="商机不能为空")
|
|
||||||
private Long businessId;
|
|
||||||
|
|
||||||
}
|
|
@ -0,0 +1,22 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.controller.admin.contact.vo;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import jakarta.validation.constraints.NotEmpty;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Schema(description = "管理后台 - CRM 联系人商机 Request VO") // 用于关联,取消关联的操作
|
||||||
|
@Data
|
||||||
|
public class CrmContactBusinessReqVO {
|
||||||
|
|
||||||
|
@Schema(description = "联系人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20878")
|
||||||
|
@NotNull(message="联系人不能为空")
|
||||||
|
private Long contactId;
|
||||||
|
|
||||||
|
@Schema(description = "商机编号数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "7638")
|
||||||
|
@NotEmpty(message="商机不能为空")
|
||||||
|
private List<Long> businessIds;
|
||||||
|
|
||||||
|
}
|
@ -124,7 +124,7 @@ public class CrmContractController {
|
|||||||
}
|
}
|
||||||
// 1. 获取客户列表
|
// 1. 获取客户列表
|
||||||
List<CrmCustomerDO> customerList = customerService.getCustomerList(
|
List<CrmCustomerDO> customerList = customerService.getCustomerList(
|
||||||
convertSet(contactList, CrmContractDO::getCustomerId), getLoginUserId());
|
convertSet(contactList, CrmContractDO::getCustomerId));
|
||||||
// 2. 获取创建人、负责人列表
|
// 2. 获取创建人、负责人列表
|
||||||
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertListByFlatMap(contactList,
|
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertListByFlatMap(contactList,
|
||||||
contact -> Stream.of(NumberUtils.parseLong(contact.getCreator()), contact.getOwnerUserId())));
|
contact -> Stream.of(NumberUtils.parseLong(contact.getCreator()), contact.getOwnerUserId())));
|
||||||
|
@ -131,7 +131,7 @@ public class CrmReceivableController {
|
|||||||
}
|
}
|
||||||
// 1. 获取客户列表
|
// 1. 获取客户列表
|
||||||
List<CrmCustomerDO> customerList = customerService.getCustomerList(
|
List<CrmCustomerDO> customerList = customerService.getCustomerList(
|
||||||
convertSet(receivableList, CrmReceivableDO::getCustomerId), getLoginUserId());
|
convertSet(receivableList, CrmReceivableDO::getCustomerId));
|
||||||
// 2. 获取创建人、负责人列表
|
// 2. 获取创建人、负责人列表
|
||||||
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertListByFlatMap(receivableList,
|
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertListByFlatMap(receivableList,
|
||||||
contact -> Stream.of(NumberUtils.parseLong(contact.getCreator()), contact.getOwnerUserId())));
|
contact -> Stream.of(NumberUtils.parseLong(contact.getCreator()), contact.getOwnerUserId())));
|
||||||
|
@ -135,7 +135,7 @@ public class CrmReceivablePlanController {
|
|||||||
}
|
}
|
||||||
// 1. 获取客户列表
|
// 1. 获取客户列表
|
||||||
List<CrmCustomerDO> customerList = customerService.getCustomerList(
|
List<CrmCustomerDO> customerList = customerService.getCustomerList(
|
||||||
convertSet(receivablePlanList, CrmReceivablePlanDO::getCustomerId), getLoginUserId());
|
convertSet(receivablePlanList, CrmReceivablePlanDO::getCustomerId));
|
||||||
// 2. 获取创建人、负责人列表
|
// 2. 获取创建人、负责人列表
|
||||||
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertListByFlatMap(receivablePlanList,
|
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertListByFlatMap(receivablePlanList,
|
||||||
contact -> Stream.of(NumberUtils.parseLong(contact.getCreator()), contact.getOwnerUserId())));
|
contact -> Stream.of(NumberUtils.parseLong(contact.getCreator()), contact.getOwnerUserId())));
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package cn.iocoder.yudao.module.crm.convert.contact;
|
package cn.iocoder.yudao.module.crm.convert.contact;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
|
||||||
import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils;
|
import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.*;
|
import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.*;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO;
|
||||||
@ -13,7 +14,6 @@ import org.mapstruct.factory.Mappers;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
|
||||||
import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen;
|
import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen;
|
||||||
@ -55,16 +55,16 @@ public interface CrmContactConvert {
|
|||||||
*
|
*
|
||||||
* @param contactDO 联系人
|
* @param contactDO 联系人
|
||||||
* @param userMap 用户列表
|
* @param userMap 用户列表
|
||||||
* @param crmCustomerDOList 客户
|
* @param customerDOList 客户
|
||||||
* @return ContactRespVO
|
* @return ContactRespVO
|
||||||
*/
|
*/
|
||||||
default CrmContactRespVO convert(CrmContactDO contactDO, Map<Long, AdminUserRespDTO> userMap, List<CrmCustomerDO> crmCustomerDOList,
|
default CrmContactRespVO convert(CrmContactDO contactDO, Map<Long, AdminUserRespDTO> userMap,
|
||||||
List<CrmContactDO> contactList) {
|
List<CrmCustomerDO> customerDOList, List<CrmContactDO> contactList) {
|
||||||
CrmContactRespVO contactVO = convert(contactDO);
|
CrmContactRespVO contactVO = convert(contactDO);
|
||||||
setUserInfo(contactVO, userMap);
|
setUserInfo(contactVO, userMap);
|
||||||
Map<Long, CrmCustomerDO> ustomerMap = crmCustomerDOList.stream().collect(Collectors.toMap(CrmCustomerDO::getId, v -> v));
|
Map<Long, CrmCustomerDO> customerMap = CollectionUtils.convertMap(customerDOList, CrmCustomerDO::getId);
|
||||||
Map<Long, CrmContactDO> contactMap = contactList.stream().collect(Collectors.toMap(CrmContactDO::getId, v -> v));
|
Map<Long, CrmContactDO> contactMap = CollectionUtils.convertMap(contactList, CrmContactDO::getId);
|
||||||
findAndThen(ustomerMap, contactDO.getCustomerId(), customer -> contactVO.setCustomerName(customer.getName()));
|
findAndThen(customerMap, contactDO.getCustomerId(), customer -> contactVO.setCustomerName(customer.getName()));
|
||||||
findAndThen(contactMap, contactDO.getParentId(), contact -> contactVO.setParentName(contact.getName()));
|
findAndThen(contactMap, contactDO.getParentId(), contact -> contactVO.setParentName(contact.getName()));
|
||||||
return contactVO;
|
return contactVO;
|
||||||
}
|
}
|
||||||
|
@ -2,14 +2,13 @@ package cn.iocoder.yudao.module.crm.dal.dataobject.contact;
|
|||||||
|
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO;
|
|
||||||
import com.baomidou.mybatisplus.annotation.KeySequence;
|
import com.baomidou.mybatisplus.annotation.KeySequence;
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import lombok.*;
|
import lombok.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CRM 联系人商机关联 DO
|
* CRM 联系人与商机的关联 DO
|
||||||
*
|
*
|
||||||
* @author 芋道源码
|
* @author 芋道源码
|
||||||
*/
|
*/
|
||||||
@ -21,7 +20,7 @@ import lombok.*;
|
|||||||
@Builder
|
@Builder
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class CrmContactBusinessLinkDO extends BaseDO {
|
public class CrmContactBusinessDO extends BaseDO {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 主键
|
* 主键
|
@ -30,7 +30,14 @@ public interface CrmBusinessMapper extends BaseMapperX<CrmBusinessDO> {
|
|||||||
|
|
||||||
default PageResult<CrmBusinessDO> selectPageByCustomerId(CrmBusinessPageReqVO pageReqVO) {
|
default PageResult<CrmBusinessDO> selectPageByCustomerId(CrmBusinessPageReqVO pageReqVO) {
|
||||||
return selectPage(pageReqVO, new LambdaQueryWrapperX<CrmBusinessDO>()
|
return selectPage(pageReqVO, new LambdaQueryWrapperX<CrmBusinessDO>()
|
||||||
.eq(CrmBusinessDO::getCustomerId, pageReqVO.getCustomerId()) // 指定客户编号
|
.eq(CrmBusinessDO::getCustomerId, pageReqVO.getCustomerId()) // 指定客户编号
|
||||||
|
.likeIfPresent(CrmBusinessDO::getName, pageReqVO.getName())
|
||||||
|
.orderByDesc(CrmBusinessDO::getId));
|
||||||
|
}
|
||||||
|
|
||||||
|
default PageResult<CrmBusinessDO> selectPageByContactId(CrmBusinessPageReqVO pageReqVO, Collection<Long> businessIds) {
|
||||||
|
return selectPage(pageReqVO, new LambdaQueryWrapperX<CrmBusinessDO>()
|
||||||
|
.in(CrmBusinessDO::getId, businessIds) // 指定商机编号
|
||||||
.likeIfPresent(CrmBusinessDO::getName, pageReqVO.getName())
|
.likeIfPresent(CrmBusinessDO::getName, pageReqVO.getName())
|
||||||
.orderByDesc(CrmBusinessDO::getId));
|
.orderByDesc(CrmBusinessDO::getId));
|
||||||
}
|
}
|
||||||
|
@ -1,30 +0,0 @@
|
|||||||
package cn.iocoder.yudao.module.crm.dal.mysql.contactbusinesslink;
|
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactBusinessLinkPageReqVO;
|
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactBusinessLinkDO;
|
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* CRM 联系人商机关联 Mapper
|
|
||||||
*
|
|
||||||
* @author 芋道源码
|
|
||||||
*/
|
|
||||||
@Mapper
|
|
||||||
public interface CrmContactBusinessLinkMapper extends BaseMapperX<CrmContactBusinessLinkDO> {
|
|
||||||
|
|
||||||
default PageResult<CrmContactBusinessLinkDO> selectPage(CrmContactBusinessLinkPageReqVO reqVO) {
|
|
||||||
return selectPage(reqVO, new LambdaQueryWrapperX<CrmContactBusinessLinkDO>()
|
|
||||||
.eqIfPresent(CrmContactBusinessLinkDO::getContactId, reqVO.getContactId())
|
|
||||||
.eqIfPresent(CrmContactBusinessLinkDO::getBusinessId, reqVO.getBusinessId())
|
|
||||||
.betweenIfPresent(CrmContactBusinessLinkDO::getCreateTime, reqVO.getCreateTime())
|
|
||||||
.orderByDesc(CrmContactBusinessLinkDO::getId));
|
|
||||||
}
|
|
||||||
default PageResult<CrmContactBusinessLinkDO> selectPageByContact(CrmContactBusinessLinkPageReqVO reqVO) {
|
|
||||||
return selectPage(reqVO, new LambdaQueryWrapperX<CrmContactBusinessLinkDO>()
|
|
||||||
.eqIfPresent(CrmContactBusinessLinkDO::getContactId, reqVO.getContactId())
|
|
||||||
.orderByDesc(CrmContactBusinessLinkDO::getId));
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,34 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.dal.mysql.contactbusinesslink;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactBusinessDO;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CRM 联系人与商机的关联 Mapper
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
@Mapper
|
||||||
|
public interface CrmContactBusinessMapper extends BaseMapperX<CrmContactBusinessDO> {
|
||||||
|
|
||||||
|
default CrmContactBusinessDO selectByContactIdAndBusinessId(Long contactId, Long businessId) {
|
||||||
|
return selectOne(CrmContactBusinessDO::getContactId, contactId,
|
||||||
|
CrmContactBusinessDO::getBusinessId, businessId);
|
||||||
|
}
|
||||||
|
|
||||||
|
default void deleteByContactIdAndBusinessId(Long contactId, Collection<Long> businessIds) {
|
||||||
|
delete(new LambdaQueryWrapper<CrmContactBusinessDO>()
|
||||||
|
.eq(CrmContactBusinessDO::getContactId, contactId)
|
||||||
|
.in(CrmContactBusinessDO::getBusinessId, businessIds));
|
||||||
|
}
|
||||||
|
|
||||||
|
default List<CrmContactBusinessDO> selectListByContactId(Long contactId) {
|
||||||
|
return selectList(CrmContactBusinessDO::getContactId, contactId);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -5,10 +5,8 @@ import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusi
|
|||||||
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessPageReqVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessPageReqVO;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessTransferReqVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessTransferReqVO;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessUpdateReqVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessUpdateReqVO;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.*;
|
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactBusinessLinkPageReqVO;
|
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractPageReqVO;
|
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
|
|
||||||
@ -78,10 +76,20 @@ public interface CrmBusinessService {
|
|||||||
* 数据权限:基于 {@link CrmCustomerDO} 读取
|
* 数据权限:基于 {@link CrmCustomerDO} 读取
|
||||||
*
|
*
|
||||||
* @param pageReqVO 分页查询
|
* @param pageReqVO 分页查询
|
||||||
* @return 联系人分页
|
* @return 商机分页
|
||||||
*/
|
*/
|
||||||
PageResult<CrmBusinessDO> getBusinessPageByCustomerId(CrmBusinessPageReqVO pageReqVO);
|
PageResult<CrmBusinessDO> getBusinessPageByCustomerId(CrmBusinessPageReqVO pageReqVO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得商机分页,基于指定联系人
|
||||||
|
*
|
||||||
|
* 数据权限:基于 {@link CrmContactDO} 读取
|
||||||
|
*
|
||||||
|
* @param pageReqVO 分页参数
|
||||||
|
* @return 商机分页
|
||||||
|
*/
|
||||||
|
PageResult<CrmBusinessDO> getBusinessPageByContact(CrmBusinessPageReqVO pageReqVO);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 商机转移
|
* 商机转移
|
||||||
*
|
*
|
||||||
@ -90,10 +98,4 @@ public interface CrmBusinessService {
|
|||||||
*/
|
*/
|
||||||
void transferBusiness(CrmBusinessTransferReqVO reqVO, Long userId);
|
void transferBusiness(CrmBusinessTransferReqVO reqVO, Long userId);
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取联系人商机列表
|
|
||||||
* @param pageReqVO 分页参数
|
|
||||||
* @return 联系人商机
|
|
||||||
*/
|
|
||||||
PageResult<CrmBusinessRespVO> getBusinessPageByContact(CrmContactBusinessLinkPageReqVO pageReqVO);
|
|
||||||
}
|
}
|
||||||
|
@ -7,20 +7,14 @@ import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusi
|
|||||||
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessPageReqVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessPageReqVO;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessTransferReqVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessTransferReqVO;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessUpdateReqVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessUpdateReqVO;
|
||||||
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
|
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.*;
|
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactBusinessLinkPageReqVO;
|
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractPageReqVO;
|
|
||||||
import cn.iocoder.yudao.module.crm.convert.business.CrmBusinessConvert;
|
import cn.iocoder.yudao.module.crm.convert.business.CrmBusinessConvert;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactBusinessLinkDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactBusinessDO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
|
|
||||||
import cn.iocoder.yudao.module.crm.dal.mysql.business.CrmBusinessMapper;
|
import cn.iocoder.yudao.module.crm.dal.mysql.business.CrmBusinessMapper;
|
||||||
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
|
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
|
||||||
import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
|
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.framework.permission.core.annotations.CrmPermission;
|
||||||
import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService;
|
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.contact.CrmContactService;
|
||||||
import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
|
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.permission.bo.CrmPermissionCreateReqBO;
|
||||||
@ -31,10 +25,9 @@ import org.springframework.validation.annotation.Validated;
|
|||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
|
||||||
import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.BUSINESS_NOT_EXISTS;
|
import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.BUSINESS_NOT_EXISTS;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -48,14 +41,13 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
|
|||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private CrmBusinessMapper businessMapper;
|
private CrmBusinessMapper businessMapper;
|
||||||
@Resource
|
|
||||||
private CrmCustomerService customerService;
|
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private CrmPermissionService crmPermissionService;
|
private CrmPermissionService permissionService;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private CrmContactService crmContactService;
|
private CrmContactService contactService;
|
||||||
|
@Resource
|
||||||
|
private CrmContactBusinessService contactBusinessService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
@ -65,7 +57,7 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
|
|||||||
businessMapper.insert(business);
|
businessMapper.insert(business);
|
||||||
|
|
||||||
// 创建数据权限
|
// 创建数据权限
|
||||||
crmPermissionService.createPermission(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_BUSINESS.getType())
|
permissionService.createPermission(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_BUSINESS.getType())
|
||||||
.setBizId(business.getId()).setUserId(userId).setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); // 设置当前操作的人为负责人
|
.setBizId(business.getId()).setUserId(userId).setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); // 设置当前操作的人为负责人
|
||||||
|
|
||||||
// 返回
|
// 返回
|
||||||
@ -93,7 +85,7 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
|
|||||||
// 删除
|
// 删除
|
||||||
businessMapper.deleteById(id);
|
businessMapper.deleteById(id);
|
||||||
// 删除数据权限
|
// 删除数据权限
|
||||||
crmPermissionService.deletePermission(CrmBizTypeEnum.CRM_BUSINESS.getType(), id);
|
permissionService.deletePermission(CrmBizTypeEnum.CRM_BUSINESS.getType(), id);
|
||||||
}
|
}
|
||||||
|
|
||||||
private CrmBusinessDO validateBusinessExists(Long id) {
|
private CrmBusinessDO validateBusinessExists(Long id) {
|
||||||
@ -129,6 +121,20 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
|
|||||||
return businessMapper.selectPageByCustomerId(pageReqVO);
|
return businessMapper.selectPageByCustomerId(pageReqVO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACT, bizId = "#pageReqVO.contactId", level = CrmPermissionLevelEnum.READ)
|
||||||
|
public PageResult<CrmBusinessDO> getBusinessPageByContact(CrmBusinessPageReqVO pageReqVO) {
|
||||||
|
// 1. 查询关联的商机编号
|
||||||
|
List<CrmContactBusinessDO> contactBusinessList = contactBusinessService.getContactBusinessListByContactId(
|
||||||
|
pageReqVO.getContactId());
|
||||||
|
if (CollUtil.isEmpty(contactBusinessList)) {
|
||||||
|
return PageResult.empty();
|
||||||
|
}
|
||||||
|
// 2. 查询商机分页
|
||||||
|
return businessMapper.selectPageByContactId(pageReqVO,
|
||||||
|
convertSet(contactBusinessList, CrmContactBusinessDO::getBusinessId));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void transferBusiness(CrmBusinessTransferReqVO reqVO, Long userId) {
|
public void transferBusiness(CrmBusinessTransferReqVO reqVO, Long userId) {
|
||||||
@ -136,36 +142,12 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
|
|||||||
validateBusinessExists(reqVO.getId());
|
validateBusinessExists(reqVO.getId());
|
||||||
|
|
||||||
// 2.1 数据权限转移
|
// 2.1 数据权限转移
|
||||||
crmPermissionService.transferPermission(
|
permissionService.transferPermission(
|
||||||
CrmBusinessConvert.INSTANCE.convert(reqVO, userId).setBizType(CrmBizTypeEnum.CRM_BUSINESS.getType()));
|
CrmBusinessConvert.INSTANCE.convert(reqVO, userId).setBizType(CrmBizTypeEnum.CRM_BUSINESS.getType()));
|
||||||
// 2.2 设置新的负责人
|
// 2.2 设置新的负责人
|
||||||
businessMapper.updateOwnerUserIdById(reqVO.getId(), reqVO.getNewOwnerUserId());
|
businessMapper.updateOwnerUserIdById(reqVO.getId(), reqVO.getNewOwnerUserId());
|
||||||
|
|
||||||
// 3. TODO 记录转移日志
|
// 3. TODO 记录转移日志
|
||||||
}
|
}
|
||||||
@Override
|
|
||||||
public PageResult<CrmBusinessRespVO> getBusinessPageByContact(CrmContactBusinessLinkPageReqVO pageReqVO) {
|
|
||||||
CrmContactBusinessLinkPageReqVO crmContactBusinessLinkPageReqVO = new CrmContactBusinessLinkPageReqVO();
|
|
||||||
crmContactBusinessLinkPageReqVO.setContactId(pageReqVO.getContactId());
|
|
||||||
PageResult<CrmContactBusinessLinkDO> businessLinkDOS = crmContactService.selectBusinessPageByContact(crmContactBusinessLinkPageReqVO);
|
|
||||||
if (CollUtil.isEmpty(businessLinkDOS.getList())){
|
|
||||||
return PageResult.empty();
|
|
||||||
}
|
|
||||||
List<CrmBusinessDO> businessList = this.getBusinessList(CollectionUtils.convertList(businessLinkDOS.getList(),
|
|
||||||
CrmContactBusinessLinkDO::getBusinessId));
|
|
||||||
if (CollUtil.isEmpty(businessList)){
|
|
||||||
return PageResult.empty();
|
|
||||||
}
|
|
||||||
PageResult<CrmBusinessRespVO> pageResult = new PageResult<CrmBusinessRespVO>();
|
|
||||||
List<CrmBusinessRespVO> respVOList = BeanUtils.toBean(businessList,CrmBusinessRespVO.class);
|
|
||||||
Map<Long,Long> businessContactMap = CollectionUtils.convertMap(businessLinkDOS.getList(),
|
|
||||||
CrmContactBusinessLinkDO::getBusinessId,CrmContactBusinessLinkDO::getId);
|
|
||||||
respVOList.forEach(item -> {
|
|
||||||
item.setBusinessContactId(businessContactMap.get(item.getId()));
|
|
||||||
});
|
|
||||||
pageResult.setList(respVOList);
|
|
||||||
pageResult.setTotal(businessLinkDOS.getTotal());
|
|
||||||
return pageResult;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,8 @@ import cn.iocoder.yudao.module.crm.controller.admin.business.vo.status.CrmBusine
|
|||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO;
|
||||||
|
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -64,4 +66,12 @@ public interface CrmBusinessStatusService {
|
|||||||
*/
|
*/
|
||||||
List<CrmBusinessStatusDO> selectList(CrmBusinessStatusQueryVO queryVO);
|
List<CrmBusinessStatusDO> selectList(CrmBusinessStatusQueryVO queryVO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得商机状态列表
|
||||||
|
*
|
||||||
|
* @param ids 编号数组
|
||||||
|
* @return 商机状态列表
|
||||||
|
*/
|
||||||
|
List<CrmBusinessStatusDO> getBusinessStatusList(Collection<Long> ids);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ import org.springframework.validation.annotation.Validated;
|
|||||||
|
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
@ -77,4 +78,9 @@ public class CrmBusinessStatusServiceImpl implements CrmBusinessStatusService {
|
|||||||
return businessStatusMapper.selectList(queryVO);
|
return businessStatusMapper.selectList(queryVO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<CrmBusinessStatusDO> getBusinessStatusList(Collection<Long> ids) {
|
||||||
|
return businessStatusMapper.selectBatchIds(ids);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,8 +5,9 @@ import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusiness
|
|||||||
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypeQueryVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypeQueryVO;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypeSaveReqVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypeSaveReqVO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusTypeDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusTypeDO;
|
||||||
|
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -63,4 +64,12 @@ public interface CrmBusinessStatusTypeService {
|
|||||||
*/
|
*/
|
||||||
List<CrmBusinessStatusTypeDO> selectList(CrmBusinessStatusTypeQueryVO queryVO);
|
List<CrmBusinessStatusTypeDO> selectList(CrmBusinessStatusTypeQueryVO queryVO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得商机状态类型列表
|
||||||
|
*
|
||||||
|
* @param ids 编号数组
|
||||||
|
* @return 商机状态类型列表
|
||||||
|
*/
|
||||||
|
List<CrmBusinessStatusTypeDO> getBusinessStatusTypeList(Collection<Long> ids);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,8 @@ import org.springframework.transaction.annotation.Transactional;
|
|||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
@ -118,4 +120,9 @@ public class CrmBusinessStatusTypeServiceImpl implements CrmBusinessStatusTypeSe
|
|||||||
return businessStatusTypeMapper.selectList(queryVO);
|
return businessStatusTypeMapper.selectList(queryVO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<CrmBusinessStatusTypeDO> getBusinessStatusTypeList(Collection<Long> ids) {
|
||||||
|
return businessStatusTypeMapper.selectBatchIds(ids);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,72 +0,0 @@
|
|||||||
package cn.iocoder.yudao.module.crm.service.contact;
|
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessRespVO;
|
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactBusinessLinkPageReqVO;
|
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactBusinessLinkSaveReqVO;
|
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactBusinessLinkDO;
|
|
||||||
|
|
||||||
import jakarta.validation.Valid;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* CRM 联系人商机关联 Service 接口
|
|
||||||
*
|
|
||||||
* @author 芋道源码
|
|
||||||
*/
|
|
||||||
public interface CrmContactBusinessLinkService {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 创建联系人商机关联
|
|
||||||
*
|
|
||||||
* @param createReqVO 创建信息
|
|
||||||
* @return 编号
|
|
||||||
*/
|
|
||||||
Long createContactBusinessLink(@Valid CrmContactBusinessLinkSaveReqVO createReqVO);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 创建联系人商机关联
|
|
||||||
*
|
|
||||||
* @param createReqVO 创建信息
|
|
||||||
*/
|
|
||||||
void createContactBusinessLinkBatch(@Valid List<CrmContactBusinessLinkSaveReqVO> createReqVO);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 更新联系人商机关联
|
|
||||||
*
|
|
||||||
* @param updateReqVO 更新信息
|
|
||||||
*/
|
|
||||||
void updateContactBusinessLink(@Valid CrmContactBusinessLinkSaveReqVO updateReqVO);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 删除联系人商机关联
|
|
||||||
*
|
|
||||||
* @param businessContactIds 删除列表
|
|
||||||
*/
|
|
||||||
void deleteContactBusinessLink(@Valid List<Long> businessContactIds);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获得联系人商机关联
|
|
||||||
*
|
|
||||||
* @param id 编号
|
|
||||||
* @return 联系人商机关联
|
|
||||||
*/
|
|
||||||
CrmContactBusinessLinkDO getContactBusinessLink(Long id);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获得联系人商机关联分页
|
|
||||||
*
|
|
||||||
* @param pageReqVO 编号
|
|
||||||
* @return 联系人商机关联
|
|
||||||
*/
|
|
||||||
PageResult<CrmBusinessRespVO> getContactBusinessLinkPageByContact(CrmContactBusinessLinkPageReqVO pageReqVO);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获得联系人商机关联分页
|
|
||||||
*
|
|
||||||
* @param pageReqVO 分页查询
|
|
||||||
* @return 联系人商机关联分页
|
|
||||||
*/
|
|
||||||
PageResult<CrmContactBusinessLinkDO> getContactBusinessLinkPage(CrmContactBusinessLinkPageReqVO pageReqVO);
|
|
||||||
|
|
||||||
}
|
|
@ -1,129 +0,0 @@
|
|||||||
package cn.iocoder.yudao.module.crm.service.contact;
|
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
|
||||||
import cn.hutool.core.lang.Assert;
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
||||||
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
|
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessRespVO;
|
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactBusinessLinkPageReqVO;
|
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactBusinessLinkSaveReqVO;
|
|
||||||
import cn.iocoder.yudao.module.crm.convert.business.CrmBusinessConvert;
|
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
|
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactBusinessLinkDO;
|
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO;
|
|
||||||
import cn.iocoder.yudao.module.crm.dal.mysql.contactbusinesslink.CrmContactBusinessLinkMapper;
|
|
||||||
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
|
|
||||||
import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
|
|
||||||
import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission;
|
|
||||||
import cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants;
|
|
||||||
import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission;
|
|
||||||
import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService;
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
import org.springframework.validation.annotation.Validated;
|
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
||||||
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
|
||||||
import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.BUSINESS_NOT_EXISTS;
|
|
||||||
import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CONTACT_BUSINESS_LINK_NOT_EXISTS;
|
|
||||||
|
|
||||||
// TODO @puhui999:数据权限的校验;每个操作;
|
|
||||||
/**
|
|
||||||
* 联系人商机关联 Service 实现类
|
|
||||||
*
|
|
||||||
* @author 芋道源码
|
|
||||||
*/
|
|
||||||
@Service
|
|
||||||
@Validated
|
|
||||||
public class CrmContactBusinessLinkServiceImpl implements CrmContactBusinessLinkService {
|
|
||||||
|
|
||||||
@Resource
|
|
||||||
private CrmContactBusinessLinkMapper contactBusinessLinkMapper;
|
|
||||||
@Resource
|
|
||||||
private CrmBusinessService crmBusinessService;
|
|
||||||
|
|
||||||
@Resource
|
|
||||||
private CrmContactService crmContactService;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Long createContactBusinessLink(CrmContactBusinessLinkSaveReqVO createReqVO) {
|
|
||||||
CrmContactBusinessLinkDO contactBusinessLink = BeanUtils.toBean(createReqVO, CrmContactBusinessLinkDO.class);
|
|
||||||
contactBusinessLinkMapper.insert(contactBusinessLink);
|
|
||||||
return contactBusinessLink.getId();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void createContactBusinessLinkBatch(List<CrmContactBusinessLinkSaveReqVO> createReqVOList) {
|
|
||||||
// 插入
|
|
||||||
CrmContactDO contactDO = crmContactService.getContact(createReqVOList.stream().findFirst().get().getContactId());
|
|
||||||
Assert.notNull(contactDO,ErrorCodeConstants.CONTACT_NOT_EXISTS.getMsg());
|
|
||||||
List<CrmContactBusinessLinkDO> saveDoList = new ArrayList<CrmContactBusinessLinkDO>();
|
|
||||||
createReqVOList.forEach(item -> {
|
|
||||||
CrmBusinessDO crmBusinessDO = crmBusinessService.getBusiness(item.getBusinessId());
|
|
||||||
if(crmBusinessDO == null){
|
|
||||||
throw exception(BUSINESS_NOT_EXISTS);
|
|
||||||
}
|
|
||||||
// 判重
|
|
||||||
CrmContactBusinessLinkDO crmContactBusinessLinkDO = contactBusinessLinkMapper.selectOne(new LambdaQueryWrapper<CrmContactBusinessLinkDO>()
|
|
||||||
.eq(CrmContactBusinessLinkDO::getBusinessId,item.getBusinessId())
|
|
||||||
.eq(CrmContactBusinessLinkDO::getContactId,item.getContactId()));
|
|
||||||
if(crmContactBusinessLinkDO == null){
|
|
||||||
saveDoList.add(BeanUtils.toBean(item,CrmContactBusinessLinkDO.class));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
contactBusinessLinkMapper.insertBatch(saveDoList);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateContactBusinessLink(CrmContactBusinessLinkSaveReqVO updateReqVO) {
|
|
||||||
// 校验存在
|
|
||||||
validateContactBusinessLinkExists(updateReqVO.getId());
|
|
||||||
// 更新
|
|
||||||
CrmContactBusinessLinkDO updateObj = BeanUtils.toBean(updateReqVO, CrmContactBusinessLinkDO.class);
|
|
||||||
contactBusinessLinkMapper.updateById(updateObj);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void deleteContactBusinessLink(List<Long> businessContactIds) {
|
|
||||||
// 删除
|
|
||||||
contactBusinessLinkMapper.deleteBatchIds(businessContactIds);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void validateContactBusinessLinkExists(Long id) {
|
|
||||||
if (contactBusinessLinkMapper.selectById(id) == null) {
|
|
||||||
throw exception(CONTACT_BUSINESS_LINK_NOT_EXISTS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@CrmPermission(bizType = CrmBizTypeEnum.CRM_BUSINESS, bizId = "#id", level = CrmPermissionLevelEnum.READ)
|
|
||||||
public CrmContactBusinessLinkDO getContactBusinessLink(Long id) {
|
|
||||||
return contactBusinessLinkMapper.selectById(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PageResult<CrmBusinessRespVO> getContactBusinessLinkPageByContact(CrmContactBusinessLinkPageReqVO pageReqVO) {
|
|
||||||
CrmContactBusinessLinkPageReqVO crmContactBusinessLinkPageReqVO = new CrmContactBusinessLinkPageReqVO();
|
|
||||||
crmContactBusinessLinkPageReqVO.setContactId(pageReqVO.getContactId());
|
|
||||||
PageResult<CrmContactBusinessLinkDO> businessLinkDOS = contactBusinessLinkMapper.selectPageByContact(crmContactBusinessLinkPageReqVO);
|
|
||||||
List<CrmBusinessDO> businessDOS = crmBusinessService.getBusinessList(CollectionUtils.convertList(businessLinkDOS.getList(),
|
|
||||||
CrmContactBusinessLinkDO::getBusinessId), getLoginUserId());
|
|
||||||
PageResult<CrmBusinessRespVO> pageResult = new PageResult<CrmBusinessRespVO>();
|
|
||||||
pageResult.setList(CrmBusinessConvert.INSTANCE.convert(businessDOS));
|
|
||||||
pageResult.setTotal(businessLinkDOS.getTotal());
|
|
||||||
return pageResult;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PageResult<CrmContactBusinessLinkDO> getContactBusinessLinkPage(CrmContactBusinessLinkPageReqVO pageReqVO) {
|
|
||||||
return contactBusinessLinkMapper.selectPage(pageReqVO);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -0,0 +1,38 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.service.contact;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactBusinessReqVO;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactBusinessDO;
|
||||||
|
import jakarta.validation.Valid;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CRM 联系人与商机的关联 Service 接口
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
public interface CrmContactBusinessService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建联系人与商机的关联
|
||||||
|
*
|
||||||
|
* @param createReqVO 创建信息
|
||||||
|
*/
|
||||||
|
void createContactBusinessList(@Valid CrmContactBusinessReqVO createReqVO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除联系人与商机的关联
|
||||||
|
*
|
||||||
|
* @param deleteReqVO 删除信息
|
||||||
|
*/
|
||||||
|
void deleteContactBusinessList(@Valid CrmContactBusinessReqVO deleteReqVO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得联系人与商机的关联列表,基于联系人编号
|
||||||
|
*
|
||||||
|
* @param contactId 联系人编号
|
||||||
|
* @return 联系人商机关联
|
||||||
|
*/
|
||||||
|
List<CrmContactBusinessDO> getContactBusinessListByContactId(Long contactId);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,83 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.service.contact;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactBusinessReqVO;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactBusinessDO;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.mysql.contactbusinesslink.CrmContactBusinessMapper;
|
||||||
|
import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import org.springframework.context.annotation.Lazy;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
|
import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.BUSINESS_NOT_EXISTS;
|
||||||
|
import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CONTACT_NOT_EXISTS;
|
||||||
|
|
||||||
|
// TODO @puhui999:数据权限的校验;每个操作;
|
||||||
|
/**
|
||||||
|
* 联系人与商机的关联 Service 实现类
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
@Validated
|
||||||
|
public class CrmContactBusinessServiceImpl implements CrmContactBusinessService {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private CrmContactBusinessMapper contactBusinessMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
@Lazy // 延迟加载,为了解决延迟加载
|
||||||
|
private CrmBusinessService businessService;
|
||||||
|
@Resource
|
||||||
|
@Lazy // 延迟加载,为了解决延迟加载
|
||||||
|
private CrmContactService contactService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void createContactBusinessList(CrmContactBusinessReqVO createReqVO) {
|
||||||
|
CrmContactDO contact = contactService.getContact(createReqVO.getContactId());
|
||||||
|
if (contact == null) {
|
||||||
|
throw exception(CONTACT_NOT_EXISTS);
|
||||||
|
}
|
||||||
|
// 遍历处理,考虑到一般数量不会太多,代码处理简单
|
||||||
|
List<CrmContactBusinessDO> saveDOList = new ArrayList<>();
|
||||||
|
createReqVO.getBusinessIds().forEach(businessId -> {
|
||||||
|
CrmBusinessDO business = businessService.getBusiness(businessId);
|
||||||
|
if (business == null) {
|
||||||
|
throw exception(BUSINESS_NOT_EXISTS);
|
||||||
|
}
|
||||||
|
// 关联判重
|
||||||
|
if (contactBusinessMapper.selectByContactIdAndBusinessId(createReqVO.getContactId(), businessId) != null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
saveDOList.add(new CrmContactBusinessDO(null, createReqVO.getContactId(), businessId));
|
||||||
|
});
|
||||||
|
// 批量插入
|
||||||
|
if (CollUtil.isNotEmpty(saveDOList)) {
|
||||||
|
contactBusinessMapper.insertBatch(saveDOList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deleteContactBusinessList(CrmContactBusinessReqVO deleteReqVO) {
|
||||||
|
CrmContactDO contact = contactService.getContact(deleteReqVO.getContactId());
|
||||||
|
if (contact == null) {
|
||||||
|
throw exception(CONTACT_NOT_EXISTS);
|
||||||
|
}
|
||||||
|
// 直接删除
|
||||||
|
contactBusinessMapper.deleteByContactIdAndBusinessId(
|
||||||
|
deleteReqVO.getContactId(), deleteReqVO.getBusinessIds());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<CrmContactBusinessDO> getContactBusinessListByContactId(Long contactId) {
|
||||||
|
return contactBusinessMapper.selectListByContactId(contactId);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,12 +1,10 @@
|
|||||||
package cn.iocoder.yudao.module.crm.service.contact;
|
package cn.iocoder.yudao.module.crm.service.contact;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactBusinessLinkPageReqVO;
|
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactCreateReqVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactCreateReqVO;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactPageReqVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactPageReqVO;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactTransferReqVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactTransferReqVO;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactUpdateReqVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactUpdateReqVO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactBusinessLinkDO;
|
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
@ -90,12 +88,4 @@ public interface CrmContactService {
|
|||||||
*/
|
*/
|
||||||
void transferContact(CrmContactTransferReqVO reqVO, Long userId);
|
void transferContact(CrmContactTransferReqVO reqVO, Long userId);
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取联系人商机关联分页列表
|
|
||||||
* @param reqVO 联系人
|
|
||||||
* @return 商机联系人关联列表
|
|
||||||
*/
|
|
||||||
PageResult<CrmContactBusinessLinkDO> selectBusinessPageByContact(CrmContactBusinessLinkPageReqVO reqVO);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,17 +5,9 @@ import cn.hutool.core.collection.ListUtil;
|
|||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.*;
|
import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.*;
|
||||||
import cn.iocoder.yudao.module.crm.convert.contact.CrmContactConvert;
|
import cn.iocoder.yudao.module.crm.convert.contact.CrmContactConvert;
|
||||||
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
|
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessRespVO;
|
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.*;
|
|
||||||
import cn.iocoder.yudao.module.crm.convert.business.CrmBusinessConvert;
|
|
||||||
import cn.iocoder.yudao.module.crm.convert.contact.ContactConvert;
|
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
|
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactBusinessLinkDO;
|
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.mysql.contact.CrmContactMapper;
|
import cn.iocoder.yudao.module.crm.dal.mysql.contact.CrmContactMapper;
|
||||||
import cn.iocoder.yudao.module.crm.dal.mysql.contactbusinesslink.CrmContactBusinessLinkMapper;
|
import cn.iocoder.yudao.module.crm.dal.mysql.contactbusinesslink.CrmContactBusinessMapper;
|
||||||
import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission;
|
|
||||||
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
|
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
|
||||||
import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
|
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.framework.permission.core.annotations.CrmPermission;
|
||||||
@ -56,7 +48,7 @@ public class CrmContactServiceImpl implements CrmContactService {
|
|||||||
private AdminUserApi adminUserApi;
|
private AdminUserApi adminUserApi;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private CrmContactBusinessLinkMapper contactBusinessLinkMapper;
|
private CrmContactBusinessMapper contactBusinessLinkMapper;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
@ -161,11 +153,4 @@ public class CrmContactServiceImpl implements CrmContactService {
|
|||||||
// 3. TODO 记录转移日志
|
// 3. TODO 记录转移日志
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public PageResult<CrmContactBusinessLinkDO> selectBusinessPageByContact(CrmContactBusinessLinkPageReqVO pageReqVO) {
|
|
||||||
CrmContactBusinessLinkPageReqVO crmContactBusinessLinkPageReqVO = new CrmContactBusinessLinkPageReqVO();
|
|
||||||
crmContactBusinessLinkPageReqVO.setContactId(pageReqVO.getContactId());
|
|
||||||
return contactBusinessLinkMapper.selectPageByContact(crmContactBusinessLinkPageReqVO);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -56,7 +56,7 @@ public interface CrmCustomerService {
|
|||||||
* @return 客户列表
|
* @return 客户列表
|
||||||
* @author ljlleo
|
* @author ljlleo
|
||||||
*/
|
*/
|
||||||
List<CrmCustomerDO> getCustomerList(Collection<Long> ids, Long userId);
|
List<CrmCustomerDO> getCustomerList(Collection<Long> ids);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得客户分页
|
* 获得客户分页
|
||||||
|
@ -116,11 +116,11 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<CrmCustomerDO> getCustomerList(Collection<Long> ids, Long userId) {
|
public List<CrmCustomerDO> getCustomerList(Collection<Long> ids) {
|
||||||
if (CollUtil.isEmpty(ids)) {
|
if (CollUtil.isEmpty(ids)) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
return customerMapper.selectBatchIds(ids, userId);
|
return customerMapper.selectBatchIds(ids);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
Loading…
Reference in New Issue
Block a user