mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 10:18:42 +08:00 
			
		
		
		
	Merge remote-tracking branch 'origin/feature/crm' into develop
# Conflicts: # yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java # yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/CrmContactController.java # yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contactbusinesslink/CrmContactBusinessLinkController.java # yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessService.java # yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java # yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactBusinessLinkServiceImpl.java # yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactServiceImpl.java
This commit is contained in:
		| @@ -4,11 +4,14 @@ import cn.hutool.core.collection.CollUtil; | ||||
| import cn.hutool.core.lang.Assert; | ||||
| import cn.iocoder.yudao.framework.common.pojo.CommonResult; | ||||
| 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.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.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.dal.dataobject.business.CrmBusinessDO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO; | ||||
| @@ -30,6 +33,7 @@ import org.springframework.web.bind.annotation.*; | ||||
|  | ||||
| import java.io.IOException; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.Objects; | ||||
| import java.util.Set; | ||||
| import java.util.stream.Collectors; | ||||
| @@ -163,5 +167,34 @@ public class CrmBusinessController { | ||||
|         businessService.transferBusiness(reqVO, getLoginUserId()); | ||||
|         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); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -25,4 +25,6 @@ public class CrmBusinessRespVO extends CrmBusinessBaseVO { | ||||
|     @Schema(description = "状态名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "跟进中") | ||||
|     private String statusName; | ||||
|  | ||||
|     @Schema(description = "联系人商机关联ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "32129") | ||||
|     private Long businessContactId; | ||||
| } | ||||
|   | ||||
| @@ -13,6 +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.customer.CrmCustomerDO; | ||||
| 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.CrmContactService; | ||||
| import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; | ||||
| import cn.iocoder.yudao.module.system.api.user.AdminUserApi; | ||||
| @@ -29,6 +30,10 @@ import org.springframework.security.access.prepost.PreAuthorize; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
| 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.util.Collections; | ||||
| import java.util.List; | ||||
| @@ -54,10 +59,12 @@ public class CrmContactController { | ||||
|     private CrmContactService contactService; | ||||
|     @Resource | ||||
|     private CrmCustomerService customerService; | ||||
|  | ||||
|     @Resource | ||||
|     private AdminUserApi adminUserApi; | ||||
|  | ||||
|     @Resource | ||||
|     private CrmContactBusinessLinkService contactBusinessLinkService; | ||||
|  | ||||
|     @PostMapping("/create") | ||||
|     @Operation(summary = "创建联系人") | ||||
|     @PreAuthorize("@ss.hasPermission('crm:contact:create')") | ||||
| @@ -141,6 +148,23 @@ public class CrmContactController { | ||||
|                 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); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 转换成详细的联系人分页,即读取关联信息 | ||||
|      * | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| package cn.iocoder.yudao.module.crm.controller.admin.contactbusinesslink.vo; | ||||
| 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; | ||||
| @@ -1,4 +1,4 @@ | ||||
| package cn.iocoder.yudao.module.crm.controller.admin.contactbusinesslink.vo; | ||||
| package cn.iocoder.yudao.module.crm.controller.admin.contact.vo; | ||||
| 
 | ||||
| import com.alibaba.excel.annotation.ExcelProperty; | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| @@ -1,4 +1,4 @@ | ||||
| package cn.iocoder.yudao.module.crm.controller.admin.contactbusinesslink.vo; | ||||
| package cn.iocoder.yudao.module.crm.controller.admin.contact.vo; | ||||
| 
 | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import lombok.Data; | ||||
| @@ -1,115 +0,0 @@ | ||||
| package cn.iocoder.yudao.module.crm.controller.admin.contactbusinesslink; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.common.pojo.CommonResult; | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessRespVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.contactbusinesslink.vo.CrmContactBusinessLinkPageReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.contactbusinesslink.vo.CrmContactBusinessLinkRespVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.contactbusinesslink.vo.CrmContactBusinessLinkSaveReqVO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.contactbusinesslink.CrmContactBusinessLinkDO; | ||||
| import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService; | ||||
| import cn.iocoder.yudao.module.crm.service.contactbusinesslink.CrmContactBusinessLinkService; | ||||
| import io.swagger.v3.oas.annotations.Operation; | ||||
| import io.swagger.v3.oas.annotations.Parameter; | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import org.springframework.security.access.prepost.PreAuthorize; | ||||
| import org.springframework.transaction.annotation.Transactional; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
| import org.springframework.web.bind.annotation.*; | ||||
|  | ||||
| import jakarta.annotation.Resource; | ||||
| import jakarta.validation.Valid; | ||||
| import java.util.List; | ||||
|  | ||||
| import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||||
| import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | ||||
| import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.BUSINESS_NOT_EXISTS; | ||||
|  | ||||
| @Tag(name = "管理后台 - CRM 联系人商机关联") | ||||
| @RestController | ||||
| @RequestMapping("/crm/contact-business-link") | ||||
| @Validated | ||||
| public class CrmContactBusinessLinkController { | ||||
|  | ||||
|     @Resource | ||||
|     private CrmContactBusinessLinkService contactBusinessLinkService; | ||||
|     @Resource | ||||
|     private CrmBusinessService crmBusinessService; | ||||
|  | ||||
|     // TODO @zyna:createContactBusinessLink 和 createContactBusinessLinkBatch 是不是合并成一个接口?contactId、List<businessId> | ||||
|     @PostMapping("/create") | ||||
|     @Operation(summary = "创建联系人商机关联") | ||||
|     @PreAuthorize("@ss.hasPermission('crm:contact-business-link:create')") | ||||
|     public CommonResult<Long> createContactBusinessLink(@Valid @RequestBody CrmContactBusinessLinkSaveReqVO createReqVO) { | ||||
|         return success(contactBusinessLinkService.createContactBusinessLink(createReqVO)); | ||||
|     } | ||||
|  | ||||
|     @PostMapping("/create-batch") | ||||
|     @Operation(summary = "创建联系人商机关联") | ||||
|     @PreAuthorize("@ss.hasPermission('crm:contact-business-link:create')") | ||||
|     @Transactional(rollbackFor = Exception.class) | ||||
|     public CommonResult<Boolean> createContactBusinessLinkBatch( | ||||
|             @Valid @RequestBody List<CrmContactBusinessLinkSaveReqVO> createReqVO) { | ||||
|         createReqVO.stream().forEach(item -> { | ||||
|             CrmBusinessDO crmBusinessDO = crmBusinessService.getBusiness(item.getBusinessId()); | ||||
|             if(crmBusinessDO == null){ | ||||
|                 throw exception(BUSINESS_NOT_EXISTS); | ||||
|             } | ||||
|         }); | ||||
|         contactBusinessLinkService.createContactBusinessLinkBatch(createReqVO); | ||||
|         return success(true); | ||||
|     } | ||||
|  | ||||
|     // TODO @zyna:这个接口是不是可以删除掉了哈?应该不存在更新。 | ||||
|     @PutMapping("/update") | ||||
|     @Operation(summary = "更新联系人商机关联") | ||||
|     @PreAuthorize("@ss.hasPermission('crm:contact-business-link:update')") | ||||
|     public CommonResult<Boolean> updateContactBusinessLink(@Valid @RequestBody CrmContactBusinessLinkSaveReqVO updateReqVO) { | ||||
|         contactBusinessLinkService.updateContactBusinessLink(updateReqVO); | ||||
|         return success(true); | ||||
|     } | ||||
|  | ||||
|     // TODO @zyna:删除,是不是传递 ids? | ||||
|     @DeleteMapping("/delete-batch") | ||||
|     @Operation(summary = "批量删除联系人商机关联") | ||||
|     @PreAuthorize("@ss.hasPermission('crm:contact-business-link:delete')") | ||||
|     public CommonResult<Boolean> deleteContactBusinessLinkBatch(@Valid @RequestBody List<CrmContactBusinessLinkSaveReqVO> deleteList) { | ||||
|         contactBusinessLinkService.deleteContactBusinessLink(deleteList); | ||||
|         return success(true); | ||||
|     } | ||||
|  | ||||
|     // TODO @zyna:这个接口是不是可以删除掉了哈?应该不存在单个读取; | ||||
|     @GetMapping("/get") | ||||
|     @Operation(summary = "获得联系人商机关联") | ||||
|     @Parameter(name = "id", description = "编号", required = true, example = "1024") | ||||
|     @PreAuthorize("@ss.hasPermission('crm:contact-business-link:query')") | ||||
|     public CommonResult<CrmContactBusinessLinkRespVO> getContactBusinessLink(@RequestParam("id") Long id) { | ||||
|         CrmContactBusinessLinkDO contactBusinessLink = contactBusinessLinkService.getContactBusinessLink(id); | ||||
|         return success(BeanUtils.toBean(contactBusinessLink, CrmContactBusinessLinkRespVO.class)); | ||||
|     } | ||||
|  | ||||
|     // TODO @zyna:这个可以转化下,使用客户编号去查询,就是使用 CrmBusinessController 的 getBusinessPageByCustomer 接口;目的是:复用 | ||||
|     @GetMapping("/page-by-contact") | ||||
|     @Operation(summary = "获得联系人商机关联") | ||||
|     @PreAuthorize("@ss.hasPermission('crm:contact-business-link:query')") | ||||
|     public CommonResult<PageResult<CrmBusinessRespVO>> getContactBusinessLinkByContact( | ||||
|             @Valid CrmContactBusinessLinkPageReqVO pageReqVO) { | ||||
|         PageResult<CrmBusinessRespVO> contactBusinessLink = contactBusinessLinkService.getContactBusinessLinkPageByContact(pageReqVO); | ||||
|         return success(contactBusinessLink); | ||||
|     } | ||||
|  | ||||
|     // TODO @zyna:这个优化下,搞到 CrmBusinessController 里去,加一个 CrmBusinessController 的 getBusinessPageByContact 接口;目的是: | ||||
|     @GetMapping("/page") | ||||
|     @Operation(summary = "获得联系人商机关联分页") | ||||
|     @PreAuthorize("@ss.hasPermission('crm:contact-business-link:query')") | ||||
|     public CommonResult<PageResult<CrmContactBusinessLinkRespVO>> getContactBusinessLinkPage( | ||||
|             @Valid CrmContactBusinessLinkPageReqVO pageReqVO) { | ||||
|         PageResult<CrmContactBusinessLinkDO> pageResult = contactBusinessLinkService.getContactBusinessLinkPage(pageReqVO); | ||||
|         return success(BeanUtils.toBean(pageResult, CrmContactBusinessLinkRespVO.class)); | ||||
|     } | ||||
|  | ||||
|     // TODO @zyna:最终梳理完后,应该就 2 个接口,要不直接合并到 CrmContactController 中,不作为独立模块,就关联、接触关联。其实和 user 设置它有哪些岗位、部门是类似的。 | ||||
|  | ||||
| } | ||||
| @@ -76,12 +76,12 @@ public interface CrmContactConvert { | ||||
|         Map<Long, CrmCustomerDO> customerMap = convertMap(customerList, CrmCustomerDO::getId); | ||||
|         result.forEach(item -> { | ||||
|             setUserInfo(item, userMap); | ||||
|             findAndThen(customerMap, item.getCustomerId(), customer -> { // TODO @zyna:这里的 { 可以去掉 | ||||
|                 item.setCustomerName(customer.getName()); | ||||
|             }); | ||||
|             findAndThen(parentContactMap, item.getParentId(), contactDO -> {  // TODO @zyna:这里的 { 可以去掉 | ||||
|                 item.setParentName(contactDO.getName()); | ||||
|             }); | ||||
|             findAndThen(customerMap, item.getCustomerId(), customer -> | ||||
|                 item.setCustomerName(customer.getName()) | ||||
|             ); | ||||
|             findAndThen(parentContactMap, item.getParentId(), contactDO -> | ||||
|                 item.setParentName(contactDO.getName()) | ||||
|             ); | ||||
|         }); | ||||
|         return result; | ||||
|     } | ||||
|   | ||||
| @@ -1,16 +0,0 @@ | ||||
| package cn.iocoder.yudao.module.crm.convert.contactbusinessslink; | ||||
|  | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.contactbusinesslink.vo.CrmContactBusinessLinkSaveReqVO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.contactbusinesslink.CrmContactBusinessLinkDO; | ||||
| import org.mapstruct.Mapper; | ||||
| import org.mapstruct.factory.Mappers; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| // TODO @zyna:使用 BeanUtils 慢慢替代现有的 mapstruct 哈 | ||||
| @Mapper | ||||
| public interface CrmContactBusinessLinkConvert { | ||||
|     CrmContactBusinessLinkConvert INSTANCE = Mappers.getMapper(CrmContactBusinessLinkConvert.class); | ||||
|     CrmContactBusinessLinkDO convert(CrmContactBusinessLinkSaveReqVO bean); | ||||
|     List<CrmContactBusinessLinkDO> convert(List<CrmContactBusinessLinkSaveReqVO> bean); | ||||
| } | ||||
| @@ -1,4 +1,4 @@ | ||||
| package cn.iocoder.yudao.module.crm.dal.dataobject.contactbusinesslink; | ||||
| package cn.iocoder.yudao.module.crm.dal.dataobject.contact; | ||||
| 
 | ||||
| import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO; | ||||
| @@ -8,14 +8,13 @@ import com.baomidou.mybatisplus.annotation.TableId; | ||||
| import com.baomidou.mybatisplus.annotation.TableName; | ||||
| import lombok.*; | ||||
| 
 | ||||
| // TODO @zyna:可以放到 contact 包下 | ||||
| /** | ||||
|  * CRM 联系人商机关联 DO | ||||
|  * | ||||
|  * @author 芋道源码 | ||||
|  */ | ||||
| @TableName("crm_contact_business_link") | ||||
| @KeySequence("crm_contact_business_link_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 | ||||
| @TableName("crm_contact_business") | ||||
| @KeySequence("crm_contact_business_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 | ||||
| @Data | ||||
| @EqualsAndHashCode(callSuper = true) | ||||
| @ToString(callSuper = true) | ||||
| @@ -3,8 +3,8 @@ 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.contactbusinesslink.vo.CrmContactBusinessLinkPageReqVO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.contactbusinesslink.CrmContactBusinessLinkDO; | ||||
| 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; | ||||
|  | ||||
| /** | ||||
| @@ -21,7 +21,7 @@ public interface CrmContactBusinessLinkMapper extends BaseMapperX<CrmContactBusi | ||||
|                 .eqIfPresent(CrmContactBusinessLinkDO::getBusinessId, reqVO.getBusinessId()) | ||||
|                 .betweenIfPresent(CrmContactBusinessLinkDO::getCreateTime, reqVO.getCreateTime()) | ||||
|                 .orderByDesc(CrmContactBusinessLinkDO::getId)); | ||||
|     } // TODO @zyna:方法和方法之间要有空行 | ||||
|     } | ||||
|     default PageResult<CrmContactBusinessLinkDO> selectPageByContact(CrmContactBusinessLinkPageReqVO reqVO) { | ||||
|         return selectPage(reqVO, new LambdaQueryWrapperX<CrmContactBusinessLinkDO>() | ||||
|                 .eqIfPresent(CrmContactBusinessLinkDO::getContactId, reqVO.getContactId()) | ||||
|   | ||||
| @@ -5,6 +5,9 @@ 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.CrmBusinessTransferReqVO; | ||||
| 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.customer.CrmCustomerDO; | ||||
| import jakarta.validation.Valid; | ||||
| @@ -87,4 +90,10 @@ public interface CrmBusinessService { | ||||
|      */ | ||||
|     void transferBusiness(CrmBusinessTransferReqVO reqVO, Long userId); | ||||
|  | ||||
|     /** | ||||
|      * 获取联系人商机列表 | ||||
|      * @param pageReqVO 分页参数 | ||||
|      * @return 联系人商机 | ||||
|      */ | ||||
|     PageResult<CrmBusinessRespVO> getBusinessPageByContact(CrmContactBusinessLinkPageReqVO pageReqVO); | ||||
| } | ||||
|   | ||||
| @@ -7,13 +7,21 @@ 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.CrmBusinessTransferReqVO; | ||||
| 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.dal.dataobject.business.CrmBusinessDO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactBusinessLinkDO; | ||||
| 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.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.service.customer.CrmCustomerService; | ||||
| 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.bo.CrmPermissionCreateReqBO; | ||||
| import jakarta.annotation.Resource; | ||||
| @@ -23,6 +31,8 @@ import org.springframework.validation.annotation.Validated; | ||||
|  | ||||
| import java.util.Collection; | ||||
| 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.module.crm.enums.ErrorCodeConstants.BUSINESS_NOT_EXISTS; | ||||
| @@ -44,6 +54,9 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { | ||||
|     @Resource | ||||
|     private CrmPermissionService crmPermissionService; | ||||
|  | ||||
|     @Resource | ||||
|     private CrmContactService crmContactService; | ||||
|  | ||||
|     @Override | ||||
|     @Transactional(rollbackFor = Exception.class) | ||||
|     public Long createBusiness(CrmBusinessCreateReqVO createReqVO, Long userId) { | ||||
| @@ -130,5 +143,29 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { | ||||
|  | ||||
|         // 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; | ||||
|  | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| package cn.iocoder.yudao.module.crm.service.contactbusinesslink; | ||||
| 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.contactbusinesslink.vo.CrmContactBusinessLinkPageReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.contactbusinesslink.vo.CrmContactBusinessLinkSaveReqVO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.contactbusinesslink.CrmContactBusinessLinkDO; | ||||
| 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; | ||||
| @@ -41,9 +41,9 @@ public interface CrmContactBusinessLinkService { | ||||
|     /** | ||||
|      * 删除联系人商机关联 | ||||
|      * | ||||
|      * @param createReqVO  删除列表 | ||||
|      * @param businessContactIds  删除列表 | ||||
|      */ | ||||
|     void deleteContactBusinessLink(@Valid List<CrmContactBusinessLinkSaveReqVO> createReqVO); | ||||
|     void deleteContactBusinessLink(@Valid List<Long> businessContactIds); | ||||
| 
 | ||||
|     /** | ||||
|      * 获得联系人商机关联 | ||||
| @@ -1,29 +1,35 @@ | ||||
| package cn.iocoder.yudao.module.crm.service.contactbusinesslink; | ||||
| 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.contactbusinesslink.vo.CrmContactBusinessLinkPageReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.contactbusinesslink.vo.CrmContactBusinessLinkSaveReqVO; | ||||
| 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.convert.contactbusinessslink.CrmContactBusinessLinkConvert; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.contactbusinesslink.CrmContactBusinessLinkDO; | ||||
| 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.service.business.CrmBusinessService; | ||||
| import jakarta.annotation.Resource; | ||||
| 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:数据权限的校验;每个操作; | ||||
| @@ -41,6 +47,9 @@ public class CrmContactBusinessLinkServiceImpl implements CrmContactBusinessLink | ||||
|     @Resource | ||||
|     private CrmBusinessService crmBusinessService; | ||||
| 
 | ||||
|     @Resource | ||||
|     private CrmContactService crmContactService; | ||||
| 
 | ||||
|     @Override | ||||
|     public Long createContactBusinessLink(CrmContactBusinessLinkSaveReqVO createReqVO) { | ||||
|         CrmContactBusinessLinkDO contactBusinessLink = BeanUtils.toBean(createReqVO, CrmContactBusinessLinkDO.class); | ||||
| @@ -51,14 +60,26 @@ public class CrmContactBusinessLinkServiceImpl implements CrmContactBusinessLink | ||||
|     @Override | ||||
|     public void createContactBusinessLinkBatch(List<CrmContactBusinessLinkSaveReqVO> createReqVOList) { | ||||
|         // 插入 | ||||
|         // TODO @zyna:如果已经关联过,不用重复插入; | ||||
|         // TODO @zyna:contact 和 business 存在校验,挪到这里,Controller 不用 @Transactional 注解,添加到这里哈。尽量业务都在 Service; | ||||
|         List<CrmContactBusinessLinkDO> saveDoList = CrmContactBusinessLinkConvert.INSTANCE.convert(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 | ||||
|     @CrmPermission(bizType = CrmBizTypeEnum.CRM_BUSINESS, bizId = "#updateReqVO.id", level = CrmPermissionLevelEnum.WRITE) | ||||
|     public void updateContactBusinessLink(CrmContactBusinessLinkSaveReqVO updateReqVO) { | ||||
|         // 校验存在 | ||||
|         validateContactBusinessLinkExists(updateReqVO.getId()); | ||||
| @@ -68,14 +89,9 @@ public class CrmContactBusinessLinkServiceImpl implements CrmContactBusinessLink | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void deleteContactBusinessLink(List<CrmContactBusinessLinkSaveReqVO> createReqVO) { | ||||
|     public void deleteContactBusinessLink(List<Long> businessContactIds) { | ||||
|         // 删除 | ||||
|         createReqVO.forEach(item -> { | ||||
|             contactBusinessLinkMapper.delete(new LambdaQueryWrapperX<CrmContactBusinessLinkDO>() | ||||
|                     .eq(CrmContactBusinessLinkDO::getBusinessId,item.getBusinessId()) | ||||
|                     .eq(CrmContactBusinessLinkDO::getContactId,item.getContactId()) | ||||
|                     .eq(CrmContactBusinessLinkDO::getDeleted,0)); | ||||
|         }); | ||||
|         contactBusinessLinkMapper.deleteBatchIds(businessContactIds); | ||||
|     } | ||||
| 
 | ||||
|     private void validateContactBusinessLinkExists(Long id) { | ||||
| @@ -1,10 +1,12 @@ | ||||
| package cn.iocoder.yudao.module.crm.service.contact; | ||||
|  | ||||
| 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.CrmContactPageReqVO; | ||||
| 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.dal.dataobject.contact.CrmContactBusinessLinkDO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; | ||||
| import jakarta.validation.Valid; | ||||
| @@ -88,4 +90,12 @@ public interface CrmContactService { | ||||
|      */ | ||||
|     void transferContact(CrmContactTransferReqVO reqVO, Long userId); | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * 获取联系人商机关联分页列表 | ||||
|      * @param reqVO 联系人 | ||||
|      * @return 商机联系人关联列表 | ||||
|      */ | ||||
|     PageResult<CrmContactBusinessLinkDO> selectBusinessPageByContact(CrmContactBusinessLinkPageReqVO reqVO); | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -5,8 +5,17 @@ import cn.hutool.core.collection.ListUtil; | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.*; | ||||
| 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.mysql.contact.CrmContactMapper; | ||||
| import cn.iocoder.yudao.module.crm.dal.mysql.contactbusinesslink.CrmContactBusinessLinkMapper; | ||||
| 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.permission.CrmPermissionLevelEnum; | ||||
| import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission; | ||||
| @@ -43,10 +52,12 @@ public class CrmContactServiceImpl implements CrmContactService { | ||||
|     private CrmCustomerService customerService; | ||||
|     @Resource | ||||
|     private CrmPermissionService crmPermissionService; | ||||
|  | ||||
|     @Resource | ||||
|     private AdminUserApi adminUserApi; | ||||
|  | ||||
|     @Resource | ||||
|     private CrmContactBusinessLinkMapper contactBusinessLinkMapper; | ||||
|  | ||||
|     @Override | ||||
|     @Transactional(rollbackFor = Exception.class) | ||||
|     public Long createContact(CrmContactCreateReqVO createReqVO, Long userId) { | ||||
| @@ -150,4 +161,11 @@ public class CrmContactServiceImpl implements CrmContactService { | ||||
|         // 3. TODO 记录转移日志 | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public PageResult<CrmContactBusinessLinkDO> selectBusinessPageByContact(CrmContactBusinessLinkPageReqVO pageReqVO) { | ||||
|         CrmContactBusinessLinkPageReqVO crmContactBusinessLinkPageReqVO = new CrmContactBusinessLinkPageReqVO(); | ||||
|         crmContactBusinessLinkPageReqVO.setContactId(pageReqVO.getContactId()); | ||||
|         return contactBusinessLinkMapper.selectPageByContact(crmContactBusinessLinkPageReqVO); | ||||
|  | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 zyna
					zyna