mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 18:28:43 +08:00 
			
		
		
		
	CRM: 完善跟进,新增跟进信息处理器 handler 接口✔
This commit is contained in:
		| @@ -125,11 +125,8 @@ public class CrmContactController { | ||||
|     @Operation(summary = "获得联系人的精简列表") | ||||
|     @PreAuthorize("@ss.hasPermission('crm:contact:query')") | ||||
|     public CommonResult<List<CrmContactRespVO>> getSimpleContactList() { | ||||
|         // TODO @puhui999:这种还是搞个 getContactList 方法好点哈; | ||||
|         CrmContactPageReqVO reqVO = new CrmContactPageReqVO(); | ||||
|         reqVO.setPageSize(PAGE_SIZE_NONE); // 不分页 | ||||
|         PageResult<CrmContactDO> pageResult = contactService.getContactPage(reqVO, getLoginUserId()); | ||||
|         return success(convertList(pageResult.getList(), contact -> // 只返回 id、name 字段 | ||||
|         List<CrmContactDO> list = contactService.getSimpleContactList(getLoginUserId()); | ||||
|         return success(convertList(list, contact -> // 只返回 id、name 字段 | ||||
|                 new CrmContactRespVO().setId(contact.getId()).setName(contact.getName()))); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -28,6 +28,7 @@ import java.util.Map; | ||||
| import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | ||||
| import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; | ||||
| import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSetByFlatMap; | ||||
| import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; | ||||
|  | ||||
|  | ||||
| @Tag(name = "管理后台 - 跟进记录") | ||||
| @@ -50,20 +51,12 @@ public class CrmFollowUpRecordController { | ||||
|         return success(crmFollowUpRecordService.createFollowUpRecord(createReqVO)); | ||||
|     } | ||||
|  | ||||
|     @PutMapping("/update") | ||||
|     @Operation(summary = "更新跟进记录") | ||||
|     @PreAuthorize("@ss.hasPermission('crm:follow-up-record:update')") | ||||
|     public CommonResult<Boolean> updateFollowUpRecord(@Valid @RequestBody CrmFollowUpRecordSaveReqVO updateReqVO) { | ||||
|         crmFollowUpRecordService.updateFollowUpRecord(updateReqVO); | ||||
|         return success(true); | ||||
|     } | ||||
|  | ||||
|     @DeleteMapping("/delete") | ||||
|     @Operation(summary = "删除跟进记录") | ||||
|     @Parameter(name = "id", description = "编号", required = true) | ||||
|     @PreAuthorize("@ss.hasPermission('crm:follow-up-record:delete')") | ||||
|     public CommonResult<Boolean> deleteFollowUpRecord(@RequestParam("id") Long id) { | ||||
|         crmFollowUpRecordService.deleteFollowUpRecord(id); | ||||
|         crmFollowUpRecordService.deleteFollowUpRecord(id, getLoginUserId()); | ||||
|         return success(true); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusi | ||||
| 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.service.business.bo.CrmBusinessUpdateFollowUpReqBO; | ||||
| import jakarta.validation.Valid; | ||||
|  | ||||
| import java.util.Collection; | ||||
| @@ -35,6 +36,13 @@ public interface CrmBusinessService { | ||||
|      */ | ||||
|     void updateBusiness(@Valid CrmBusinessSaveReqVO updateReqVO); | ||||
|  | ||||
|     /** | ||||
|      * 更新商机相关跟进信息 | ||||
|      * | ||||
|      * @param updateFollowUpReqBOList 跟进信息 | ||||
|      */ | ||||
|     void updateContactFollowUpBatch(List<CrmBusinessUpdateFollowUpReqBO> updateFollowUpReqBOList); | ||||
|  | ||||
|     /** | ||||
|      * 删除商机 | ||||
|      * | ||||
|   | ||||
| @@ -8,7 +8,6 @@ import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusi | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessSaveReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessTransferReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.business.vo.product.CrmBusinessProductSaveReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductSaveReqVO; | ||||
| import cn.iocoder.yudao.module.crm.convert.business.CrmBusinessConvert; | ||||
| import cn.iocoder.yudao.module.crm.convert.businessproduct.CrmBusinessProductConvert; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO; | ||||
| @@ -22,6 +21,7 @@ import cn.iocoder.yudao.module.crm.dal.mysql.contract.CrmContractMapper; | ||||
| 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.permission.core.annotations.CrmPermission; | ||||
| import cn.iocoder.yudao.module.crm.service.business.bo.CrmBusinessUpdateFollowUpReqBO; | ||||
| import cn.iocoder.yudao.module.crm.service.contact.CrmContactBusinessService; | ||||
| import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; | ||||
| import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; | ||||
| @@ -33,7 +33,6 @@ import org.springframework.stereotype.Service; | ||||
| import org.springframework.transaction.annotation.Transactional; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
|  | ||||
| import java.math.BigDecimal; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| import java.util.List; | ||||
| @@ -95,9 +94,10 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { | ||||
|         LogRecordContext.putVariable("business", business); | ||||
|         return business.getId(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param businessId 商机id | ||||
|      * @param contactId 联系人id | ||||
|      * @param contactId  联系人id | ||||
|      * @throws | ||||
|      * @description 联系人与商机的关联 | ||||
|      * @author lzxhqs | ||||
| @@ -163,6 +163,11 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { | ||||
|         LogRecordContext.putVariable("businessName", oldBusiness.getName()); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void updateContactFollowUpBatch(List<CrmBusinessUpdateFollowUpReqBO> updateFollowUpReqBOList) { | ||||
|         businessMapper.updateBatch(BeanUtils.toBean(updateFollowUpReqBOList, CrmBusinessDO.class)); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     @Transactional(rollbackFor = Exception.class) | ||||
|     @LogRecord(type = CRM_BUSINESS_TYPE, subType = CRM_BUSINESS_DELETE_SUB_TYPE, bizNo = "{{#id}}", | ||||
| @@ -191,7 +196,7 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { | ||||
|      */ | ||||
|     private void validateContractExists(Long businessId) { | ||||
|         CrmContractDO contract = contractMapper.selectByBizId(businessId); | ||||
|         if(contract != null) { | ||||
|         if (contract != null) { | ||||
|             throw exception(BUSINESS_CONTRACT_EXISTS); | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -0,0 +1,37 @@ | ||||
| package cn.iocoder.yudao.module.crm.service.business.bo; | ||||
|  | ||||
| import com.mzt.logapi.starter.annotation.DiffLogField; | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import jakarta.validation.constraints.NotNull; | ||||
| import lombok.Data; | ||||
|  | ||||
| import java.time.LocalDateTime; | ||||
|  | ||||
| /** | ||||
|  * 商机跟进信息 Update Req BO | ||||
|  * | ||||
|  * @author HUIHUI | ||||
|  */ | ||||
| @Data | ||||
| public class CrmBusinessUpdateFollowUpReqBO { | ||||
|  | ||||
|     @Schema(description = "商机编号", example = "3167") | ||||
|     @NotNull(message = "商机编号不能为空") | ||||
|     private Long id; | ||||
|  | ||||
|     @Schema(description = "最后跟进时间") | ||||
|     @DiffLogField(name = "最后跟进时间") | ||||
|     @NotNull(message = "最后跟进时间不能为空") | ||||
|     private LocalDateTime contactLastTime; | ||||
|  | ||||
|     @Schema(description = "下次联系时间") | ||||
|     @DiffLogField(name = "下次联系时间") | ||||
|     @NotNull(message = "下次联系时间不能为空") | ||||
|     private LocalDateTime contactNextTime; | ||||
|  | ||||
|     @Schema(description = "最后更进内容") | ||||
|     @DiffLogField(name = "最后更进内容") | ||||
|     @NotNull(message = "最后更进内容不能为空") | ||||
|     private String contactLastContent; | ||||
|  | ||||
| } | ||||
| @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueSaveReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueTransferReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueTransformReqVO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.clue.CrmClueDO; | ||||
| import cn.iocoder.yudao.module.crm.service.clue.bo.CrmClueUpdateFollowUpReqBO; | ||||
| import jakarta.validation.Valid; | ||||
|  | ||||
| import java.util.Collection; | ||||
| @@ -33,6 +34,13 @@ public interface CrmClueService { | ||||
|      */ | ||||
|     void updateClue(@Valid CrmClueSaveReqVO updateReqVO); | ||||
|  | ||||
|     /** | ||||
|      * 更新线索相关的跟进信息 | ||||
|      * | ||||
|      * @param clueUpdateFollowUpReqBO 信息 | ||||
|      */ | ||||
|     void updateClueFollowUp(CrmClueUpdateFollowUpReqBO clueUpdateFollowUpReqBO); | ||||
|  | ||||
|     /** | ||||
|      * 删除线索 | ||||
|      * | ||||
|   | ||||
| @@ -16,6 +16,7 @@ import cn.iocoder.yudao.module.crm.dal.mysql.clue.CrmClueMapper; | ||||
| 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.permission.core.annotations.CrmPermission; | ||||
| import cn.iocoder.yudao.module.crm.service.clue.bo.CrmClueUpdateFollowUpReqBO; | ||||
| import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; | ||||
| import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; | ||||
| import cn.iocoder.yudao.module.system.api.user.AdminUserApi; | ||||
| @@ -82,6 +83,11 @@ public class CrmClueServiceImpl implements CrmClueService { | ||||
|         clueMapper.updateById(updateObj); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void updateClueFollowUp(CrmClueUpdateFollowUpReqBO clueUpdateFollowUpReqBO) { | ||||
|         clueMapper.updateById(BeanUtils.toBean(clueUpdateFollowUpReqBO, CrmClueDO.class)); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     @CrmPermission(bizType = CrmBizTypeEnum.CRM_LEADS, bizId = "#id", level = CrmPermissionLevelEnum.OWNER) | ||||
|     public void deleteClue(Long id) { | ||||
|   | ||||
| @@ -0,0 +1,37 @@ | ||||
| package cn.iocoder.yudao.module.crm.service.clue.bo; | ||||
|  | ||||
| import com.mzt.logapi.starter.annotation.DiffLogField; | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import jakarta.validation.constraints.NotNull; | ||||
| import lombok.Data; | ||||
|  | ||||
| import java.time.LocalDateTime; | ||||
|  | ||||
| /** | ||||
|  * 线索跟进信息 Update Req BO | ||||
|  * | ||||
|  * @author HUIHUI | ||||
|  */ | ||||
| @Data | ||||
| public class CrmClueUpdateFollowUpReqBO { | ||||
|  | ||||
|     @Schema(description = "线索编号", example = "3167") | ||||
|     @NotNull(message = "线索编号不能为空") | ||||
|     private Long id; | ||||
|  | ||||
|     @Schema(description = "最后跟进时间") | ||||
|     @DiffLogField(name = "最后跟进时间") | ||||
|     @NotNull(message = "最后跟进时间不能为空") | ||||
|     private LocalDateTime contactLastTime; | ||||
|  | ||||
|     @Schema(description = "下次联系时间") | ||||
|     @DiffLogField(name = "下次联系时间") | ||||
|     @NotNull(message = "下次联系时间不能为空") | ||||
|     private LocalDateTime contactNextTime; | ||||
|  | ||||
|     @Schema(description = "最后更进内容") | ||||
|     @DiffLogField(name = "最后更进内容") | ||||
|     @NotNull(message = "最后更进内容不能为空") | ||||
|     private String contactLastContent; | ||||
|  | ||||
| } | ||||
| @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactSaveReq | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactTransferReqVO; | ||||
| 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.service.contact.bo.CrmContactUpdateFollowUpReqBO; | ||||
| import jakarta.validation.Valid; | ||||
|  | ||||
| import java.util.Collection; | ||||
| @@ -57,6 +58,14 @@ public interface CrmContactService { | ||||
|      */ | ||||
|     void updateOwnerUserIdByCustomerId(Long customerId, Long ownerUserId); | ||||
|  | ||||
|     /** | ||||
|      * 更新联系人相关跟进信息 | ||||
|      * | ||||
|      * @param updateFollowUpReqBOList 跟进信息 | ||||
|      */ | ||||
|     void updateContactFollowUpBatch(List<CrmContactUpdateFollowUpReqBO> updateFollowUpReqBOList); | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * 获得联系人 | ||||
|      * | ||||
| @@ -89,6 +98,14 @@ public interface CrmContactService { | ||||
|      */ | ||||
|     List<CrmContactDO> getContactList(); | ||||
|  | ||||
|     /** | ||||
|      * 获取联系人列表(校验权限) | ||||
|      * | ||||
|      * @param userId 用户编号 | ||||
|      * @return 联系人列表 | ||||
|      */ | ||||
|     List<CrmContactDO> getSimpleContactList(Long userId); | ||||
|  | ||||
|     /** | ||||
|      * 获得联系人分页 | ||||
|      * | ||||
|   | ||||
| @@ -15,6 +15,7 @@ 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.permission.core.annotations.CrmPermission; | ||||
| import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService; | ||||
| import cn.iocoder.yudao.module.crm.service.contact.bo.CrmContactUpdateFollowUpReqBO; | ||||
| import cn.iocoder.yudao.module.crm.service.contract.CrmContractService; | ||||
| import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; | ||||
| import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; | ||||
| @@ -32,6 +33,7 @@ import java.util.Collection; | ||||
| import java.util.List; | ||||
|  | ||||
| import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||||
| import static cn.iocoder.yudao.framework.common.pojo.PageParam.PAGE_SIZE_NONE; | ||||
| import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*; | ||||
| import static cn.iocoder.yudao.module.crm.enums.LogRecordConstants.*; | ||||
| import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_NOT_EXISTS; | ||||
| @@ -192,6 +194,11 @@ public class CrmContactServiceImpl implements CrmContactService { | ||||
|         contactMapper.updateOwnerUserIdByCustomerId(customerId, ownerUserId); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void updateContactFollowUpBatch(List<CrmContactUpdateFollowUpReqBO> updateFollowUpReqBOList) { | ||||
|         contactMapper.updateBatch(BeanUtils.toBean(updateFollowUpReqBOList, CrmContactDO.class)); | ||||
|     } | ||||
|  | ||||
|     //======================= 查询相关 ======================= | ||||
|  | ||||
|     @Override | ||||
| @@ -221,6 +228,13 @@ public class CrmContactServiceImpl implements CrmContactService { | ||||
|         return contactMapper.selectList(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public List<CrmContactDO> getSimpleContactList(Long userId) { | ||||
|         CrmContactPageReqVO reqVO = new CrmContactPageReqVO(); | ||||
|         reqVO.setPageSize(PAGE_SIZE_NONE); // 不分页 | ||||
|         return contactMapper.selectPage(reqVO, userId).getList(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public PageResult<CrmContactDO> getContactPage(CrmContactPageReqVO pageReqVO, Long userId) { | ||||
|         return contactMapper.selectPage(pageReqVO, userId); | ||||
|   | ||||
| @@ -0,0 +1,37 @@ | ||||
| package cn.iocoder.yudao.module.crm.service.contact.bo; | ||||
|  | ||||
| import com.mzt.logapi.starter.annotation.DiffLogField; | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import jakarta.validation.constraints.NotNull; | ||||
| import lombok.Data; | ||||
|  | ||||
| import java.time.LocalDateTime; | ||||
|  | ||||
| /** | ||||
|  * 联系人跟进信息 Update Req BO | ||||
|  * | ||||
|  * @author HUIHUI | ||||
|  */ | ||||
| @Data | ||||
| public class CrmContactUpdateFollowUpReqBO { | ||||
|  | ||||
|     @Schema(description = "联系人编号", example = "3167") | ||||
|     @NotNull(message = "联系人编号不能为空") | ||||
|     private Long id; | ||||
|  | ||||
|     @Schema(description = "最后跟进时间") | ||||
|     @DiffLogField(name = "最后跟进时间") | ||||
|     @NotNull(message = "最后跟进时间不能为空") | ||||
|     private LocalDateTime contactLastTime; | ||||
|  | ||||
|     @Schema(description = "下次联系时间") | ||||
|     @DiffLogField(name = "下次联系时间") | ||||
|     @NotNull(message = "下次联系时间不能为空") | ||||
|     private LocalDateTime contactNextTime; | ||||
|  | ||||
|     @Schema(description = "最后更进内容") | ||||
|     @DiffLogField(name = "最后更进内容") | ||||
|     @NotNull(message = "最后更进内容不能为空") | ||||
|     private String contactLastContent; | ||||
|  | ||||
| } | ||||
| @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractSaveR | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractTransferReqVO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; | ||||
| import cn.iocoder.yudao.module.crm.service.contract.bo.CrmContractUpdateFollowUpReqBO; | ||||
| import jakarta.validation.Valid; | ||||
|  | ||||
| import java.util.Collection; | ||||
| @@ -41,6 +42,21 @@ public interface CrmContractService { | ||||
|      */ | ||||
|     void deleteContract(Long id); | ||||
|  | ||||
|     /** | ||||
|      * 合同转移 | ||||
|      * | ||||
|      * @param reqVO  请求 | ||||
|      * @param userId 用户编号 | ||||
|      */ | ||||
|     void transferContract(CrmContractTransferReqVO reqVO, Long userId); | ||||
|  | ||||
|     /** | ||||
|      * 更新合同相关的更进信息 | ||||
|      * | ||||
|      * @param contractUpdateFollowUpReqBO 信息 | ||||
|      */ | ||||
|     void updateContractFollowUp(CrmContractUpdateFollowUpReqBO contractUpdateFollowUpReqBO); | ||||
|  | ||||
|     /** | ||||
|      * 获得合同 | ||||
|      * | ||||
| @@ -78,14 +94,6 @@ public interface CrmContractService { | ||||
|      */ | ||||
|     PageResult<CrmContractDO> getContractPageByCustomerId(CrmContractPageReqVO pageReqVO); | ||||
|  | ||||
|     /** | ||||
|      * 合同转移 | ||||
|      * | ||||
|      * @param reqVO  请求 | ||||
|      * @param userId 用户编号 | ||||
|      */ | ||||
|     void transferContract(CrmContractTransferReqVO reqVO, Long userId); | ||||
|  | ||||
|     /** | ||||
|      * 查询属于某个联系人的合同数量 | ||||
|      * | ||||
|   | ||||
| @@ -13,6 +13,7 @@ import cn.iocoder.yudao.module.crm.dal.mysql.contract.CrmContractMapper; | ||||
| 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.permission.core.annotations.CrmPermission; | ||||
| import cn.iocoder.yudao.module.crm.service.contract.bo.CrmContractUpdateFollowUpReqBO; | ||||
| import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; | ||||
| import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; | ||||
| import com.mzt.logapi.context.LogRecordContext; | ||||
| @@ -135,6 +136,11 @@ public class CrmContractServiceImpl implements CrmContractService { | ||||
|         LogRecordContext.putVariable("contract", contract); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void updateContractFollowUp(CrmContractUpdateFollowUpReqBO contractUpdateFollowUpReqBO) { | ||||
|         contractMapper.updateById(BeanUtils.toBean(contractUpdateFollowUpReqBO, CrmContractDO.class)); | ||||
|     } | ||||
|  | ||||
|     //======================= 查询相关 ======================= | ||||
|  | ||||
|     @Override | ||||
|   | ||||
| @@ -0,0 +1,37 @@ | ||||
| package cn.iocoder.yudao.module.crm.service.contract.bo; | ||||
|  | ||||
| import com.mzt.logapi.starter.annotation.DiffLogField; | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import jakarta.validation.constraints.NotNull; | ||||
| import lombok.Data; | ||||
|  | ||||
| import java.time.LocalDateTime; | ||||
|  | ||||
| /** | ||||
|  * 合同跟进信息 Update Req BO | ||||
|  * | ||||
|  * @author HUIHUI | ||||
|  */ | ||||
| @Data | ||||
| public class CrmContractUpdateFollowUpReqBO { | ||||
|  | ||||
|     @Schema(description = "合同编号", example = "3167") | ||||
|     @NotNull(message = "合同编号不能为空") | ||||
|     private Long id; | ||||
|  | ||||
|     @Schema(description = "最后跟进时间") | ||||
|     @DiffLogField(name = "最后跟进时间") | ||||
|     @NotNull(message = "最后跟进时间不能为空") | ||||
|     private LocalDateTime contactLastTime; | ||||
|  | ||||
|     @Schema(description = "下次联系时间") | ||||
|     @DiffLogField(name = "下次联系时间") | ||||
|     @NotNull(message = "下次联系时间不能为空") | ||||
|     private LocalDateTime contactNextTime; | ||||
|  | ||||
|     @Schema(description = "最后更进内容") | ||||
|     @DiffLogField(name = "最后更进内容") | ||||
|     @NotNull(message = "最后更进内容不能为空") | ||||
|     private String contactLastContent; | ||||
|  | ||||
| } | ||||
| @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPageR | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerSaveReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerTransferReqVO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; | ||||
| import cn.iocoder.yudao.module.crm.service.customer.bo.CrmCustomerUpdateFollowUpReqBO; | ||||
| import jakarta.validation.Valid; | ||||
|  | ||||
| import java.util.Collection; | ||||
| @@ -90,6 +91,13 @@ public interface CrmCustomerService { | ||||
|      */ | ||||
|     void lockCustomer(@Valid CrmCustomerLockReqVO lockReqVO, Long userId); | ||||
|  | ||||
|     /** | ||||
|      * 更新客户相关更进信息 | ||||
|      * | ||||
|      * @param customerUpdateFollowUpReqBO 请求 | ||||
|      */ | ||||
|     void updateCustomerFollowUp(CrmCustomerUpdateFollowUpReqBO customerUpdateFollowUpReqBO); | ||||
|  | ||||
|     // ==================== 公海相关操作 ==================== | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -21,6 +21,7 @@ import cn.iocoder.yudao.module.crm.framework.permission.core.util.CrmPermissionU | ||||
| import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService; | ||||
| import cn.iocoder.yudao.module.crm.service.contact.CrmContactService; | ||||
| import cn.iocoder.yudao.module.crm.service.contract.CrmContractService; | ||||
| import cn.iocoder.yudao.module.crm.service.customer.bo.CrmCustomerUpdateFollowUpReqBO; | ||||
| import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; | ||||
| import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; | ||||
| import cn.iocoder.yudao.module.system.api.user.AdminUserApi; | ||||
| @@ -203,6 +204,11 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { | ||||
|         LogRecordContext.putVariable("customer", customer); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void updateCustomerFollowUp(CrmCustomerUpdateFollowUpReqBO customerUpdateFollowUpReqBO) { | ||||
|         customerMapper.updateById(BeanUtils.toBean(customerUpdateFollowUpReqBO, CrmCustomerDO.class)); | ||||
|     } | ||||
|  | ||||
|     // ==================== 公海相关操作 ==================== | ||||
|  | ||||
|     @Override | ||||
|   | ||||
| @@ -0,0 +1,32 @@ | ||||
| package cn.iocoder.yudao.module.crm.service.customer.bo; | ||||
|  | ||||
| import com.mzt.logapi.starter.annotation.DiffLogField; | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import lombok.Data; | ||||
|  | ||||
| import java.time.LocalDateTime; | ||||
|  | ||||
| /** | ||||
|  * 跟进信息 Update Req BO | ||||
|  * | ||||
|  * @author HUIHUI | ||||
|  */ | ||||
| @Data | ||||
| public class CrmCustomerUpdateFollowUpReqBO { | ||||
|  | ||||
|     @Schema(description = "主键", example = "3167") | ||||
|     private Long id; | ||||
|  | ||||
|     @Schema(description = "最后跟进时间") | ||||
|     @DiffLogField(name = "最后跟进时间") | ||||
|     private LocalDateTime contactLastTime; | ||||
|  | ||||
|     @Schema(description = "下次联系时间") | ||||
|     @DiffLogField(name = "下次联系时间") | ||||
|     private LocalDateTime contactNextTime; | ||||
|  | ||||
|     @Schema(description = "最后更进内容") | ||||
|     @DiffLogField(name = "最后更进内容") | ||||
|     private String contactLastContent; | ||||
|  | ||||
| } | ||||
| @@ -14,7 +14,7 @@ import jakarta.validation.Valid; | ||||
| public interface CrmFollowUpRecordService { | ||||
|  | ||||
|     /** | ||||
|      * 创建跟进记录 | ||||
|      * 创建跟进记录 (数据权限基于 bizType、 bizId) | ||||
|      * | ||||
|      * @param createReqVO 创建信息 | ||||
|      * @return 编号 | ||||
| @@ -22,18 +22,12 @@ public interface CrmFollowUpRecordService { | ||||
|     Long createFollowUpRecord(@Valid CrmFollowUpRecordSaveReqVO createReqVO); | ||||
|  | ||||
|     /** | ||||
|      * 更新跟进记录 | ||||
|      * 删除跟进记录 (数据权限基于 bizType、 bizId) | ||||
|      * | ||||
|      * @param updateReqVO 更新信息 | ||||
|      * @param id     编号 | ||||
|      * @param userId 用户编号 | ||||
|      */ | ||||
|     void updateFollowUpRecord(@Valid CrmFollowUpRecordSaveReqVO updateReqVO); | ||||
|  | ||||
|     /** | ||||
|      * 删除跟进记录 | ||||
|      * | ||||
|      * @param id 编号 | ||||
|      */ | ||||
|     void deleteFollowUpRecord(Long id); | ||||
|     void deleteFollowUpRecord(Long id, Long userId); | ||||
|  | ||||
|     /** | ||||
|      * 获得跟进记录 | ||||
| @@ -44,7 +38,7 @@ public interface CrmFollowUpRecordService { | ||||
|     CrmFollowUpRecordDO getFollowUpRecord(Long id); | ||||
|  | ||||
|     /** | ||||
|      * 获得跟进记录分页 | ||||
|      * 获得跟进记录分页 (数据权限基于 bizType、 bizId) | ||||
|      * | ||||
|      * @param pageReqVO 分页查询 | ||||
|      * @return 跟进记录分页 | ||||
|   | ||||
| @@ -1,16 +1,33 @@ | ||||
| package cn.iocoder.yudao.module.crm.service.followup; | ||||
|  | ||||
| import cn.hutool.core.collection.CollUtil; | ||||
| import cn.hutool.core.util.ObjUtil; | ||||
| 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.followup.vo.CrmFollowUpRecordPageReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.followup.vo.CrmFollowUpRecordSaveReqVO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.followup.CrmFollowUpRecordDO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; | ||||
| import cn.iocoder.yudao.module.crm.dal.mysql.followup.CrmFollowUpRecordMapper; | ||||
| import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; | ||||
| import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission; | ||||
| import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService; | ||||
| import cn.iocoder.yudao.module.crm.service.business.bo.CrmBusinessUpdateFollowUpReqBO; | ||||
| import cn.iocoder.yudao.module.crm.service.contact.CrmContactService; | ||||
| import cn.iocoder.yudao.module.crm.service.contact.bo.CrmContactUpdateFollowUpReqBO; | ||||
| import cn.iocoder.yudao.module.crm.service.followup.handle.CrmFollowUpHandler; | ||||
| import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; | ||||
| import jakarta.annotation.Resource; | ||||
| import org.springframework.stereotype.Service; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
|  | ||||
| import java.time.LocalDateTime; | ||||
| import java.util.List; | ||||
|  | ||||
| import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||||
| import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.anyMatch; | ||||
| import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; | ||||
| import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.FOLLOW_UP_RECORD_DELETE_DENIED; | ||||
| import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.FOLLOW_UP_RECORD_NOT_EXISTS; | ||||
|  | ||||
| /** | ||||
| @@ -25,39 +42,69 @@ public class CrmFollowUpRecordServiceImpl implements CrmFollowUpRecordService { | ||||
|     @Resource | ||||
|     private CrmFollowUpRecordMapper crmFollowUpRecordMapper; | ||||
|  | ||||
|     // TODO @puhui999:数据权限 | ||||
|     @Resource | ||||
|     private CrmPermissionService permissionService; | ||||
|     @Resource | ||||
|     private List<CrmFollowUpHandler> followUpHandlers; | ||||
|     @Resource | ||||
|     private CrmBusinessService businessService; | ||||
|     @Resource | ||||
|     private CrmContactService contactService; | ||||
|  | ||||
|     @Override | ||||
|     @CrmPermission(bizTypeValue = "#createReqVO.bizType", bizId = "#createReqVO.bizId", level = CrmPermissionLevelEnum.WRITE) | ||||
|     public Long createFollowUpRecord(CrmFollowUpRecordSaveReqVO createReqVO) { | ||||
|         // 创建更进记录 | ||||
|         CrmFollowUpRecordDO followUpRecord = BeanUtils.toBean(createReqVO, CrmFollowUpRecordDO.class); | ||||
|         crmFollowUpRecordMapper.insert(followUpRecord); | ||||
|         // TODO @puhui999:需要更新 bizId 对应的记录; | ||||
|         // TODO @puhui999:需要更新 businessIds、contactIds 对应的记录; | ||||
|  | ||||
|         LocalDateTime now = LocalDateTime.now(); | ||||
|         // 更新 bizId 对应的记录; | ||||
|         followUpHandlers.forEach(handler -> handler.execute(followUpRecord, now)); | ||||
|         // 更新 contactIds 对应的记录 | ||||
|         if (CollUtil.isNotEmpty(createReqVO.getContactIds())) { | ||||
|             contactService.updateContactFollowUpBatch(convertList(createReqVO.getContactIds(), contactId -> { | ||||
|                 CrmContactUpdateFollowUpReqBO crmContactUpdateFollowUpReqBO = new CrmContactUpdateFollowUpReqBO(); | ||||
|                 crmContactUpdateFollowUpReqBO.setId(contactId).setContactNextTime(followUpRecord.getNextTime()) | ||||
|                         .setContactLastTime(now).setContactLastContent(followUpRecord.getContent()); | ||||
|                 return crmContactUpdateFollowUpReqBO; | ||||
|             })); | ||||
|         } | ||||
|         // 需要更新 businessIds、contactIds 对应的记录 | ||||
|         if (CollUtil.isNotEmpty(createReqVO.getBusinessIds())) { | ||||
|             businessService.updateContactFollowUpBatch(convertList(createReqVO.getBusinessIds(), businessId -> { | ||||
|                 CrmBusinessUpdateFollowUpReqBO crmBusinessUpdateFollowUpReqBO = new CrmBusinessUpdateFollowUpReqBO(); | ||||
|                 crmBusinessUpdateFollowUpReqBO.setId(businessId).setContactNextTime(followUpRecord.getNextTime()) | ||||
|                         .setContactLastTime(now).setContactLastContent(followUpRecord.getContent()); | ||||
|                 return crmBusinessUpdateFollowUpReqBO; | ||||
|             })); | ||||
|         } | ||||
|         return followUpRecord.getId(); | ||||
|     } | ||||
|  | ||||
|     // TODO @puhui999:不能编辑~~~ | ||||
|     @Override | ||||
|     public void updateFollowUpRecord(CrmFollowUpRecordSaveReqVO updateReqVO) { | ||||
|     public void deleteFollowUpRecord(Long id, Long userId) { | ||||
|         // 校验存在 | ||||
|         validateFollowUpRecordExists(updateReqVO.getId()); | ||||
|         // 更新 | ||||
|         CrmFollowUpRecordDO updateObj = BeanUtils.toBean(updateReqVO, CrmFollowUpRecordDO.class); | ||||
|         crmFollowUpRecordMapper.updateById(updateObj); | ||||
|     } | ||||
|         CrmFollowUpRecordDO followUpRecord = validateFollowUpRecordExists(id); | ||||
|         // 校验权限 | ||||
|         List<CrmPermissionDO> permissionList = permissionService.getPermissionListByBiz( | ||||
|                 followUpRecord.getBizType(), followUpRecord.getBizId()); | ||||
|         boolean condition = anyMatch(permissionList, permission -> | ||||
|                 ObjUtil.equal(permission.getUserId(), userId) && ObjUtil.equal(permission.getLevel(), CrmPermissionLevelEnum.OWNER.getLevel())); | ||||
|         if (!condition) { | ||||
|             throw exception(FOLLOW_UP_RECORD_DELETE_DENIED); | ||||
|         } | ||||
|  | ||||
|     // TODO @puhui999:数据权限 | ||||
|     @Override | ||||
|     public void deleteFollowUpRecord(Long id) { | ||||
|         // 校验存在 | ||||
|         validateFollowUpRecordExists(id); | ||||
|         // 删除 | ||||
|         crmFollowUpRecordMapper.deleteById(id); | ||||
|     } | ||||
|  | ||||
|     private void validateFollowUpRecordExists(Long id) { | ||||
|         if (crmFollowUpRecordMapper.selectById(id) == null) { | ||||
|     private CrmFollowUpRecordDO validateFollowUpRecordExists(Long id) { | ||||
|         CrmFollowUpRecordDO followUpRecord = crmFollowUpRecordMapper.selectById(id); | ||||
|         if (followUpRecord == null) { | ||||
|             throw exception(FOLLOW_UP_RECORD_NOT_EXISTS); | ||||
|         } | ||||
|         return followUpRecord; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
| @@ -65,8 +112,9 @@ public class CrmFollowUpRecordServiceImpl implements CrmFollowUpRecordService { | ||||
|         return crmFollowUpRecordMapper.selectById(id); | ||||
|     } | ||||
|  | ||||
|     // TODO @puhui999:数据权限 | ||||
|  | ||||
|     @Override | ||||
|     @CrmPermission(bizTypeValue = "#pageReqVO.bizType", bizId = "#pageReqVO.bizId", level = CrmPermissionLevelEnum.READ) | ||||
|     public PageResult<CrmFollowUpRecordDO> getFollowUpRecordPage(CrmFollowUpRecordPageReqVO pageReqVO) { | ||||
|         return crmFollowUpRecordMapper.selectPage(pageReqVO); | ||||
|     } | ||||
|   | ||||
| @@ -0,0 +1,38 @@ | ||||
| package cn.iocoder.yudao.module.crm.service.followup.handle; | ||||
|  | ||||
| import cn.hutool.core.util.ObjUtil; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.followup.CrmFollowUpRecordDO; | ||||
| import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; | ||||
| import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService; | ||||
| import cn.iocoder.yudao.module.crm.service.business.bo.CrmBusinessUpdateFollowUpReqBO; | ||||
| import jakarta.annotation.Resource; | ||||
| import org.springframework.stereotype.Component; | ||||
|  | ||||
| import java.time.LocalDateTime; | ||||
| import java.util.Collections; | ||||
|  | ||||
| /** | ||||
|  * CRM 商机的 {@link CrmFollowUpHandler} 实现类 | ||||
|  * | ||||
|  * @author HUIHUI | ||||
|  */ | ||||
| @Component | ||||
| public class CrmBusinessFollowUpHandler implements CrmFollowUpHandler { | ||||
|  | ||||
|     @Resource | ||||
|     private CrmBusinessService businessService; | ||||
|  | ||||
|     @Override | ||||
|     public void execute(CrmFollowUpRecordDO followUpRecord, LocalDateTime now) { | ||||
|         if (ObjUtil.notEqual(CrmBizTypeEnum.CRM_BUSINESS.getType(), followUpRecord.getBizType())) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         // 更新商机跟进信息 | ||||
|         CrmBusinessUpdateFollowUpReqBO businessUpdateFollowUpReqBO = new CrmBusinessUpdateFollowUpReqBO(); | ||||
|         businessUpdateFollowUpReqBO.setId(followUpRecord.getBizId()).setContactNextTime(followUpRecord.getNextTime()) | ||||
|                 .setContactLastTime(now).setContactLastContent(followUpRecord.getContent()); | ||||
|         businessService.updateContactFollowUpBatch(Collections.singletonList(businessUpdateFollowUpReqBO)); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,37 @@ | ||||
| package cn.iocoder.yudao.module.crm.service.followup.handle; | ||||
|  | ||||
| import cn.hutool.core.util.ObjUtil; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.followup.CrmFollowUpRecordDO; | ||||
| import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; | ||||
| import cn.iocoder.yudao.module.crm.service.clue.CrmClueService; | ||||
| import cn.iocoder.yudao.module.crm.service.clue.bo.CrmClueUpdateFollowUpReqBO; | ||||
| import jakarta.annotation.Resource; | ||||
| import org.springframework.stereotype.Component; | ||||
|  | ||||
| import java.time.LocalDateTime; | ||||
|  | ||||
| /** | ||||
|  * CRM 线索的 {@link CrmFollowUpHandler} 实现类 | ||||
|  * | ||||
|  * @author HUIHUI | ||||
|  */ | ||||
| @Component | ||||
| public class CrmClueFollowUpHandler implements CrmFollowUpHandler { | ||||
|  | ||||
|     @Resource | ||||
|     private CrmClueService clueService; | ||||
|  | ||||
|     @Override | ||||
|     public void execute(CrmFollowUpRecordDO followUpRecord, LocalDateTime now) { | ||||
|         if (ObjUtil.notEqual(CrmBizTypeEnum.CRM_LEADS.getType(), followUpRecord.getBizType())) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         // 更新线索跟进信息 | ||||
|         CrmClueUpdateFollowUpReqBO clueUpdateFollowUpReqBO = new CrmClueUpdateFollowUpReqBO(); | ||||
|         clueUpdateFollowUpReqBO.setId(followUpRecord.getBizId()).setContactNextTime(followUpRecord.getNextTime()) | ||||
|                 .setContactLastTime(now).setContactLastContent(followUpRecord.getContent()); | ||||
|         clueService.updateClueFollowUp(clueUpdateFollowUpReqBO); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,38 @@ | ||||
| package cn.iocoder.yudao.module.crm.service.followup.handle; | ||||
|  | ||||
| import cn.hutool.core.util.ObjUtil; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.followup.CrmFollowUpRecordDO; | ||||
| import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; | ||||
| import cn.iocoder.yudao.module.crm.service.contact.CrmContactService; | ||||
| import cn.iocoder.yudao.module.crm.service.contact.bo.CrmContactUpdateFollowUpReqBO; | ||||
| import jakarta.annotation.Resource; | ||||
| import org.springframework.stereotype.Component; | ||||
|  | ||||
| import java.time.LocalDateTime; | ||||
| import java.util.Collections; | ||||
|  | ||||
| /** | ||||
|  * CRM 联系人的 {@link CrmFollowUpHandler} 实现类 | ||||
|  * | ||||
|  * @author HUIHUI | ||||
|  */ | ||||
| @Component | ||||
| public class CrmContactFollowUpHandler implements CrmFollowUpHandler { | ||||
|  | ||||
|     @Resource | ||||
|     private CrmContactService contactService; | ||||
|  | ||||
|     @Override | ||||
|     public void execute(CrmFollowUpRecordDO followUpRecord, LocalDateTime now) { | ||||
|         if (ObjUtil.notEqual(CrmBizTypeEnum.CRM_CONTACT.getType(), followUpRecord.getBizType())) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         // 更新联系人跟进信息 | ||||
|         CrmContactUpdateFollowUpReqBO contactUpdateFollowUpReqBO = new CrmContactUpdateFollowUpReqBO(); | ||||
|         contactUpdateFollowUpReqBO.setId(followUpRecord.getBizId()).setContactNextTime(followUpRecord.getNextTime()) | ||||
|                 .setContactLastTime(now).setContactLastContent(followUpRecord.getContent()); | ||||
|         contactService.updateContactFollowUpBatch(Collections.singletonList(contactUpdateFollowUpReqBO)); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,37 @@ | ||||
| package cn.iocoder.yudao.module.crm.service.followup.handle; | ||||
|  | ||||
| import cn.hutool.core.util.ObjUtil; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.followup.CrmFollowUpRecordDO; | ||||
| import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; | ||||
| import cn.iocoder.yudao.module.crm.service.contract.CrmContractService; | ||||
| import cn.iocoder.yudao.module.crm.service.contract.bo.CrmContractUpdateFollowUpReqBO; | ||||
| import jakarta.annotation.Resource; | ||||
| import org.springframework.stereotype.Component; | ||||
|  | ||||
| import java.time.LocalDateTime; | ||||
|  | ||||
| /** | ||||
|  * CRM 合同的 {@link CrmFollowUpHandler} 实现类 | ||||
|  * | ||||
|  * @author HUIHUI | ||||
|  */ | ||||
| @Component | ||||
| public class CrmContractFollowUpHandler implements CrmFollowUpHandler { | ||||
|  | ||||
|     @Resource | ||||
|     private CrmContractService contractService; | ||||
|  | ||||
|     @Override | ||||
|     public void execute(CrmFollowUpRecordDO followUpRecord, LocalDateTime now) { | ||||
|         if (ObjUtil.notEqual(CrmBizTypeEnum.CRM_CONTRACT.getType(), followUpRecord.getBizType())) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         // 更新合同跟进信息 | ||||
|         CrmContractUpdateFollowUpReqBO contractUpdateFollowUpReqBO = new CrmContractUpdateFollowUpReqBO(); | ||||
|         contractUpdateFollowUpReqBO.setId(followUpRecord.getBizId()).setContactNextTime(followUpRecord.getNextTime()) | ||||
|                 .setContactLastTime(now).setContactLastContent(followUpRecord.getContent()); | ||||
|         contractService.updateContractFollowUp(contractUpdateFollowUpReqBO); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,37 @@ | ||||
| package cn.iocoder.yudao.module.crm.service.followup.handle; | ||||
|  | ||||
| import cn.hutool.core.util.ObjUtil; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.followup.CrmFollowUpRecordDO; | ||||
| import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; | ||||
| import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; | ||||
| import cn.iocoder.yudao.module.crm.service.customer.bo.CrmCustomerUpdateFollowUpReqBO; | ||||
| import jakarta.annotation.Resource; | ||||
| import org.springframework.stereotype.Component; | ||||
|  | ||||
| import java.time.LocalDateTime; | ||||
|  | ||||
| /** | ||||
|  * CRM 客户的 {@link CrmFollowUpHandler} 实现类 | ||||
|  * | ||||
|  * @author HUIHUI | ||||
|  */ | ||||
| @Component | ||||
| public class CrmCustomerFollowUpHandler implements CrmFollowUpHandler { | ||||
|  | ||||
|     @Resource | ||||
|     private CrmCustomerService customerService; | ||||
|  | ||||
|     @Override | ||||
|     public void execute(CrmFollowUpRecordDO followUpRecord, LocalDateTime now) { | ||||
|         if (ObjUtil.notEqual(CrmBizTypeEnum.CRM_CUSTOMER.getType(), followUpRecord.getBizType())) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         // 更新客户跟进信息 | ||||
|         CrmCustomerUpdateFollowUpReqBO customerUpdateFollowUpReqBO = new CrmCustomerUpdateFollowUpReqBO(); | ||||
|         customerUpdateFollowUpReqBO.setId(followUpRecord.getBizId()).setContactNextTime(followUpRecord.getNextTime()) | ||||
|                 .setContactLastTime(now).setContactLastContent(followUpRecord.getContent()); | ||||
|         customerService.updateCustomerFollowUp(customerUpdateFollowUpReqBO); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,22 @@ | ||||
| package cn.iocoder.yudao.module.crm.service.followup.handle; | ||||
|  | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.followup.CrmFollowUpRecordDO; | ||||
|  | ||||
| import java.time.LocalDateTime; | ||||
|  | ||||
| /** | ||||
|  * CRM 跟进信息处理器 handler 接口 | ||||
|  * | ||||
|  * @author HUIHUI | ||||
|  */ | ||||
| public interface CrmFollowUpHandler { | ||||
|  | ||||
|     /** | ||||
|      * 执行更新 | ||||
|      * | ||||
|      * @param followUpRecord 跟进记录 | ||||
|      * @param now            跟进时间 | ||||
|      */ | ||||
|     void execute(CrmFollowUpRecordDO followUpRecord, LocalDateTime now); | ||||
|  | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 puhui999
					puhui999