From 64db1a9c908072bdac4ca40cee55682307642a52 Mon Sep 17 00:00:00 2001 From: Wanwan <913752709@qq.com> Date: Sat, 4 Nov 2023 03:21:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=A2=E6=88=B7=E8=AF=A6=E6=83=85=20?= =?UTF-8?q?+=20review=20=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enums/customer/CrmCustomerLevelEnum.java | 5 +- yudao-module-crm/yudao-module-crm-biz/pom.xml | 6 +++ .../admin/customer/CrmCustomerController.java | 51 +++++++++++++++++-- .../admin/customer/vo/CrmCustomerBaseVO.java | 2 +- .../customer/vo/CrmCustomerCreateReqVO.java | 6 ++- .../admin/customer/vo/CrmCustomerExcelVO.java | 2 +- .../customer/vo/CrmCustomerPageReqVO.java | 9 ++++ .../admin/customer/vo/CrmCustomerRespVO.java | 17 +++++++ .../dataobject/customer/CrmCustomerDO.java | 14 ++++- .../dal/mysql/customer/CrmCustomerMapper.java | 4 +- .../service/customer/CrmCustomerService.java | 8 --- .../customer/CrmCustomerServiceImpl.java | 12 ----- 12 files changed, 105 insertions(+), 31 deletions(-) diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/CrmCustomerLevelEnum.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/CrmCustomerLevelEnum.java index f58028314..aa06b05eb 100644 --- a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/CrmCustomerLevelEnum.java +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/CrmCustomerLevelEnum.java @@ -19,13 +19,12 @@ public enum CrmCustomerLevelEnum implements IntArrayValuable { GENERAL(2, "B(普通客户)"), LOW_PRIORITY(3, "C(非优先客户)"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmCustomerLevelEnum::getStatus).toArray(); + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmCustomerLevelEnum::getLevel).toArray(); - // TODO @wanwan:这里的 status 字段,可以考虑改成 level /** * 状态 */ - private final Integer status; + private final Integer level; /** * 状态名 */ diff --git a/yudao-module-crm/yudao-module-crm-biz/pom.xml b/yudao-module-crm/yudao-module-crm-biz/pom.xml index 5bedf5eac..bb179e592 100644 --- a/yudao-module-crm/yudao-module-crm-biz/pom.xml +++ b/yudao-module-crm/yudao-module-crm-biz/pom.xml @@ -57,6 +57,12 @@ yudao-spring-boot-starter-excel + + + cn.iocoder.boot + yudao-spring-boot-starter-biz-ip + + cn.iocoder.boot diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.java index c44c12b70..6a2cbc660 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.java @@ -1,13 +1,22 @@ package cn.iocoder.yudao.module.crm.controller.admin.customer; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.*; import cn.iocoder.yudao.module.crm.convert.customer.CrmCustomerConvert; import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; +import cn.iocoder.yudao.module.system.api.dept.DeptApi; +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; +import com.google.common.collect.Lists; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -19,7 +28,9 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; @@ -33,6 +44,10 @@ public class CrmCustomerController { @Resource private CrmCustomerService customerService; + @Resource + private DeptApi deptApi; + @Resource + private AdminUserApi adminUserApi; @PostMapping("/create") @Operation(summary = "创建客户") @@ -64,7 +79,21 @@ public class CrmCustomerController { @PreAuthorize("@ss.hasPermission('crm:customer:query')") public CommonResult getCustomer(@RequestParam("id") Long id) { CrmCustomerDO customer = customerService.getCustomer(id); - return success(CrmCustomerConvert.INSTANCE.convert(customer)); + CrmCustomerRespVO customerRespVO = CrmCustomerConvert.INSTANCE.convert(customer); + if (ObjectUtil.isAllNotEmpty(customer, customer.getAreaId())) { + customerRespVO.setAreaName(AreaUtils.format(customer.getAreaId())); + } + Map userMap = adminUserApi.getUserMap(CollUtil.removeNull(Lists.newArrayList(NumberUtil.parseLong(customerRespVO.getCreator()), customerRespVO.getOwnerUserId()))); + customerRespVO.setCreatorName(Optional.ofNullable(userMap.get(NumberUtil.parseLong(customerRespVO.getCreator()))).map(AdminUserRespDTO::getNickname).orElse(null)); + AdminUserRespDTO ownerUser = userMap.get(customer.getOwnerUserId()); + if (Objects.nonNull(ownerUser)) { + customerRespVO.setOwnerUserName(ownerUser.getNickname()); + DeptRespDTO dept = deptApi.getDept(ownerUser.getDeptId()); + if (Objects.nonNull(dept)) { + customerRespVO.setOwnerUserDept(dept.getName()); + } + } + return success(customerRespVO); } @GetMapping("/page") @@ -72,7 +101,23 @@ public class CrmCustomerController { @PreAuthorize("@ss.hasPermission('crm:customer:query')") public CommonResult> getCustomerPage(@Valid CrmCustomerPageReqVO pageVO) { PageResult pageResult = customerService.getCustomerPage(pageVO); - return success(CrmCustomerConvert.INSTANCE.convertPage(pageResult)); + PageResult pageVo = CrmCustomerConvert.INSTANCE.convertPage(pageResult); + Set userSet = pageVo.getList().stream().flatMap(i -> Stream.of(NumberUtil.parseLong(i.getCreator()), i.getOwnerUserId())).collect(Collectors.toSet()); + Map userMap = adminUserApi.getUserMap(userSet); + Map deptMap = deptApi.getDeptMap(userMap.values().stream().map(AdminUserRespDTO::getDeptId).collect(Collectors.toSet())); + pageVo.getList().forEach(customerRespVO -> { + customerRespVO.setAreaName(AreaUtils.format(customerRespVO.getAreaId())); + customerRespVO.setCreatorName(Optional.ofNullable(userMap.get(NumberUtil.parseLong(customerRespVO.getCreator()))).map(AdminUserRespDTO::getNickname).orElse(null)); + AdminUserRespDTO ownerUser = userMap.get(customerRespVO.getOwnerUserId()); + if (Objects.nonNull(ownerUser)) { + customerRespVO.setOwnerUserName(ownerUser.getNickname()); + DeptRespDTO dept = deptMap.get(ownerUser.getDeptId()); + if (Objects.nonNull(dept)) { + customerRespVO.setOwnerUserDept(dept.getName()); + } + } + }); + return success(pageVo); } @GetMapping("/export-excel") diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerBaseVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerBaseVO.java index 0e4d4463d..c654b4b56 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerBaseVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerBaseVO.java @@ -68,7 +68,7 @@ public class CrmCustomerBaseVO { private String remark; @Schema(description = "地区编号", example = "20158") - private Long areaId; + private Integer areaId; @Schema(description = "详细地址", example = "北京市海淀区") private String detailAddress; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerCreateReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerCreateReqVO.java index 38108776a..41324079d 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerCreateReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerCreateReqVO.java @@ -5,12 +5,16 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +import javax.validation.constraints.NotNull; + @Schema(description = "管理后台 - CRM 客户创建 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) public class CrmCustomerCreateReqVO extends CrmCustomerBaseVO { - // TODO @wanwan:负责人 + @Schema(description = "负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563") + @NotNull(message = "负责人不能为空") + private Long ownerUserId; } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerExcelVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerExcelVO.java index 6f8156175..d49f569b3 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerExcelVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerExcelVO.java @@ -76,7 +76,7 @@ public class CrmCustomerExcelVO { private Long ownerUserId; @ExcelProperty("地区编号") - private Long areaId; + private Integer areaId; @ExcelProperty("详细地址") private String detailAddress; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerPageReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerPageReqVO.java index e8a0b9e71..c34980b36 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerPageReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerPageReqVO.java @@ -18,5 +18,14 @@ public class CrmCustomerPageReqVO extends PageParam { @Schema(description = "手机", example = "18000000000") private String mobile; + @Schema(description = "所属行业", example = "1") + private Integer industryId; + + @Schema(description = "客户等级", example = "1") + private Integer level; + + @Schema(description = "客户来源", example = "1") + private Integer source; + // TODO @芋艿:场景; } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerRespVO.java index 505221dfd..1bda33a3c 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerRespVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerRespVO.java @@ -31,6 +31,15 @@ public class CrmCustomerRespVO extends CrmCustomerBaseVO { @Schema(description = "负责人的用户编号", example = "25682") private Long ownerUserId; + @Schema(description = "负责人名字", example = "25682") + private String ownerUserName; + + @Schema(description = "负责人部门") + private String ownerUserDept; + + @Schema(description = "地区名称", example = "北京市") + private String areaName; + @Schema(description = "最后跟进时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime contactLastTime; @@ -38,4 +47,12 @@ public class CrmCustomerRespVO extends CrmCustomerBaseVO { @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) private LocalDateTime createTime; + @Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime updateTime; + + @Schema(description = "创建人") + private String creator; + + @Schema(description = "创建人名字") + private String creatorName; } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customer/CrmCustomerDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customer/CrmCustomerDO.java index 9de87ee5b..8b34ed582 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customer/CrmCustomerDO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customer/CrmCustomerDO.java @@ -96,10 +96,22 @@ public class CrmCustomerDO extends BaseDO { * 备注 */ private String remark; + /** + * 负责人的用户编号 + */ + private Long ownerUserId; + /** + * 只读权限的用户编号数组 + */ + private String roUserIds; + /** + * 读写权限的用户编号数组 + */ + private String rwUserIds; /** * 地区编号 */ - private Long areaId; + private Integer areaId; /** * 详细地址 */ diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customer/CrmCustomerMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customer/CrmCustomerMapper.java index 0b2497a7b..74cdfe5dd 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customer/CrmCustomerMapper.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customer/CrmCustomerMapper.java @@ -19,10 +19,12 @@ import java.util.List; public interface CrmCustomerMapper extends BaseMapperX { default PageResult selectPage(CrmCustomerPageReqVO reqVO) { - // TODO @Wanwan 填充负责人,所属部门字段;这个可以在 controller 填哈; return selectPage(reqVO, new LambdaQueryWrapperX() .likeIfPresent(CrmCustomerDO::getName, reqVO.getName()) .eqIfPresent(CrmCustomerDO::getMobile, reqVO.getMobile()) + .eqIfPresent(CrmCustomerDO::getIndustryId, reqVO.getIndustryId()) + .eqIfPresent(CrmCustomerDO::getLevel, reqVO.getLevel()) + .eqIfPresent(CrmCustomerDO::getSource, reqVO.getSource()) .orderByDesc(CrmCustomerDO::getId)); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerService.java index 5f64142b2..2c12d5d92 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerService.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerService.java @@ -46,14 +46,6 @@ public interface CrmCustomerService { */ CrmCustomerDO getCustomer(Long id); - /** - * 获得客户列表 - * - * @param ids 编号 - * @return 客户列表 - */ - List getCustomerList(Collection ids); - /** * 获得客户分页 * diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java index e77ceb042..5121abe80 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java @@ -37,8 +37,6 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @Resource private CrmCustomerMapper customerMapper; @Resource - private DeptApi deptApi; // TODO @wanwan:拼接数据,可以放到 controller;所以这里的引入,可以考虑放到 controller 哈; - @Resource private CrmPermissionService crmPermissionService; @Override @@ -93,14 +91,6 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { return customerMapper.selectById(id); } - @Override - public List getCustomerList(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return ListUtil.empty(); - } - return customerMapper.selectBatchIds(ids); - } - @Override public PageResult getCustomerPage(CrmCustomerPageReqVO pageReqVO) { // TODO 芋艿:数据权限,是否可以查询到; @@ -112,8 +102,6 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { return customerMapper.selectList(exportReqVO); } - // TODO wanwan:service 接口已经注释,实现类就不需要了。 - /** * 校验客户是否存在 *