Commit 1280f49a04f415b78d3a91e98bc187807173cffb
1 parent
722b3351
CRM:【线索】转化为客户接口修改
Showing
5 changed files
with
25 additions
and
24 deletions
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/clue/CrmClueController.java
| @@ -99,9 +99,8 @@ public class CrmClueController { | @@ -99,9 +99,8 @@ public class CrmClueController { | ||
| 99 | @PostMapping("/transform") | 99 | @PostMapping("/transform") |
| 100 | @Operation(summary = "线索转化为客户") | 100 | @Operation(summary = "线索转化为客户") |
| 101 | @PreAuthorize("@ss.hasPermission('crm:clue:update')") | 101 | @PreAuthorize("@ss.hasPermission('crm:clue:update')") |
| 102 | - // TODO @min:方法改成 translateCustomer | ||
| 103 | - public CommonResult<Boolean> translate(@Valid @RequestBody CrmClueTransformReqVO reqVO) { | ||
| 104 | - clueService.translate(reqVO, getLoginUserId()); | 102 | + public CommonResult<Boolean> translateCustomer(@Valid @RequestBody CrmClueTransformReqVO reqVO) { |
| 103 | + clueService.translateCustomer(reqVO, getLoginUserId()); | ||
| 105 | return success(Boolean.TRUE); | 104 | return success(Boolean.TRUE); |
| 106 | } | 105 | } |
| 107 | 106 |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/clue/vo/CrmClueTransformReqVO.java
| @@ -11,6 +11,7 @@ import java.util.Set; | @@ -11,6 +11,7 @@ import java.util.Set; | ||
| 11 | public class CrmClueTransformReqVO { | 11 | public class CrmClueTransformReqVO { |
| 12 | 12 | ||
| 13 | @Schema(description = "线索编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1024, 1025]") | 13 | @Schema(description = "线索编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1024, 1025]") |
| 14 | - @NotEmpty(message = "线索编号不能为空") Set<Long> ids; // TODO @min:应该空行噢 | 14 | + @NotEmpty(message = "线索编号不能为空") |
| 15 | + private Set<Long> ids; | ||
| 15 | 16 | ||
| 16 | } | 17 | } |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java
| @@ -7,7 +7,6 @@ import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerSaveR | @@ -7,7 +7,6 @@ import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerSaveR | ||
| 7 | import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerTransferReqVO; | 7 | import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerTransferReqVO; |
| 8 | import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigRespVO; | 8 | import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigRespVO; |
| 9 | import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigSaveReqVO; | 9 | import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigSaveReqVO; |
| 10 | -import cn.iocoder.yudao.module.crm.dal.dataobject.clue.CrmClueDO; | ||
| 11 | import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; | 10 | import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; |
| 12 | import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerPoolConfigDO; | 11 | import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerPoolConfigDO; |
| 13 | import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; | 12 | import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; |
| @@ -78,8 +77,4 @@ public interface CrmCustomerConvert { | @@ -78,8 +77,4 @@ public interface CrmCustomerConvert { | ||
| 78 | 77 | ||
| 79 | CrmCustomerPoolConfigDO convert(CrmCustomerPoolConfigSaveReqVO updateReqVO); | 78 | CrmCustomerPoolConfigDO convert(CrmCustomerPoolConfigSaveReqVO updateReqVO); |
| 80 | 79 | ||
| 81 | - // TODO @min:使用 BeanUtils 拷贝哈。我们慢慢简单的对象,不再直接基于 convert 做啦。 | ||
| 82 | - @Mapping(ignore = true, target = "id") | ||
| 83 | - CrmCustomerSaveReqVO convert(CrmClueDO bean); | ||
| 84 | - | ||
| 85 | } | 80 | } |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/clue/CrmClueService.java
| @@ -79,6 +79,6 @@ public interface CrmClueService { | @@ -79,6 +79,6 @@ public interface CrmClueService { | ||
| 79 | * @param reqVO 线索编号 | 79 | * @param reqVO 线索编号 |
| 80 | * @param userId 用户编号 | 80 | * @param userId 用户编号 |
| 81 | */ | 81 | */ |
| 82 | - void translate(CrmClueTransformReqVO reqVO, Long userId); | 82 | + void translateCustomer(CrmClueTransformReqVO reqVO, Long userId); |
| 83 | 83 | ||
| 84 | } | 84 | } |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/clue/CrmClueServiceImpl.java
| @@ -2,13 +2,15 @@ package cn.iocoder.yudao.module.crm.service.clue; | @@ -2,13 +2,15 @@ package cn.iocoder.yudao.module.crm.service.clue; | ||
| 2 | 2 | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | import cn.hutool.core.collection.ListUtil; | 4 | import cn.hutool.core.collection.ListUtil; |
| 5 | +import cn.hutool.core.util.ObjectUtil; | ||
| 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 6 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 7 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||
| 6 | import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmCluePageReqVO; | 8 | import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmCluePageReqVO; |
| 7 | import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueSaveReqVO; | 9 | import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueSaveReqVO; |
| 8 | import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueTransferReqVO; | 10 | import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueTransferReqVO; |
| 9 | import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueTransformReqVO; | 11 | import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueTransformReqVO; |
| 12 | +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerSaveReqVO; | ||
| 10 | import cn.iocoder.yudao.module.crm.convert.clue.CrmClueConvert; | 13 | import cn.iocoder.yudao.module.crm.convert.clue.CrmClueConvert; |
| 11 | -import cn.iocoder.yudao.module.crm.convert.customer.CrmCustomerConvert; | ||
| 12 | import cn.iocoder.yudao.module.crm.dal.dataobject.clue.CrmClueDO; | 14 | import cn.iocoder.yudao.module.crm.dal.dataobject.clue.CrmClueDO; |
| 13 | import cn.iocoder.yudao.module.crm.dal.mysql.clue.CrmClueMapper; | 15 | import cn.iocoder.yudao.module.crm.dal.mysql.clue.CrmClueMapper; |
| 14 | import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; | 16 | import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; |
| @@ -129,24 +131,28 @@ public class CrmClueServiceImpl implements CrmClueService { | @@ -129,24 +131,28 @@ public class CrmClueServiceImpl implements CrmClueService { | ||
| 129 | 131 | ||
| 130 | @Override | 132 | @Override |
| 131 | @Transactional(rollbackFor = Exception.class) | 133 | @Transactional(rollbackFor = Exception.class) |
| 132 | - public void translate(CrmClueTransformReqVO reqVO, Long userId) { | 134 | + public void translateCustomer(CrmClueTransformReqVO reqVO, Long userId) { |
| 133 | // 校验线索都存在 | 135 | // 校验线索都存在 |
| 134 | List<CrmClueDO> clues = getClueList(reqVO.getIds(), userId); | 136 | List<CrmClueDO> clues = getClueList(reqVO.getIds(), userId); |
| 135 | if (CollUtil.isEmpty(clues)) { | 137 | if (CollUtil.isEmpty(clues)) { |
| 136 | throw exception(CLUE_NOT_EXISTS); | 138 | throw exception(CLUE_NOT_EXISTS); |
| 137 | } | 139 | } |
| 138 | - // TODO @min:如果已经转化,则不能重复转化 | ||
| 139 | - | ||
| 140 | - // 遍历线索,创建对应的客户 | ||
| 141 | - clues.forEach(clue -> { | ||
| 142 | - // 创建客户 | ||
| 143 | - customerService.createCustomer(CrmCustomerConvert.INSTANCE.convert(clue), userId); | ||
| 144 | - // 更新线索状态 | ||
| 145 | - // TODO @min:新建一个 CrmClueDO 去更新。尽量规避直接用原本的对象去更新。因为这样万一并发更新,会存在覆盖的问题。 | ||
| 146 | - // TODO @puhui999:如果有跟进记录,需要一起转过去; | ||
| 147 | - clue.setTransformStatus(Boolean.TRUE); | ||
| 148 | - clueMapper.updateById(clue); | ||
| 149 | - }); | 140 | + |
| 141 | + // 遍历线索(过滤掉已转化的线索),创建对应的客户 | ||
| 142 | + clues.stream().filter(clue -> ObjectUtil.notEqual(Boolean.TRUE, clue.getTransformStatus())) | ||
| 143 | + .forEach(clue -> { | ||
| 144 | + // 1.创建客户 | ||
| 145 | + CrmCustomerSaveReqVO customerSaveReqVO = BeanUtils.toBean(clue, CrmCustomerSaveReqVO.class) | ||
| 146 | + .setId(null); | ||
| 147 | + Long customerId = customerService.createCustomer(customerSaveReqVO, userId); | ||
| 148 | + // TODO @puhui999:如果有跟进记录,需要一起转过去; | ||
| 149 | + // 2.更新线索,新建一个 CrmClueDO 去更新。尽量规避直接用原本的对象去更新。因为这样万一并发更新,会存在覆盖的问题。 | ||
| 150 | + clueMapper.updateById(BeanUtils.toBean(clue, CrmClueDO.class) | ||
| 151 | + // 线索状态设置为已转化 | ||
| 152 | + .setTransformStatus(Boolean.TRUE) | ||
| 153 | + // 设置关联的客户编号 | ||
| 154 | + .setCustomerId(customerId)); | ||
| 155 | + }); | ||
| 150 | } | 156 | } |
| 151 | 157 | ||
| 152 | private void validateRelationDataExists(CrmClueSaveReqVO reqVO) { | 158 | private void validateRelationDataExists(CrmClueSaveReqVO reqVO) { |