From 87778f7fd96082eefda83354ba93ddf2d9423f8b Mon Sep 17 00:00:00 2001 From: xiaqing Date: Sun, 19 Nov 2023 23:23:52 +0800 Subject: [PATCH 01/35] =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=9A=84=E5=85=AC?= =?UTF-8?q?=E6=B5=B7=E9=A2=86=E5=8F=96=E5=92=8C=E5=88=86=E9=85=8D=EF=BC=8C?= =?UTF-8?q?=E6=8C=89=E7=85=A7=E8=A6=81=E4=BF=AE=E8=B0=83=E6=95=B4=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/customer/CrmCustomerController.java | 31 +++++---- .../dal/mysql/customer/CrmCustomerMapper.java | 7 ++ .../service/customer/CrmCustomerService.java | 10 ++- .../customer/CrmCustomerServiceImpl.java | 64 ++++++++++--------- 4 files changed, 60 insertions(+), 52 deletions(-) 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 8a34b599d..f95f47054 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 @@ -6,6 +6,7 @@ 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.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; 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; @@ -20,6 +21,7 @@ import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.util.CollectionUtils; @@ -183,28 +185,25 @@ public class CrmCustomerController { @PutMapping("/receive") @Operation(summary = "领取公海客户") - // TODO @xiaqing:1)receiveCustomer 方法名字;2)cIds 改成 ids,要加下 @RequestParam,还有 swagger 注解;3)参数非空,使用 validator 校验;4)返回 true 即可; + @Parameter(name = "ids", description = "批量领取公海的客户id集合", required = true,example = "1,2,3") @PreAuthorize("@ss.hasPermission('crm:customer:receive')") - public CommonResult receiveByIds(List cIds){ - // 判断是否为空 - if(CollectionUtils.isEmpty(cIds)) - return error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),GlobalErrorCodeConstants.BAD_REQUEST.getMsg()); + public CommonResult receiveCustomer(@RequestParam(value = "ids") List ids){ // 领取公海任务 - // TODO @xiaqing:userid,通过 controller 传递给 service,不要在 service 里面获取,无状态 - customerService.receive(cIds); - return success("领取成功"); + customerService.receiveCustomer(ids, SecurityFrameworkUtils.getLoginUserId()); + return success(true); } - // TODO @xiaqing:1)distributeCustomer 方法名;2)cIds 同上;3)参数校验,同上;4)ownerId 改成 ownerUserId,和别的模块统一;5)返回 true 即可; @PutMapping("/distributeByIds") @Operation(summary = "分配公海给对应负责人") - @PreAuthorize("@ss.hasPermission('crm:customer:distributeByIds')") - public CommonResult distributeByIds(Long ownerId,ListcIds){ - //判断参数不能为空 - if(ownerId==null || CollectionUtils.isEmpty(cIds)) - return error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),GlobalErrorCodeConstants.BAD_REQUEST.getMsg()); - customerService.distributeByIds(cIds,ownerId); - return success("分配成功"); + @Parameters({ + @Parameter(name = "ownerUserId", description = "分配的负责人id", required = true,example = "12345"), + @Parameter(name = "ids", description = "批量分配的公海的客户id集合", required = true,example = "1,2,3") + }) + @PreAuthorize("@ss.hasPermission('crm:customer:distribute')") + public CommonResult distributeCustomer(@RequestParam(value = "ownerUserId") Long ownerUserId, + @RequestParam(value = "ids") Listids){ + customerService.distributeCustomer(ids,ownerUserId); + return success(true); } } 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 683df3581..0997ea69f 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 @@ -5,6 +5,7 @@ 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.customer.vo.CrmCustomerPageReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import org.apache.ibatis.annotations.Mapper; import java.util.Collection; @@ -27,4 +28,10 @@ public interface CrmCustomerMapper extends BaseMapperX { .eqIfPresent(CrmCustomerDO::getSource, pageReqVO.getSource())); } + default void updateCustomerOwnerUser(Long id,CrmCustomerDO customerDO){ + update(customerDO,new LambdaUpdateWrapper () + .eq(CrmCustomerDO::getId,id) + .isNull(CrmCustomerDO::getOwnerUserId) + ); + } } 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 6aa21477e..b5f29293c 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 @@ -85,22 +85,20 @@ public interface CrmCustomerService { */ void lockCustomer(@Valid CrmCustomerUpdateReqVO updateReqVO); - // TODO @xiaqing:根据 controller 的建议,改下 /** * 领取公海客户 * * @param ids 要领取的客户 id */ - void receive(Listids); + void receiveCustomer(Listids, Long ownerUserId); - // TODO @xiaqing:根据 controller 的建议,改下 /** * 分配公海客户 * - * @param cIds 要分配的客户 id - * @param ownerId 分配的负责人id + * @param ids 要分配的客户 id + * @param ownerUserId 分配的负责人id * @author xiaqing */ - void distributeByIds(ListcIds,Long ownerId); + void distributeCustomer(Listids,Long ownerUserId); } 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 ebb499128..5560789f7 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 @@ -83,6 +83,11 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { throw exception(CUSTOMER_NOT_EXISTS); } } + private void validateCustomerExists(CrmCustomerDO customerDO){ + if (customerDO == null) { + throw exception(CUSTOMER_NOT_EXISTS); + } + } @Override @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#id", level = CrmPermissionLevelEnum.READ) @@ -162,53 +167,52 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @Override @Transactional(rollbackFor = Exception.class) - public void receive(List ids) { - transferCustomerOwner(ids,SecurityFrameworkUtils.getLoginUserId()); + public void receiveCustomer(List ids,Long ownerUserId) { + transferCustomerOwner(ids,ownerUserId); } @Override - public void distributeByIds(List cIds, Long ownerId) { - transferCustomerOwner(cIds,ownerId); + public void distributeCustomer(List ids, Long ownerUserId) { + transferCustomerOwner(ids,ownerUserId); } - private void transferCustomerOwner(List cIds, Long ownerId){ - // 先一次性校验完成客户是否可用 - // TODO @xiaqing:批量一次性加载客户列表,然后去逐个校验; - for (Long cId : cIds) { - //校验是否存在 - validateCustomerExists(cId); - //todo 校验是否已有负责人 - validCustomerOwnerExist(cId); - //todo 校验是否锁定 - validCustomerIsLocked(cId); - //todo 校验成交状态 - validCustomerDeal(cId); - } - // TODO @xiaqing:每个客户更新的时候,where 条件,加上 owner_user_id is null,防止并发问题; - List updateDos = new ArrayList <>(); - for (Long cId : cIds){ - CrmCustomerDO customerDO = new CrmCustomerDO(); - customerDO.setId(cId); - customerDO.setOwnerUserId(SecurityFrameworkUtils.getLoginUserId()); + private void transferCustomerOwner(List ids, Long ownerUserId) { + // 先一次性加载所有数据,校验客户是否可用 + List customerDOList = customerMapper.selectBatchIds(ids); + for (CrmCustomerDO customerDO : customerDOList) { + // 校验客户是否存在 + validateCustomerExists(customerDO); + // 校验是否已有负责人 + validCustomerOwnerExist(customerDO); + // 校验是否锁定 + validCustomerIsLocked(customerDO); + // 校验成交状态 + validCustomerDeal(customerDO); } + // 统一修改状态 - customerMapper.updateBatch(updateDos); + CrmCustomerDO updateDo = new CrmCustomerDO(); + updateDo.setOwnerUserId(ownerUserId); + for (Long id : ids) { + customerMapper.updateCustomerOwnerUser(id,updateDo); + } + } - private void validCustomerOwnerExist(Long id) { - if (customerMapper.selectById(id).getOwnerUserId()!=null) { + private void validCustomerOwnerExist(CrmCustomerDO customerDO) { + if (customerDO.getOwnerUserId()!=null) { throw exception(CUSTOMER_OWNER_EXISTS); } } - private void validCustomerIsLocked(Long id) { - if (customerMapper.selectById(id).getLockStatus() ==true) { + private void validCustomerIsLocked(CrmCustomerDO customerDO) { + if (customerDO.getLockStatus() ==true) { throw exception(CUSTOMER_LOCKED); } } - private void validCustomerDeal(Long id) { - if (customerMapper.selectById(id).getDealStatus() ==true) { + private void validCustomerDeal(CrmCustomerDO customerDO) { + if (customerDO.getDealStatus() ==true) { throw exception(CUSTOMER_ALREADY_DEAL); } } From 780526f4844b4db9ca85181d417c80cd3f137066 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Wed, 22 Nov 2023 17:27:00 +0800 Subject: [PATCH 02/35] =?UTF-8?q?crm-=E6=95=B0=E6=8D=AE=E6=9D=83=E9=99=90?= =?UTF-8?q?=EF=BC=9A=E5=AE=8C=E5=96=84=E6=95=B0=E6=8D=AE=E6=9D=83=E9=99=90?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=93=8D=E4=BD=9C=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/crm/enums/ErrorCodeConstants.java | 4 + .../permission/CrmPermissionController.http | 2 +- .../permission/CrmPermissionController.java | 104 +++++++----------- .../permission/vo/CrmPermissionBaseVO.java | 2 +- .../permission/vo/CrmPermissionRespVO.java | 2 +- .../permission/CrmPermissionConvert.java | 15 +-- .../permission/CrmPermissionService.java | 1 + .../permission/CrmPermissionServiceImpl.java | 26 +++-- 8 files changed, 72 insertions(+), 84 deletions(-) diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java index b04644a41..6b5eea184 100644 --- a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java @@ -46,6 +46,10 @@ public interface ErrorCodeConstants { ErrorCode CRM_PERMISSION_DENIED = new ErrorCode(1_020_007_001, "{}操作失败,原因:没有权限"); ErrorCode CRM_PERMISSION_MODEL_NOT_EXISTS = new ErrorCode(1_020_007_002, "{}不存在"); ErrorCode CRM_PERMISSION_MODEL_TRANSFER_FAIL_OWNER_USER_EXISTS = new ErrorCode(1_020_007_003, "{}操作失败,原因:转移对象已经是该负责人"); + ErrorCode CRM_PERMISSION_DELETE_FAIL = new ErrorCode(1_020_007_004, "删除数据权限失败,原因:参数异常"); + ErrorCode CRM_PERMISSION_DELETE_FAIL_EXIST_OWNER = new ErrorCode(1_020_007_005, "删除数据权限失败,原因:存在负责人"); + ErrorCode CRM_PERMISSION_DELETE_DENIED = new ErrorCode(1_020_007_006, "删除数据权限失败,原因:没有权限"); + ErrorCode CRM_PERMISSION_DELETE_SELF_PERMISSION_FAIL_EXIST_OWNER = new ErrorCode(1_020_007_007, "删除数据权限失败,原因:不能删除负责人"); // ========== 产品 1_020_008_000 ========== ErrorCode PRODUCT_NOT_EXISTS = new ErrorCode(1_020_008_000, "产品不存在"); diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.http b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.http index 1a7faecdd..1ef2bc1a1 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.http +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.http @@ -1,5 +1,5 @@ ### 请求 /add -PUT {{baseUrl}}/crm/permission/add +POST {{baseUrl}}/crm/permission/create Content-Type: application/json Authorization: Bearer {{token}} tenant-id: {{adminTenentId}} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.java index 75e8ad658..fcae121f5 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.java @@ -3,13 +3,13 @@ package cn.iocoder.yudao.module.crm.controller.admin.permission; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionCreateReqVO; import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionRespVO; import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionUpdateReqVO; import cn.iocoder.yudao.module.crm.convert.permission.CrmPermissionConvert; import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission; -import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; import cn.iocoder.yudao.module.system.api.dept.DeptApi; @@ -29,17 +29,14 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; import java.util.*; -import java.util.function.Predicate; -import java.util.stream.Collectors; 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.framework.common.util.collection.CollectionUtils.anyMatch; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; -import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CRM_PERMISSION_NOT_EXISTS; +import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*; -@Tag(name = "管理后台 - CRM 数据权限(数据团队成员操作)") +@Tag(name = "管理后台 - CRM 数据权限") @RestController @RequestMapping("/crm/permission") @Validated @@ -55,72 +52,59 @@ public class CrmPermissionController { @Resource private PostApi postApi; - // TODO @puhui999:保持统一,create 噢;然后是 PostMapping - @PutMapping("/add") - @Operation(summary = "添加团队成员") + @PostMapping("/create") + @Operation(summary = "创建数据权限") @PreAuthorize("@ss.hasPermission('crm:permission:create')") - @CrmPermission(bizType = CrmBizTypeEnum.CRM_PERMISSION, bizTypeValue = "#reqVO.bizType", bizId = "#reqVO.bizId", - level = CrmPermissionLevelEnum.OWNER) + @CrmPermission(bizTypeValue = "#reqVO.bizType", bizId = "#reqVO.bizId", level = CrmPermissionLevelEnum.OWNER) public CommonResult addPermission(@Valid @RequestBody CrmPermissionCreateReqVO reqVO) { permissionService.createPermission(CrmPermissionConvert.INSTANCE.convert(reqVO)); return success(true); } - // TODO @puhui999:领取公海客户,是不是放到客户那更合适哈? - @PutMapping("/receive") - @Operation(summary = "领取公海数据") - @PreAuthorize("@ss.hasPermission('crm:permission:update')") - public CommonResult receive(@RequestParam("bizType") Integer bizType, @RequestParam("bizId") Long bizId) { - permissionService.receiveBiz(bizType, bizId, getLoginUserId()); - return success(true); - } - - // TODO @puhui999:是不是放到客户那更合适哈? - @PutMapping("/put-pool") - @Operation(summary = "数据放入公海") - @PreAuthorize("@ss.hasPermission('crm:permission:update')") - @CrmPermission(bizType = CrmBizTypeEnum.CRM_PERMISSION, bizTypeValue = "#bizType", bizId = "#bizId" - , level = CrmPermissionLevelEnum.OWNER) - public CommonResult putPool(@RequestParam(value = "bizType") Integer bizType, @RequestParam("bizId") Long bizId) { - permissionService.putPool(bizType, bizId, getLoginUserId()); - return success(true); - } - @PutMapping("/update") - @Operation(summary = "编辑团队成员权限") + @Operation(summary = "编辑数据权限") @PreAuthorize("@ss.hasPermission('crm:permission:update')") - @CrmPermission(bizType = CrmBizTypeEnum.CRM_PERMISSION, bizTypeValue = "#updateReqVO.bizType", bizId = "#updateReqVO.bizId" + @CrmPermission(bizTypeValue = "#updateReqVO.bizType", bizId = "#updateReqVO.bizId" , level = CrmPermissionLevelEnum.OWNER) public CommonResult updatePermission(@Valid @RequestBody CrmPermissionUpdateReqVO updateReqVO) { permissionService.updatePermission(updateReqVO); return success(true); } - // TODO @puhui999:bizType 和 bizId 是不是不用啦;因为参数校验需要 bizType 和 bizId,可以先查询下,在直接调用方法;不一定都要注解哈; @DeleteMapping("/delete") - @Operation(summary = "移除团队成员") - @Parameters({ - @Parameter(name = "bizType", description = "CRM 类型", required = true, example = "2"), - @Parameter(name = "bizId", description = "CRM 类型数据编号", required = true, example = "1024"), - @Parameter(name = "ids", description = "团队成员编号", required = true, example = "1024") - }) + @Operation(summary = "删除数据权限") + @Parameter(name = "ids", description = "数据权限编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('crm:permission:delete')") - @CrmPermission(bizType = CrmBizTypeEnum.CRM_PERMISSION, bizTypeValue = "#bizType", bizId = "#bizId" - , level = CrmPermissionLevelEnum.OWNER) // 为了校验权限请求必须带上 bizType 和 bizId - public CommonResult deletePermission(@RequestParam("bizType") Integer bizType, - @RequestParam("bizId") Long bizId, - @RequestParam("ids") Collection ids) { + public CommonResult deletePermission(@RequestParam("ids") Collection ids) { + List permissions = permissionService.getPermissionListByIds(ids); + if (CollUtil.isEmpty(permissions)) { + throw exception(CRM_PERMISSION_NOT_EXISTS); + } + Set bizIds = convertSet(permissions, CrmPermissionDO::getBizId); + if (bizIds.size() > 1) { // 情况一:数据权限的模块数据编号是一致的不可能存在两个 + throw exception(CRM_PERMISSION_DELETE_FAIL); + } + if (permissions.size() != ids.size()) { // 情况二:期望数量和实际结果不一致 + throw exception(CRM_PERMISSION_NOT_EXISTS); + } + // 情况三:不能包含负责人 + boolean isOwner = CollectionUtils.anyMatch(permissions, item -> ObjUtil.equal(item.getLevel(), CrmPermissionLevelEnum.OWNER.getLevel())); + if (isOwner) { + throw exception(CRM_PERMISSION_DELETE_FAIL_EXIST_OWNER); + } + // 校验操作人是否为负责人 + CrmPermissionDO permission = permissionService.getPermissionByIdAndUserId(permissions.get(0).getBizId(), getLoginUserId()); + if (!CrmPermissionLevelEnum.isOwner(permission.getLevel())) { + throw exception(CRM_PERMISSION_DELETE_DENIED); + } + // 删除数据权限 permissionService.deletePermission(ids); return success(true); } - // TODO @puhui999:deleteSelfPermission;尽量归成 crud 这样的操作哈; - @DeleteMapping("/quit-team") - @Operation(summary = "退出团队") - @Parameters({ - // TODO @puhui999:这个可以拿出来,不用包在 @Parameters 里,在只有一个参数时哈; - @Parameter(name = "id", description = "团队成员编号", required = true, example = "1024") - }) + @DeleteMapping("/deleteSelfPermission") + @Operation(summary = "删除自己的数据权限") + @Parameter(name = "id", description = "数据权限编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('crm:permission:delete')") public CommonResult deletePermission(@RequestParam("id") Long id) { // 校验数据存在且是自己 @@ -128,6 +112,10 @@ public class CrmPermissionController { if (permission == null) { throw exception(CRM_PERMISSION_NOT_EXISTS); } + // 校验是否是负责人 + if (CrmPermissionLevelEnum.isOwner(permission.getLevel())) { + throw exception(CRM_PERMISSION_DELETE_SELF_PERMISSION_FAIL_EXIST_OWNER); + } // 删除 permissionService.deletePermission(Collections.singletonList(id)); @@ -135,7 +123,7 @@ public class CrmPermissionController { } @GetMapping("/list") - @Operation(summary = "获取团队成员") + @Operation(summary = "获取数据权限列表") @Parameters({ @Parameter(name = "bizType", description = "CRM 类型", required = true, example = "2"), @Parameter(name = "bizId", description = "CRM 类型数据编号", required = true, example = "1024") @@ -147,19 +135,11 @@ public class CrmPermissionController { if (CollUtil.isEmpty(permission)) { return success(Collections.emptyList()); } - // TODO @puhui999:池子的逻辑; - // 判断是否是公海数据 - // TODO @puhui999:这段逻辑,可以删除么? - Predicate filter = item -> ObjUtil.equal(item.getUserId(), CrmPermissionDO.POOL_USER_ID); - if (anyMatch(permission, filter)) { - permission.removeIf(filter); // 排除 - } // 拼接数据 List userList = adminUserApi.getUserList(convertSet(permission, CrmPermissionDO::getUserId)); Map deptMap = deptApi.getDeptMap(convertSet(userList, AdminUserRespDTO::getDeptId)); - // TODO @puhui999:CollectionUtils.convertSetByFlatMap() 看看可以不 - Set postIds = userList.stream().flatMap(item -> item.getPostIds().stream()).collect(Collectors.toSet()); + Set postIds = CollectionUtils.convertSetByFlatMap(userList, AdminUserRespDTO::getPostIds, Collection::stream); Map postMap = postApi.getPostMap(postIds); return success(CrmPermissionConvert.INSTANCE.convert(permission, userList, deptMap, postMap)); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionBaseVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionBaseVO.java index 595b8f9f2..086cbb42b 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionBaseVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionBaseVO.java @@ -9,7 +9,7 @@ import lombok.Data; import javax.validation.constraints.NotNull; /** - * 数据权限(团队成员) Base VO,提供给添加、修改、详细的子 VO 使用 + * 数据权限 Base VO,提供给添加、修改、详细的子 VO 使用 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 * * @author HUIHUI diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionRespVO.java index 9440a949f..10f1ce198 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionRespVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionRespVO.java @@ -6,7 +6,7 @@ import lombok.Data; import java.time.LocalDateTime; import java.util.Set; -@Schema(description = "管理后台 - CRM 数据权限(团队成员) Response VO") +@Schema(description = "管理后台 - CRM 数据权限 Response VO") @Data public class CrmPermissionRespVO extends CrmPermissionBaseVO { diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/permission/CrmPermissionConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/permission/CrmPermissionConvert.java index 42f784ba7..03492b2c0 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/permission/CrmPermissionConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/permission/CrmPermissionConvert.java @@ -15,10 +15,11 @@ import com.google.common.collect.Multimaps; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; -import java.util.ArrayList; import java.util.List; import java.util.Map; +import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen; + /** * Crm 数据权限 Convert * @@ -43,9 +44,9 @@ public interface CrmPermissionConvert { Map deptMap, Map postMap) { Map userMap = CollectionUtils.convertMap(userList, AdminUserRespDTO::getId); return CollectionUtils.convertList(convert(permission), item -> { - MapUtils.findAndThen(userMap, item.getId(), user -> { + findAndThen(userMap, item.getUserId(), user -> { item.setNickname(user.getNickname()); - MapUtils.findAndThen(deptMap, user.getDeptId(), deptRespDTO -> { + findAndThen(deptMap, user.getDeptId(), deptRespDTO -> { item.setDeptName(deptRespDTO.getName()); }); List postRespList = MapUtils.getList(Multimaps.forMap(postMap), user.getPostIds()); @@ -56,12 +57,8 @@ public interface CrmPermissionConvert { } default List convertList(CrmPermissionUpdateReqVO updateReqVO) { - // TODO @puhui999:CollectionUtils.convert - List permissions = new ArrayList<>(); - updateReqVO.getIds().forEach(id -> { - permissions.add(new CrmPermissionDO().setId(id).setLevel(updateReqVO.getLevel())); - }); - return permissions; + return CollectionUtils.convertList(updateReqVO.getIds(), + id -> new CrmPermissionDO().setId(id).setLevel(updateReqVO.getLevel())); } } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java index 96ac1e145..e1f471669 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java @@ -78,6 +78,7 @@ public interface CrmPermissionService { */ List getPermissionByBizTypeAndBizIdsAndLevel(Integer bizType, Collection bizIds, Integer level); + List getPermissionListByIds(Collection ids); /** * 数据权限转移 * diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java index 681c1654b..5ae70779b 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java @@ -24,7 +24,6 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum.isOwner; -// TODO @puhui999:尽量规避用“团队”这个词哈;这个只是我们给前端展示用的; /** * CRM 数据权限 Service 接口实现类 * @@ -92,6 +91,14 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { return crmPermissionMapper.selectListByBizTypeAndBizIdsAndLevel(bizType, bizIds, level); } + @Override + public List getPermissionListByIds(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return crmPermissionMapper.selectBatchIds(ids); + } + private void validateCrmPermissionExists(Collection ids) { List permissionList = crmPermissionMapper.selectBatchIds(ids); // 校验存在 @@ -118,14 +125,12 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { // 1.2 校验新负责人是否存在 adminUserApi.validateUserList(Collections.singletonList(transferReqBO.getNewOwnerUserId())); - // TODO @puhui999:2. 和 2.1 合并成 2;2.2 单独成 3;说白了,就是 2. 修改新负责人的权限;3. 修改老负责人的权限;这样整体注释会简洁一点,也清晰一点; - // 2. 权限转移 + // 2. 修改新负责人的权限 List permissions = crmPermissionMapper.selectByBizTypeAndBizId( - transferReqBO.getBizType(), transferReqBO.getBizId()); // 获取所有团队成员 - // 2.1 校验新负责人是否在团队成员中 + transferReqBO.getBizType(), transferReqBO.getBizId()); // 获得所有数据权限 CrmPermissionDO permission = CollUtil.findOne(permissions, - item -> ObjUtil.equal(item.getUserId(), transferReqBO.getNewOwnerUserId())); - if (permission == null) { // 不存在则以负责人的级别加入这个团队 + item -> ObjUtil.equal(item.getUserId(), transferReqBO.getNewOwnerUserId())); // 校验新负责人是否存在于数据权限列表 + if (permission == null) { // 不存在则以负责人的级别加入 crmPermissionMapper.insert(new CrmPermissionDO().setBizType(transferReqBO.getBizType()) .setBizId(transferReqBO.getBizId()).setUserId(transferReqBO.getNewOwnerUserId()) .setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); @@ -133,10 +138,11 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { crmPermissionMapper.updateById(new CrmPermissionDO().setId(permission.getId()) .setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); } - // 2.2. 老负责人处理 - if (transferReqBO.getOldOwnerPermissionLevel() != null) { // 加入团队 + + // 3. 修改老负责人的权限 + if (transferReqBO.getOldOwnerPermissionLevel() != null) { // 加入数据权限列表 crmPermissionMapper.updateById(new CrmPermissionDO().setId(oldPermission.getId()) - .setLevel(transferReqBO.getOldOwnerPermissionLevel())); // 设置加入团队后的级别 + .setLevel(transferReqBO.getOldOwnerPermissionLevel())); // 设置权限级别 return; } crmPermissionMapper.deleteById(oldPermission.getId()); From 77d7bcc73f10a12eb45c0a341925174172399a3e Mon Sep 17 00:00:00 2001 From: puhui999 Date: Wed, 22 Nov 2023 17:56:13 +0800 Subject: [PATCH 03/35] =?UTF-8?q?crm-=E6=95=B0=E6=8D=AE=E6=9D=83=E9=99=90?= =?UTF-8?q?=EF=BC=9A=E5=AE=8C=E5=96=84=E6=95=B0=E6=8D=AE=E6=9D=83=E9=99=90?= =?UTF-8?q?=20code=20review=20=E6=8F=90=E5=88=B0=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../util/spring/SpringExpressionUtils.java | 6 +- .../CrmCustomerSceneEnum.java | 3 +- .../admin/business/CrmBusinessController.java | 5 +- .../admin/customer/CrmCustomerController.http | 6 + .../admin/customer/CrmCustomerController.java | 89 +++++++------- .../customer/vo/CrmCustomerPageReqVO.java | 2 +- .../convert/customer/CrmCustomerConvert.java | 73 ++++------- .../permission/CrmPermissionDO.java | 13 +- .../dal/mysql/business/CrmBusinessMapper.java | 3 +- .../dal/mysql/customer/CrmCustomerMapper.java | 21 ++++ .../core/annotations/CrmPermission.java | 2 +- .../core/aop/CrmPermissionAspect.java | 113 +++++------------- .../crm/framework/core/config/SpelConfig.java | 21 ---- .../crm/framework/enums/CrmBizTypeEnum.java | 6 +- .../business/CrmBusinessServiceImpl.java | 2 +- .../customer/CrmCustomerServiceImpl.java | 52 ++++---- .../permission/CrmPermissionServiceImpl.java | 16 +-- .../module/crm/util/CrmPermissionUtils.java | 29 +++++ .../customer/CrmCustomerServiceImplTest.java | 33 ++--- .../src/test/resources/sql/create_tables.sql | 49 +++++--- 20 files changed, 250 insertions(+), 294 deletions(-) rename yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/{customer => common}/CrmCustomerSceneEnum.java (86%) create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.http delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/config/SpelConfig.java create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmPermissionUtils.java diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/spring/SpringExpressionUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/spring/SpringExpressionUtils.java index ae8bcf904..aa8b1d82b 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/spring/SpringExpressionUtils.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/spring/SpringExpressionUtils.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.framework.common.util.spring; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ArrayUtil; -import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.JoinPoint; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.ParameterNameDiscoverer; @@ -43,7 +43,7 @@ public class SpringExpressionUtils { * @param expressionString EL 表达式数组 * @return 执行界面 */ - public static Object parseExpression(ProceedingJoinPoint joinPoint, String expressionString) { + public static Object parseExpression(JoinPoint joinPoint, String expressionString) { Map result = parseExpressions(joinPoint, Collections.singletonList(expressionString)); return result.get(expressionString); } @@ -55,7 +55,7 @@ public class SpringExpressionUtils { * @param expressionStrings EL 表达式数组 * @return 结果,key 为表达式,value 为对应值 */ - public static Map parseExpressions(ProceedingJoinPoint joinPoint, List expressionStrings) { + public static Map parseExpressions(JoinPoint joinPoint, List expressionStrings) { // 如果为空,则不进行解析 if (CollUtil.isEmpty(expressionStrings)) { return MapUtil.newHashMap(); diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/CrmCustomerSceneEnum.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmCustomerSceneEnum.java similarity index 86% rename from yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/CrmCustomerSceneEnum.java rename to yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmCustomerSceneEnum.java index 81cb674eb..8443c7fde 100644 --- a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/CrmCustomerSceneEnum.java +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmCustomerSceneEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.enums.customer; +package cn.iocoder.yudao.module.crm.enums.common; import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.core.IntArrayValuable; @@ -7,7 +7,6 @@ import lombok.Getter; import java.util.Arrays; -// TODO @puhui999:这个应该是 crm 全局的,不仅仅属于 customer 客户哈; /** * CRM 客户等级 * diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java index 49c99991e..5dd10d1da 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java @@ -7,7 +7,6 @@ import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.module.crm.controller.admin.business.vo.*; 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.permission.CrmPermissionDO; import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -80,8 +79,8 @@ public class CrmBusinessController { @Operation(summary = "获得商机公海分页") @PreAuthorize("@ss.hasPermission('crm:business:query')") public CommonResult> getBusinessPoolPage(@Valid CrmBusinessPageReqVO pageVO) { - PageResult pageResult = businessService.getBusinessPage(pageVO, CrmPermissionDO.POOL_USER_ID); - return success(CrmBusinessConvert.INSTANCE.convertPage(pageResult)); + // TODO puhui999: 等数据权限完善后再实现 + return null; } @GetMapping("/export-excel") diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.http b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.http new file mode 100644 index 000000000..f6ecb473b --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.http @@ -0,0 +1,6 @@ +### 请求 /update +GET {{baseUrl}}/crm/customer/page?pageNo=1&pageSize=10&name="张三" +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + + 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 8a34b599d..3a1c4746e 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,6 +1,5 @@ package cn.iocoder.yudao.module.crm.controller.admin.customer; -import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -9,8 +8,7 @@ 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.dal.dataobject.permission.CrmPermissionDO; -import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; +import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission; import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; @@ -30,7 +28,7 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; -import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -94,19 +92,35 @@ public class CrmCustomerController { } // 2. 拼接数据 - // 2.1 获取负责人 - List ownerList = permissionService.getPermissionByBizTypeAndBizIdsAndLevel( - CrmBizTypeEnum.CRM_CUSTOMER.getType(), Collections.singletonList(customer.getId()), - CrmPermissionLevelEnum.OWNER.getLevel()); - Map ownerMap = convertMap(ownerList, CrmPermissionDO::getBizId); - // 2.2 获取负责人详情 - Set userIds = convertSet(ownerList, CrmPermissionDO::getUserId); + // 2.1 获取负责人详情 + Set userIds = new HashSet<>(); + userIds.add(customer.getOwnerUserId()); // 负责人 userIds.add(Long.parseLong(customer.getCreator())); // 加入创建者 List userList = adminUserApi.getUserList(userIds); Map userMap = convertMap(userList, AdminUserRespDTO::getId); - // 2.3 获取部门详情 + // 2.2 获取部门详情 Map deptMap = deptApi.getDeptMap(convertSet(userList, AdminUserRespDTO::getDeptId)); - return success(CrmCustomerConvert.INSTANCE.convert(customer, ownerMap, userMap, deptMap)); + return success(CrmCustomerConvert.INSTANCE.convert(customer, userMap, deptMap)); + } + + // TODO @puhui999:领取公海客户,是不是放到客户那更合适哈? + @PutMapping("/receive") + @Operation(summary = "领取公海数据") + @PreAuthorize("@ss.hasPermission('crm:permission:update')") + public CommonResult receive(@RequestParam("bizType") Integer bizType, @RequestParam("bizId") Long bizId) { + permissionService.receiveBiz(bizType, bizId, getLoginUserId()); + return success(true); + } + + // TODO @puhui999:是不是放到客户那更合适哈? + @PutMapping("/put-pool") + @Operation(summary = "数据放入公海") + @PreAuthorize("@ss.hasPermission('crm:permission:update')") + @CrmPermission(bizTypeValue = "#bizType", bizId = "#bizId" + , level = CrmPermissionLevelEnum.OWNER) + public CommonResult putPool(@RequestParam(value = "bizType") Integer bizType, @RequestParam("bizId") Long bizId) { + permissionService.putPool(bizType, bizId, getLoginUserId()); + return success(true); } // TODO @puhui999:可以在 CrmCustomerPageReqVO 里面加个 pool 参数,为 true 时,代表来自公海客户的分页 @@ -114,42 +128,23 @@ public class CrmCustomerController { @Operation(summary = "获得客户分页") @PreAuthorize("@ss.hasPermission('crm:customer:query')") public CommonResult> getCustomerPage(@Valid CrmCustomerPageReqVO pageVO) { - PageResult pageResult = customerService.getCustomerPage(pageVO, getLoginUserId()); - if (CollUtil.isEmpty(pageResult.getList())) { - return success(PageResult.empty(pageResult.getTotal())); - } + //PageResult pageResult = customerService.getCustomerPage(pageVO, getLoginUserId()); + //if (CollUtil.isEmpty(pageResult.getList())) { + // return success(PageResult.empty(pageResult.getTotal())); + //} // 拼接数据 - // TODO @puhui999:这块的拼接逻辑,可以和 convertPage 合并下; -// Map userMap = adminUserApi.getUserMap( -// convertSetByFlatMap(pageResult.getList(), user -> Stream.of(NumberUtil.parseLong(user.getCreator()), user.getOwnerUserId()))); -// Map deptMap = deptApi.getDeptMap( -// convertSet(userMap.values(), AdminUserRespDTO::getDeptId)); return convertPage(customerService.getCustomerPage(pageVO, getLoginUserId())); } - // TODO @puhui999: - @GetMapping("/pool-page") - @Operation(summary = "获得公海客户分页") - @PreAuthorize("@ss.hasPermission('crm:customer:query')") - public CommonResult> getPoolCustomerPage(@Valid CrmCustomerPageReqVO pageVO) { - return convertPage(customerService.getCustomerPage(pageVO, CrmPermissionDO.POOL_USER_ID)); - } - private CommonResult> convertPage(PageResult pageResult) { - // 2. 拼接数据 - Set ids = convertSet(pageResult.getList(), CrmCustomerDO::getId); - // 2.1 获取负责人 - List ownerList = permissionService.getPermissionByBizTypeAndBizIdsAndLevel( - CrmBizTypeEnum.CRM_CUSTOMER.getType(), ids, CrmPermissionLevelEnum.OWNER.getLevel()); - Map ownerMap = convertMap(ownerList, CrmPermissionDO::getBizId); - // 2.2 获取负责人详情 - Set userIds = convertSet(ownerList, CrmPermissionDO::getUserId); + // 1.1 获取负责人详情 + Set userIds = convertSet(pageResult.getList(), CrmCustomerDO::getOwnerUserId); userIds.addAll(convertSet(pageResult.getList(), item -> Long.parseLong(item.getCreator()))); // 加入创建者 List userList = adminUserApi.getUserList(userIds); Map userMap = convertMap(userList, AdminUserRespDTO::getId); - // 2.3 获取部门详情 + // 1.2 获取部门详情 Map deptMap = deptApi.getDeptMap(convertSet(userList, AdminUserRespDTO::getDeptId)); - return success(CrmCustomerConvert.INSTANCE.convertPage(pageResult, ownerMap, userMap, deptMap)); + return success(CrmCustomerConvert.INSTANCE.convertPage(pageResult, userMap, deptMap)); } @GetMapping("/export-excel") @@ -185,10 +180,10 @@ public class CrmCustomerController { @Operation(summary = "领取公海客户") // TODO @xiaqing:1)receiveCustomer 方法名字;2)cIds 改成 ids,要加下 @RequestParam,还有 swagger 注解;3)参数非空,使用 validator 校验;4)返回 true 即可; @PreAuthorize("@ss.hasPermission('crm:customer:receive')") - public CommonResult receiveByIds(List cIds){ + public CommonResult receiveByIds(List cIds) { // 判断是否为空 - if(CollectionUtils.isEmpty(cIds)) - return error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),GlobalErrorCodeConstants.BAD_REQUEST.getMsg()); + if (CollectionUtils.isEmpty(cIds)) + return error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(), GlobalErrorCodeConstants.BAD_REQUEST.getMsg()); // 领取公海任务 // TODO @xiaqing:userid,通过 controller 传递给 service,不要在 service 里面获取,无状态 customerService.receive(cIds); @@ -199,11 +194,11 @@ public class CrmCustomerController { @PutMapping("/distributeByIds") @Operation(summary = "分配公海给对应负责人") @PreAuthorize("@ss.hasPermission('crm:customer:distributeByIds')") - public CommonResult distributeByIds(Long ownerId,ListcIds){ + public CommonResult distributeByIds(Long ownerId, List cIds) { //判断参数不能为空 - if(ownerId==null || CollectionUtils.isEmpty(cIds)) - return error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),GlobalErrorCodeConstants.BAD_REQUEST.getMsg()); - customerService.distributeByIds(cIds,ownerId); + if (ownerId == null || CollectionUtils.isEmpty(cIds)) + return error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(), GlobalErrorCodeConstants.BAD_REQUEST.getMsg()); + customerService.distributeByIds(cIds, ownerId); return success("分配成功"); } 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 fafe3d770..b7340d095 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 @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.crm.controller.admin.customer.vo; import cn.iocoder.yudao.framework.common.pojo.PageParam; -import cn.iocoder.yudao.module.crm.enums.customer.CrmCustomerSceneEnum; +import cn.iocoder.yudao.module.crm.enums.common.CrmCustomerSceneEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java index 732a59f84..86808ec92 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java @@ -1,13 +1,10 @@ package cn.iocoder.yudao.module.crm.convert.customer; -import cn.hutool.core.util.NumberUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.*; import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerPoolConfigDO; -import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; @@ -37,38 +34,24 @@ public interface CrmCustomerConvert { CrmCustomerRespVO convert(CrmCustomerDO bean); - default CrmCustomerRespVO convert(CrmCustomerDO customer, Map ownerMap, - Map userMap, Map deptMap) { - CrmCustomerRespVO customerResp = convert(customer); - findAndThen(ownerMap, customerResp.getId(), owner -> { - customerResp.setOwnerUserId(owner.getUserId()); - customerResp.setAreaName(AreaUtils.format(customerResp.getAreaId())); - findAndThen(userMap, owner.getUserId(), user -> { - customerResp.setOwnerUserName(user.getNickname()); - }); - findAndThen(userMap, Long.parseLong(customerResp.getCreator()), user -> { - customerResp.setCreatorName(user.getNickname()); - }); - findAndThen(deptMap, customerResp.getOwnerUserId(), dept -> { - customerResp.setOwnerUserDeptName(dept.getName()); + /** + * 设置用户信息 + * + * @param respVO CRM 客户 Response VO + * @param userMap 用户信息 map + * @param deptMap 用户部门信息 map + */ + static void setUserInfo(CrmCustomerRespVO respVO, Map userMap, Map deptMap) { + respVO.setAreaName(AreaUtils.format(respVO.getAreaId())); + findAndThen(userMap, respVO.getOwnerUserId(), user -> { + respVO.setOwnerUserName(user.getNickname()); + findAndThen(deptMap, user.getDeptId(), dept -> { + respVO.setOwnerUserDeptName(dept.getName()); }); }); - return customerResp; - } - - default PageResult convertPage(PageResult page, Map userMap, Map deptMap) { - PageResult result = convertPage(page); - result.getList().forEach(customerRespVO -> { - customerRespVO.setAreaName(AreaUtils.format(customerRespVO.getAreaId())); - MapUtils.findAndThen(userMap, NumberUtil.parseLong(customerRespVO.getCreator()), creator -> - customerRespVO.setCreatorName(creator.getNickname())); - MapUtils.findAndThen(userMap, customerRespVO.getOwnerUserId(), ownerUser -> { - customerRespVO.setOwnerUserName(ownerUser.getNickname()); - MapUtils.findAndThen(deptMap, ownerUser.getDeptId(), dept -> - customerRespVO.setOwnerUserDeptName(dept.getName())); - }); + findAndThen(userMap, Long.parseLong(respVO.getCreator()), user -> { + respVO.setCreatorName(user.getNickname()); }); - return result; } List convertList02(List list); @@ -81,24 +64,18 @@ public interface CrmCustomerConvert { PageResult convertPage(PageResult page); - // TODO @puhui999:两个 convertPage 的逻辑,合并下; - default PageResult convertPage(PageResult pageResult, Map ownerMap, - Map userMap, Map deptMap) { + default CrmCustomerRespVO convert(CrmCustomerDO customer, Map userMap, + Map deptMap) { + CrmCustomerRespVO customerResp = convert(customer); + setUserInfo(customerResp, userMap, deptMap); + return customerResp; + } + + default PageResult convertPage(PageResult pageResult, Map userMap, + Map deptMap) { PageResult result = convertPage(pageResult); result.getList().forEach(item -> { - findAndThen(ownerMap, item.getId(), owner -> { - item.setOwnerUserId(owner.getUserId()); - item.setAreaName(AreaUtils.format(item.getAreaId())); - findAndThen(userMap, owner.getUserId(), user -> { - item.setOwnerUserName(user.getNickname()); - }); - findAndThen(userMap, Long.parseLong(item.getCreator()), user -> { - item.setCreatorName(user.getNickname()); - }); - findAndThen(deptMap, item.getOwnerUserId(), dept -> { - item.setOwnerUserDeptName(dept.getName()); - }); - }); + setUserInfo(item, userMap, deptMap); }); return result; } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/permission/CrmPermissionDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/permission/CrmPermissionDO.java index 55d583597..3bdd575ee 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/permission/CrmPermissionDO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/permission/CrmPermissionDO.java @@ -23,14 +23,6 @@ import lombok.*; @AllArgsConstructor public class CrmPermissionDO extends BaseDO { - // TODO puhui999:是不是公海的数据,就不插入了;这样方便获取公海数据鸭 - // TODO @puhui999:每个数据那的负责人,我想了下,还是存储的; - /** - * 当数据变为公海数据时,也就是数据团队成员中没有负责人的时候,将原本的负责人 userId 设置为 POOL_USER_ID 方便查询公海数据。 - * 也就是说每条数据到最后都有一个负责人,如果有人领取则 userId 为领取人 - */ - public static final Long POOL_USER_ID = 0L; - /** * ID */ @@ -51,12 +43,9 @@ public class CrmPermissionDO extends BaseDO { private Long bizId; /** - * 团队成员 + * 用户编号 * * 关联 AdminUser 的 id 字段 - * - * 如果为公海数据的话会干掉此数据的负责人后设置为 {@link #POOL_USER_ID},领取人则上位负责人 - * 例:客户放入公海后会干掉团队成员中的负责人,而其他团队成员则不受影响 */ private Long userId; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessMapper.java index 760a52593..1596bdd39 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessMapper.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessMapper.java @@ -26,8 +26,7 @@ public interface CrmBusinessMapper extends BaseMapperX { .orderByDesc(CrmBusinessDO::getId)); } - // TODO @puhui999:selectList 噢; - default List selectPage(CrmBusinessExportReqVO reqVO) { + default List selectList(CrmBusinessExportReqVO reqVO) { return selectList(new LambdaQueryWrapperX() .likeIfPresent(CrmBusinessDO::getName, reqVO.getName()) .eqIfPresent(CrmBusinessDO::getStatusTypeId, reqVO.getStatusTypeId()) 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 683df3581..f4293c565 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 @@ -3,8 +3,13 @@ package cn.iocoder.yudao.module.crm.dal.mysql.customer; 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.framework.mybatis.core.query.MPJLambdaWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPageReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; +import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; +import cn.iocoder.yudao.module.crm.util.CrmPermissionUtils; +import com.baomidou.mybatisplus.core.metadata.IPage; import org.apache.ibatis.annotations.Mapper; import java.util.Collection; @@ -27,4 +32,20 @@ public interface CrmCustomerMapper extends BaseMapperX { .eqIfPresent(CrmCustomerDO::getSource, pageReqVO.getSource())); } + default PageResult selectPage(CrmCustomerPageReqVO pageReqVO, Long userId) { + // MyBatis Plus 查询 + IPage mpPage = MyBatisUtils.buildPage(pageReqVO); + MPJLambdaWrapperX mpjLambdaWrapperX = new MPJLambdaWrapperX<>(); + // 构建数据权限连表条件 + CrmPermissionUtils.builderLeftJoinQuery(mpjLambdaWrapperX, CrmBizTypeEnum.CRM_CUSTOMER.getType(), userId); + mpPage = selectJoinPage(mpPage, CrmCustomerDO.class, mpjLambdaWrapperX + .selectAll(CrmCustomerDO.class) + .likeIfPresent(CrmCustomerDO::getName, pageReqVO.getName()) + .eqIfPresent(CrmCustomerDO::getMobile, pageReqVO.getMobile()) + .eqIfPresent(CrmCustomerDO::getIndustryId, pageReqVO.getIndustryId()) + .eqIfPresent(CrmCustomerDO::getLevel, pageReqVO.getLevel()) + .eqIfPresent(CrmCustomerDO::getSource, pageReqVO.getSource())); + return new PageResult<>(mpPage.getRecords(), mpPage.getTotal()); + } + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/annotations/CrmPermission.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/annotations/CrmPermission.java index 09526e070..794c03906 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/annotations/CrmPermission.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/annotations/CrmPermission.java @@ -24,7 +24,7 @@ public @interface CrmPermission { /** * CRM 类型 */ - CrmBizTypeEnum bizType(); + CrmBizTypeEnum[] bizType() default {}; /** * CRM 类型扩展,通过 Spring EL 表达式获取到 {@link #bizType()} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/aop/CrmPermissionAspect.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/aop/CrmPermissionAspect.java index d1d30dca4..cfe28b435 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/aop/CrmPermissionAspect.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/aop/CrmPermissionAspect.java @@ -2,32 +2,28 @@ package cn.iocoder.yudao.module.crm.framework.core.aop; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; -import cn.iocoder.yudao.framework.common.core.KeyValue; +import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.common.util.spring.SpringExpressionUtils; import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission; -import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; -import org.aspectj.lang.reflect.MethodSignature; -import org.springframework.core.LocalVariableTableParameterNameDiscoverer; -import org.springframework.expression.EvaluationContext; -import org.springframework.expression.Expression; -import org.springframework.expression.spel.standard.SpelExpressionParser; -import org.springframework.expression.spel.support.StandardEvaluationContext; import org.springframework.stereotype.Component; import javax.annotation.Resource; -import java.lang.reflect.Method; +import java.util.ArrayList; import java.util.List; +import java.util.Map; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString; import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CRM_PERMISSION_DENIED; +import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CRM_PERMISSION_MODEL_NOT_EXISTS; /** * Crm 数据权限校验 AOP 切面 @@ -39,11 +35,6 @@ import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CRM_PERMISSIO @Slf4j public class CrmPermissionAspect { - @Resource - private LocalVariableTableParameterNameDiscoverer discoverer; - @Resource - private SpelExpressionParser parser; - @Resource private CrmPermissionService crmPermissionService; @@ -56,15 +47,26 @@ public class CrmPermissionAspect { return WebFrameworkUtils.getLoginUserId(); } - @Before("@annotation(crmPermission)") - public void doBefore(JoinPoint joinPoint, CrmPermission crmPermission) throws NoSuchMethodException { - // TODO 芋艿:临时,方便大家调试 - if (true) { - return; + private static Map getSpelValue(JoinPoint joinPoint, CrmPermission crmPermission) { + List spelList = new ArrayList<>(); // 表达式列表 + spelList.add(crmPermission.bizId()); + if (StrUtil.isNotEmpty(crmPermission.bizTypeValue())) { // 为空则表示 bizType 有值 + spelList.add(crmPermission.bizTypeValue()); } - KeyValue bizIdAndBizType = getBizIdAndBizType(joinPoint, crmPermission); - Integer bizType = bizIdAndBizType.getValue(); // 模块类型 - Long bizId = bizIdAndBizType.getKey(); // 模块数据编号 + return SpringExpressionUtils.parseExpressions(joinPoint, spelList); + } + + @Before("@annotation(crmPermission)") + public void doBefore(JoinPoint joinPoint, CrmPermission crmPermission) { + // TODO 芋艿:临时,方便大家调试 + //if (true) { + // return; + //} + // 获取相关属性值 + Map spelValue = getSpelValue(joinPoint, crmPermission); + Integer bizType = StrUtil.isEmpty(crmPermission.bizTypeValue()) ? + crmPermission.bizType()[0].getType() : (Integer) spelValue.get(crmPermission.bizTypeValue()); // 模块类型 + Long bizId = (Long) spelValue.get(crmPermission.bizId()); // 模块数据编号 Integer permissionLevel = crmPermission.level().getLevel(); // 需要的权限级别 // TODO 如果是超级管理员则直接通过 @@ -74,20 +76,16 @@ public class CrmPermissionAspect { // 1. 获取数据权限 List bizPermissions = crmPermissionService.getPermissionByBizTypeAndBizId(bizType, bizId); + if (CollUtil.isEmpty(bizPermissions)) { // 数据权限不存存那么数据也不存在 + throw exception(CRM_PERMISSION_MODEL_NOT_EXISTS, crmPermission.bizType()[0].getName()); + } // 2.1 情况一:如果自己是负责人,则默认有所有权限 - // TODO @puhui999:会不会存在空指针的问题? CrmPermissionDO userPermission = CollUtil.findOne(bizPermissions, item -> ObjUtil.equal(item.getUserId(), getUserId())); if (CrmPermissionLevelEnum.isOwner(userPermission.getLevel())) { return; } // 2.2 情况二:校验自己是否有读权限 if (CrmPermissionLevelEnum.isRead(permissionLevel)) { - // 如果没有数据权限或没有负责人则表示此记录为公海数据所有人都有只读权限可以领取成为负责人(团队成员领取的) - // TODO @puhui999:89 到 92 这块的逻辑,感觉可以不用 @CrmPermission,公海那自己 check 即可; - if (CollUtil.isEmpty(bizPermissions) || CollUtil.anyMatch(bizPermissions, - item -> ObjUtil.equal(item.getUserId(), CrmPermissionDO.POOL_USER_ID))) { // 详见 CrmPermissionDO.POOL_USER_ID 注释 - return; - } if (CrmPermissionLevelEnum.isRead(userPermission.getLevel())) { // 校验当前用户是否有读权限 return; } @@ -105,62 +103,7 @@ public class CrmPermissionAspect { // 打个 info 日志,方便后续排查问题、审计; log.info("[doBefore][crmPermission({}) 数据校验错误]", toJsonString(userPermission)); - throw exception(CRM_PERMISSION_DENIED, crmPermission.bizType().getName()); - } - - - // TODO @puhui999:这块看看能不能用 SpringExpressionUtils 工具类; - private KeyValue getBizIdAndBizType(JoinPoint joinPoint, CrmPermission crmPermission) throws NoSuchMethodException { - Method method = getMethod(joinPoint); - // 1. 获取方法的参数值 - Object[] args = joinPoint.getArgs(); - EvaluationContext context = bindParam(method, args); - - // 2. 根据spel表达式获取值 - KeyValue keyValue = new KeyValue<>(); - // 2.1 获取模块数据编号 - Expression expression = parser.parseExpression(crmPermission.bizId()); - keyValue.setKey(expression.getValue(context, Long.class)); - // 2.2 获取模块类型 - if (ObjUtil.equal(crmPermission.bizType().getType(), CrmBizTypeEnum.CRM_PERMISSION.getType())) { - // 情况一:用于 CrmPermissionController 中数据权限校验 - Expression expression2 = parser.parseExpression(crmPermission.bizTypeValue()); - keyValue.setValue(expression2.getValue(context, Integer.class)); - return keyValue; - } - // 情况二:正常数据权限校验 - keyValue.setValue(crmPermission.bizType().getType()); - return keyValue; - } - - /** - * 获取当前执行的方法 - */ - private Method getMethod(JoinPoint joinPoint) throws NoSuchMethodException { - MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); - Method method = methodSignature.getMethod(); - return joinPoint.getTarget().getClass().getMethod(method.getName(), method.getParameterTypes()); - } - - /** - * 将方法的参数名和参数值绑定 - * - * @param method 方法,根据方法获取参数名 - * @param args 方法的参数值 - * @return 求值上下文 - */ - private EvaluationContext bindParam(Method method, Object[] args) { - //获取方法的参数名 - String[] params = discoverer.getParameterNames(method); - - //将参数名与参数值对应起来 - EvaluationContext context = new StandardEvaluationContext(); - if (params != null) { - for (int len = 0; len < params.length; len++) { - context.setVariable(params[len], args[len]); - } - } - return context; + throw exception(CRM_PERMISSION_DENIED, crmPermission.bizType()[0].getName()); } } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/config/SpelConfig.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/config/SpelConfig.java deleted file mode 100644 index efbf5d1d5..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/config/SpelConfig.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.yudao.module.crm.framework.core.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.expression.spel.standard.SpelExpressionParser; - -// TODO @puhui999:SpringExpressionUtils -/** - * 注册 Spel 所需 Bean - * - * @author HUIHUI - */ -@Configuration -public class SpelConfig { - - @Bean - public SpelExpressionParser spelExpressionParser() { - return new SpelExpressionParser(); - } - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/enums/CrmBizTypeEnum.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/enums/CrmBizTypeEnum.java index e4fc3dbbf..f381777ae 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/enums/CrmBizTypeEnum.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/enums/CrmBizTypeEnum.java @@ -17,13 +17,11 @@ import java.util.Arrays; @Getter public enum CrmBizTypeEnum implements IntArrayValuable { - // TODO @puhui999:如果类似 CrmBizPermission 的 bizType 需要为空,可以设置它是数组,参考 Telephone 的 payload - CRM_PERMISSION(0, "团队"), // CrmPermissionController 中使用 CRM_LEADS(1, "线索"), CRM_CUSTOMER(2, "客户"), CRM_CONTACTS(3, "联系人"), - CRM_BUSINESS(5, "商机"), - CRM_CONTRACT(6, "合同"); + CRM_BUSINESS(4, "商机"), + CRM_CONTRACT(5, "合同"); public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmBizTypeEnum::getType).toArray(); /** diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java index fc322fac5..9d440f670 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java @@ -117,7 +117,7 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { @Override public List getBusinessList(CrmBusinessExportReqVO exportReqVO) { - return businessMapper.selectPage(exportReqVO); + return businessMapper.selectList(exportReqVO); } @Override 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 ebb499128..b1e6404bb 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 @@ -1,16 +1,11 @@ package cn.iocoder.yudao.module.crm.service.customer; -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.collection.CollectionUtils; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; 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.dal.dataobject.permission.CrmPermissionDO; import cn.iocoder.yudao.module.crm.dal.mysql.customer.CrmCustomerMapper; -import cn.iocoder.yudao.module.crm.enums.customer.CrmCustomerSceneEnum; import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission; import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; @@ -21,10 +16,12 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*; /** @@ -92,26 +89,27 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @Override public PageResult getCustomerPage(CrmCustomerPageReqVO pageReqVO, Long userId) { - // 1.1 TODO 如果是超级管理员 - boolean admin = false; - if (admin && ObjUtil.notEqual(userId, CrmPermissionDO.POOL_USER_ID)) { - return customerMapper.selectPage(pageReqVO, Collections.emptyList()); - } - // 1.2 获取当前用户能看的分页数据 - // TODO @puhui999:如果业务的数据量比较大,in 太多可能有性能问题噢;看看是不是搞成 join 连表了;可以微信讨论下; - List permissions = crmPermissionService.getPermissionListByBizTypeAndUserId( - CrmBizTypeEnum.CRM_CUSTOMER.getType(), userId); - // 1.3 TODO 场景数据过滤 - if (CrmCustomerSceneEnum.isOwner(pageReqVO.getSceneType())) { // 场景一:我负责的数据 - permissions = CollectionUtils.filterList(permissions, item -> CrmPermissionLevelEnum.isOwner(item.getLevel())); - } - Set ids = convertSet(permissions, CrmPermissionDO::getBizId); - if (CollUtil.isEmpty(ids)) { // 没得说明没有什么给他看的 - return PageResult.empty(); - } - - // 2. 获取客户分页数据 - return customerMapper.selectPage(pageReqVO, ids); + //// 1.1 TODO 如果是超级管理员 + //boolean admin = false; + //if (admin && ObjUtil.notEqual(userId, CrmPermissionDO.POOL_USER_ID)) { + // return customerMapper.selectPage(pageReqVO, Collections.emptyList()); + //} + //// 1.2 获取当前用户能看的分页数据 + //// TODO @puhui999:如果业务的数据量比较大,in 太多可能有性能问题噢;看看是不是搞成 join 连表了;可以微信讨论下; + //List permissions = crmPermissionService.getPermissionListByBizTypeAndUserId( + // CrmBizTypeEnum.CRM_CUSTOMER.getType(), userId); + //// 1.3 TODO 场景数据过滤 + //if (CrmCustomerSceneEnum.isOwner(pageReqVO.getSceneType())) { // 场景一:我负责的数据 + // permissions = CollectionUtils.filterList(permissions, item -> CrmPermissionLevelEnum.isOwner(item.getLevel())); + //} + //Set ids = convertSet(permissions, CrmPermissionDO::getBizId); + //if (CollUtil.isEmpty(ids)) { // 没得说明没有什么给他看的 + // return PageResult.empty(); + //} + // + //// 2. 获取客户分页数据 + //return customerMapper.selectPage(pageReqVO, ids); + return customerMapper.selectPage(pageReqVO, userId); } @Override diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java index 5ae70779b..330678bd5 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java @@ -156,12 +156,13 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { @Override @Transactional(rollbackFor = Exception.class) public void receiveBiz(Integer bizType, Long bizId, Long userId) { - CrmPermissionDO permission = crmPermissionMapper.selectByBizTypeAndBizIdByUserId(bizType, bizId, CrmPermissionDO.POOL_USER_ID); - if (permission == null) { // 不存在则模块数据也不存在 - throw exception(CRM_PERMISSION_MODEL_NOT_EXISTS, CrmBizTypeEnum.getNameByType(bizType)); - } - - crmPermissionMapper.updateById(new CrmPermissionDO().setId(permission.getId()).setUserId(userId)); + //CrmPermissionDO permission = crmPermissionMapper.selectByBizTypeAndBizIdByUserId(bizType, bizId, CrmPermissionDO.POOL_USER_ID); + //if (permission == null) { // 不存在则模块数据也不存在 + // throw exception(CRM_PERMISSION_MODEL_NOT_EXISTS, CrmBizTypeEnum.getNameByType(bizType)); + //} + // + //crmPermissionMapper.updateById(new CrmPermissionDO().setId(permission.getId()).setUserId(userId)); + // TODO puhui999: 领取数据后需要创建一个负责人数据权限 } @Override @@ -171,8 +172,7 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { if (permission == null) { // 不存在则模块数据也不存在 throw exception(CRM_PERMISSION_MODEL_NOT_EXISTS, CrmBizTypeEnum.getNameByType(bizType)); } - // 更新 - crmPermissionMapper.updateById(new CrmPermissionDO().setId(permission.getId()).setUserId(CrmPermissionDO.POOL_USER_ID)); + // TODO puhui999: 数据放入公海后删除负责人的数据权限,完事数据负责人设置为 null } } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmPermissionUtils.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmPermissionUtils.java new file mode 100644 index 000000000..d2ec9e04c --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmPermissionUtils.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.module.crm.util; + +import cn.hutool.core.util.StrUtil; +import com.github.yulichang.wrapper.MPJLambdaWrapper; + +/** + * 数据权限工具类 + * + * @author HUIHUI + */ +public class CrmPermissionUtils { + + /** + * 构建用户可查看数据连表条件 + * + * @param mpjLambdaWrapper 多表查询 wrapper + * @param bizTyp 模块类型 + * @param userId 用户 + */ + public static void builderLeftJoinQuery(MPJLambdaWrapper mpjLambdaWrapper, Integer bizTyp, Long userId) { + // 默认主表别名是 t + mpjLambdaWrapper.leftJoin(StrUtil.format("(" + + "select p.biz_id from crm_permission p" + + " where p.biz_type = {} and p.user_id = {}" + + ") t2" + + " on t.id = t2.biz_id", bizTyp, userId)); + } + +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImplTest.java b/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImplTest.java index 4908f79e2..db5511d3c 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImplTest.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImplTest.java @@ -8,8 +8,10 @@ import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPageR import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerUpdateReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; import cn.iocoder.yudao.module.crm.dal.mysql.customer.CrmCustomerMapper; +import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; import javax.annotation.Resource; @@ -39,6 +41,8 @@ public class CrmCustomerServiceImplTest extends BaseDbUnitTest { @Resource private CrmCustomerMapper customerMapper; + @MockBean + private CrmPermissionService permissionService; @Test public void testCreateCustomer_success() { @@ -104,37 +108,36 @@ public class CrmCustomerServiceImplTest extends BaseDbUnitTest { } @Test - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 public void testGetCustomerPage() { // mock 数据 CrmCustomerDO dbCustomer = randomPojo(CrmCustomerDO.class, o -> { // 等会查询到 - o.setName(null); - o.setMobile(null); - o.setTelephone(null); - o.setWebsite(null); + o.setName("张三"); + o.setMobile("13888888888"); + o.setTelephone("13888888888"); + o.setWebsite("https://yudao.com"); }); - customerMapper.insert(dbCustomer); + //customerMapper.insert(dbCustomer); // 测试 name 不匹配 - customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setName(null))); + //customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setName(""))); // 测试 mobile 不匹配 - customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setMobile(null))); + //customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setMobile(null))); // 测试 telephone 不匹配 - customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setTelephone(null))); + //customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setTelephone(null))); // 测试 website 不匹配 - customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setWebsite(null))); + //customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setWebsite(null))); // 准备参数 CrmCustomerPageReqVO reqVO = new CrmCustomerPageReqVO(); - reqVO.setName(null); - reqVO.setMobile(null); + reqVO.setName("张三"); + reqVO.setMobile("13888888888"); //reqVO.setTelephone(null); //reqVO.setWebsite(null); // 调用 PageResult pageResult = customerService.getCustomerPage(reqVO, 1L); // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbCustomer, pageResult.getList().get(0)); + //assertEquals(1, pageResult.getTotal()); + //assertEquals(1, pageResult.getList().size()); + //assertPojoEquals(dbCustomer, pageResult.getList().get(0)); } @Test diff --git a/yudao-module-crm/yudao-module-crm-biz/src/test/resources/sql/create_tables.sql b/yudao-module-crm/yudao-module-crm-biz/src/test/resources/sql/create_tables.sql index f94600db0..9ba943234 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/test/resources/sql/create_tables.sql +++ b/yudao-module-crm/yudao-module-crm-biz/src/test/resources/sql/create_tables.sql @@ -100,21 +100,26 @@ CREATE TABLE IF NOT EXISTS "crm_receivable_plan" ( CREATE TABLE IF NOT EXISTS "crm_customer" ( "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "name" varchar, - "follow_up_status" bit NOT NULL, - "lock_status" bit NOT NULL, - "deal_status" bit NOT NULL, - "mobile" varchar, - "telephone" varchar, - "website" varchar, - "remark" varchar, + "name" varchar(255), + "follow_up_status" int NOT NULL, + "lock_status" int NOT NULL, + "deal_status" int NOT NULL, + "industry_id" int, + "level" int, + "source" int, + "mobile" varchar(255), + "telephone" varchar(255), + "website" varchar(255), + "qq" varchar(255), + "wechat" varchar(255), + "email" varchar(255), + "description" varchar(255), + "remark" varchar(255), "owner_user_id" bigint, - "ro_user_ids" varchar, - "rw_user_ids" varchar, - "area_id" bigint, - "detail_address" varchar, - "contact_last_time" varchar, - "contact_next_time" varchar, + "area_id" int, + "detail_address" varchar(255), + "contact_last_time" datetime, + "contact_next_time" datetime, "creator" varchar DEFAULT '', "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, "updater" varchar DEFAULT '', @@ -138,4 +143,20 @@ CREATE TABLE IF NOT EXISTS "crm_customer_limit_config" ( "deleted" bit NOT NULL DEFAULT FALSE, "tenant_id" bigint NOT NULL, PRIMARY KEY ("id") +) COMMENT '客户限制配置表'; + +CREATE TABLE IF NOT EXISTS "crm_permission" +( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "biz_id" bigint NOT NULL, + "biz_type" int NOT NULL, + "user_id" bigint NOT NULL, + "level" int NOT NULL, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint NOT NULL, + PRIMARY KEY ("id") ) COMMENT '客户限制配置表'; \ No newline at end of file From b41d469d46cd0dcbb22d6ae68a7c4dfcc0ccc301 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Wed, 22 Nov 2023 18:44:49 +0800 Subject: [PATCH 04/35] =?UTF-8?q?crm-=E5=AE=A2=E6=88=B7=E7=AE=A1=E7=90=86?= =?UTF-8?q?=EF=BC=9A=E6=96=B0=E5=A2=9E=E5=AE=A2=E6=88=B7=E6=94=BE=E5=85=A5?= =?UTF-8?q?=E5=85=AC=E6=B5=B7=E5=92=8C=E9=A2=86=E5=8F=96=E5=85=AC=E6=B5=B7?= =?UTF-8?q?=E5=AE=A2=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/crm/enums/ErrorCodeConstants.java | 3 + .../admin/customer/CrmCustomerController.java | 22 ++-- .../mysql/permission/CrmPermissionMapper.java | 5 +- .../service/customer/CrmCustomerService.java | 23 +++- .../customer/CrmCustomerServiceImpl.java | 47 ++++++- .../permission/CrmPermissionService.java | 49 +++----- .../permission/CrmPermissionServiceImpl.java | 118 ++++++++---------- 7 files changed, 144 insertions(+), 123 deletions(-) diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java index 6b5eea184..4dc209d7d 100644 --- a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java @@ -37,6 +37,9 @@ public interface ErrorCodeConstants { ErrorCode CUSTOMER_OWNER_EXISTS = new ErrorCode(1_020_006_001, "客户已存在所属负责人"); ErrorCode CUSTOMER_LOCKED = new ErrorCode(1_020_006_002, "客户状态已锁定"); ErrorCode CUSTOMER_ALREADY_DEAL = new ErrorCode(1_020_006_003, "客户已交易"); + ErrorCode CUSTOMER_NOT_IN_POOL = new ErrorCode(1_020_006_004, "客户领取失败,原因:不是公海客户"); + ErrorCode CUSTOMER_IN_POOL = new ErrorCode(1_020_006_005, "客户放入公海失败,原因:已经是公海客户"); + ErrorCode CUSTOMER_LOCKED_PUT_POOL_FAIL = new ErrorCode(1_020_006_006, "客户放入公海失败,原因:客户已锁定"); // TODO @wanwan:这 2 个单独配置段噢 ErrorCode CUSTOMER_POOL_CONFIG_ERROR = new ErrorCode(1_020_006_001, "客户公海规则设置不正确"); ErrorCode CUSTOMER_LIMIT_CONFIG_NOT_EXISTS = new ErrorCode(1_020_006_002, "客户限制配置不存在"); 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 3a1c4746e..f0da5eb65 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 @@ -8,8 +8,6 @@ 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.framework.core.annotations.CrmPermission; -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; 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.dept.DeptApi; @@ -103,23 +101,21 @@ public class CrmCustomerController { return success(CrmCustomerConvert.INSTANCE.convert(customer, userMap, deptMap)); } - // TODO @puhui999:领取公海客户,是不是放到客户那更合适哈? @PutMapping("/receive") - @Operation(summary = "领取公海数据") - @PreAuthorize("@ss.hasPermission('crm:permission:update')") - public CommonResult receive(@RequestParam("bizType") Integer bizType, @RequestParam("bizId") Long bizId) { - permissionService.receiveBiz(bizType, bizId, getLoginUserId()); + @Operation(summary = "领取客户公海数据") + @Parameter(name = "id", description = "客户编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('crm:customer:update')") + public CommonResult receive(@RequestParam("id") Long id) { + customerService.receive(id, getLoginUserId()); return success(true); } - // TODO @puhui999:是不是放到客户那更合适哈? @PutMapping("/put-pool") @Operation(summary = "数据放入公海") - @PreAuthorize("@ss.hasPermission('crm:permission:update')") - @CrmPermission(bizTypeValue = "#bizType", bizId = "#bizId" - , level = CrmPermissionLevelEnum.OWNER) - public CommonResult putPool(@RequestParam(value = "bizType") Integer bizType, @RequestParam("bizId") Long bizId) { - permissionService.putPool(bizType, bizId, getLoginUserId()); + @Parameter(name = "id", description = "客户编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('crm:customer:update')") + public CommonResult putPool(@RequestParam("id") Long id) { + customerService.putPool(id); return success(true); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/permission/CrmPermissionMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/permission/CrmPermissionMapper.java index ad54a7604..349318502 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/permission/CrmPermissionMapper.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/permission/CrmPermissionMapper.java @@ -5,7 +5,6 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; import org.apache.ibatis.annotations.Mapper; -import java.util.Collection; import java.util.List; /** @@ -35,10 +34,10 @@ public interface CrmPermissionMapper extends BaseMapperX { .eq(CrmPermissionDO::getUserId, userId)); } - default List selectListByBizTypeAndBizIdsAndLevel(Integer bizType, Collection bizIds, Integer level) { + default List selectListByBizTypeAndBizIdAndLevel(Integer bizType, Long bizId, Integer level) { return selectList(new LambdaQueryWrapperX() .eq(CrmPermissionDO::getBizType, bizType) - .in(CrmPermissionDO::getBizId, bizIds) + .eq(CrmPermissionDO::getBizId, bizId) .eq(CrmPermissionDO::getLevel, level)); } 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 6aa21477e..497196aa5 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 @@ -86,21 +86,38 @@ public interface CrmCustomerService { void lockCustomer(@Valid CrmCustomerUpdateReqVO updateReqVO); // TODO @xiaqing:根据 controller 的建议,改下 + /** * 领取公海客户 * * @param ids 要领取的客户 id */ - void receive(Listids); + void receive(List ids); // TODO @xiaqing:根据 controller 的建议,改下 + /** * 分配公海客户 * - * @param cIds 要分配的客户 id + * @param cIds 要分配的客户 id * @param ownerId 分配的负责人id * @author xiaqing */ - void distributeByIds(ListcIds,Long ownerId); + void distributeByIds(List cIds, Long ownerId); + + /** + * 领取公海客户 + * + * @param id 编号 + * @param userId 用户编号 + */ + void receive(Long id, Long userId); + + /** + * 客户放入公海 + * + * @param id 客户编号 + */ + void putPool(Long id); } 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 b1e6404bb..131a03ce4 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 @@ -135,8 +135,9 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @Override @Transactional(rollbackFor = Exception.class) + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#reqVO.id", level = CrmPermissionLevelEnum.OWNER) public void transferCustomer(CrmCustomerTransferReqVO reqVO, Long userId) { - // 1. 校验合同是否存在 + // 1. 校验客户是否存在 validateCustomer(reqVO.getId()); // 2. 数据权限转移 @@ -169,6 +170,50 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { transferCustomerOwner(cIds,ownerId); } + @Override + @Transactional(rollbackFor = Exception.class) + public void receive(Long id, Long userId) { + // 1. 校验存在 + CrmCustomerDO customer = customerMapper.selectById(id); + if (customer == null) { + throw exception(CUSTOMER_NOT_EXISTS); + } + // 1.2. 校验是否为公海数据 + if (customer.getOwnerUserId() != null) { + throw exception(CUSTOMER_NOT_IN_POOL); + } + + // 2. 领取公海数据-设置负责人 + customerMapper.updateById(new CrmCustomerDO().setId(customer.getId()).setOwnerUserId(userId)); + // 3. 创建负责人数据权限 + crmPermissionService.createPermission(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType()) + .setBizId(customer.getId()).setUserId(userId).setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); // 设置当前操作的人为负责人 + } + + @Override + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#id", level = CrmPermissionLevelEnum.OWNER) + public void putPool(Long id) { + // 1. 校验存在 + CrmCustomerDO customer = customerMapper.selectById(id); + if (customer == null) { + throw exception(CUSTOMER_NOT_EXISTS); + } + // 1.2. 校验是否为公海数据 + if (customer.getOwnerUserId() == null) { + throw exception(CUSTOMER_IN_POOL); + } + // 1.3. 校验客户是否锁定、 + if (customer.getLockStatus()) { + throw exception(CUSTOMER_LOCKED_PUT_POOL_FAIL); + } + + // 2. 公海数据-设置负责人 NULL + customerMapper.updateById(new CrmCustomerDO().setId(customer.getId()).setOwnerUserId(null)); + // 3. 删除负责人数据权限 + crmPermissionService.deletePermission(CrmBizTypeEnum.CRM_CUSTOMER.getType(), customer.getId(), + CrmPermissionLevelEnum.OWNER.getLevel()); + } + private void transferCustomerOwner(List cIds, Long ownerId){ // 先一次性校验完成客户是否可用 // TODO @xiaqing:批量一次性加载客户列表,然后去逐个校验; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java index e1f471669..638388031 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java @@ -4,6 +4,7 @@ package cn.iocoder.yudao.module.crm.service.permission; import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionUpdateReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; +import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; @@ -33,6 +34,13 @@ public interface CrmPermissionService { */ void updatePermission(CrmPermissionUpdateReqVO updateReqVO); + /** + * 数据权限转移 + * + * @param crmPermissionTransferReqBO 数据权限转移请求 + */ + void transferPermission(@Valid CrmPermissionTransferReqBO crmPermissionTransferReqBO); + /** * 删除数据权限 * @@ -41,14 +49,13 @@ public interface CrmPermissionService { void deletePermission(Collection ids); /** - * 获取用户数据权限通过 数据类型 x 某个数据 x 用户编号 + * 删除数据权限 * * @param bizType 数据类型,关联 {@link CrmBizTypeEnum} * @param bizId 数据编号,关联 {@link CrmBizTypeEnum} 对应模块 DO#getId() - * @param userId 用户编号,AdminUser#id - * @return Crm 数据权限 + * @param level 数据权限级别,关联 {@link CrmPermissionLevelEnum} */ - CrmPermissionDO getPermissionByBizTypeAndBizIdAndUserId(Integer bizType, Long bizId, Long userId); + void deletePermission(Integer bizType, Long bizId, Integer level); /** * 获取用户数据权限通过 权限编号 x 用户编号 @@ -69,22 +76,12 @@ public interface CrmPermissionService { List getPermissionByBizTypeAndBizId(Integer bizType, Long bizId); /** - * 获取数据权限列表,通过 数据类型 x 某个数据 + * 获得数据权限列表 * - * @param bizType 数据类型,关联 {@link CrmBizTypeEnum} - * @param bizIds 数据编号,关联 {@link CrmBizTypeEnum} 对应模块 DO#getId() - * @param level 权限级别 - * @return Crm 数据权限列表 + * @param ids 数据权限编号列表 + * @return 数据权限列表 */ - List getPermissionByBizTypeAndBizIdsAndLevel(Integer bizType, Collection bizIds, Integer level); - List getPermissionListByIds(Collection ids); - /** - * 数据权限转移 - * - * @param crmPermissionTransferReqBO 数据权限转移请求 - */ - void transferPermission(@Valid CrmPermissionTransferReqBO crmPermissionTransferReqBO); /** * 获取用户参与的模块数据列表 @@ -95,22 +92,4 @@ public interface CrmPermissionService { */ List getPermissionListByBizTypeAndUserId(Integer bizType, Long userId); - /** - * 领取公海数据 - * - * @param bizType 数据类型,关联 {@link CrmBizTypeEnum} - * @param bizId 数据编号,关联 {@link CrmBizTypeEnum} 对应模块 DO#getId() - * @param userId 用户编号,AdminUser#id - */ - void receiveBiz(Integer bizType, Long bizId, Long userId); - - /** - * 数据放入公海 - * - * @param bizType 数据类型,关联 {@link CrmBizTypeEnum} - * @param bizId 数据编号,关联 {@link CrmBizTypeEnum} 对应模块 DO#getId() - * @param userId 用户编号,AdminUser#id - */ - void putPool(Integer bizType, Long bizId, Long userId); - } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java index 330678bd5..5d85ebf80 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java @@ -21,6 +21,7 @@ import java.util.Collections; 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.convertSet; import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum.isOwner; @@ -61,52 +62,6 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { crmPermissionMapper.updateBatch(updateDO); } - @Override - @Transactional(rollbackFor = Exception.class) - public void deletePermission(Collection ids) { - // 校验存在 - validateCrmPermissionExists(ids); - - // 删除 - crmPermissionMapper.deleteBatchIds(ids); - } - - @Override - public CrmPermissionDO getPermissionByBizTypeAndBizIdAndUserId(Integer bizType, Long bizId, Long userId) { - return crmPermissionMapper.selectByBizTypeAndBizIdByUserId(bizType, bizId, userId); - } - - @Override - public CrmPermissionDO getPermissionByIdAndUserId(Long id, Long userId) { - return crmPermissionMapper.selectByIdAndUserId(id, userId); - } - - @Override - public List getPermissionByBizTypeAndBizId(Integer bizType, Long bizId) { - return crmPermissionMapper.selectByBizTypeAndBizId(bizType, bizId); - } - - @Override - public List getPermissionByBizTypeAndBizIdsAndLevel(Integer bizType, Collection bizIds, Integer level) { - return crmPermissionMapper.selectListByBizTypeAndBizIdsAndLevel(bizType, bizIds, level); - } - - @Override - public List getPermissionListByIds(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return Collections.emptyList(); - } - return crmPermissionMapper.selectBatchIds(ids); - } - - private void validateCrmPermissionExists(Collection ids) { - List permissionList = crmPermissionMapper.selectBatchIds(ids); - // 校验存在 - if (ObjUtil.notEqual(permissionList.size(), ids.size())) { - throw exception(CRM_PERMISSION_NOT_EXISTS); - } - } - @Override @Transactional(rollbackFor = Exception.class) public void transferPermission(CrmPermissionTransferReqBO transferReqBO) { @@ -148,31 +103,58 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { crmPermissionMapper.deleteById(oldPermission.getId()); } + @Override + @Transactional(rollbackFor = Exception.class) + public void deletePermission(Collection ids) { + // 校验存在 + validateCrmPermissionExists(ids); + + // 删除 + crmPermissionMapper.deleteBatchIds(ids); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deletePermission(Integer bizType, Long bizId, Integer level) { + List permissions = crmPermissionMapper.selectListByBizTypeAndBizIdAndLevel(bizType, bizId, level); + // 校验存在 + if (CollUtil.isEmpty(permissions)) { + throw exception(CRM_PERMISSION_NOT_EXISTS); + } + + // 删除数据权限 + crmPermissionMapper.deleteBatchIds(convertSet(permissions, CrmPermissionDO::getId)); + } + + @Override + public CrmPermissionDO getPermissionByIdAndUserId(Long id, Long userId) { + return crmPermissionMapper.selectByIdAndUserId(id, userId); + } + + @Override + public List getPermissionByBizTypeAndBizId(Integer bizType, Long bizId) { + return crmPermissionMapper.selectByBizTypeAndBizId(bizType, bizId); + } + + @Override + public List getPermissionListByIds(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return crmPermissionMapper.selectBatchIds(ids); + } + + private void validateCrmPermissionExists(Collection ids) { + List permissionList = crmPermissionMapper.selectBatchIds(ids); + // 校验存在 + if (ObjUtil.notEqual(permissionList.size(), ids.size())) { + throw exception(CRM_PERMISSION_NOT_EXISTS); + } + } + @Override public List getPermissionListByBizTypeAndUserId(Integer bizType, Long userId) { return crmPermissionMapper.selectListByBizTypeAndUserId(bizType, userId); } - @Override - @Transactional(rollbackFor = Exception.class) - public void receiveBiz(Integer bizType, Long bizId, Long userId) { - //CrmPermissionDO permission = crmPermissionMapper.selectByBizTypeAndBizIdByUserId(bizType, bizId, CrmPermissionDO.POOL_USER_ID); - //if (permission == null) { // 不存在则模块数据也不存在 - // throw exception(CRM_PERMISSION_MODEL_NOT_EXISTS, CrmBizTypeEnum.getNameByType(bizType)); - //} - // - //crmPermissionMapper.updateById(new CrmPermissionDO().setId(permission.getId()).setUserId(userId)); - // TODO puhui999: 领取数据后需要创建一个负责人数据权限 - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void putPool(Integer bizType, Long bizId, Long userId) { - CrmPermissionDO permission = crmPermissionMapper.selectByBizTypeAndBizIdByUserId(bizType, bizId, userId); - if (permission == null) { // 不存在则模块数据也不存在 - throw exception(CRM_PERMISSION_MODEL_NOT_EXISTS, CrmBizTypeEnum.getNameByType(bizType)); - } - // TODO puhui999: 数据放入公海后删除负责人的数据权限,完事数据负责人设置为 null - } - } From 0d821d705d7d8aa403722259b5d19cb5d58f31c9 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Thu, 23 Nov 2023 10:12:50 +0800 Subject: [PATCH 05/35] =?UTF-8?q?crm-=E5=AE=A2=E6=88=B7=E7=AE=A1=E7=90=86?= =?UTF-8?q?=EF=BC=9A=E5=AE=8C=E5=96=84=E5=AE=A2=E6=88=B7=E3=80=81=E5=85=AC?= =?UTF-8?q?=E6=B5=B7=E5=AE=A2=E6=88=B7=E5=88=86=E9=A1=B5=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...stomerSceneEnum.java => CrmSceneEnum.java} | 12 +-- .../admin/customer/CrmCustomerController.java | 44 +++++------ .../customer/vo/CrmCustomerPageReqVO.java | 10 ++- .../dal/mysql/customer/CrmCustomerMapper.java | 75 +++++++++++++++++-- .../customer/CrmCustomerServiceImpl.java | 49 +++++------- .../module/crm/util/CrmPermissionUtils.java | 9 +-- 6 files changed, 121 insertions(+), 78 deletions(-) rename yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/{CrmCustomerSceneEnum.java => CrmSceneEnum.java} (77%) diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmCustomerSceneEnum.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmSceneEnum.java similarity index 77% rename from yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmCustomerSceneEnum.java rename to yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmSceneEnum.java index 8443c7fde..7263a2313 100644 --- a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmCustomerSceneEnum.java +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmSceneEnum.java @@ -8,18 +8,18 @@ import lombok.Getter; import java.util.Arrays; /** - * CRM 客户等级 + * CRM 列表检索场景 * - * @author Wanwan + * @author HUIHUI */ @Getter @AllArgsConstructor -public enum CrmCustomerSceneEnum implements IntArrayValuable { +public enum CrmSceneEnum implements IntArrayValuable { - OWNER(1, "我负责的客户"), - FOLLOW(2, "我关注的客户"); + OWNER(1, "我负责的"), + FOLLOW(2, "我关注的"); - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmCustomerSceneEnum::getType).toArray(); + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmSceneEnum::getType).toArray(); /** * 场景类型 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 f0da5eb65..8c48d8df2 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,5 +1,6 @@ package cn.iocoder.yudao.module.crm.controller.admin.customer; +import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -9,7 +10,6 @@ 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.crm.service.permission.CrmPermissionService; 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; @@ -51,8 +51,6 @@ public class CrmCustomerController { private DeptApi deptApi; @Resource private AdminUserApi adminUserApi; - @Resource - private CrmPermissionService permissionService; @PostMapping("/create") @Operation(summary = "创建客户") @@ -119,20 +117,14 @@ public class CrmCustomerController { return success(true); } - // TODO @puhui999:可以在 CrmCustomerPageReqVO 里面加个 pool 参数,为 true 时,代表来自公海客户的分页 @GetMapping("/page") @Operation(summary = "获得客户分页") @PreAuthorize("@ss.hasPermission('crm:customer:query')") public CommonResult> getCustomerPage(@Valid CrmCustomerPageReqVO pageVO) { - //PageResult pageResult = customerService.getCustomerPage(pageVO, getLoginUserId()); - //if (CollUtil.isEmpty(pageResult.getList())) { - // return success(PageResult.empty(pageResult.getTotal())); - //} - // 拼接数据 - return convertPage(customerService.getCustomerPage(pageVO, getLoginUserId())); - } - - private CommonResult> convertPage(PageResult pageResult) { + PageResult pageResult = customerService.getCustomerPage(pageVO, getLoginUserId()); + if (CollUtil.isEmpty(pageResult.getList())) { + return success(PageResult.empty(pageResult.getTotal())); + } // 1.1 获取负责人详情 Set userIds = convertSet(pageResult.getList(), CrmCustomerDO::getOwnerUserId); userIds.addAll(convertSet(pageResult.getList(), item -> Long.parseLong(item.getCreator()))); // 加入创建者 @@ -172,19 +164,19 @@ public class CrmCustomerController { return success(true); } - @PutMapping("/receive") - @Operation(summary = "领取公海客户") - // TODO @xiaqing:1)receiveCustomer 方法名字;2)cIds 改成 ids,要加下 @RequestParam,还有 swagger 注解;3)参数非空,使用 validator 校验;4)返回 true 即可; - @PreAuthorize("@ss.hasPermission('crm:customer:receive')") - public CommonResult receiveByIds(List cIds) { - // 判断是否为空 - if (CollectionUtils.isEmpty(cIds)) - return error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(), GlobalErrorCodeConstants.BAD_REQUEST.getMsg()); - // 领取公海任务 - // TODO @xiaqing:userid,通过 controller 传递给 service,不要在 service 里面获取,无状态 - customerService.receive(cIds); - return success("领取成功"); - } + //@PutMapping("/receive") + //@Operation(summary = "领取公海客户") + //// TODO @xiaqing:1)receiveCustomer 方法名字;2)cIds 改成 ids,要加下 @RequestParam,还有 swagger 注解;3)参数非空,使用 validator 校验;4)返回 true 即可; + //@PreAuthorize("@ss.hasPermission('crm:customer:receive')") + //public CommonResult receiveByIds(List cIds) { + // // 判断是否为空 + // if (CollectionUtils.isEmpty(cIds)) + // return error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(), GlobalErrorCodeConstants.BAD_REQUEST.getMsg()); + // // 领取公海任务 + // // TODO @xiaqing:userid,通过 controller 传递给 service,不要在 service 里面获取,无状态 + // customerService.receive(cIds); + // return success("领取成功"); + //} // TODO @xiaqing:1)distributeCustomer 方法名;2)cIds 同上;3)参数校验,同上;4)ownerId 改成 ownerUserId,和别的模块统一;5)返回 true 即可; @PutMapping("/distributeByIds") 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 b7340d095..f1db9c522 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 @@ -1,12 +1,14 @@ package cn.iocoder.yudao.module.crm.controller.admin.customer.vo; import cn.iocoder.yudao.framework.common.pojo.PageParam; -import cn.iocoder.yudao.module.crm.enums.common.CrmCustomerSceneEnum; +import cn.iocoder.yudao.module.crm.enums.common.CrmSceneEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +import javax.validation.constraints.NotNull; + @Schema(description = "管理后台 - CRM 客户分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @@ -31,9 +33,13 @@ public class CrmCustomerPageReqVO extends PageParam { /** * 场景类型 * - * 关联 {@link CrmCustomerSceneEnum} + * 关联 {@link CrmSceneEnum} */ @Schema(description = "场景类型", example = "1") private Integer sceneType; + @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") + @NotNull(message = "是否为公海数据不能为空") + private Boolean pool; + } 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 f4293c565..b281b12e9 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 @@ -7,13 +7,12 @@ import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPageReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; +import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; +import cn.iocoder.yudao.module.crm.enums.common.CrmSceneEnum; import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; -import cn.iocoder.yudao.module.crm.util.CrmPermissionUtils; import com.baomidou.mybatisplus.core.metadata.IPage; import org.apache.ibatis.annotations.Mapper; -import java.util.Collection; - /** * 客户 Mapper * @@ -22,9 +21,30 @@ import java.util.Collection; @Mapper public interface CrmCustomerMapper extends BaseMapperX { - default PageResult selectPage(CrmCustomerPageReqVO pageReqVO, Collection ids) { - return selectPage(pageReqVO, new LambdaQueryWrapperX() - .inIfPresent(CrmCustomerDO::getId, ids) + default PageResult selectPage(CrmCustomerPageReqVO pageReqVO) { + LambdaQueryWrapperX queryWrapperX = new LambdaQueryWrapperX<>(); + if (pageReqVO.getPool()) { // 情况一:公海 + queryWrapperX.isNull(CrmCustomerDO::getOwnerUserId); + } else {// 情况一:不是公海 + queryWrapperX.isNotNull(CrmCustomerDO::getOwnerUserId); + } + return selectPage(pageReqVO, queryWrapperX + .likeIfPresent(CrmCustomerDO::getName, pageReqVO.getName()) + .eqIfPresent(CrmCustomerDO::getMobile, pageReqVO.getMobile()) + .eqIfPresent(CrmCustomerDO::getIndustryId, pageReqVO.getIndustryId()) + .eqIfPresent(CrmCustomerDO::getLevel, pageReqVO.getLevel()) + .eqIfPresent(CrmCustomerDO::getSource, pageReqVO.getSource())); + } + + default PageResult selectPage1(CrmCustomerPageReqVO pageReqVO, Long userId) { + LambdaQueryWrapperX queryWrapperX = new LambdaQueryWrapperX<>(); + //queryWrapperX.sql + if (pageReqVO.getPool()) { // 情况一:公海 + queryWrapperX.isNull(CrmCustomerDO::getOwnerUserId); + } else {// 情况一:不是公海 + queryWrapperX.isNotNull(CrmCustomerDO::getOwnerUserId); + } + return selectPage(pageReqVO, queryWrapperX .likeIfPresent(CrmCustomerDO::getName, pageReqVO.getName()) .eqIfPresent(CrmCustomerDO::getMobile, pageReqVO.getMobile()) .eqIfPresent(CrmCustomerDO::getIndustryId, pageReqVO.getIndustryId()) @@ -33,11 +53,50 @@ public interface CrmCustomerMapper extends BaseMapperX { } default PageResult selectPage(CrmCustomerPageReqVO pageReqVO, Long userId) { - // MyBatis Plus 查询 IPage mpPage = MyBatisUtils.buildPage(pageReqVO); MPJLambdaWrapperX mpjLambdaWrapperX = new MPJLambdaWrapperX<>(); // 构建数据权限连表条件 - CrmPermissionUtils.builderLeftJoinQuery(mpjLambdaWrapperX, CrmBizTypeEnum.CRM_CUSTOMER.getType(), userId); + //CrmPermissionUtils.builderRightJoinQuery(mpjLambdaWrapperX, CrmBizTypeEnum.CRM_CUSTOMER.getType(), userId); + mpjLambdaWrapperX + //.rightJoin("(SELECT t1.biz_id FROM crm_permission t1 WHERE (t1.biz_type = 1 AND t1.user_id = 1)) t2 on t.id = t2.biz_id"); + .rightJoin(CrmPermissionDO.class, CrmPermissionDO::getBizId, CrmCustomerDO::getId) + .eq(CrmPermissionDO::getBizType, CrmBizTypeEnum.CRM_CUSTOMER.getType()) + .eq(CrmPermissionDO::getUserId, userId); + /** TODO @芋艿: + -- 常规连表-查询正常 + | ==> Preparing: + SELECT t.id, t.name, t.follow_up_status, t.lock_status, t.deal_status, + t.industry_id, t.level, t.source, t.mobile, t.telephone, t.website, + t.qq, t.wechat, t.email, t.description, t.remark, t.owner_user_id, + t.area_id, t.detail_address, t.contact_last_time, t.contact_next_time, + t.create_time, t.update_time, t.creator, t.updater, t.deleted + FROM crm_customer t RIGHT JOIN crm_permission t1 ON (t1.biz_id = t.id) AND t.tenant_id = 1 + WHERE t.deleted = 0 AND t1.deleted = 0 + AND (t1.biz_type = ? AND t1.user_id = ? + AND t.owner_user_id IS NOT NULL AND t.level = ?) AND t1.tenant_id = 1 LIMIT ? + | ==> Parameters: 2(Integer), 1(Long), 3(Integer), 10(Long) + + -- 连接子查询-报错,但是复制到 navicat 是可以正常执行的 + -- 区别点:常规连表会自动拼接租户 AND t.tenant_id = 1 + SELECT + t.id,t.name,t.follow_up_status,t.lock_status,t.deal_status,t.industry_id,t.level, + t.source,t.mobile,t.telephone,t.website,t.qq,t.wechat,t.email,t.description,t.remark, + t.owner_user_id,t.area_id,t.detail_address,t.contact_last_time,t.contact_next_time, + t.create_time,t.update_time,t.creator,t.updater,t.deleted + FROM crm_customer t + RIGHT JOIN (SELECT t1.biz_id FROM crm_permission t1 WHERE (t1.biz_type = 2 AND t1.user_id = 1)) t2 on t.id = t2.biz_id + WHERE t.deleted=0 + AND (t.owner_user_id IS NOT NULL) + */ + if (pageReqVO.getPool()) { // 情况一:公海 + mpjLambdaWrapperX.isNull(CrmCustomerDO::getOwnerUserId); + } else {// 情况一:不是公海 + mpjLambdaWrapperX.isNotNull(CrmCustomerDO::getOwnerUserId); + } + // TODO 场景数据过滤 + if (CrmSceneEnum.isOwner(pageReqVO.getSceneType())) { // 场景一:我负责的数据 + mpjLambdaWrapperX.eq(CrmCustomerDO::getOwnerUserId, userId); + } mpPage = selectJoinPage(mpPage, CrmCustomerDO.class, mpjLambdaWrapperX .selectAll(CrmCustomerDO.class) .likeIfPresent(CrmCustomerDO::getName, pageReqVO.getName()) 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 131a03ce4..e555896f1 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 @@ -39,6 +39,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { private CrmPermissionService crmPermissionService; @Override + @Transactional(rollbackFor = Exception.class) public Long createCustomer(CrmCustomerCreateReqVO createReqVO, Long userId) { // 插入 CrmCustomerDO customer = CrmCustomerConvert.INSTANCE.convert(createReqVO); @@ -89,32 +90,19 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @Override public PageResult getCustomerPage(CrmCustomerPageReqVO pageReqVO, Long userId) { - //// 1.1 TODO 如果是超级管理员 - //boolean admin = false; - //if (admin && ObjUtil.notEqual(userId, CrmPermissionDO.POOL_USER_ID)) { - // return customerMapper.selectPage(pageReqVO, Collections.emptyList()); - //} - //// 1.2 获取当前用户能看的分页数据 - //// TODO @puhui999:如果业务的数据量比较大,in 太多可能有性能问题噢;看看是不是搞成 join 连表了;可以微信讨论下; - //List permissions = crmPermissionService.getPermissionListByBizTypeAndUserId( - // CrmBizTypeEnum.CRM_CUSTOMER.getType(), userId); - //// 1.3 TODO 场景数据过滤 - //if (CrmCustomerSceneEnum.isOwner(pageReqVO.getSceneType())) { // 场景一:我负责的数据 - // permissions = CollectionUtils.filterList(permissions, item -> CrmPermissionLevelEnum.isOwner(item.getLevel())); - //} - //Set ids = convertSet(permissions, CrmPermissionDO::getBizId); - //if (CollUtil.isEmpty(ids)) { // 没得说明没有什么给他看的 - // return PageResult.empty(); - //} - // - //// 2. 获取客户分页数据 - //return customerMapper.selectPage(pageReqVO, ids); + // 1.1. TODO 如果是超级管理员 + boolean admin = false; + if (admin) { + return customerMapper.selectPage(pageReqVO); + } + // 1.2. 获取当前用户能看的分页数据 return customerMapper.selectPage(pageReqVO, userId); } @Override public List getCustomerList(CrmCustomerExportReqVO exportReqVO) { //return customerMapper.selectList(exportReqVO); + // TODO puhui999: 等数据权限完善后再实现 return Collections.emptyList(); } @@ -161,13 +149,13 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @Override @Transactional(rollbackFor = Exception.class) - public void receive(List ids) { - transferCustomerOwner(ids,SecurityFrameworkUtils.getLoginUserId()); + public void receive(List ids) { + transferCustomerOwner(ids, SecurityFrameworkUtils.getLoginUserId()); } @Override - public void distributeByIds(List cIds, Long ownerId) { - transferCustomerOwner(cIds,ownerId); + public void distributeByIds(List cIds, Long ownerId) { + transferCustomerOwner(cIds, ownerId); } @Override @@ -191,6 +179,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { } @Override + @Transactional(rollbackFor = Exception.class) @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#id", level = CrmPermissionLevelEnum.OWNER) public void putPool(Long id) { // 1. 校验存在 @@ -214,7 +203,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { CrmPermissionLevelEnum.OWNER.getLevel()); } - private void transferCustomerOwner(List cIds, Long ownerId){ + private void transferCustomerOwner(List cIds, Long ownerId) { // 先一次性校验完成客户是否可用 // TODO @xiaqing:批量一次性加载客户列表,然后去逐个校验; for (Long cId : cIds) { @@ -228,8 +217,8 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { validCustomerDeal(cId); } // TODO @xiaqing:每个客户更新的时候,where 条件,加上 owner_user_id is null,防止并发问题; - List updateDos = new ArrayList <>(); - for (Long cId : cIds){ + List updateDos = new ArrayList<>(); + for (Long cId : cIds) { CrmCustomerDO customerDO = new CrmCustomerDO(); customerDO.setId(cId); customerDO.setOwnerUserId(SecurityFrameworkUtils.getLoginUserId()); @@ -239,19 +228,19 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { } private void validCustomerOwnerExist(Long id) { - if (customerMapper.selectById(id).getOwnerUserId()!=null) { + if (customerMapper.selectById(id).getOwnerUserId() != null) { throw exception(CUSTOMER_OWNER_EXISTS); } } private void validCustomerIsLocked(Long id) { - if (customerMapper.selectById(id).getLockStatus() ==true) { + if (customerMapper.selectById(id).getLockStatus() == true) { throw exception(CUSTOMER_LOCKED); } } private void validCustomerDeal(Long id) { - if (customerMapper.selectById(id).getDealStatus() ==true) { + if (customerMapper.selectById(id).getDealStatus() == true) { throw exception(CUSTOMER_ALREADY_DEAL); } } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmPermissionUtils.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmPermissionUtils.java index d2ec9e04c..675c507be 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmPermissionUtils.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmPermissionUtils.java @@ -17,13 +17,10 @@ public class CrmPermissionUtils { * @param bizTyp 模块类型 * @param userId 用户 */ - public static void builderLeftJoinQuery(MPJLambdaWrapper mpjLambdaWrapper, Integer bizTyp, Long userId) { + public static void builderRightJoinQuery(MPJLambdaWrapper mpjLambdaWrapper, Integer bizTyp, Long userId) { + String querySql = "(SELECT t1.biz_id FROM crm_permission t1 WHERE (t1.biz_type = {} AND t1.user_id = {})) t2 on t.id = t2.biz_id"; // 默认主表别名是 t - mpjLambdaWrapper.leftJoin(StrUtil.format("(" + - "select p.biz_id from crm_permission p" + - " where p.biz_type = {} and p.user_id = {}" + - ") t2" + - " on t.id = t2.biz_id", bizTyp, userId)); + mpjLambdaWrapper.rightJoin(StrUtil.format(querySql, bizTyp, userId)); } } From 4e1d9d62926e054216f7d6e9d8c94075a6efcb30 Mon Sep 17 00:00:00 2001 From: ljlleo Date: Fri, 24 Nov 2023 14:24:04 +0800 Subject: [PATCH 06/35] =?UTF-8?q?=E5=95=86=E6=9C=BA=E3=80=81=E5=95=86?= =?UTF-8?q?=E6=9C=BA=E7=8A=B6=E6=80=81=E7=B1=BB=E5=9E=8B=E5=92=8C=E5=95=86?= =?UTF-8?q?=E6=9C=BA=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/crm/enums/ErrorCodeConstants.java | 9 +- .../admin/business/CrmBusinessController.java | 36 +++++- .../CrmBusinessStatusTypeController.java | 82 ++++++++---- .../admin/business/vo/CrmBusinessRespVO.java | 9 ++ .../vo/CrmBusinessStatusPageReqVO.java | 5 +- .../business/vo/CrmBusinessStatusQueryVO.java | 19 +++ .../business/vo/CrmBusinessStatusRespVO.java | 33 +++++ .../vo/CrmBusinessStatusSaveReqVO.java | 30 +++++ .../vo/CrmBusinessStatusTypePageReqVO.java | 8 +- .../vo/CrmBusinessStatusTypeQueryVO.java | 19 +++ .../vo/CrmBusinessStatusTypeRespVO.java | 44 +++++++ .../vo/CrmBusinessStatusTypeSaveReqVO.java | 27 ++++ .../CrmBusinessStatusController.java | 119 ----------------- .../vo/CrmBusinessStatusBaseVO.java | 33 ----- .../vo/CrmBusinessStatusCreateReqVO.java | 14 -- .../vo/CrmBusinessStatusExcelVO.java | 30 ----- .../vo/CrmBusinessStatusExportReqVO.java | 23 ---- .../vo/CrmBusinessStatusRespVO.java | 15 --- .../vo/CrmBusinessStatusUpdateReqVO.java | 20 --- .../vo/CrmBusinessStatusTypeBaseVO.java | 27 ---- .../vo/CrmBusinessStatusTypeCreateReqVO.java | 15 --- .../vo/CrmBusinessStatusTypeExcelVO.java | 32 ----- .../vo/CrmBusinessStatusTypeExportReqVO.java | 29 ----- .../vo/CrmBusinessStatusTypeRespVO.java | 19 --- .../vo/CrmBusinessStatusTypeUpdateReqVO.java | 21 --- .../convert/business/CrmBusinessConvert.java | 20 +++ .../CrmBusinessStatusConvert.java | 16 +-- .../CrmBusinessStatusTypeConvert.java | 38 ++++-- .../dataobject/business/CrmBusinessDO.java | 2 - .../CrmBusinessStatusDO.java | 4 +- .../CrmBusinessStatusTypeDO.java | 17 ++- .../business/CrmBusinessStatusMapper.java | 38 ++++++ .../business/CrmBusinessStatusTypeMapper.java | 31 +++++ .../CrmBusinessStatusMapper.java | 40 ------ .../CrmBusinessStatusTypeMapper.java | 41 ------ .../dal/mysql/customer/CrmCustomerMapper.java | 6 + .../business/CrmBusinessStatusService.java | 65 ++++++++++ .../CrmBusinessStatusServiceImpl.java | 79 ++++++++++++ .../CrmBusinessStatusTypeService.java | 64 +++++++++ .../CrmBusinessStatusTypeServiceImpl.java | 121 ++++++++++++++++++ .../CrmBusinessStatusService.java | 90 ------------- .../CrmBusinessStatusServiceImpl.java | 99 -------------- .../CrmBusinessStatusTypeService.java | 83 ------------ .../CrmBusinessStatusTypeServiceImpl.java | 98 -------------- .../service/customer/CrmCustomerService.java | 9 ++ .../customer/CrmCustomerServiceImpl.java | 12 +- .../BusinessStatusTypeServiceImplTest.java | 117 +++++++++++++++++ 47 files changed, 883 insertions(+), 925 deletions(-) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/{businessstatustype => business}/CrmBusinessStatusTypeController.java (59%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/{businessstatus => business}/vo/CrmBusinessStatusPageReqVO.java (70%) create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusQueryVO.java create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusRespVO.java create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusSaveReqVO.java rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/{businessstatustype => business}/vo/CrmBusinessStatusTypePageReqVO.java (61%) create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypeQueryVO.java create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypeRespVO.java create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypeSaveReqVO.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/CrmBusinessStatusController.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusBaseVO.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusCreateReqVO.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusExcelVO.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusExportReqVO.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusRespVO.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusUpdateReqVO.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeBaseVO.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeCreateReqVO.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeExcelVO.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeExportReqVO.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeRespVO.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeUpdateReqVO.java rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/{businessstatus => business}/CrmBusinessStatusDO.java (87%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/{businessstatustype => business}/CrmBusinessStatusTypeDO.java (57%) create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessStatusMapper.java create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessStatusTypeMapper.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/businessstatus/CrmBusinessStatusMapper.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/businessstatustype/CrmBusinessStatusTypeMapper.java create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusService.java create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusServiceImpl.java create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusTypeService.java create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusTypeServiceImpl.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/businessstatus/CrmBusinessStatusService.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/businessstatus/CrmBusinessStatusServiceImpl.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/businessstatustype/CrmBusinessStatusTypeService.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/businessstatustype/CrmBusinessStatusTypeServiceImpl.java create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/business/BusinessStatusTypeServiceImplTest.java diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java index b04644a41..ada4ecc1e 100644 --- a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java @@ -20,8 +20,6 @@ public interface ErrorCodeConstants { // TODO @lilleo:商机状态、商机类型,都单独错误码段 - ErrorCode BUSINESS_STATUS_TYPE_NOT_EXISTS = new ErrorCode(1_020_002_001, "商机状态类型不存在"); - ErrorCode BUSINESS_STATUS_NOT_EXISTS = new ErrorCode(1_020_002_002, "商机状态不存在"); // ========== 联系人管理 1-020-003-000 ========== ErrorCode CONTACT_NOT_EXISTS = new ErrorCode(1_020_003_000, "联系人不存在"); @@ -54,4 +52,11 @@ public interface ErrorCodeConstants { // ========== 产品分类 1_020_009_000 ========== ErrorCode PRODUCT_CATEGORY_NOT_EXISTS = new ErrorCode(1_020_009_000, "产品分类不存在"); + // ========== 商机状态类型 1_020_010_000 ========== + ErrorCode BUSINESS_STATUS_TYPE_NOT_EXISTS = new ErrorCode(1_020_010_000, "商机状态类型不存在"); + ErrorCode BUSINESS_STATUS_TYPE_NAME_EXISTS = new ErrorCode(1_020_010_001, "商机状态类型名称已存在"); + + // ========== 商机状态 1_020_011_000 ========== + ErrorCode BUSINESS_STATUS_NOT_EXISTS = new ErrorCode(1_020_011_000, "商机状态不存在"); + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java index 49c99991e..713b562b3 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java @@ -7,8 +7,14 @@ import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.module.crm.controller.admin.business.vo.*; 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; +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusTypeDO; +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService; +import cn.iocoder.yudao.module.crm.service.business.CrmBusinessStatusService; +import cn.iocoder.yudao.module.crm.service.business.CrmBusinessStatusTypeService; +import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -21,6 +27,9 @@ import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; @@ -35,6 +44,15 @@ public class CrmBusinessController { @Resource private CrmBusinessService businessService; + @Resource + private CrmCustomerService customerService; + + @Resource + private CrmBusinessStatusTypeService businessStatusTypeService; + + @Resource + private CrmBusinessStatusService businessStatusService; + @PostMapping("/create") @Operation(summary = "创建商机") @PreAuthorize("@ss.hasPermission('crm:business:create')") @@ -73,7 +91,23 @@ public class CrmBusinessController { @PreAuthorize("@ss.hasPermission('crm:business:query')") public CommonResult> getBusinessPage(@Valid CrmBusinessPageReqVO pageVO) { PageResult pageResult = businessService.getBusinessPage(pageVO, getLoginUserId()); - return success(CrmBusinessConvert.INSTANCE.convertPage(pageResult)); + //处理客户名称回显 + Set customerIds = pageResult.getList().stream() + .map(CrmBusinessDO::getCustomerId).filter(Objects::nonNull).collect(Collectors.toSet()); + List customerList = customerService.getCustomerList(customerIds); + //处理商机状态类型名称回显 + Set statusTypeIds = pageResult.getList().stream() + .map(CrmBusinessDO::getStatusTypeId).filter(Objects::nonNull).collect(Collectors.toSet()); + CrmBusinessStatusTypeQueryVO queryStatusTypeVO = new CrmBusinessStatusTypeQueryVO(); + queryStatusTypeVO.setIdList(statusTypeIds); + List statusTypeList = businessStatusTypeService.selectList(queryStatusTypeVO); + //处理商机状态名称回显 + Set statusIds = pageResult.getList().stream() + .map(CrmBusinessDO::getCustomerId).filter(Objects::nonNull).collect(Collectors.toSet()); + CrmBusinessStatusQueryVO queryVO = new CrmBusinessStatusQueryVO(); + queryVO.setIdList(statusIds); + List statusList = businessStatusService.selectList(queryVO); + return success(CrmBusinessConvert.INSTANCE.convertPage(pageResult, customerList, statusTypeList, statusList)); } @GetMapping("/pool-page") diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/CrmBusinessStatusTypeController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessStatusTypeController.java similarity index 59% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/CrmBusinessStatusTypeController.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessStatusTypeController.java index 25ba7448f..af35eb62e 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/CrmBusinessStatusTypeController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessStatusTypeController.java @@ -1,14 +1,21 @@ -package cn.iocoder.yudao.module.crm.controller.admin.businessstatustype; +package cn.iocoder.yudao.module.crm.controller.admin.business; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 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.businessstatustype.vo.*; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.*; +import cn.iocoder.yudao.module.crm.convert.businessstatus.CrmBusinessStatusConvert; import cn.iocoder.yudao.module.crm.convert.businessstatustype.CrmBusinessStatusTypeConvert; -import cn.iocoder.yudao.module.crm.dal.dataobject.businessstatustype.CrmBusinessStatusTypeDO; -import cn.iocoder.yudao.module.crm.service.businessstatustype.CrmBusinessStatusTypeService; +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO; +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusTypeDO; +import cn.iocoder.yudao.module.crm.service.business.CrmBusinessStatusService; +import cn.iocoder.yudao.module.crm.service.business.CrmBusinessStatusTypeService; +import cn.iocoder.yudao.module.system.api.dept.DeptApi; +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -22,11 +29,13 @@ import javax.validation.Valid; import java.io.IOException; import java.util.Collection; import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -// TODO @lilleo:这个模块,可以挪到 business 下;这样我打开 business 包下,就知道,噢~原来里面有 business 商机、有 type 状态类型、status 具体状态; @Tag(name = "管理后台 - 商机状态类型") @RestController @RequestMapping("/crm/business-status-type") @@ -36,17 +45,23 @@ public class CrmBusinessStatusTypeController { @Resource private CrmBusinessStatusTypeService businessStatusTypeService; + @Resource + private CrmBusinessStatusService businessStatusService; + + @Resource + private DeptApi deptApi; + @PostMapping("/create") @Operation(summary = "创建商机状态类型") @PreAuthorize("@ss.hasPermission('crm:business-status-type:create')") - public CommonResult createBusinessStatusType(@Valid @RequestBody CrmBusinessStatusTypeCreateReqVO createReqVO) { + public CommonResult createBusinessStatusType(@Valid @RequestBody CrmBusinessStatusTypeSaveReqVO createReqVO) { return success(businessStatusTypeService.createBusinessStatusType(createReqVO)); } @PutMapping("/update") @Operation(summary = "更新商机状态类型") @PreAuthorize("@ss.hasPermission('crm:business-status-type:update')") - public CommonResult updateBusinessStatusType(@Valid @RequestBody CrmBusinessStatusTypeUpdateReqVO updateReqVO) { + public CommonResult updateBusinessStatusType(@Valid @RequestBody CrmBusinessStatusTypeSaveReqVO updateReqVO) { businessStatusTypeService.updateBusinessStatusType(updateReqVO); return success(true); } @@ -66,45 +81,58 @@ public class CrmBusinessStatusTypeController { @PreAuthorize("@ss.hasPermission('crm:business-status-type:query')") public CommonResult getBusinessStatusType(@RequestParam("id") Long id) { CrmBusinessStatusTypeDO businessStatusType = businessStatusTypeService.getBusinessStatusType(id); - return success(CrmBusinessStatusTypeConvert.INSTANCE.convert(businessStatusType)); - } - - // TODO @lilleo:这个接口,暂时用不到,可以考虑先删除掉 - @GetMapping("/list") - @Operation(summary = "获得商机状态类型列表") - @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") - @PreAuthorize("@ss.hasPermission('crm:business-status-type:query')") - public CommonResult> getBusinessStatusTypeList(@RequestParam("ids") Collection ids) { - List list = businessStatusTypeService.getBusinessStatusTypeList(ids); - return success(CrmBusinessStatusTypeConvert.INSTANCE.convertList(list)); + //处理状态回显 + CrmBusinessStatusQueryVO queryVO = new CrmBusinessStatusQueryVO(); + queryVO.setTypeId(id); + List statusList = businessStatusService.selectList(queryVO); + return success(CrmBusinessStatusTypeConvert.INSTANCE.convert(businessStatusType, statusList)); } @GetMapping("/page") @Operation(summary = "获得商机状态类型分页") @PreAuthorize("@ss.hasPermission('crm:business-status-type:query')") - public CommonResult> getBusinessStatusTypePage(@Valid CrmBusinessStatusTypePageReqVO pageVO) { - PageResult pageResult = businessStatusTypeService.getBusinessStatusTypePage(pageVO); - return success(CrmBusinessStatusTypeConvert.INSTANCE.convertPage(pageResult)); + public CommonResult> getBusinessStatusTypePage(@Valid CrmBusinessStatusTypePageReqVO pageReqVO) { + PageResult pageResult = businessStatusTypeService.getBusinessStatusTypePage(pageReqVO); + //处理部门回显 + Set deptIds = pageResult.getList().stream() + .map(CrmBusinessStatusTypeDO::getDeptIds) + .filter(Objects::nonNull) + .flatMap(Collection::stream) + .collect(Collectors.toSet()); + List deptList = deptApi.getDeptList(deptIds); + return success(CrmBusinessStatusTypeConvert.INSTANCE.convertPage(pageResult, deptList)); } @GetMapping("/export-excel") @Operation(summary = "导出商机状态类型 Excel") @PreAuthorize("@ss.hasPermission('crm:business-status-type:export')") @OperateLog(type = EXPORT) - public void exportBusinessStatusTypeExcel(@Valid CrmBusinessStatusTypeExportReqVO exportReqVO, + public void exportBusinessStatusTypeExcel(@Valid CrmBusinessStatusTypePageReqVO pageReqVO, HttpServletResponse response) throws IOException { - List list = businessStatusTypeService.getBusinessStatusTypeList(exportReqVO); + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = businessStatusTypeService.getBusinessStatusTypePage(pageReqVO).getList(); // 导出 Excel - List datas = CrmBusinessStatusTypeConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "商机状态类型.xls", "数据", CrmBusinessStatusTypeExcelVO.class, datas); + ExcelUtils.write(response, "商机状态类型.xls", "数据", CrmBusinessStatusTypeRespVO.class, + BeanUtils.toBean(list, CrmBusinessStatusTypeRespVO.class)); } @GetMapping("/get-simple-list") @Operation(summary = "获得商机状态类型列表") @PreAuthorize("@ss.hasPermission('crm:business-status-type:query')") public CommonResult> getBusinessStatusTypeList() { - List list = businessStatusTypeService.getBusinessStatusTypeListByStatus(CommonStatusEnum.ENABLE.getStatus()); - return success(CrmBusinessStatusTypeConvert.INSTANCE.convertList(list)); + CrmBusinessStatusTypeQueryVO queryVO = new CrmBusinessStatusTypeQueryVO(); + queryVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + List list = businessStatusTypeService.selectList(queryVO); + return success(BeanUtils.toBean(list, CrmBusinessStatusTypeRespVO.class)); } + @GetMapping("/get-status-list") + @Operation(summary = "获得商机状态列表") + @PreAuthorize("@ss.hasPermission('crm:business-status:query')") + public CommonResult> getBusinessStatusListByTypeId(@RequestParam("typeId") Long typeId) { + CrmBusinessStatusQueryVO queryVO = new CrmBusinessStatusQueryVO(); + queryVO.setTypeId(typeId); + List list = businessStatusService.selectList(queryVO); + return success(CrmBusinessStatusConvert.INSTANCE.convertList(list)); + } } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessRespVO.java index 672f99ec3..57efd8e16 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessRespVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessRespVO.java @@ -16,4 +16,13 @@ public class CrmBusinessRespVO extends CrmBusinessBaseVO { @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) private LocalDateTime createTime; + @Schema(description = "客户名称") + private String customerName; + + @Schema(description = "状态类型名称") + private String statusTypeName; + + @Schema(description = "状态名称") + private String statusName; + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusPageReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusPageReqVO.java similarity index 70% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusPageReqVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusPageReqVO.java index af03512af..72e754eab 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusPageReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo; +package cn.iocoder.yudao.module.crm.controller.admin.business.vo; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.v3.oas.annotations.media.Schema; @@ -12,7 +12,4 @@ import lombok.ToString; @ToString(callSuper = true) public class CrmBusinessStatusPageReqVO extends PageParam { - @Schema(description = "状态类型编号", example = "22882") - private Long typeId; - } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusQueryVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusQueryVO.java new file mode 100644 index 000000000..0801b3fe4 --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusQueryVO.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.module.crm.controller.admin.business.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.util.Collection; + +@Schema(description = "管理后台 - 商机状态 Query VO") +@Data +@ToString(callSuper = true) +public class CrmBusinessStatusQueryVO { + + @Schema(description = "主键集合") + private Collection idList; + + @Schema(description = "状态类型编号") + private Long typeId; +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusRespVO.java new file mode 100644 index 000000000..d490d2bcc --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusRespVO.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.crm.controller.admin.business.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 商机状态 Response VO") +@Data +@ExcelIgnoreUnannotated +public class CrmBusinessStatusRespVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "23899") + @ExcelProperty("主键") + private Long id; + + @Schema(description = "状态类型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "7139") + @ExcelProperty("状态类型编号") + private Long typeId; + + @Schema(description = "状态名", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") + @ExcelProperty("状态名") + private String name; + + @Schema(description = "赢单率") + @ExcelProperty("赢单率") + private String percent; + + @Schema(description = "排序") + @ExcelProperty("排序") + private Integer sort; + +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusSaveReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusSaveReqVO.java new file mode 100644 index 000000000..9a3362291 --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusSaveReqVO.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.crm.controller.admin.business.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 商机状态新增/修改 Request VO") +@Data +public class CrmBusinessStatusSaveReqVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "23899") + private Long id; + + @Schema(description = "状态类型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "7139") + @NotNull(message = "状态类型编号不能为空") + private Long typeId; + + @Schema(description = "状态名", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") + @NotEmpty(message = "状态名不能为空") + private String name; + + @Schema(description = "赢单率") + private String percent; + + @Schema(description = "排序") + private Integer sort; + +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypePageReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypePageReqVO.java similarity index 61% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypePageReqVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypePageReqVO.java index 4b15210ac..3e02fa5ac 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypePageReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypePageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo; +package cn.iocoder.yudao.module.crm.controller.admin.business.vo; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.v3.oas.annotations.media.Schema; @@ -12,10 +12,4 @@ import lombok.ToString; @ToString(callSuper = true) public class CrmBusinessStatusTypePageReqVO extends PageParam { - @Schema(description = "状态类型名", example = "芋艿") - private String name; - - @Schema(description = "开启状态", example = "1") - private Boolean status; - } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypeQueryVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypeQueryVO.java new file mode 100644 index 000000000..321a48426 --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypeQueryVO.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.module.crm.controller.admin.business.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.util.Collection; + +@Schema(description = "管理后台 - 商机状态类型 Query VO") +@Data +@ToString(callSuper = true) +public class CrmBusinessStatusTypeQueryVO { + + @Schema(description = "主键集合") + private Collection idList; + + @Schema(description = "状态") + private Integer status; +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypeRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypeRespVO.java new file mode 100644 index 000000000..0a43af12e --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypeRespVO.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.module.crm.controller.admin.business.vo; + +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - 商机状态类型 Response VO") +@Data +@ExcelIgnoreUnannotated +public class CrmBusinessStatusTypeRespVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "2934") + @ExcelProperty("主键") + private Long id; + + @Schema(description = "状态类型名", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") + @ExcelProperty("状态类型名") + private String name; + + @Schema(description = "使用的部门名称", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("使用的部门名称") + private List deptNames; + + @Schema(description = "使用的部门编号", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("使用的部门编号") + private List deptIds; + + @Schema(description = "创建人", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建人") + private String creator; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @Schema(description = "状态集合", requiredMode = Schema.RequiredMode.REQUIRED) + private List statusList; + +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypeSaveReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypeSaveReqVO.java new file mode 100644 index 000000000..58e8f4229 --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypeSaveReqVO.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.crm.controller.admin.business.vo; + +import com.google.common.collect.Lists; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import java.util.List; + +@Schema(description = "管理后台 - 商机状态类型新增/修改 Request VO") +@Data +public class CrmBusinessStatusTypeSaveReqVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "2934") + private Long id; + + @Schema(description = "状态类型名", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") + @NotEmpty(message = "状态类型名不能为空") + private String name; + + @Schema(description = "使用的部门编号", requiredMode = Schema.RequiredMode.REQUIRED) + private List deptIds = Lists.newArrayList(); + + @Schema(description = "商机状态集合", requiredMode = Schema.RequiredMode.REQUIRED) + private List statusList = Lists.newArrayList(); + +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/CrmBusinessStatusController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/CrmBusinessStatusController.java deleted file mode 100644 index 275285098..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/CrmBusinessStatusController.java +++ /dev/null @@ -1,119 +0,0 @@ -package cn.iocoder.yudao.module.crm.controller.admin.businessstatus; - -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.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo.*; -import cn.iocoder.yudao.module.crm.convert.businessstatus.CrmBusinessStatusConvert; -import cn.iocoder.yudao.module.crm.dal.dataobject.businessstatus.CrmBusinessStatusDO; -import cn.iocoder.yudao.module.crm.service.businessstatus.CrmBusinessStatusService; -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.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.IOException; -import java.util.Collection; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; - -// TODO @lilleo:这个模块,可以挪到 business 下;这样我打开 business 包下,就知道,噢~原来里面有 business 商机、有 type 状态类型、status 具体状态; -@Tag(name = "管理后台 - 商机状态") -@RestController -@RequestMapping("/crm/business-status") -@Validated -public class CrmBusinessStatusController { - - @Resource - private CrmBusinessStatusService businessStatusService; - - @PostMapping("/create") - @Operation(summary = "创建商机状态") - @PreAuthorize("@ss.hasPermission('crm:business-status:create')") - public CommonResult createBusinessStatus(@Valid @RequestBody CrmBusinessStatusCreateReqVO createReqVO) { - return success(businessStatusService.createBusinessStatus(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新商机状态") - @PreAuthorize("@ss.hasPermission('crm:business-status:update')") - public CommonResult updateBusinessStatus(@Valid @RequestBody CrmBusinessStatusUpdateReqVO updateReqVO) { - businessStatusService.updateBusinessStatus(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除商机状态") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('crm:business-status:delete')") - public CommonResult deleteBusinessStatus(@RequestParam("id") Long id) { - businessStatusService.deleteBusinessStatus(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得商机状态") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('crm:business-status:query')") - public CommonResult getBusinessStatus(@RequestParam("id") Long id) { - CrmBusinessStatusDO businessStatus = businessStatusService.getBusinessStatus(id); - return success(CrmBusinessStatusConvert.INSTANCE.convert(businessStatus)); - } - - // TODO @lilleo:这个接口,暂时用不到,可以考虑先删除掉 - @GetMapping("/list") - @Operation(summary = "获得商机状态列表") - @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") - @PreAuthorize("@ss.hasPermission('crm:business-status:query')") - public CommonResult> getBusinessStatusList(@RequestParam("ids") Collection ids) { - List list = businessStatusService.getBusinessStatusList(ids); - return success(CrmBusinessStatusConvert.INSTANCE.convertList(list)); - } - - @GetMapping("/page") - @Operation(summary = "获得商机状态分页") - @PreAuthorize("@ss.hasPermission('crm:business-status:query')") - public CommonResult> getBusinessStatusPage(@Valid CrmBusinessStatusPageReqVO pageVO) { - PageResult pageResult = businessStatusService.getBusinessStatusPage(pageVO); - return success(CrmBusinessStatusConvert.INSTANCE.convertPage(pageResult)); - } - - @GetMapping("/export-excel") - @Operation(summary = "导出商机状态 Excel") - @PreAuthorize("@ss.hasPermission('crm:business-status:export')") - @OperateLog(type = EXPORT) - public void exportBusinessStatusExcel(@Valid CrmBusinessStatusExportReqVO exportReqVO, - HttpServletResponse response) throws IOException { - List list = businessStatusService.getBusinessStatusList(exportReqVO); - // 导出 Excel - List datas = CrmBusinessStatusConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "商机状态.xls", "数据", CrmBusinessStatusExcelVO.class, datas); - } - - // TODO 芋艿:后续再看看 - @GetMapping("/get-simple-list") - @Operation(summary = "获得商机状态列表") - @PreAuthorize("@ss.hasPermission('crm:business-status:query')") - public CommonResult> getBusinessStatusListByTypeId(@RequestParam("typeId") Integer typeId) { - List list = businessStatusService.getBusinessStatusListByTypeId(typeId); - return success(CrmBusinessStatusConvert.INSTANCE.convertList(list)); - } - - // TODO 芋艿:后续再看看 - @GetMapping("/get-all-list") - @Operation(summary = "获得商机状态列表") - @PreAuthorize("@ss.hasPermission('crm:business-status:query')") - public CommonResult> getBusinessStatusList() { - List list = businessStatusService.getBusinessStatusList(); - return success(CrmBusinessStatusConvert.INSTANCE.convertList(list)); - } - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusBaseVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusBaseVO.java deleted file mode 100644 index 401e35fbe..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusBaseVO.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** - * 商机状态 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class CrmBusinessStatusBaseVO { - - // TODO @lilleo:example 要写下 - - @Schema(description = "状态类型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "22882") - @NotNull(message = "状态类型编号不能为空") - private Long typeId; - - @Schema(description = "状态名", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") - @NotNull(message = "状态名不能为空") - private String name; - - // TODO @lilleo:percent 应该是 Integer; - @Schema(description = "赢单率") - private String percent; - - // TODO @lilleo:这个是不是不用前端新增和修改的时候传递,交给顺序计算出来,存储起来就好了; - @Schema(description = "排序") - private Integer sort; - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusCreateReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusCreateReqVO.java deleted file mode 100644 index 04e999474..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusCreateReqVO.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo; - -import lombok.*; -import java.util.*; -import io.swagger.v3.oas.annotations.media.Schema; -import javax.validation.constraints.*; - -@Schema(description = "管理后台 - 商机状态创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class CrmBusinessStatusCreateReqVO extends CrmBusinessStatusBaseVO { - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusExcelVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusExcelVO.java deleted file mode 100644 index 78da092f7..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusExcelVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo; - -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.Data; - -// TODO @lilleo:这个暂时不需要;嘿嘿~不是每个模块都需要导出哈 -/** - * 商机状态 Excel VO - * - * @author ljlleo - */ -@Data -public class CrmBusinessStatusExcelVO { - - @ExcelProperty("主键") - private Long id; - - @ExcelProperty("状态类型编号") - private Long typeId; - - @ExcelProperty("状态名") - private String name; - - @ExcelProperty("赢单率") - private String percent; - - @ExcelProperty("排序") - private Integer sort; - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusExportReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusExportReqVO.java deleted file mode 100644 index 7f7fba6c7..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusExportReqVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -// TODO @lilleo:这个暂时不需要;嘿嘿~不是每个模块都需要导出哈 -@Schema(description = "管理后台 - 商机状态 Excel 导出 Request VO,参数和 CrmBusinessStatusPageReqVO 是一致的") -@Data -public class CrmBusinessStatusExportReqVO { - - @Schema(description = "状态类型编号", example = "22882") - private Long typeId; - - @Schema(description = "状态名", example = "李四") - private String name; - - @Schema(description = "赢单率") - private String percent; - - @Schema(description = "排序") - private Integer sort; - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusRespVO.java deleted file mode 100644 index 54f675272..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusRespVO.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; - -@Schema(description = "管理后台 - 商机状态 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class CrmBusinessStatusRespVO extends CrmBusinessStatusBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "6802") - private Long id; - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusUpdateReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusUpdateReqVO.java deleted file mode 100644 index 429902164..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusUpdateReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 商机状态更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class CrmBusinessStatusUpdateReqVO extends CrmBusinessStatusBaseVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "6802") - @NotNull(message = "编号不能为空") - private Long id; - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeBaseVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeBaseVO.java deleted file mode 100644 index c472a3471..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeBaseVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** - * 商机状态类型 Base VO,提供给添加、修改、详细的子 VO 使用 - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 - */ -@Data -public class CrmBusinessStatusTypeBaseVO { - - @Schema(description = "状态类型名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") - @NotNull(message = "状态类型名不能为空") - private String name; - - @Schema(description = "使用的部门编号", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "使用的部门编号不能为空") - private String deptIds; - - @Schema(description = "开启状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "开启状态不能为空") - private Boolean status; - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeCreateReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeCreateReqVO.java deleted file mode 100644 index 5000e25ee..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeCreateReqVO.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -// TODO 状态类型和状态添加,是在一个请求里,所以需要把 CrmBusinessStatusCreateReqVO 融合进来; -@Schema(description = "管理后台 - 商机状态类型创建 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class CrmBusinessStatusTypeCreateReqVO extends CrmBusinessStatusTypeBaseVO { - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeExcelVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeExcelVO.java deleted file mode 100644 index cc6ed8502..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeExcelVO.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo; - -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -// TODO @lilleo:这个暂时不需要;嘿嘿~不是每个模块都需要导出哈 -/** - * 商机状态类型 Excel VO - * - * @author ljlleo - */ -@Data -public class CrmBusinessStatusTypeExcelVO { - - @ExcelProperty("主键") - private Long id; - - @ExcelProperty("状态类型名") - private String name; - - @ExcelProperty("使用的部门编号") - private String deptIds; - - @ExcelProperty("开启状态") - private Boolean status; - - @ExcelProperty("创建时间") - private LocalDateTime createTime; - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeExportReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeExportReqVO.java deleted file mode 100644 index 1345565be..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeExportReqVO.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -// TODO @lilleo:这个暂时不需要;嘿嘿~不是每个模块都需要导出哈 -@Schema(description = "管理后台 - 商机状态类型 Excel 导出 Request VO,参数和 CrmBusinessStatusTypePageReqVO 是一致的") -@Data -public class CrmBusinessStatusTypeExportReqVO { - - @Schema(description = "状态类型名", example = "芋艿") - private String name; - - @Schema(description = "使用的部门编号") - private String deptIds; - - @Schema(description = "开启状态", example = "1") - private Boolean status; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeRespVO.java deleted file mode 100644 index a4e21c58e..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeRespVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - 商机状态类型 Response VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class CrmBusinessStatusTypeRespVO extends CrmBusinessStatusTypeBaseVO { - - @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "24019") - private Long id; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeUpdateReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeUpdateReqVO.java deleted file mode 100644 index 0eb93224c..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeUpdateReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import javax.validation.constraints.NotNull; - -// TODO 状态类型和状态添加,是在一个请求里,所以需要把 CrmBusinessStatusUpdateReqVO 融合进来; -@Schema(description = "管理后台 - 商机状态类型更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class CrmBusinessStatusTypeUpdateReqVO extends CrmBusinessStatusTypeBaseVO { - - @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "24019") - @NotNull(message = "主键不能为空") - private Long id; - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/business/CrmBusinessConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/business/CrmBusinessConvert.java index 8b7f7e83b..6de4c1241 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/business/CrmBusinessConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/business/CrmBusinessConvert.java @@ -3,6 +3,9 @@ package cn.iocoder.yudao.module.crm.convert.business; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.crm.controller.admin.business.vo.*; import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO; +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO; +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusTypeDO; +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @@ -10,6 +13,9 @@ import org.mapstruct.Mappings; import org.mapstruct.factory.Mappers; import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; /** * 商机 Convert @@ -37,4 +43,18 @@ public interface CrmBusinessConvert { }) CrmPermissionTransferReqBO convert(CrmBusinessTransferReqVO reqVO, Long userId); + default PageResult convertPage(PageResult page, List customerList, + List statusTypeList, List statusList) { + PageResult result = convertPage(page); + Map customerMap = convertMap(customerList, CrmCustomerDO::getId, CrmCustomerDO::getName); + Map statusTypeMap = convertMap(statusTypeList, CrmBusinessStatusTypeDO::getId, CrmBusinessStatusTypeDO::getName); + Map statusMap = convertMap(statusList, CrmBusinessStatusDO::getId, CrmBusinessStatusDO::getName); + result.getList().stream().forEach(t -> { + t.setCustomerName(customerMap.get(t.getCustomerId())); + t.setStatusTypeName(statusTypeMap.get(t.getStatusTypeId())); + t.setStatusName(statusMap.get(t.getStatusId())); + }); + return result; + } + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/businessstatus/CrmBusinessStatusConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/businessstatus/CrmBusinessStatusConvert.java index c8b854144..19fb76171 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/businessstatus/CrmBusinessStatusConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/businessstatus/CrmBusinessStatusConvert.java @@ -1,13 +1,13 @@ package cn.iocoder.yudao.module.crm.convert.businessstatus; -import java.util.*; - import cn.iocoder.yudao.framework.common.pojo.PageResult; - +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusRespVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusSaveReqVO; +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo.*; -import cn.iocoder.yudao.module.crm.dal.dataobject.businessstatus.CrmBusinessStatusDO; + +import java.util.List; /** * 商机状态 Convert @@ -19,9 +19,7 @@ public interface CrmBusinessStatusConvert { CrmBusinessStatusConvert INSTANCE = Mappers.getMapper(CrmBusinessStatusConvert.class); - CrmBusinessStatusDO convert(CrmBusinessStatusCreateReqVO bean); - - CrmBusinessStatusDO convert(CrmBusinessStatusUpdateReqVO bean); + CrmBusinessStatusDO convert(CrmBusinessStatusSaveReqVO bean); CrmBusinessStatusRespVO convert(CrmBusinessStatusDO bean); @@ -29,6 +27,4 @@ public interface CrmBusinessStatusConvert { PageResult convertPage(PageResult page); - List convertList02(List list); - } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/businessstatustype/CrmBusinessStatusTypeConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/businessstatustype/CrmBusinessStatusTypeConvert.java index 75f1aed4c..ef3788233 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/businessstatustype/CrmBusinessStatusTypeConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/businessstatustype/CrmBusinessStatusTypeConvert.java @@ -1,13 +1,19 @@ package cn.iocoder.yudao.module.crm.convert.businessstatustype; -import java.util.*; - import cn.iocoder.yudao.framework.common.pojo.PageResult; - +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusTypeRespVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusTypeSaveReqVO; +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO; +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusTypeDO; +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo.*; -import cn.iocoder.yudao.module.crm.dal.dataobject.businessstatustype.CrmBusinessStatusTypeDO; + +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; /** * 商机状态类型 Convert @@ -19,16 +25,26 @@ public interface CrmBusinessStatusTypeConvert { CrmBusinessStatusTypeConvert INSTANCE = Mappers.getMapper(CrmBusinessStatusTypeConvert.class); - CrmBusinessStatusTypeDO convert(CrmBusinessStatusTypeCreateReqVO bean); - - CrmBusinessStatusTypeDO convert(CrmBusinessStatusTypeUpdateReqVO bean); + CrmBusinessStatusTypeDO convert(CrmBusinessStatusTypeSaveReqVO bean); CrmBusinessStatusTypeRespVO convert(CrmBusinessStatusTypeDO bean); - List convertList(List list); - PageResult convertPage(PageResult page); - List convertList02(List list); + default PageResult convertPage(PageResult page, List deptList) { + PageResult pageResult = convertPage(page); + Map deptMap = convertMap(deptList, DeptRespDTO::getId, DeptRespDTO::getName); + pageResult.getList().stream().forEach(r -> { + r.setDeptNames(convertList(r.getDeptIds(), deptMap::get)); + }); + return pageResult; + } + + default CrmBusinessStatusTypeRespVO convert(CrmBusinessStatusTypeDO bean, List statusList) { + CrmBusinessStatusTypeRespVO result = convert(bean); + result.setStatusList(statusList); + return result; + } + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessDO.java index 435bf1995..f748525d4 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessDO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessDO.java @@ -1,8 +1,6 @@ package cn.iocoder.yudao.module.crm.dal.dataobject.business; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.module.crm.dal.dataobject.businessstatus.CrmBusinessStatusDO; -import cn.iocoder.yudao.module.crm.dal.dataobject.businessstatustype.CrmBusinessStatusTypeDO; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/businessstatus/CrmBusinessStatusDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessStatusDO.java similarity index 87% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/businessstatus/CrmBusinessStatusDO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessStatusDO.java index 3a1b66ad0..b6ae23bce 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/businessstatus/CrmBusinessStatusDO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessStatusDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.dal.dataobject.businessstatus; +package cn.iocoder.yudao.module.crm.dal.dataobject.business; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; @@ -26,8 +26,6 @@ public class CrmBusinessStatusDO { private Long id; /** * 状态类型编号 - * - * // TODO @ljlleo:要写下关联字段噢 */ private Long typeId; /** diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/businessstatustype/CrmBusinessStatusTypeDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessStatusTypeDO.java similarity index 57% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/businessstatustype/CrmBusinessStatusTypeDO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessStatusTypeDO.java index fbc2e6857..d5dcef0ba 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/businessstatustype/CrmBusinessStatusTypeDO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessStatusTypeDO.java @@ -1,23 +1,29 @@ -package cn.iocoder.yudao.module.crm.dal.dataobject.businessstatustype; +package cn.iocoder.yudao.module.crm.dal.dataobject.business; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler; import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; +import java.util.List; + /** * 商机状态类型 DO * * @author ljlleo */ -@TableName("crm_business_status_type") +@TableName(value = "crm_business_status_type", autoResultMap = true) @KeySequence("crm_business_status_type_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 @Data +@EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @Builder @NoArgsConstructor @AllArgsConstructor -public class CrmBusinessStatusTypeDO { +public class CrmBusinessStatusTypeDO extends BaseDO { /** * 主键 @@ -28,15 +34,14 @@ public class CrmBusinessStatusTypeDO { * 状态类型名 */ private String name; - // TODO @ljlleo:List 存储哈 /** * 使用的部门编号 */ - private String deptIds; + @TableField(typeHandler = LongListTypeHandler.class) + private List deptIds; /** * 开启状态 */ - // TODO @ljlleo:这个字段,使用 Integer,对应 CommonStatus private Boolean status; } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessStatusMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessStatusMapper.java new file mode 100644 index 000000000..d78ecab5c --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessStatusMapper.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.module.crm.dal.mysql.business; + +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.business.vo.CrmBusinessStatusPageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusQueryVO; +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 商机状态 Mapper + * + * @author ljlleo + */ +@Mapper +public interface CrmBusinessStatusMapper extends BaseMapperX { + + default PageResult selectPage(CrmBusinessStatusPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .orderByDesc(CrmBusinessStatusDO::getId)); + } + + default List selectList(CrmBusinessStatusQueryVO queryVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(CrmBusinessStatusDO::getTypeId, queryVO.getTypeId()) + .inIfPresent(CrmBusinessStatusDO::getId, queryVO.getIdList()) + .orderByDesc(CrmBusinessStatusDO::getId)); + } + + default int delete(Long typeId) { + return delete(new LambdaQueryWrapperX() + .eq(CrmBusinessStatusDO::getTypeId, typeId)); + } + +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessStatusTypeMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessStatusTypeMapper.java new file mode 100644 index 000000000..d3f3e1e2e --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessStatusTypeMapper.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.crm.dal.mysql.business; + +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.business.vo.CrmBusinessStatusTypePageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusTypeQueryVO; +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusTypeDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 商机状态类型 Mapper + * + * @author ljlleo + */ +@Mapper +public interface CrmBusinessStatusTypeMapper extends BaseMapperX { + + default PageResult selectPage(CrmBusinessStatusTypePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .orderByDesc(CrmBusinessStatusTypeDO::getId)); + } + + default List selectList(CrmBusinessStatusTypeQueryVO queryVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(CrmBusinessStatusTypeDO::getStatus, queryVO.getStatus()) + .inIfPresent(CrmBusinessStatusTypeDO::getId, queryVO.getIdList())); + } +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/businessstatus/CrmBusinessStatusMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/businessstatus/CrmBusinessStatusMapper.java deleted file mode 100644 index 2b9eeb4ae..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/businessstatus/CrmBusinessStatusMapper.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.iocoder.yudao.module.crm.dal.mysql.businessstatus; - -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.businessstatus.vo.CrmBusinessStatusExportReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo.CrmBusinessStatusPageReqVO; -import cn.iocoder.yudao.module.crm.dal.dataobject.businessstatus.CrmBusinessStatusDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * 商机状态 Mapper - * - * @author ljlleo - */ -@Mapper -public interface CrmBusinessStatusMapper extends BaseMapperX { - - default PageResult selectPage(CrmBusinessStatusPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(CrmBusinessStatusDO::getTypeId, reqVO.getTypeId()) - .orderByDesc(CrmBusinessStatusDO::getId)); - } - - default List selectList(CrmBusinessStatusExportReqVO reqVO) { - return selectList(new LambdaQueryWrapperX() - .eqIfPresent(CrmBusinessStatusDO::getTypeId, reqVO.getTypeId()) - .likeIfPresent(CrmBusinessStatusDO::getName, reqVO.getName()) - .eqIfPresent(CrmBusinessStatusDO::getPercent, reqVO.getPercent()) - .eqIfPresent(CrmBusinessStatusDO::getSort, reqVO.getSort()) - .orderByDesc(CrmBusinessStatusDO::getId)); - } - - default List getBusinessStatusListByTypeId(Integer typeId) { - return selectList(CrmBusinessStatusDO::getTypeId, typeId); - } - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/businessstatustype/CrmBusinessStatusTypeMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/businessstatustype/CrmBusinessStatusTypeMapper.java deleted file mode 100644 index 258477e4d..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/businessstatustype/CrmBusinessStatusTypeMapper.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.iocoder.yudao.module.crm.dal.mysql.businessstatustype; - -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.businessstatustype.vo.CrmBusinessStatusTypeExportReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo.CrmBusinessStatusTypePageReqVO; -import cn.iocoder.yudao.module.crm.dal.dataobject.businessstatustype.CrmBusinessStatusTypeDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * 商机状态类型 Mapper - * - * @author ljlleo - */ -@Mapper -public interface CrmBusinessStatusTypeMapper extends BaseMapperX { - - default PageResult selectPage(CrmBusinessStatusTypePageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(CrmBusinessStatusTypeDO::getName, reqVO.getName()) -// .eqIfPresent(CrmBusinessStatusTypeDO::getDeptIds, reqVO.getDeptIds()) TODO 报错,临时注释掉 - .eqIfPresent(CrmBusinessStatusTypeDO::getStatus, reqVO.getStatus()) - .orderByDesc(CrmBusinessStatusTypeDO::getId)); - } - - default List selectList(CrmBusinessStatusTypeExportReqVO reqVO) { - return selectList(new LambdaQueryWrapperX() - .likeIfPresent(CrmBusinessStatusTypeDO::getName, reqVO.getName()) - .eqIfPresent(CrmBusinessStatusTypeDO::getDeptIds, reqVO.getDeptIds()) - .eqIfPresent(CrmBusinessStatusTypeDO::getStatus, reqVO.getStatus()) - .orderByDesc(CrmBusinessStatusTypeDO::getId)); - } - - default List getBusinessStatusTypeListByStatus(Integer status) { - return selectList(CrmBusinessStatusTypeDO::getStatus, status.byteValue()); - } - -} 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 683df3581..ef6ba8234 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 @@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; import org.apache.ibatis.annotations.Mapper; import java.util.Collection; +import java.util.List; /** * 客户 Mapper @@ -27,4 +28,9 @@ public interface CrmCustomerMapper extends BaseMapperX { .eqIfPresent(CrmCustomerDO::getSource, pageReqVO.getSource())); } + default List selectList(Collection ids) { + return selectList(new LambdaQueryWrapperX() + .inIfPresent(CrmCustomerDO::getId, ids)); + } + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusService.java new file mode 100644 index 000000000..48686de11 --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusService.java @@ -0,0 +1,65 @@ +package cn.iocoder.yudao.module.crm.service.business; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusPageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusQueryVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusSaveReqVO; +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO; + +import javax.validation.Valid; +import java.util.List; + +/** + * 商机状态 Service 接口 + * + * @author ljlleo + */ +public interface CrmBusinessStatusService { + + /** + * 创建商机状态 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createBusinessStatus(@Valid CrmBusinessStatusSaveReqVO createReqVO); + + /** + * 更新商机状态 + * + * @param updateReqVO 更新信息 + */ + void updateBusinessStatus(@Valid CrmBusinessStatusSaveReqVO updateReqVO); + + /** + * 删除商机状态 + * + * @param id 编号 + */ + void deleteBusinessStatus(Long id); + + /** + * 获得商机状态 + * + * @param id 编号 + * @return 商机状态 + */ + CrmBusinessStatusDO getBusinessStatus(Long id); + + /** + * 获得商机状态分页 + * + * @param pageReqVO 分页查询 + * @return 商机状态分页 + */ + PageResult getBusinessStatusPage(CrmBusinessStatusPageReqVO pageReqVO); + + /** + * 获得商机状态分页 + * + * @param queryVO 查询参数 + * @return 商机状态分页 + */ + List selectList(CrmBusinessStatusQueryVO queryVO); + +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusServiceImpl.java new file mode 100644 index 000000000..1f68fc89e --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusServiceImpl.java @@ -0,0 +1,79 @@ +package cn.iocoder.yudao.module.crm.service.business; + +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.CrmBusinessStatusPageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusQueryVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusSaveReqVO; +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO; +import cn.iocoder.yudao.module.crm.dal.mysql.business.CrmBusinessStatusMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.BUSINESS_STATUS_NOT_EXISTS; + +/** + * 商机状态 Service 实现类 + * + * @author ljlleo + */ +@Service +@Validated +public class CrmBusinessStatusServiceImpl implements CrmBusinessStatusService { + + @Resource + private CrmBusinessStatusMapper businessStatusMapper; + + @Override + public Long createBusinessStatus(CrmBusinessStatusSaveReqVO createReqVO) { + // 插入 + CrmBusinessStatusDO businessStatus = BeanUtils.toBean(createReqVO, CrmBusinessStatusDO.class); + businessStatusMapper.insert(businessStatus); + // 返回 + return businessStatus.getId(); + } + + @Override + public void updateBusinessStatus(CrmBusinessStatusSaveReqVO updateReqVO) { + // 校验存在 + validateBusinessStatusExists(updateReqVO.getId()); + // 更新 + CrmBusinessStatusDO updateObj = BeanUtils.toBean(updateReqVO, CrmBusinessStatusDO.class); + businessStatusMapper.updateById(updateObj); + } + + @Override + public void deleteBusinessStatus(Long id) { + // 校验存在 + validateBusinessStatusExists(id); + // 删除 + businessStatusMapper.deleteById(id); + } + + private void validateBusinessStatusExists(Long id) { + if (businessStatusMapper.selectById(id) == null) { + throw exception(BUSINESS_STATUS_NOT_EXISTS); + } + } + + @Override + public CrmBusinessStatusDO getBusinessStatus(Long id) { + return businessStatusMapper.selectById(id); + } + + @Override + public PageResult getBusinessStatusPage(CrmBusinessStatusPageReqVO pageReqVO) { + return businessStatusMapper.selectPage(pageReqVO); + } + + @Override + public List selectList(CrmBusinessStatusQueryVO queryVO) { + return businessStatusMapper.selectList(queryVO); + } + +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusTypeService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusTypeService.java new file mode 100644 index 000000000..0b0bea7e0 --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusTypeService.java @@ -0,0 +1,64 @@ +package cn.iocoder.yudao.module.crm.service.business; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusTypePageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusTypeQueryVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusTypeSaveReqVO; +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusTypeDO; + +import javax.validation.Valid; +import java.util.List; + +/** + * 商机状态类型 Service 接口 + * + * @author ljlleo + */ +public interface CrmBusinessStatusTypeService { + + /** + * 创建商机状态类型 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createBusinessStatusType(@Valid CrmBusinessStatusTypeSaveReqVO createReqVO); + + /** + * 更新商机状态类型 + * + * @param updateReqVO 更新信息 + */ + void updateBusinessStatusType(@Valid CrmBusinessStatusTypeSaveReqVO updateReqVO); + + /** + * 删除商机状态类型 + * + * @param id 编号 + */ + void deleteBusinessStatusType(Long id); + + /** + * 获得商机状态类型 + * + * @param id 编号 + * @return 商机状态类型 + */ + CrmBusinessStatusTypeDO getBusinessStatusType(Long id); + + /** + * 获得商机状态类型分页 + * + * @param pageReqVO 分页查询 + * @return 商机状态类型分页 + */ + PageResult getBusinessStatusTypePage(CrmBusinessStatusTypePageReqVO pageReqVO); + + /** + * 获得商机状态类型列表 + * + * @param queryVO 查询参数 + * @return 商机状态类型列表 + */ + List selectList(CrmBusinessStatusTypeQueryVO queryVO); +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusTypeServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusTypeServiceImpl.java new file mode 100644 index 000000000..d8226e8f8 --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusTypeServiceImpl.java @@ -0,0 +1,121 @@ +package cn.iocoder.yudao.module.crm.service.business; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +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.CrmBusinessStatusTypePageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusTypeQueryVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusTypeSaveReqVO; +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO; +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusTypeDO; +import cn.iocoder.yudao.module.crm.dal.mysql.business.CrmBusinessStatusMapper; +import cn.iocoder.yudao.module.crm.dal.mysql.business.CrmBusinessStatusTypeMapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.BUSINESS_STATUS_TYPE_NOT_EXISTS; +import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.BUSINESS_STATUS_TYPE_NAME_EXISTS; + +/** + * 商机状态类型 Service 实现类 + * + * @author ljlleo + */ +@Service +@Validated +public class CrmBusinessStatusTypeServiceImpl implements CrmBusinessStatusTypeService { + + @Resource + private CrmBusinessStatusTypeMapper businessStatusTypeMapper; + + @Resource + private CrmBusinessStatusMapper businessStatusMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createBusinessStatusType(CrmBusinessStatusTypeSaveReqVO createReqVO) { + //检验名称是否存在 + validateBusinessStatusTypeExists(createReqVO.getName(), null); + // 插入 + CrmBusinessStatusTypeDO businessStatusType = BeanUtils.toBean(createReqVO, CrmBusinessStatusTypeDO.class); + businessStatusTypeMapper.insert(businessStatusType); + createReqVO.getStatusList().stream().forEach(status -> { + status.setTypeId(businessStatusType.getId()); + }); + //插入状态 + businessStatusMapper.insertBatch(BeanUtils.toBean(createReqVO.getStatusList(), CrmBusinessStatusDO.class)); + // 返回 + return businessStatusType.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateBusinessStatusType(CrmBusinessStatusTypeSaveReqVO updateReqVO) { + // 校验存在 + validateBusinessStatusTypeExists(updateReqVO.getId()); + // 校验名称是否存在 + validateBusinessStatusTypeExists(updateReqVO.getName(), updateReqVO.getId()); + // 更新 + CrmBusinessStatusTypeDO updateObj = BeanUtils.toBean(updateReqVO, CrmBusinessStatusTypeDO.class); + businessStatusTypeMapper.updateById(updateObj); + //删除状态 + businessStatusMapper.delete(updateReqVO.getId()); + //插入状态 + updateReqVO.getStatusList().stream().forEach(status -> { + status.setTypeId(updateReqVO.getId()); + }); + businessStatusMapper.insertBatch(BeanUtils.toBean(updateReqVO.getStatusList(), CrmBusinessStatusDO.class)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteBusinessStatusType(Long id) { + //TODO 待添加被引用校验 + //... + + // 校验存在 + validateBusinessStatusTypeExists(id); + // 删除 + businessStatusTypeMapper.deleteById(id); + //删除状态 + businessStatusMapper.delete(id); + } + + private void validateBusinessStatusTypeExists(Long id) { + if (businessStatusTypeMapper.selectById(id) == null) { + throw exception(BUSINESS_STATUS_TYPE_NOT_EXISTS); + } + } + + private void validateBusinessStatusTypeExists(String name, Long id) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapperX<>(); + if(null != id) { + wrapper.ne(CrmBusinessStatusTypeDO::getId, id); + } + long cnt = businessStatusTypeMapper.selectCount(wrapper.eq(CrmBusinessStatusTypeDO::getName, name)); + if (cnt > 0) { + throw exception(BUSINESS_STATUS_TYPE_NAME_EXISTS); + } + } + + @Override + public CrmBusinessStatusTypeDO getBusinessStatusType(Long id) { + return businessStatusTypeMapper.selectById(id); + } + + @Override + public PageResult getBusinessStatusTypePage(CrmBusinessStatusTypePageReqVO pageReqVO) { + return businessStatusTypeMapper.selectPage(pageReqVO); + } + + @Override + public List selectList(CrmBusinessStatusTypeQueryVO queryVO) { + return businessStatusTypeMapper.selectList(queryVO); + } +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/businessstatus/CrmBusinessStatusService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/businessstatus/CrmBusinessStatusService.java deleted file mode 100644 index 44b3e9f1b..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/businessstatus/CrmBusinessStatusService.java +++ /dev/null @@ -1,90 +0,0 @@ -package cn.iocoder.yudao.module.crm.service.businessstatus; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo.CrmBusinessStatusCreateReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo.CrmBusinessStatusExportReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo.CrmBusinessStatusPageReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo.CrmBusinessStatusUpdateReqVO; -import cn.iocoder.yudao.module.crm.dal.dataobject.businessstatus.CrmBusinessStatusDO; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; - -/** - * 商机状态 Service 接口 - * - * @author ljlleo - */ -public interface CrmBusinessStatusService { - - /** - * 创建商机状态 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createBusinessStatus(@Valid CrmBusinessStatusCreateReqVO createReqVO); - - /** - * 更新商机状态 - * - * @param updateReqVO 更新信息 - */ - void updateBusinessStatus(@Valid CrmBusinessStatusUpdateReqVO updateReqVO); - - /** - * 删除商机状态 - * - * @param id 编号 - */ - void deleteBusinessStatus(Long id); - - /** - * 获得商机状态 - * - * @param id 编号 - * @return 商机状态 - */ - CrmBusinessStatusDO getBusinessStatus(Long id); - - /** - * 获得商机状态列表 - * - * @param ids 编号 - * @return 商机状态列表 - */ - List getBusinessStatusList(Collection ids); - - /** - * 获得商机状态分页 - * - * @param pageReqVO 分页查询 - * @return 商机状态分页 - */ - PageResult getBusinessStatusPage(CrmBusinessStatusPageReqVO pageReqVO); - - /** - * 获得商机状态列表, 用于 Excel 导出 - * - * @param exportReqVO 查询条件 - * @return 商机状态列表 - */ - List getBusinessStatusList(CrmBusinessStatusExportReqVO exportReqVO); - - /** - * 根据类型 ID 获得商机状态列表 - * - * @param typeId 商机状态类型 ID - * @return 商机状态列表 - */ - List getBusinessStatusListByTypeId(Integer typeId); - - /** - * 获得商机状态列表 - * - * @return 商机状态列表 - */ - List getBusinessStatusList(); - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/businessstatus/CrmBusinessStatusServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/businessstatus/CrmBusinessStatusServiceImpl.java deleted file mode 100644 index e927fac74..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/businessstatus/CrmBusinessStatusServiceImpl.java +++ /dev/null @@ -1,99 +0,0 @@ -package cn.iocoder.yudao.module.crm.service.businessstatus; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.collection.ListUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo.CrmBusinessStatusCreateReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo.CrmBusinessStatusExportReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo.CrmBusinessStatusPageReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo.CrmBusinessStatusUpdateReqVO; -import cn.iocoder.yudao.module.crm.convert.businessstatus.CrmBusinessStatusConvert; -import cn.iocoder.yudao.module.crm.dal.dataobject.businessstatus.CrmBusinessStatusDO; -import cn.iocoder.yudao.module.crm.dal.mysql.businessstatus.CrmBusinessStatusMapper; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.Collection; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.BUSINESS_STATUS_NOT_EXISTS; - -/** - * 商机状态 Service 实现类 - * - * @author ljlleo - */ -@Service -@Validated -public class CrmBusinessStatusServiceImpl implements CrmBusinessStatusService { - - @Resource - private CrmBusinessStatusMapper businessStatusMapper; - - @Override - public Long createBusinessStatus(CrmBusinessStatusCreateReqVO createReqVO) { - // 插入 - CrmBusinessStatusDO businessStatus = CrmBusinessStatusConvert.INSTANCE.convert(createReqVO); - businessStatusMapper.insert(businessStatus); - // 返回 - return businessStatus.getId(); - } - - @Override - public void updateBusinessStatus(CrmBusinessStatusUpdateReqVO updateReqVO) { - // 校验存在 - validateBusinessStatusExists(updateReqVO.getId()); - // 更新 - CrmBusinessStatusDO updateObj = CrmBusinessStatusConvert.INSTANCE.convert(updateReqVO); - businessStatusMapper.updateById(updateObj); - } - - @Override - public void deleteBusinessStatus(Long id) { - // 校验存在 - validateBusinessStatusExists(id); - // 删除 - businessStatusMapper.deleteById(id); - } - - private void validateBusinessStatusExists(Long id) { - if (businessStatusMapper.selectById(id) == null) { - throw exception(BUSINESS_STATUS_NOT_EXISTS); - } - } - - @Override - public CrmBusinessStatusDO getBusinessStatus(Long id) { - return businessStatusMapper.selectById(id); - } - - @Override - public List getBusinessStatusList(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return ListUtil.empty(); - } - return businessStatusMapper.selectBatchIds(ids); - } - - @Override - public PageResult getBusinessStatusPage(CrmBusinessStatusPageReqVO pageReqVO) { - return businessStatusMapper.selectPage(pageReqVO); - } - - @Override - public List getBusinessStatusList(CrmBusinessStatusExportReqVO exportReqVO) { - return businessStatusMapper.selectList(exportReqVO); - } - - @Override - public List getBusinessStatusListByTypeId(Integer typeId) { - return businessStatusMapper.getBusinessStatusListByTypeId(typeId); - } - - @Override - public List getBusinessStatusList() { - return businessStatusMapper.selectList(); - } -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/businessstatustype/CrmBusinessStatusTypeService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/businessstatustype/CrmBusinessStatusTypeService.java deleted file mode 100644 index 3c473f62b..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/businessstatustype/CrmBusinessStatusTypeService.java +++ /dev/null @@ -1,83 +0,0 @@ -package cn.iocoder.yudao.module.crm.service.businessstatustype; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo.CrmBusinessStatusTypeCreateReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo.CrmBusinessStatusTypeExportReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo.CrmBusinessStatusTypePageReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo.CrmBusinessStatusTypeUpdateReqVO; -import cn.iocoder.yudao.module.crm.dal.dataobject.businessstatustype.CrmBusinessStatusTypeDO; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; - -/** - * 商机状态类型 Service 接口 - * - * @author ljlleo - */ -public interface CrmBusinessStatusTypeService { - - /** - * 创建商机状态类型 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createBusinessStatusType(@Valid CrmBusinessStatusTypeCreateReqVO createReqVO); - - /** - * 更新商机状态类型 - * - * @param updateReqVO 更新信息 - */ - void updateBusinessStatusType(@Valid CrmBusinessStatusTypeUpdateReqVO updateReqVO); - - /** - * 删除商机状态类型 - * - * @param id 编号 - */ - void deleteBusinessStatusType(Long id); - - /** - * 获得商机状态类型 - * - * @param id 编号 - * @return 商机状态类型 - */ - CrmBusinessStatusTypeDO getBusinessStatusType(Long id); - - /** - * 获得商机状态类型列表 - * - * @param ids 编号 - * @return 商机状态类型列表 - */ - List getBusinessStatusTypeList(Collection ids); - - /** - * 获得商机状态类型分页 - * - * @param pageReqVO 分页查询 - * @return 商机状态类型分页 - */ - PageResult getBusinessStatusTypePage(CrmBusinessStatusTypePageReqVO pageReqVO); - - /** - * 获得商机状态类型列表, 用于 Excel 导出 - * - * @param exportReqVO 查询条件 - * @return 商机状态类型列表 - */ - List getBusinessStatusTypeList(CrmBusinessStatusTypeExportReqVO exportReqVO); - - /** - * 获得商机状态类型列表 - * - * @param status 状态 - * @return 商机状态类型列表 - */ - List getBusinessStatusTypeListByStatus(Integer status); - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/businessstatustype/CrmBusinessStatusTypeServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/businessstatustype/CrmBusinessStatusTypeServiceImpl.java deleted file mode 100644 index f428c3836..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/businessstatustype/CrmBusinessStatusTypeServiceImpl.java +++ /dev/null @@ -1,98 +0,0 @@ -package cn.iocoder.yudao.module.crm.service.businessstatustype; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.collection.ListUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo.CrmBusinessStatusTypeCreateReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo.CrmBusinessStatusTypeExportReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo.CrmBusinessStatusTypePageReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo.CrmBusinessStatusTypeUpdateReqVO; -import cn.iocoder.yudao.module.crm.convert.businessstatustype.CrmBusinessStatusTypeConvert; -import cn.iocoder.yudao.module.crm.dal.dataobject.businessstatustype.CrmBusinessStatusTypeDO; -import cn.iocoder.yudao.module.crm.dal.mysql.businessstatustype.CrmBusinessStatusTypeMapper; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import javax.annotation.Resource; -import java.util.Collection; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.BUSINESS_STATUS_TYPE_NOT_EXISTS; - -/** - * 商机状态类型 Service 实现类 - * - * @author ljlleo - */ -@Service -@Validated -public class CrmBusinessStatusTypeServiceImpl implements CrmBusinessStatusTypeService { - - @Resource - private CrmBusinessStatusTypeMapper businessStatusTypeMapper; - - @Override - public Long createBusinessStatusType(CrmBusinessStatusTypeCreateReqVO createReqVO) { - // TODO ljlleo:name 应该需要唯一哈; - // 插入 - CrmBusinessStatusTypeDO businessStatusType = CrmBusinessStatusTypeConvert.INSTANCE.convert(createReqVO); - businessStatusTypeMapper.insert(businessStatusType); - // 返回 - return businessStatusType.getId(); - } - - @Override - public void updateBusinessStatusType(CrmBusinessStatusTypeUpdateReqVO updateReqVO) { - // TODO ljlleo:name 应该需要唯一哈; - // 校验存在 - validateBusinessStatusTypeExists(updateReqVO.getId()); - // 更新 - CrmBusinessStatusTypeDO updateObj = CrmBusinessStatusTypeConvert.INSTANCE.convert(updateReqVO); - businessStatusTypeMapper.updateById(updateObj); - } - - @Override - public void deleteBusinessStatusType(Long id) { - // 校验存在 - validateBusinessStatusTypeExists(id); - // TODO 艿艿:这里在看看,是不是要校验业务是否在使用; - // 删除 - businessStatusTypeMapper.deleteById(id); - } - - private void validateBusinessStatusTypeExists(Long id) { - if (businessStatusTypeMapper.selectById(id) == null) { - throw exception(BUSINESS_STATUS_TYPE_NOT_EXISTS); - } - } - - @Override - public CrmBusinessStatusTypeDO getBusinessStatusType(Long id) { - return businessStatusTypeMapper.selectById(id); - } - - @Override - public List getBusinessStatusTypeList(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return ListUtil.empty(); - } - return businessStatusTypeMapper.selectBatchIds(ids); - } - - @Override - public PageResult getBusinessStatusTypePage(CrmBusinessStatusTypePageReqVO pageReqVO) { - return businessStatusTypeMapper.selectPage(pageReqVO); - } - - @Override - public List getBusinessStatusTypeList(CrmBusinessStatusTypeExportReqVO exportReqVO) { - return businessStatusTypeMapper.selectList(exportReqVO); - } - - @Override - public List getBusinessStatusTypeListByStatus(Integer status) { - return businessStatusTypeMapper.getBusinessStatusTypeListByStatus(status); - } - -} 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 6aa21477e..aad0547a9 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 @@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.*; import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; import javax.validation.Valid; +import java.util.Collection; import java.util.List; /** @@ -103,4 +104,12 @@ public interface CrmCustomerService { */ void distributeByIds(ListcIds,Long ownerId); + /** + * 根据客户ID集合查询客户集合 + * @param ids + * @author ljlleo + * @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 ebb499128..16d96544d 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 @@ -1,6 +1,5 @@ package cn.iocoder.yudao.module.crm.service.customer; -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.collection.CollectionUtils; @@ -106,9 +105,9 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { permissions = CollectionUtils.filterList(permissions, item -> CrmPermissionLevelEnum.isOwner(item.getLevel())); } Set ids = convertSet(permissions, CrmPermissionDO::getBizId); - if (CollUtil.isEmpty(ids)) { // 没得说明没有什么给他看的 - return PageResult.empty(); - } +// if (CollUtil.isEmpty(ids)) { // 没得说明没有什么给他看的 +// return PageResult.empty(); +// } // 2. 获取客户分页数据 return customerMapper.selectPage(pageReqVO, ids); @@ -213,4 +212,9 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { } } + @Override + public List getCustomerList(Collection ids) { + return customerMapper.selectList(ids); + } + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/business/BusinessStatusTypeServiceImplTest.java b/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/business/BusinessStatusTypeServiceImplTest.java new file mode 100644 index 000000000..b28ccf6f7 --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/business/BusinessStatusTypeServiceImplTest.java @@ -0,0 +1,117 @@ +package cn.iocoder.yudao.module.crm.service.business; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.BusinessStatusTypePageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.BusinessStatusTypeSaveReqVO; +import cn.iocoder.yudao.module.crm.dal.dataobject.business.BusinessStatusTypeDO; +import cn.iocoder.yudao.module.crm.dal.mysql.business.BusinessStatusTypeMapper; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; + +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.BUSINESS_STATUS_TYPE_NOT_EXISTS; +import static org.junit.jupiter.api.Assertions.*; + +/** + * {@link BusinessStatusTypeServiceImpl} 的单元测试类 + * + * @author ljlleo + */ +@Import(BusinessStatusTypeServiceImpl.class) +public class BusinessStatusTypeServiceImplTest extends BaseDbUnitTest { + + @Resource + private BusinessStatusTypeServiceImpl businessStatusTypeService; + + @Resource + private BusinessStatusTypeMapper businessStatusTypeMapper; + + @Test + public void testCreateBusinessStatusType_success() { + // 准备参数 + BusinessStatusTypeSaveReqVO createReqVO = randomPojo(BusinessStatusTypeSaveReqVO.class).setId(null); + + // 调用 + Long businessStatusTypeId = businessStatusTypeService.createBusinessStatusType(createReqVO); + // 断言 + assertNotNull(businessStatusTypeId); + // 校验记录的属性是否正确 + BusinessStatusTypeDO businessStatusType = businessStatusTypeMapper.selectById(businessStatusTypeId); + assertPojoEquals(createReqVO, businessStatusType, "id"); + } + + @Test + public void testUpdateBusinessStatusType_success() { + // mock 数据 + BusinessStatusTypeDO dbBusinessStatusType = randomPojo(BusinessStatusTypeDO.class); + businessStatusTypeMapper.insert(dbBusinessStatusType);// @Sql: 先插入出一条存在的数据 + // 准备参数 + BusinessStatusTypeSaveReqVO updateReqVO = randomPojo(BusinessStatusTypeSaveReqVO.class, o -> { + o.setId(dbBusinessStatusType.getId()); // 设置更新的 ID + }); + + // 调用 + businessStatusTypeService.updateBusinessStatusType(updateReqVO); + // 校验是否更新正确 + BusinessStatusTypeDO businessStatusType = businessStatusTypeMapper.selectById(updateReqVO.getId()); // 获取最新的 + assertPojoEquals(updateReqVO, businessStatusType); + } + + @Test + public void testUpdateBusinessStatusType_notExists() { + // 准备参数 + BusinessStatusTypeSaveReqVO updateReqVO = randomPojo(BusinessStatusTypeSaveReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> businessStatusTypeService.updateBusinessStatusType(updateReqVO), BUSINESS_STATUS_TYPE_NOT_EXISTS); + } + + @Test + public void testDeleteBusinessStatusType_success() { + // mock 数据 + BusinessStatusTypeDO dbBusinessStatusType = randomPojo(BusinessStatusTypeDO.class); + businessStatusTypeMapper.insert(dbBusinessStatusType);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbBusinessStatusType.getId(); + + // 调用 + businessStatusTypeService.deleteBusinessStatusType(id); + // 校验数据不存在了 + assertNull(businessStatusTypeMapper.selectById(id)); + } + + @Test + public void testDeleteBusinessStatusType_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> businessStatusTypeService.deleteBusinessStatusType(id), BUSINESS_STATUS_TYPE_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetBusinessStatusTypePage() { + // mock 数据 + BusinessStatusTypeDO dbBusinessStatusType = randomPojo(BusinessStatusTypeDO.class, o -> { // 等会查询到 + }); + businessStatusTypeMapper.insert(dbBusinessStatusType); + // 准备参数 + BusinessStatusTypePageReqVO reqVO = new BusinessStatusTypePageReqVO(); + + // 调用 + PageResult pageResult = businessStatusTypeService.getBusinessStatusTypePage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbBusinessStatusType, pageResult.getList().get(0)); + } + +} From 1842549634911731bfa84d4d02b2dc6055a947cc Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 24 Nov 2023 23:11:58 +0800 Subject: [PATCH 07/35] =?UTF-8?q?crm=EF=BC=9Acode=20review=20=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E7=9A=84=E5=85=AC=E6=B5=B7=E9=A2=86=E5=8F=96=E5=92=8C?= =?UTF-8?q?=E5=88=86=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/customer/CrmCustomerController.java | 19 +++----- .../dal/mysql/customer/CrmCustomerMapper.java | 10 ++-- .../service/customer/CrmCustomerService.java | 8 ++-- .../customer/CrmCustomerServiceImpl.java | 47 ++++++++++--------- 4 files changed, 40 insertions(+), 44 deletions(-) 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 f95f47054..e09999ef2 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,12 +1,10 @@ package cn.iocoder.yudao.module.crm.controller.admin.customer; import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; 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.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; 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; @@ -24,7 +22,6 @@ import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.util.CollectionUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -37,7 +34,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error; 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.convertSet; @@ -185,24 +181,23 @@ public class CrmCustomerController { @PutMapping("/receive") @Operation(summary = "领取公海客户") - @Parameter(name = "ids", description = "批量领取公海的客户id集合", required = true,example = "1,2,3") + @Parameter(name = "ids", description = "编号数组", required = true,example = "1,2,3") @PreAuthorize("@ss.hasPermission('crm:customer:receive')") public CommonResult receiveCustomer(@RequestParam(value = "ids") List ids){ - // 领取公海任务 - customerService.receiveCustomer(ids, SecurityFrameworkUtils.getLoginUserId()); + customerService.receiveCustomer(ids, getLoginUserId()); return success(true); } - @PutMapping("/distributeByIds") + @PutMapping("/distribute") @Operation(summary = "分配公海给对应负责人") @Parameters({ - @Parameter(name = "ownerUserId", description = "分配的负责人id", required = true,example = "12345"), - @Parameter(name = "ids", description = "批量分配的公海的客户id集合", required = true,example = "1,2,3") + @Parameter(name = "ownerUserId", description = "分配的负责人编号", required = true, example = "12345"), + @Parameter(name = "ids", description = "客户编号数组", required = true, example = "1,2,3") }) @PreAuthorize("@ss.hasPermission('crm:customer:distribute')") public CommonResult distributeCustomer(@RequestParam(value = "ownerUserId") Long ownerUserId, - @RequestParam(value = "ids") Listids){ - customerService.distributeCustomer(ids,ownerUserId); + @RequestParam(value = "ids") List ids){ + customerService.distributeCustomer(ids, ownerUserId); return success(true); } 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 0997ea69f..80e3c47aa 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 @@ -28,10 +28,10 @@ public interface CrmCustomerMapper extends BaseMapperX { .eqIfPresent(CrmCustomerDO::getSource, pageReqVO.getSource())); } - default void updateCustomerOwnerUser(Long id,CrmCustomerDO customerDO){ - update(customerDO,new LambdaUpdateWrapper () - .eq(CrmCustomerDO::getId,id) - .isNull(CrmCustomerDO::getOwnerUserId) - ); + default void updateCustomerByOwnerUserIdIsNull(Long id, CrmCustomerDO updateObj) { + update(updateObj, new LambdaUpdateWrapper() + .eq(CrmCustomerDO::getId, id) + .isNull(CrmCustomerDO::getOwnerUserId)); } + } 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 b5f29293c..fee106b8a 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 @@ -88,17 +88,17 @@ public interface CrmCustomerService { /** * 领取公海客户 * - * @param ids 要领取的客户 id + * @param ids 要领取的客户编号数组 */ void receiveCustomer(Listids, Long ownerUserId); /** * 分配公海客户 * - * @param ids 要分配的客户 id - * @param ownerUserId 分配的负责人id + * @param ids 要分配的客户编号数组 + * @param ownerUserId 分配的负责人编号 * @author xiaqing */ - void distributeCustomer(Listids,Long ownerUserId); + void distributeCustomer(Listids, Long ownerUserId); } 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 5560789f7..e161ee409 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 @@ -4,7 +4,6 @@ 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.collection.CollectionUtils; -import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; 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; @@ -83,11 +82,6 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { throw exception(CUSTOMER_NOT_EXISTS); } } - private void validateCustomerExists(CrmCustomerDO customerDO){ - if (customerDO == null) { - throw exception(CUSTOMER_NOT_EXISTS); - } - } @Override @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#id", level = CrmPermissionLevelEnum.READ) @@ -168,51 +162,58 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @Override @Transactional(rollbackFor = Exception.class) public void receiveCustomer(List ids,Long ownerUserId) { - transferCustomerOwner(ids,ownerUserId); + transferCustomerOwner(ids, ownerUserId); } @Override + @Transactional(rollbackFor = Exception.class) public void distributeCustomer(List ids, Long ownerUserId) { - transferCustomerOwner(ids,ownerUserId); + transferCustomerOwner(ids, ownerUserId); } + /** + * 转移客户负责人 + * + * @param ids 客户编号数组 + * @param ownerUserId 负责人编号 + */ private void transferCustomerOwner(List ids, Long ownerUserId) { // 先一次性加载所有数据,校验客户是否可用 - List customerDOList = customerMapper.selectBatchIds(ids); - for (CrmCustomerDO customerDO : customerDOList) { - // 校验客户是否存在 - validateCustomerExists(customerDO); + List customers = customerMapper.selectBatchIds(ids); + for (CrmCustomerDO customer : customers) { // 校验是否已有负责人 - validCustomerOwnerExist(customerDO); + validateCustomerOwnerExists(customer); // 校验是否锁定 - validCustomerIsLocked(customerDO); + validateCustomerIsLocked(customer); // 校验成交状态 - validCustomerDeal(customerDO); + validateCustomerDeal(customer); } + // TODO @QingX:这里是不是改成一次性更新;不然,如果有 20 个客户,就要执行 20 次 SQL 了; // 统一修改状态 CrmCustomerDO updateDo = new CrmCustomerDO(); updateDo.setOwnerUserId(ownerUserId); + // TODO @QingX:如果更新的数量不对,则应该抛出异常,回滚,并错误提示; for (Long id : ids) { - customerMapper.updateCustomerOwnerUser(id,updateDo); + customerMapper.updateCustomerByOwnerUserIdIsNull(id,updateDo); } - } - private void validCustomerOwnerExist(CrmCustomerDO customerDO) { - if (customerDO.getOwnerUserId()!=null) { + // TODO @QingX:错误提示里面,可以把客户的名字带上哈;不然不知道是谁; + private void validateCustomerOwnerExists(CrmCustomerDO customer) { + if (customer.getOwnerUserId() != null) { throw exception(CUSTOMER_OWNER_EXISTS); } } - private void validCustomerIsLocked(CrmCustomerDO customerDO) { - if (customerDO.getLockStatus() ==true) { + private void validateCustomerIsLocked(CrmCustomerDO customer) { + if (customer.getLockStatus()) { throw exception(CUSTOMER_LOCKED); } } - private void validCustomerDeal(CrmCustomerDO customerDO) { - if (customerDO.getDealStatus() ==true) { + private void validateCustomerDeal(CrmCustomerDO customer) { + if (customer.getDealStatus()) { throw exception(CUSTOMER_ALREADY_DEAL); } } From ec67e63c675d1b5453e899b40e8ce802566e3ca0 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 24 Nov 2023 23:11:58 +0800 Subject: [PATCH 08/35] =?UTF-8?q?crm=EF=BC=9Acode=20review=20=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E7=9A=84=E5=85=AC=E6=B5=B7=E9=A2=86=E5=8F=96=E5=92=8C?= =?UTF-8?q?=E5=88=86=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/customer/CrmCustomerController.java | 41 +++++++------- .../dal/mysql/customer/CrmCustomerMapper.java | 7 +++ .../service/customer/CrmCustomerService.java | 14 ++--- .../customer/CrmCustomerServiceImpl.java | 56 +++++++++++++++++-- 4 files changed, 83 insertions(+), 35 deletions(-) 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 8c48d8df2..8d7055686 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 @@ -16,6 +16,7 @@ import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.util.CollectionUtils; @@ -164,30 +165,26 @@ public class CrmCustomerController { return success(true); } - //@PutMapping("/receive") - //@Operation(summary = "领取公海客户") - //// TODO @xiaqing:1)receiveCustomer 方法名字;2)cIds 改成 ids,要加下 @RequestParam,还有 swagger 注解;3)参数非空,使用 validator 校验;4)返回 true 即可; - //@PreAuthorize("@ss.hasPermission('crm:customer:receive')") - //public CommonResult receiveByIds(List cIds) { - // // 判断是否为空 - // if (CollectionUtils.isEmpty(cIds)) - // return error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(), GlobalErrorCodeConstants.BAD_REQUEST.getMsg()); - // // 领取公海任务 - // // TODO @xiaqing:userid,通过 controller 传递给 service,不要在 service 里面获取,无状态 - // customerService.receive(cIds); - // return success("领取成功"); - //} + @PutMapping("/receive") + @Operation(summary = "领取公海客户") + @Parameter(name = "ids", description = "编号数组", required = true,example = "1,2,3") + @PreAuthorize("@ss.hasPermission('crm:customer:receive')") + public CommonResult receiveCustomer(@RequestParam(value = "ids") List ids){ + customerService.receiveCustomer(ids, getLoginUserId()); + return success(true); + } - // TODO @xiaqing:1)distributeCustomer 方法名;2)cIds 同上;3)参数校验,同上;4)ownerId 改成 ownerUserId,和别的模块统一;5)返回 true 即可; - @PutMapping("/distributeByIds") + @PutMapping("/distribute") @Operation(summary = "分配公海给对应负责人") - @PreAuthorize("@ss.hasPermission('crm:customer:distributeByIds')") - public CommonResult distributeByIds(Long ownerId, List cIds) { - //判断参数不能为空 - if (ownerId == null || CollectionUtils.isEmpty(cIds)) - return error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(), GlobalErrorCodeConstants.BAD_REQUEST.getMsg()); - customerService.distributeByIds(cIds, ownerId); - return success("分配成功"); + @Parameters({ + @Parameter(name = "ownerUserId", description = "分配的负责人编号", required = true, example = "12345"), + @Parameter(name = "ids", description = "客户编号数组", required = true, example = "1,2,3") + }) + @PreAuthorize("@ss.hasPermission('crm:customer:distribute')") + public CommonResult distributeCustomer(@RequestParam(value = "ownerUserId") Long ownerUserId, + @RequestParam(value = "ids") List ids){ + customerService.distributeCustomer(ids, ownerUserId); + return success(true); } } 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 b281b12e9..c9c38d5f0 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 @@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; import cn.iocoder.yudao.module.crm.enums.common.CrmSceneEnum; import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import org.apache.ibatis.annotations.Mapper; @@ -107,4 +108,10 @@ public interface CrmCustomerMapper extends BaseMapperX { return new PageResult<>(mpPage.getRecords(), mpPage.getTotal()); } + default void updateCustomerByOwnerUserIdIsNull(Long id, CrmCustomerDO updateObj) { + update(updateObj, new LambdaUpdateWrapper() + .eq(CrmCustomerDO::getId, id) + .isNull(CrmCustomerDO::getOwnerUserId)); + } + } 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 497196aa5..2aec682f7 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 @@ -85,25 +85,21 @@ public interface CrmCustomerService { */ void lockCustomer(@Valid CrmCustomerUpdateReqVO updateReqVO); - // TODO @xiaqing:根据 controller 的建议,改下 - /** * 领取公海客户 * - * @param ids 要领取的客户 id + * @param ids 要领取的客户编号数组 */ - void receive(List ids); - - // TODO @xiaqing:根据 controller 的建议,改下 + void receiveCustomer(Listids, Long ownerUserId); /** * 分配公海客户 * - * @param cIds 要分配的客户 id - * @param ownerId 分配的负责人id + * @param ids 要分配的客户编号数组 + * @param ownerUserId 分配的负责人编号 * @author xiaqing */ - void distributeByIds(List cIds, Long ownerId); + void distributeCustomer(Listids, Long ownerUserId); /** * 领取公海客户 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 e555896f1..b4d3b3479 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 @@ -149,13 +149,61 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @Override @Transactional(rollbackFor = Exception.class) - public void receive(List ids) { - transferCustomerOwner(ids, SecurityFrameworkUtils.getLoginUserId()); + public void receiveCustomer(List ids,Long ownerUserId) { + transferCustomerOwner(ids, ownerUserId); } @Override - public void distributeByIds(List cIds, Long ownerId) { - transferCustomerOwner(cIds, ownerId); + @Transactional(rollbackFor = Exception.class) + public void distributeCustomer(List ids, Long ownerUserId) { + transferCustomerOwner(ids, ownerUserId); + } + + /** + * 转移客户负责人 + * + * @param ids 客户编号数组 + * @param ownerUserId 负责人编号 + */ + private void transferCustomerOwner(List ids, Long ownerUserId) { + // 先一次性加载所有数据,校验客户是否可用 + List customers = customerMapper.selectBatchIds(ids); + for (CrmCustomerDO customer : customers) { + // 校验是否已有负责人 + validateCustomerOwnerExists(customer); + // 校验是否锁定 + validateCustomerIsLocked(customer); + // 校验成交状态 + validateCustomerDeal(customer); + } + + // TODO @QingX:这里是不是改成一次性更新;不然,如果有 20 个客户,就要执行 20 次 SQL 了; + // 统一修改状态 + CrmCustomerDO updateDo = new CrmCustomerDO(); + updateDo.setOwnerUserId(ownerUserId); + // TODO @QingX:如果更新的数量不对,则应该抛出异常,回滚,并错误提示; + for (Long id : ids) { + customerMapper.updateCustomerByOwnerUserIdIsNull(id,updateDo); + } + } + + // TODO @QingX:错误提示里面,可以把客户的名字带上哈;不然不知道是谁; + private void validateCustomerOwnerExists(CrmCustomerDO customer) { + if (customer.getOwnerUserId() != null) { + throw exception(CUSTOMER_OWNER_EXISTS); + } + } + + private void validateCustomerIsLocked(CrmCustomerDO customer) { + if (customer.getLockStatus()) { + throw exception(CUSTOMER_LOCKED); + } + } + + private void validateCustomerDeal(CrmCustomerDO customer) { + if (customer.getDealStatus()) { + throw exception(CUSTOMER_ALREADY_DEAL); + } } @Override From 13e5d70be7fe7e61b5352c7d8558a84fe8a6eb81 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 24 Nov 2023 23:54:23 +0800 Subject: [PATCH 09/35] =?UTF-8?q?crm=EF=BC=9A=E8=A7=A3=E5=86=B3=E5=86=B2?= =?UTF-8?q?=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../customer/CrmCustomerServiceImpl.java | 44 ------------------- 1 file changed, 44 deletions(-) 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 b4d3b3479..9650b0e58 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 @@ -1,7 +1,6 @@ package cn.iocoder.yudao.module.crm.service.customer; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; 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; @@ -16,7 +15,6 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; -import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; @@ -251,46 +249,4 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { CrmPermissionLevelEnum.OWNER.getLevel()); } - private void transferCustomerOwner(List cIds, Long ownerId) { - // 先一次性校验完成客户是否可用 - // TODO @xiaqing:批量一次性加载客户列表,然后去逐个校验; - for (Long cId : cIds) { - //校验是否存在 - validateCustomerExists(cId); - //todo 校验是否已有负责人 - validCustomerOwnerExist(cId); - //todo 校验是否锁定 - validCustomerIsLocked(cId); - //todo 校验成交状态 - validCustomerDeal(cId); - } - // TODO @xiaqing:每个客户更新的时候,where 条件,加上 owner_user_id is null,防止并发问题; - List updateDos = new ArrayList<>(); - for (Long cId : cIds) { - CrmCustomerDO customerDO = new CrmCustomerDO(); - customerDO.setId(cId); - customerDO.setOwnerUserId(SecurityFrameworkUtils.getLoginUserId()); - } - // 统一修改状态 - customerMapper.updateBatch(updateDos); - } - - private void validCustomerOwnerExist(Long id) { - if (customerMapper.selectById(id).getOwnerUserId() != null) { - throw exception(CUSTOMER_OWNER_EXISTS); - } - } - - private void validCustomerIsLocked(Long id) { - if (customerMapper.selectById(id).getLockStatus() == true) { - throw exception(CUSTOMER_LOCKED); - } - } - - private void validCustomerDeal(Long id) { - if (customerMapper.selectById(id).getDealStatus() == true) { - throw exception(CUSTOMER_ALREADY_DEAL); - } - } - } From 899e40deb9baa950d83aeb823374a75af734a3e6 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 25 Nov 2023 10:02:55 +0800 Subject: [PATCH 10/35] =?UTF-8?q?crm=EF=BC=9Acode=20review=20=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=9D=83=E9=99=90=E7=9A=84=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../util/collection/CollectionUtils.java | 68 +++++------ .../util/spring/SpringExpressionUtils.java | 2 +- .../admin/customer/CrmCustomerController.java | 60 +++++----- .../permission/CrmPermissionController.java | 15 ++- .../convert/customer/CrmCustomerConvert.java | 18 ++- .../permission/CrmPermissionDO.java | 2 +- .../dal/mysql/customer/CrmCustomerMapper.java | 11 +- .../core/aop/CrmPermissionAspect.java | 113 +++++++++--------- .../crm/framework/enums/CrmBizTypeEnum.java | 3 +- .../service/customer/CrmCustomerService.java | 33 ++--- .../customer/CrmCustomerServiceImpl.java | 23 ++-- .../permission/CrmPermissionService.java | 6 +- .../permission/CrmPermissionServiceImpl.java | 54 ++++----- .../module/crm/util/CrmPermissionUtils.java | 1 + 14 files changed, 205 insertions(+), 204 deletions(-) diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/collection/CollectionUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/collection/CollectionUtils.java index 2d3232978..35ebc8ff3 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/collection/CollectionUtils.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/collection/CollectionUtils.java @@ -73,6 +73,23 @@ public class CollectionUtils { return from.stream().filter(filter).map(func).filter(Objects::nonNull).collect(Collectors.toList()); } + public static List convertListByFlatMap(Collection from, + Function> func) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return from.stream().flatMap(func).filter(Objects::nonNull).collect(Collectors.toList()); + } + + public static List convertListByFlatMap(Collection from, + Function mapper, + Function> func) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return from.stream().map(mapper).flatMap(func).filter(Objects::nonNull).collect(Collectors.toList()); + } + public static List mergeValuesFromMap(Map> map) { return map.values() .stream() @@ -101,6 +118,23 @@ public class CollectionUtils { return from.stream().filter(filter).collect(Collectors.toMap(keyFunc, v -> v)); } + public static Set convertSetByFlatMap(Collection from, + Function> func) { + if (CollUtil.isEmpty(from)) { + return new HashSet<>(); + } + return from.stream().flatMap(func).filter(Objects::nonNull).collect(Collectors.toSet()); + } + + public static Set convertSetByFlatMap(Collection from, + Function mapper, + Function> func) { + if (CollUtil.isEmpty(from)) { + return new HashSet<>(); + } + return from.stream().map(mapper).flatMap(func).filter(Objects::nonNull).collect(Collectors.toSet()); + } + public static Map convertMap(Collection from, Function keyFunc) { if (CollUtil.isEmpty(from)) { return new HashMap<>(); @@ -272,38 +306,4 @@ public class CollectionUtils { return deptId == null ? Collections.emptyList() : Collections.singleton(deptId); } - public static List convertListByFlatMap(Collection from, - Function> func) { - if (CollUtil.isEmpty(from)) { - return new ArrayList<>(); - } - return from.stream().flatMap(func).filter(Objects::nonNull).collect(Collectors.toList()); - } - - public static List convertListByFlatMap(Collection from, - Function mapper, - Function> func) { - if (CollUtil.isEmpty(from)) { - return new ArrayList<>(); - } - return from.stream().map(mapper).flatMap(func).filter(Objects::nonNull).collect(Collectors.toList()); - } - - public static Set convertSetByFlatMap(Collection from, - Function> func) { - if (CollUtil.isEmpty(from)) { - return new HashSet<>(); - } - return from.stream().flatMap(func).filter(Objects::nonNull).collect(Collectors.toSet()); - } - - public static Set convertSetByFlatMap(Collection from, - Function mapper, - Function> func) { - if (CollUtil.isEmpty(from)) { - return new HashSet<>(); - } - return from.stream().map(mapper).flatMap(func).filter(Objects::nonNull).collect(Collectors.toSet()); - } - } diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/spring/SpringExpressionUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/spring/SpringExpressionUtils.java index aa8b1d82b..9a7f8812b 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/spring/SpringExpressionUtils.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/spring/SpringExpressionUtils.java @@ -25,7 +25,7 @@ import java.util.Map; public class SpringExpressionUtils { /** - * spel表达式解析器 + * Spring EL 表达式解析器 */ private static final ExpressionParser EXPRESSION_PARSER = new SpelExpressionParser(); /** 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 b09919b2f..976781f71 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 @@ -17,6 +17,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; +import org.mapstruct.ap.internal.util.Collections; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -25,14 +26,13 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; +import java.util.stream.Stream; 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.convertSet; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSetByFlatMap; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @@ -84,19 +84,14 @@ public class CrmCustomerController { if (customer == null) { return success(null); } - // 2. 拼接数据 - // 2.1 获取负责人详情 - Set userIds = new HashSet<>(); - userIds.add(customer.getOwnerUserId()); // 负责人 - userIds.add(Long.parseLong(customer.getCreator())); // 加入创建者 - List userList = adminUserApi.getUserList(userIds); - Map userMap = convertMap(userList, AdminUserRespDTO::getId); - // 2.2 获取部门详情 - Map deptMap = deptApi.getDeptMap(convertSet(userList, AdminUserRespDTO::getDeptId)); + Map userMap = adminUserApi.getUserMap( + Collections.asSet(Long.valueOf(customer.getCreator()), customer.getOwnerUserId())); + Map deptMap = deptApi.getDeptMap(convertSet(userMap.values(), AdminUserRespDTO::getDeptId)); return success(CrmCustomerConvert.INSTANCE.convert(customer, userMap, deptMap)); } + // TODO @puhui999:合并到 receiveCustomer @PutMapping("/receive") @Operation(summary = "领取客户公海数据") @Parameter(name = "id", description = "客户编号", required = true, example = "1024") @@ -106,30 +101,20 @@ public class CrmCustomerController { return success(true); } - @PutMapping("/put-pool") - @Operation(summary = "数据放入公海") - @Parameter(name = "id", description = "客户编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('crm:customer:update')") - public CommonResult putPool(@RequestParam("id") Long id) { - customerService.putPool(id); - return success(true); - } - @GetMapping("/page") @Operation(summary = "获得客户分页") @PreAuthorize("@ss.hasPermission('crm:customer:query')") public CommonResult> getCustomerPage(@Valid CrmCustomerPageReqVO pageVO) { + // 1. 查询客户分页 PageResult pageResult = customerService.getCustomerPage(pageVO, getLoginUserId()); if (CollUtil.isEmpty(pageResult.getList())) { return success(PageResult.empty(pageResult.getTotal())); } - // 1.1 获取负责人详情 - Set userIds = convertSet(pageResult.getList(), CrmCustomerDO::getOwnerUserId); - userIds.addAll(convertSet(pageResult.getList(), item -> Long.parseLong(item.getCreator()))); // 加入创建者 - List userList = adminUserApi.getUserList(userIds); - Map userMap = convertMap(userList, AdminUserRespDTO::getId); - // 1.2 获取部门详情 - Map deptMap = deptApi.getDeptMap(convertSet(userList, AdminUserRespDTO::getDeptId)); + + // 2. 拼接数据 + Map userMap = adminUserApi.getUserMap( + convertSetByFlatMap(pageResult.getList(), user -> Stream.of(Long.parseLong(user.getCreator()), user.getOwnerUserId()))); + Map deptMap = deptApi.getDeptMap(convertSet(userMap.values(), AdminUserRespDTO::getDeptId)); return success(CrmCustomerConvert.INSTANCE.convertPage(pageResult, userMap, deptMap)); } @@ -162,6 +147,17 @@ public class CrmCustomerController { return success(true); } + // ==================== 公海相关操作 ==================== + + @PutMapping("/put-pool") + @Operation(summary = "数据放入公海") + @Parameter(name = "id", description = "客户编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('crm:customer:update')") + public CommonResult putCustomerPool(@RequestParam("id") Long id) { + customerService.putCustomerPool(id); + return success(true); + } + @PutMapping("/receive") @Operation(summary = "领取公海客户") @Parameter(name = "ids", description = "编号数组", required = true,example = "1,2,3") @@ -174,12 +170,12 @@ public class CrmCustomerController { @PutMapping("/distribute") @Operation(summary = "分配公海给对应负责人") @Parameters({ - @Parameter(name = "ownerUserId", description = "分配的负责人编号", required = true, example = "12345"), - @Parameter(name = "ids", description = "客户编号数组", required = true, example = "1,2,3") + @Parameter(name = "ids", description = "客户编号数组", required = true, example = "1,2,3"), + @Parameter(name = "ownerUserId", description = "分配的负责人编号", required = true, example = "12345") }) @PreAuthorize("@ss.hasPermission('crm:customer:distribute')") - public CommonResult distributeCustomer(@RequestParam(value = "ownerUserId") Long ownerUserId, - @RequestParam(value = "ids") List ids){ + public CommonResult distributeCustomer(@RequestParam(value = "ids") List ids, + @RequestParam(value = "ownerUserId") Long ownerUserId){ customerService.distributeCustomer(ids, ownerUserId); return success(true); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.java index fcae121f5..34a912a2e 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.java @@ -71,29 +71,32 @@ public class CrmPermissionController { return success(true); } + // TODO @puhui999:这个要不要放到 Service 实现,让 Controller 还轻一点; @DeleteMapping("/delete") @Operation(summary = "删除数据权限") @Parameter(name = "ids", description = "数据权限编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('crm:permission:delete')") public CommonResult deletePermission(@RequestParam("ids") Collection ids) { - List permissions = permissionService.getPermissionListByIds(ids); + List permissions = permissionService.getPermissionList(ids); if (CollUtil.isEmpty(permissions)) { throw exception(CRM_PERMISSION_NOT_EXISTS); } Set bizIds = convertSet(permissions, CrmPermissionDO::getBizId); - if (bizIds.size() > 1) { // 情况一:数据权限的模块数据编号是一致的不可能存在两个 + if (bizIds.size() > 1) { // 情况一:数据权限的模块数据编号是一致的不可能存在两个 TODO @puhui999:这里可以额外说明下原因,就是批量删除权限的时候,只能属于同一个 bizId 下; throw exception(CRM_PERMISSION_DELETE_FAIL); } + // TODO @puhui999:下面 2 个,可以忽略。简单点哈; if (permissions.size() != ids.size()) { // 情况二:期望数量和实际结果不一致 throw exception(CRM_PERMISSION_NOT_EXISTS); } // 情况三:不能包含负责人 + // TODO @puhui999:isOwner 可以直接放到判断里,不用单独取个变量名 boolean isOwner = CollectionUtils.anyMatch(permissions, item -> ObjUtil.equal(item.getLevel(), CrmPermissionLevelEnum.OWNER.getLevel())); if (isOwner) { throw exception(CRM_PERMISSION_DELETE_FAIL_EXIST_OWNER); } // 校验操作人是否为负责人 - CrmPermissionDO permission = permissionService.getPermissionByIdAndUserId(permissions.get(0).getBizId(), getLoginUserId()); + CrmPermissionDO permission = permissionService.getPermission(permissions.get(0).getBizId(), getLoginUserId()); if (!CrmPermissionLevelEnum.isOwner(permission.getLevel())) { throw exception(CRM_PERMISSION_DELETE_DENIED); } @@ -102,13 +105,15 @@ public class CrmPermissionController { return success(true); } + // TODO @puhui999:这个要不要放到 Service 实现,让 Controller 还轻一点; + // TODO @puhui999:delete-self 就可以啦。方法名叫 deleteSelfPermission @DeleteMapping("/deleteSelfPermission") @Operation(summary = "删除自己的数据权限") @Parameter(name = "id", description = "数据权限编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('crm:permission:delete')") public CommonResult deletePermission(@RequestParam("id") Long id) { // 校验数据存在且是自己 - CrmPermissionDO permission = permissionService.getPermissionByIdAndUserId(id, getLoginUserId()); + CrmPermissionDO permission = permissionService.getPermission(id, getLoginUserId()); if (permission == null) { throw exception(CRM_PERMISSION_NOT_EXISTS); } @@ -131,7 +136,7 @@ public class CrmPermissionController { @PreAuthorize("@ss.hasPermission('crm:permission:query')") public CommonResult> getPermissionList(@RequestParam("bizType") Integer bizType, @RequestParam("bizId") Long bizId) { - List permission = permissionService.getPermissionByBizTypeAndBizId(bizType, bizId); + List permission = permissionService.getPermissionListByBiz(bizType, bizId); if (CollUtil.isEmpty(permission)) { return success(Collections.emptyList()); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java index 86808ec92..88971d4af 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java @@ -37,21 +37,17 @@ public interface CrmCustomerConvert { /** * 设置用户信息 * - * @param respVO CRM 客户 Response VO + * @param customer CRM 客户 Response VO * @param userMap 用户信息 map * @param deptMap 用户部门信息 map */ - static void setUserInfo(CrmCustomerRespVO respVO, Map userMap, Map deptMap) { - respVO.setAreaName(AreaUtils.format(respVO.getAreaId())); - findAndThen(userMap, respVO.getOwnerUserId(), user -> { - respVO.setOwnerUserName(user.getNickname()); - findAndThen(deptMap, user.getDeptId(), dept -> { - respVO.setOwnerUserDeptName(dept.getName()); - }); - }); - findAndThen(userMap, Long.parseLong(respVO.getCreator()), user -> { - respVO.setCreatorName(user.getNickname()); + static void setUserInfo(CrmCustomerRespVO customer, Map userMap, Map deptMap) { + customer.setAreaName(AreaUtils.format(customer.getAreaId())); + findAndThen(userMap, customer.getOwnerUserId(), user -> { + customer.setOwnerUserName(user.getNickname()); + findAndThen(deptMap, user.getDeptId(), dept -> customer.setOwnerUserDeptName(dept.getName())); }); + findAndThen(userMap, Long.parseLong(customer.getCreator()), user -> customer.setCreatorName(user.getNickname())); } List convertList02(List list); diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/permission/CrmPermissionDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/permission/CrmPermissionDO.java index 3bdd575ee..bdfd8d38f 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/permission/CrmPermissionDO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/permission/CrmPermissionDO.java @@ -24,7 +24,7 @@ import lombok.*; public class CrmPermissionDO extends BaseDO { /** - * ID + * 编号,主键自增 */ @TableId private Long id; 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 cb409fbda..bfd0c8dc0 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 @@ -14,9 +14,6 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import org.apache.ibatis.annotations.Mapper; -import java.util.Collection; -import java.util.List; - /** * 客户 Mapper * @@ -40,6 +37,7 @@ public interface CrmCustomerMapper extends BaseMapperX { .eqIfPresent(CrmCustomerDO::getSource, pageReqVO.getSource())); } + // TODO @puhui999:这个方法还要哇? default PageResult selectPage1(CrmCustomerPageReqVO pageReqVO, Long userId) { LambdaQueryWrapperX queryWrapperX = new LambdaQueryWrapperX<>(); //queryWrapperX.sql @@ -94,7 +92,7 @@ public interface CrmCustomerMapper extends BaseMapperX { */ if (pageReqVO.getPool()) { // 情况一:公海 mpjLambdaWrapperX.isNull(CrmCustomerDO::getOwnerUserId); - } else {// 情况一:不是公海 + } else { // 情况二:不是公海 mpjLambdaWrapperX.isNotNull(CrmCustomerDO::getOwnerUserId); } // TODO 场景数据过滤 @@ -117,9 +115,4 @@ public interface CrmCustomerMapper extends BaseMapperX { .isNull(CrmCustomerDO::getOwnerUserId)); } - default List selectList(Collection ids) { - return selectList(new LambdaQueryWrapperX() - .inIfPresent(CrmCustomerDO::getId, ids)); - } - } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/aop/CrmPermissionAspect.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/aop/CrmPermissionAspect.java index cfe28b435..f1a9075cd 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/aop/CrmPermissionAspect.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/aop/CrmPermissionAspect.java @@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.common.util.spring.SpringExpressionUtils; import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission; +import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; import lombok.extern.slf4j.Slf4j; @@ -38,6 +39,56 @@ public class CrmPermissionAspect { @Resource private CrmPermissionService crmPermissionService; + @Before("@annotation(crmPermission)") + public void doBefore(JoinPoint joinPoint, CrmPermission crmPermission) { + // TODO 芋艿:临时,方便大家调试 + //if (true) { + // return; + //} + // 获取相关属性值 + Map expressionValues = parseExpressions(joinPoint, crmPermission); + Integer bizType = StrUtil.isEmpty(crmPermission.bizTypeValue()) ? + crmPermission.bizType()[0].getType() : (Integer) expressionValues.get(crmPermission.bizTypeValue()); // 模块类型 + Long bizId = (Long) expressionValues.get(crmPermission.bizId()); // 模块数据编号 + Integer permissionLevel = crmPermission.level().getLevel(); // 需要的权限级别 + + // TODO 如果是超级管理员则直接通过 + //if (superAdmin){ + // return; + //} + + // 1. 获取数据权限 + List bizPermissions = crmPermissionService.getPermissionListByBiz(bizType, bizId); + if (CollUtil.isEmpty(bizPermissions)) { // 数据权限不存存那么数据也不存在 + throw exception(CRM_PERMISSION_MODEL_NOT_EXISTS, CrmBizTypeEnum.getNameByType(bizType)); + } + // 2.1 情况一:如果自己是负责人,则默认有所有权限 + CrmPermissionDO userPermission = CollUtil.findOne(bizPermissions, permission -> ObjUtil.equal(permission.getUserId(), getUserId())); + if (userPermission != null) { + if (CrmPermissionLevelEnum.isOwner(userPermission.getLevel())) { + return; + } + // 2.2 情况二:校验自己是否有读权限 + if (CrmPermissionLevelEnum.isRead(permissionLevel)) { + if (CrmPermissionLevelEnum.isRead(userPermission.getLevel()) // 校验当前用户是否有读权限 + || CrmPermissionLevelEnum.isWrite(userPermission.getLevel())) { // 校验当前用户是否有写权限 + return; + } + } + // 2.3 情况三:校验自己是否有写权限 + if (CrmPermissionLevelEnum.isWrite(permissionLevel)) { + if (CrmPermissionLevelEnum.isWrite(userPermission.getLevel())) { // 校验当前用户是否有写权限 + return; + } + } + } + // 2.4 没有权限! + // 打个 info 日志,方便后续排查问题、审计 + log.info("[doBefore][userId({}) 要求权限({}) 实际权限({}) 数据校验错误]", + getUserId(), permissionLevel, toJsonString(userPermission)); + throw exception(CRM_PERMISSION_DENIED, CrmBizTypeEnum.getNameByType(bizType)); + } + /** * 获得用户编号 * @@ -47,63 +98,15 @@ public class CrmPermissionAspect { return WebFrameworkUtils.getLoginUserId(); } - private static Map getSpelValue(JoinPoint joinPoint, CrmPermission crmPermission) { - List spelList = new ArrayList<>(); // 表达式列表 - spelList.add(crmPermission.bizId()); + private static Map parseExpressions(JoinPoint joinPoint, CrmPermission crmPermission) { + // 1. 需要解析的表达式 + List expressionStrings = new ArrayList<>(2); + expressionStrings.add(crmPermission.bizId()); if (StrUtil.isNotEmpty(crmPermission.bizTypeValue())) { // 为空则表示 bizType 有值 - spelList.add(crmPermission.bizTypeValue()); + expressionStrings.add(crmPermission.bizTypeValue()); } - return SpringExpressionUtils.parseExpressions(joinPoint, spelList); - } - - @Before("@annotation(crmPermission)") - public void doBefore(JoinPoint joinPoint, CrmPermission crmPermission) { - // TODO 芋艿:临时,方便大家调试 - //if (true) { - // return; - //} - // 获取相关属性值 - Map spelValue = getSpelValue(joinPoint, crmPermission); - Integer bizType = StrUtil.isEmpty(crmPermission.bizTypeValue()) ? - crmPermission.bizType()[0].getType() : (Integer) spelValue.get(crmPermission.bizTypeValue()); // 模块类型 - Long bizId = (Long) spelValue.get(crmPermission.bizId()); // 模块数据编号 - Integer permissionLevel = crmPermission.level().getLevel(); // 需要的权限级别 - - // TODO 如果是超级管理员则直接通过 - //if (superAdmin){ - // return; - //} - - // 1. 获取数据权限 - List bizPermissions = crmPermissionService.getPermissionByBizTypeAndBizId(bizType, bizId); - if (CollUtil.isEmpty(bizPermissions)) { // 数据权限不存存那么数据也不存在 - throw exception(CRM_PERMISSION_MODEL_NOT_EXISTS, crmPermission.bizType()[0].getName()); - } - // 2.1 情况一:如果自己是负责人,则默认有所有权限 - CrmPermissionDO userPermission = CollUtil.findOne(bizPermissions, item -> ObjUtil.equal(item.getUserId(), getUserId())); - if (CrmPermissionLevelEnum.isOwner(userPermission.getLevel())) { - return; - } - // 2.2 情况二:校验自己是否有读权限 - if (CrmPermissionLevelEnum.isRead(permissionLevel)) { - if (CrmPermissionLevelEnum.isRead(userPermission.getLevel())) { // 校验当前用户是否有读权限 - return; - } - // 如果查询数据的话拥有写权限的也能查询 - if (CrmPermissionLevelEnum.isWrite(userPermission.getLevel())) { // 校验当前用户是否有写权限 - return; - } - } - // 2.3 情况三:校验自己是否有写权限 - if (CrmPermissionLevelEnum.isWrite(permissionLevel)) { - if (CrmPermissionLevelEnum.isWrite(userPermission.getLevel())) { // 校验当前用户是否有写权限 - return; - } - } - - // 打个 info 日志,方便后续排查问题、审计; - log.info("[doBefore][crmPermission({}) 数据校验错误]", toJsonString(userPermission)); - throw exception(CRM_PERMISSION_DENIED, crmPermission.bizType()[0].getName()); + // 2. 执行解析 + return SpringExpressionUtils.parseExpressions(joinPoint, expressionStrings); } } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/enums/CrmBizTypeEnum.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/enums/CrmBizTypeEnum.java index f381777ae..1e780df5c 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/enums/CrmBizTypeEnum.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/enums/CrmBizTypeEnum.java @@ -9,7 +9,7 @@ import lombok.RequiredArgsConstructor; import java.util.Arrays; /** - * Crm 类型枚举 + * CRM 类型枚举 * * @author HUIHUI */ @@ -24,6 +24,7 @@ public enum CrmBizTypeEnum implements IntArrayValuable { CRM_CONTRACT(5, "合同"); public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmBizTypeEnum::getType).toArray(); + /** * 类型 */ 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 24605d55c..ae429c745 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,6 +46,15 @@ public interface CrmCustomerService { */ CrmCustomerDO getCustomer(Long id); + /** + * 获得客户列表 + * + * @param ids 客户编号数组 + * @author ljlleo + * @return 客户列表 + */ + List getCustomerList(Collection ids); + /** * 获得客户分页 * @@ -86,6 +95,15 @@ public interface CrmCustomerService { */ void lockCustomer(@Valid CrmCustomerUpdateReqVO updateReqVO); + // ==================== 公海相关操作 ==================== + + /** + * 客户放入公海 + * + * @param id 客户编号 + */ + void putCustomerPool(Long id); + /** * 领取公海客户 * @@ -110,19 +128,4 @@ public interface CrmCustomerService { */ void receive(Long id, Long userId); - /** - * 客户放入公海 - * - * @param id 客户编号 - */ - void putPool(Long id); - - /** - * 根据客户ID集合查询客户集合 - * @param ids - * @author ljlleo - * @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 1156a2c98..aa5ef9f5b 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 @@ -15,6 +15,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Objects; @@ -33,6 +34,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @Resource private CrmCustomerMapper customerMapper; + @Resource private CrmPermissionService crmPermissionService; @@ -46,8 +48,6 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { // 创建数据权限 crmPermissionService.createPermission(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType()) .setBizId(customer.getId()).setUserId(userId).setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); // 设置当前操作的人为负责人 - - // 返回 return customer.getId(); } @@ -86,6 +86,11 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { return customerMapper.selectById(id); } + @Override + public List getCustomerList(Collection ids) { + return customerMapper.selectBatchIds(ids); + } + @Override public PageResult getCustomerPage(CrmCustomerPageReqVO pageReqVO, Long userId) { // 1.1. TODO 如果是超级管理员 @@ -204,6 +209,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { } } + // TODO @puhui999:合并到 receiveCustomer 里 @Override @Transactional(rollbackFor = Exception.class) public void receive(Long id, Long userId) { @@ -227,31 +233,28 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @Override @Transactional(rollbackFor = Exception.class) @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#id", level = CrmPermissionLevelEnum.OWNER) - public void putPool(Long id) { + public void putCustomerPool(Long id) { // 1. 校验存在 CrmCustomerDO customer = customerMapper.selectById(id); if (customer == null) { throw exception(CUSTOMER_NOT_EXISTS); } + // TODO puhui999:校验合并到 validateCustomerOwnerExists、validateCustomerIsLocked // 1.2. 校验是否为公海数据 if (customer.getOwnerUserId() == null) { throw exception(CUSTOMER_IN_POOL); } - // 1.3. 校验客户是否锁定、 + // 1.3. 校验客户是否锁定 if (customer.getLockStatus()) { throw exception(CUSTOMER_LOCKED_PUT_POOL_FAIL); } - // 2. 公海数据-设置负责人 NULL + // 2. 设置负责人为 NULL + // TODO @puhui999:updateById 这么操作,是无法设置 null 的; customerMapper.updateById(new CrmCustomerDO().setId(customer.getId()).setOwnerUserId(null)); // 3. 删除负责人数据权限 crmPermissionService.deletePermission(CrmBizTypeEnum.CRM_CUSTOMER.getType(), customer.getId(), CrmPermissionLevelEnum.OWNER.getLevel()); } - @Override - public List getCustomerList(Collection ids) { - return customerMapper.selectList(ids); - } - } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java index 638388031..3067bf7c2 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java @@ -64,7 +64,7 @@ public interface CrmPermissionService { * @param userId 用户编号 * @return 数据权限 */ - CrmPermissionDO getPermissionByIdAndUserId(Long id, Long userId); + CrmPermissionDO getPermission(Long id, Long userId); /** * 获取数据权限列表,通过 数据类型 x 某个数据 @@ -73,7 +73,7 @@ public interface CrmPermissionService { * @param bizId 数据编号,关联 {@link CrmBizTypeEnum} 对应模块 DO#getId() * @return Crm 数据权限列表 */ - List getPermissionByBizTypeAndBizId(Integer bizType, Long bizId); + List getPermissionListByBiz(Integer bizType, Long bizId); /** * 获得数据权限列表 @@ -81,7 +81,7 @@ public interface CrmPermissionService { * @param ids 数据权限编号列表 * @return 数据权限列表 */ - List getPermissionListByIds(Collection ids); + List getPermissionList(Collection ids); /** * 获取用户参与的模块数据列表 diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java index 5d85ebf80..935b6f0e0 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java @@ -55,27 +55,34 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { @Override @Transactional(rollbackFor = Exception.class) public void updatePermission(CrmPermissionUpdateReqVO updateReqVO) { - // 校验存在 + // 1. 校验存在 validateCrmPermissionExists(updateReqVO.getIds()); - + // 2. 更新 List updateDO = CrmPermissionConvert.INSTANCE.convertList(updateReqVO); crmPermissionMapper.updateBatch(updateDO); } + private void validateCrmPermissionExists(Collection ids) { + List permissionList = crmPermissionMapper.selectBatchIds(ids); + if (ObjUtil.notEqual(permissionList.size(), ids.size())) { + throw exception(CRM_PERMISSION_NOT_EXISTS); + } + } + @Override @Transactional(rollbackFor = Exception.class) public void transferPermission(CrmPermissionTransferReqBO transferReqBO) { - // 1. 校验数据权限-是否是负责人,只有负责人才可以转移 - CrmPermissionDO oldPermission = crmPermissionMapper.selectByBizTypeAndBizIdByUserId(transferReqBO.getBizType(), - transferReqBO.getBizId(), transferReqBO.getUserId()); - String crmName = CrmBizTypeEnum.getNameByType(transferReqBO.getBizType()); + // 1. 校验数据权限:是否是负责人,只有负责人才可以转移 + CrmPermissionDO oldPermission = crmPermissionMapper.selectByBizTypeAndBizIdByUserId( + transferReqBO.getBizType(), transferReqBO.getBizId(), transferReqBO.getUserId()); + String bizTypeName = CrmBizTypeEnum.getNameByType(transferReqBO.getBizType()); // TODO 校验是否为超级管理员 || 1 if (oldPermission == null || !isOwner(oldPermission.getLevel())) { - throw exception(CRM_PERMISSION_DENIED, crmName); + throw exception(CRM_PERMISSION_DENIED, bizTypeName); } // 1.1 校验转移对象是否已经是该负责人 if (ObjUtil.equal(transferReqBO.getNewOwnerUserId(), oldPermission.getUserId())) { - throw exception(CRM_PERMISSION_MODEL_TRANSFER_FAIL_OWNER_USER_EXISTS, crmName); + throw exception(CRM_PERMISSION_MODEL_TRANSFER_FAIL_OWNER_USER_EXISTS, bizTypeName); } // 1.2 校验新负责人是否存在 adminUserApi.validateUserList(Collections.singletonList(transferReqBO.getNewOwnerUserId())); @@ -84,23 +91,23 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { List permissions = crmPermissionMapper.selectByBizTypeAndBizId( transferReqBO.getBizType(), transferReqBO.getBizId()); // 获得所有数据权限 CrmPermissionDO permission = CollUtil.findOne(permissions, - item -> ObjUtil.equal(item.getUserId(), transferReqBO.getNewOwnerUserId())); // 校验新负责人是否存在于数据权限列表 - if (permission == null) { // 不存在则以负责人的级别加入 + item -> ObjUtil.equal(item.getUserId(), transferReqBO.getNewOwnerUserId())); + if (permission == null) { crmPermissionMapper.insert(new CrmPermissionDO().setBizType(transferReqBO.getBizType()) .setBizId(transferReqBO.getBizId()).setUserId(transferReqBO.getNewOwnerUserId()) .setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); - } else { // 存在则修改权限级别 + } else { crmPermissionMapper.updateById(new CrmPermissionDO().setId(permission.getId()) .setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); } // 3. 修改老负责人的权限 - if (transferReqBO.getOldOwnerPermissionLevel() != null) { // 加入数据权限列表 + if (transferReqBO.getOldOwnerPermissionLevel() != null) { crmPermissionMapper.updateById(new CrmPermissionDO().setId(oldPermission.getId()) - .setLevel(transferReqBO.getOldOwnerPermissionLevel())); // 设置权限级别 - return; + .setLevel(transferReqBO.getOldOwnerPermissionLevel())); + } else { + crmPermissionMapper.deleteById(oldPermission.getId()); } - crmPermissionMapper.deleteById(oldPermission.getId()); } @Override @@ -116,7 +123,8 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { @Override @Transactional(rollbackFor = Exception.class) public void deletePermission(Integer bizType, Long bizId, Integer level) { - List permissions = crmPermissionMapper.selectListByBizTypeAndBizIdAndLevel(bizType, bizId, level); + List permissions = crmPermissionMapper.selectListByBizTypeAndBizIdAndLevel( + bizType, bizId, level); // 校验存在 if (CollUtil.isEmpty(permissions)) { throw exception(CRM_PERMISSION_NOT_EXISTS); @@ -127,31 +135,23 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { } @Override - public CrmPermissionDO getPermissionByIdAndUserId(Long id, Long userId) { + public CrmPermissionDO getPermission(Long id, Long userId) { return crmPermissionMapper.selectByIdAndUserId(id, userId); } @Override - public List getPermissionByBizTypeAndBizId(Integer bizType, Long bizId) { + public List getPermissionListByBiz(Integer bizType, Long bizId) { return crmPermissionMapper.selectByBizTypeAndBizId(bizType, bizId); } @Override - public List getPermissionListByIds(Collection ids) { + public List getPermissionList(Collection ids) { if (CollUtil.isEmpty(ids)) { return Collections.emptyList(); } return crmPermissionMapper.selectBatchIds(ids); } - private void validateCrmPermissionExists(Collection ids) { - List permissionList = crmPermissionMapper.selectBatchIds(ids); - // 校验存在 - if (ObjUtil.notEqual(permissionList.size(), ids.size())) { - throw exception(CRM_PERMISSION_NOT_EXISTS); - } - } - @Override public List getPermissionListByBizTypeAndUserId(Integer bizType, Long userId) { return crmPermissionMapper.selectListByBizTypeAndUserId(bizType, userId); diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmPermissionUtils.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmPermissionUtils.java index 675c507be..7c15b5f1f 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmPermissionUtils.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmPermissionUtils.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.crm.util; import cn.hutool.core.util.StrUtil; import com.github.yulichang.wrapper.MPJLambdaWrapper; +// TODO @puhui999:这个类还要哇? /** * 数据权限工具类 * From 3e9eb59de394e2010376671ff65bde27f7b680b0 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 25 Nov 2023 10:55:47 +0800 Subject: [PATCH 11/35] =?UTF-8?q?crm=EF=BC=9Acode=20review=20=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=9D=83=E9=99=90=E7=9A=84=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/mysql/crm_menu.sql | 88 ------------------- .../admin/customer/CrmCustomerController.java | 2 +- .../permission/CrmPermissionDO.java | 2 +- .../dal/mysql/customer/CrmCustomerMapper.java | 2 +- 4 files changed, 3 insertions(+), 91 deletions(-) diff --git a/sql/mysql/crm_menu.sql b/sql/mysql/crm_menu.sql index a4b9105e0..e69de29bb 100644 --- a/sql/mysql/crm_menu.sql +++ b/sql/mysql/crm_menu.sql @@ -1,88 +0,0 @@ --- ---------------------------- --- 客户公海配置 --- ---------------------------- --- 菜单 SQL -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status, component_name -) -VALUES ( - '客户公海配置', '', 2, 0, 2397, - 'customer-pool-config', 'ep:data-analysis', 'crm/customerPoolConf/index', 0, 'CustomerPoolConf' -); - --- 按钮父菜单ID --- 暂时只支持 MySQL。如果你是 Oracle、PostgreSQL、SQLServer 的话,需要手动修改 @parentId 的部分的代码 -SELECT @parentId := LAST_INSERT_ID(); - --- 按钮 SQL -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status -) -VALUES ( - '客户公海配置保存', 'crm:customer-pool-config:update', 3, 1, @parentId, - '', '', '', 0 -); - - - - --- ---------------------------- --- 客户限制配置管理 --- ---------------------------- --- 菜单 SQL -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status, component_name -) -VALUES ( - '客户限制配置管理', '', 2, 0, 2397, - 'customer-limit-config', '', 'crm/customerLimitConfig/index', 0, 'CrmCustomerLimitConfig' -); - --- 按钮父菜单ID --- 暂时只支持 MySQL。如果你是 Oracle、PostgreSQL、SQLServer 的话,需要手动修改 @parentId 的部分的代码 -SELECT @parentId := LAST_INSERT_ID(); - --- 按钮 SQL -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status -) -VALUES ( - '客户限制配置查询', 'crm:customer-limit-config:query', 3, 1, @parentId, - '', '', '', 0 -); -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status -) -VALUES ( - '客户限制配置创建', 'crm:customer-limit-config:create', 3, 2, @parentId, - '', '', '', 0 -); -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status -) -VALUES ( - '客户限制配置更新', 'crm:customer-limit-config:update', 3, 3, @parentId, - '', '', '', 0 -); -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status -) -VALUES ( - '客户限制配置删除', 'crm:customer-limit-config:delete', 3, 4, @parentId, - '', '', '', 0 -); -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status -) -VALUES ( - '客户限制配置导出', 'crm:customer-limit-config:export', 3, 5, @parentId, - '', '', '', 0 -); 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 976781f71..e55b8fdd8 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 @@ -92,7 +92,7 @@ public class CrmCustomerController { } // TODO @puhui999:合并到 receiveCustomer - @PutMapping("/receive") + @PutMapping("/receive-") @Operation(summary = "领取客户公海数据") @Parameter(name = "id", description = "客户编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('crm:customer:update')") diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/permission/CrmPermissionDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/permission/CrmPermissionDO.java index bdfd8d38f..33cb2dbeb 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/permission/CrmPermissionDO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/permission/CrmPermissionDO.java @@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; /** - * Crm 数据权限 DO + * CRM 数据权限 DO * * @author HUIHUI */ 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 bfd0c8dc0..de545ac51 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 @@ -61,7 +61,7 @@ public interface CrmCustomerMapper extends BaseMapperX { //CrmPermissionUtils.builderRightJoinQuery(mpjLambdaWrapperX, CrmBizTypeEnum.CRM_CUSTOMER.getType(), userId); mpjLambdaWrapperX //.rightJoin("(SELECT t1.biz_id FROM crm_permission t1 WHERE (t1.biz_type = 1 AND t1.user_id = 1)) t2 on t.id = t2.biz_id"); - .rightJoin(CrmPermissionDO.class, CrmPermissionDO::getBizId, CrmCustomerDO::getId) + .rightJoin(CrmPermissionDO.class, CrmPermissionDO::getBizId, CrmCustomerDO::getId) // TODO @puhui999:应该是 inner join? .eq(CrmPermissionDO::getBizType, CrmBizTypeEnum.CRM_CUSTOMER.getType()) .eq(CrmPermissionDO::getUserId, userId); /** TODO @芋艿: From 63f9bcb0a3f451a73996bacbe4b0da7ff7b35a36 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 25 Nov 2023 12:02:03 +0800 Subject: [PATCH 12/35] =?UTF-8?q?crm=EF=BC=9Acode=20review=20=E5=95=86?= =?UTF-8?q?=E6=9C=BA=E7=B1=BB=E5=9E=8B=E3=80=81=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/business/CrmBusinessController.java | 16 +++++--- .../CrmBusinessStatusTypeController.java | 15 ++++++-- .../admin/business/package-info.java | 4 -- .../vo/{ => business}/CrmBusinessBaseVO.java | 2 +- .../CrmBusinessCreateReqVO.java | 2 +- .../vo/{ => business}/CrmBusinessExcelVO.java | 2 +- .../CrmBusinessExportReqVO.java | 2 +- .../{ => business}/CrmBusinessPageReqVO.java | 2 +- .../vo/{ => business}/CrmBusinessRespVO.java | 8 ++-- .../CrmBusinessTransferReqVO.java | 2 +- .../CrmBusinessUpdateReqVO.java | 3 +- .../CrmBusinessStatusPageReqVO.java | 2 +- .../CrmBusinessStatusQueryVO.java | 2 +- .../{ => status}/CrmBusinessStatusRespVO.java | 4 +- .../CrmBusinessStatusSaveReqVO.java | 4 +- .../CrmBusinessStatusTypePageReqVO.java | 2 +- .../CrmBusinessStatusTypeQueryVO.java | 2 +- .../CrmBusinessStatusTypeRespVO.java | 10 ++--- .../CrmBusinessStatusTypeSaveReqVO.java | 4 +- .../convert/business/CrmBusinessConvert.java | 12 +++--- .../CrmBusinessStatusConvert.java | 4 +- .../CrmBusinessStatusTypeConvert.java | 11 +++--- .../dataobject/business/CrmBusinessDO.java | 3 +- .../business/CrmBusinessStatusDO.java | 4 ++ .../business/CrmBusinessStatusTypeDO.java | 2 + .../dal/mysql/business/CrmBusinessMapper.java | 4 +- .../business/CrmBusinessStatusMapper.java | 7 ++-- .../business/CrmBusinessStatusTypeMapper.java | 4 +- .../service/business/CrmBusinessService.java | 2 +- .../business/CrmBusinessServiceImpl.java | 2 +- .../business/CrmBusinessStatusService.java | 8 ++-- .../CrmBusinessStatusServiceImpl.java | 7 ++-- .../CrmBusinessStatusTypeService.java | 8 ++-- .../CrmBusinessStatusTypeServiceImpl.java | 38 +++++++++---------- .../BusinessStatusTypeServiceImplTest.java | 37 +++++++++--------- .../business/CrmBusinessServiceImplTest.java | 6 +-- 36 files changed, 136 insertions(+), 111 deletions(-) delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/package-info.java rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/{ => business}/CrmBusinessBaseVO.java (99%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/{ => business}/CrmBusinessCreateReqVO.java (97%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/{ => business}/CrmBusinessExcelVO.java (99%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/{ => business}/CrmBusinessExportReqVO.java (99%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/{ => business}/CrmBusinessPageReqVO.java (97%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/{ => business}/CrmBusinessRespVO.java (67%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/{ => business}/CrmBusinessTransferReqVO.java (99%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/{ => business}/CrmBusinessUpdateReqVO.java (86%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/{ => status}/CrmBusinessStatusPageReqVO.java (98%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/{ => status}/CrmBusinessStatusQueryVO.java (98%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/{ => status}/CrmBusinessStatusRespVO.java (90%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/{ => status}/CrmBusinessStatusSaveReqVO.java (83%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/{ => type}/CrmBusinessStatusTypePageReqVO.java (98%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/{ => type}/CrmBusinessStatusTypeQueryVO.java (98%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/{ => type}/CrmBusinessStatusTypeRespVO.java (91%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/{ => type}/CrmBusinessStatusTypeSaveReqVO.java (80%) diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java index 524a078b1..997c5667c 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java @@ -1,16 +1,18 @@ package cn.iocoder.yudao.module.crm.controller.admin.business; +import cn.hutool.core.collection.CollUtil; 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.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.*; +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.convert.business.CrmBusinessConvert; import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO; import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO; import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusTypeDO; import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; -import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService; import cn.iocoder.yudao.module.crm.service.business.CrmBusinessStatusService; import cn.iocoder.yudao.module.crm.service.business.CrmBusinessStatusTypeService; @@ -91,17 +93,21 @@ public class CrmBusinessController { @PreAuthorize("@ss.hasPermission('crm:business:query')") public CommonResult> getBusinessPage(@Valid CrmBusinessPageReqVO pageVO) { PageResult pageResult = businessService.getBusinessPage(pageVO, getLoginUserId()); - //处理客户名称回显 + if (CollUtil.isEmpty(pageResult.getList())) { + return success(PageResult.empty(pageResult.getTotal())); + } + // 处理客户名称回显 + // TODO @ljlleo:可以使用 CollectionUtils.convertSet 替代常用的 stream 操作,更简洁一点;下面几个也是哈; Set customerIds = pageResult.getList().stream() .map(CrmBusinessDO::getCustomerId).filter(Objects::nonNull).collect(Collectors.toSet()); List customerList = customerService.getCustomerList(customerIds); - //处理商机状态类型名称回显 + // 处理商机状态类型名称回显 Set statusTypeIds = pageResult.getList().stream() .map(CrmBusinessDO::getStatusTypeId).filter(Objects::nonNull).collect(Collectors.toSet()); CrmBusinessStatusTypeQueryVO queryStatusTypeVO = new CrmBusinessStatusTypeQueryVO(); queryStatusTypeVO.setIdList(statusTypeIds); List statusTypeList = businessStatusTypeService.selectList(queryStatusTypeVO); - //处理商机状态名称回显 + // 处理商机状态名称回显 Set statusIds = pageResult.getList().stream() .map(CrmBusinessDO::getCustomerId).filter(Objects::nonNull).collect(Collectors.toSet()); CrmBusinessStatusQueryVO queryVO = new CrmBusinessStatusQueryVO(); diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessStatusTypeController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessStatusTypeController.java index af35eb62e..1942768da 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessStatusTypeController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessStatusTypeController.java @@ -7,7 +7,12 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 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.*; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.status.CrmBusinessStatusQueryVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.status.CrmBusinessStatusRespVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypePageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypeQueryVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypeRespVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypeSaveReqVO; import cn.iocoder.yudao.module.crm.convert.businessstatus.CrmBusinessStatusConvert; import cn.iocoder.yudao.module.crm.convert.businessstatustype.CrmBusinessStatusTypeConvert; import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO; @@ -81,7 +86,8 @@ public class CrmBusinessStatusTypeController { @PreAuthorize("@ss.hasPermission('crm:business-status-type:query')") public CommonResult getBusinessStatusType(@RequestParam("id") Long id) { CrmBusinessStatusTypeDO businessStatusType = businessStatusTypeService.getBusinessStatusType(id); - //处理状态回显 + // 处理状态回显 + // TODO @ljlleo:可以使用 CollectionUtils.convertSet 替代常用的 stream 操作,更简洁一点;下面几个也是哈; CrmBusinessStatusQueryVO queryVO = new CrmBusinessStatusQueryVO(); queryVO.setTypeId(id); List statusList = businessStatusService.selectList(queryVO); @@ -93,7 +99,8 @@ public class CrmBusinessStatusTypeController { @PreAuthorize("@ss.hasPermission('crm:business-status-type:query')") public CommonResult> getBusinessStatusTypePage(@Valid CrmBusinessStatusTypePageReqVO pageReqVO) { PageResult pageResult = businessStatusTypeService.getBusinessStatusTypePage(pageReqVO); - //处理部门回显 + // 处理部门回显 + // TODO @ljlleo:可以使用 CollectionUtils.convertSet 替代常用的 stream 操作,更简洁一点;下面几个也是哈; Set deptIds = pageResult.getList().stream() .map(CrmBusinessStatusTypeDO::getDeptIds) .filter(Objects::nonNull) @@ -126,6 +133,7 @@ public class CrmBusinessStatusTypeController { return success(BeanUtils.toBean(list, CrmBusinessStatusTypeRespVO.class)); } + // TODO @ljlleo 这个接口,是不是可以和 getBusinessStatusTypeList 合并成一个? @GetMapping("/get-status-list") @Operation(summary = "获得商机状态列表") @PreAuthorize("@ss.hasPermission('crm:business-status:query')") @@ -135,4 +143,5 @@ public class CrmBusinessStatusTypeController { List list = businessStatusService.selectList(queryVO); return success(CrmBusinessStatusConvert.INSTANCE.convertList(list)); } + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/package-info.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/package-info.java deleted file mode 100644 index 07dec89b1..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 商机(销售机会) - */ -package cn.iocoder.yudao.module.crm.controller.admin.business; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessBaseVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessBaseVO.java similarity index 99% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessBaseVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessBaseVO.java index 9bcffb117..a942a0004 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessBaseVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.controller.admin.business.vo; +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.business; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessCreateReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessCreateReqVO.java similarity index 97% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessCreateReqVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessCreateReqVO.java index f743c8469..1f01e76eb 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessCreateReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.controller.admin.business.vo; +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.business; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessExcelVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessExcelVO.java similarity index 99% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessExcelVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessExcelVO.java index e7e3ef987..a11949ecd 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessExcelVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessExcelVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.controller.admin.business.vo; +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.business; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessExportReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessExportReqVO.java similarity index 99% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessExportReqVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessExportReqVO.java index a44283112..6b78e21c3 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessExportReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessExportReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.controller.admin.business.vo; +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.business; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessPageReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessPageReqVO.java similarity index 97% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessPageReqVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessPageReqVO.java index c8368cce7..ab1770302 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessPageReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.controller.admin.business.vo; +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.business; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessRespVO.java similarity index 67% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessRespVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessRespVO.java index 57efd8e16..53c8f45da 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessRespVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.controller.admin.business.vo; +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.business; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; @@ -16,13 +16,13 @@ public class CrmBusinessRespVO extends CrmBusinessBaseVO { @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) private LocalDateTime createTime; - @Schema(description = "客户名称") + @Schema(description = "客户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") private String customerName; - @Schema(description = "状态类型名称") + @Schema(description = "状态类型名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "进行中") private String statusTypeName; - @Schema(description = "状态名称") + @Schema(description = "状态名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "跟进中") private String statusName; } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessTransferReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessTransferReqVO.java similarity index 99% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessTransferReqVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessTransferReqVO.java index b5a1153f7..6a19eca9e 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessTransferReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessTransferReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.controller.admin.business.vo; +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.business; import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessUpdateReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessUpdateReqVO.java similarity index 86% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessUpdateReqVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessUpdateReqVO.java index f137d4c5b..9a9d3045a 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessUpdateReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessUpdateReqVO.java @@ -1,5 +1,6 @@ -package cn.iocoder.yudao.module.crm.controller.admin.business.vo; +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.business; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessBaseVO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusPageReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/status/CrmBusinessStatusPageReqVO.java similarity index 98% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusPageReqVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/status/CrmBusinessStatusPageReqVO.java index 72e754eab..b91a954e0 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusPageReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/status/CrmBusinessStatusPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.controller.admin.business.vo; +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.status; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusQueryVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/status/CrmBusinessStatusQueryVO.java similarity index 98% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusQueryVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/status/CrmBusinessStatusQueryVO.java index 0801b3fe4..fbf4d06e1 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusQueryVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/status/CrmBusinessStatusQueryVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.controller.admin.business.vo; +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.status; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/status/CrmBusinessStatusRespVO.java similarity index 90% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusRespVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/status/CrmBusinessStatusRespVO.java index d490d2bcc..405a832a5 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusRespVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/status/CrmBusinessStatusRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.controller.admin.business.vo; +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.status; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; @@ -26,7 +26,7 @@ public class CrmBusinessStatusRespVO { @ExcelProperty("赢单率") private String percent; - @Schema(description = "排序") + @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @ExcelProperty("排序") private Integer sort; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusSaveReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/status/CrmBusinessStatusSaveReqVO.java similarity index 83% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusSaveReqVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/status/CrmBusinessStatusSaveReqVO.java index 9a3362291..02f08e94c 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusSaveReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/status/CrmBusinessStatusSaveReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.controller.admin.business.vo; +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.status; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -21,9 +21,11 @@ public class CrmBusinessStatusSaveReqVO { @NotEmpty(message = "状态名不能为空") private String name; + // TODO @lilleo:percent 应该是 Integer; @Schema(description = "赢单率") private String percent; + // TODO @lilleo:这个是不是不用前端新增和修改的时候传递,交给顺序计算出来,存储起来就好了; @Schema(description = "排序") private Integer sort; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypePageReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/type/CrmBusinessStatusTypePageReqVO.java similarity index 98% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypePageReqVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/type/CrmBusinessStatusTypePageReqVO.java index 3e02fa5ac..03b113cc7 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypePageReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/type/CrmBusinessStatusTypePageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.controller.admin.business.vo; +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.type; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypeQueryVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/type/CrmBusinessStatusTypeQueryVO.java similarity index 98% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypeQueryVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/type/CrmBusinessStatusTypeQueryVO.java index 321a48426..9c78f1afc 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypeQueryVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/type/CrmBusinessStatusTypeQueryVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.controller.admin.business.vo; +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.type; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypeRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/type/CrmBusinessStatusTypeRespVO.java similarity index 91% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypeRespVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/type/CrmBusinessStatusTypeRespVO.java index 0a43af12e..9d13d5dc3 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypeRespVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/type/CrmBusinessStatusTypeRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.controller.admin.business.vo; +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.type; import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; @@ -22,13 +22,12 @@ public class CrmBusinessStatusTypeRespVO { @ExcelProperty("状态类型名") private String name; - @Schema(description = "使用的部门名称", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("使用的部门名称") - private List deptNames; - @Schema(description = "使用的部门编号", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("使用的部门编号") private List deptIds; + @Schema(description = "使用的部门名称", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("使用的部门名称") + private List deptNames; @Schema(description = "创建人", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("创建人") @@ -38,6 +37,7 @@ public class CrmBusinessStatusTypeRespVO { @ExcelProperty("创建时间") private LocalDateTime createTime; + // TODO @ljlleo 字段后缀改成 statuses,保持和 deptIds 风格一致;CrmBusinessStatusDO 改成 VO 哈;一般不使用 do 直接返回 @Schema(description = "状态集合", requiredMode = Schema.RequiredMode.REQUIRED) private List statusList; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypeSaveReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/type/CrmBusinessStatusTypeSaveReqVO.java similarity index 80% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypeSaveReqVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/type/CrmBusinessStatusTypeSaveReqVO.java index 58e8f4229..248f09ab6 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessStatusTypeSaveReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/type/CrmBusinessStatusTypeSaveReqVO.java @@ -1,5 +1,6 @@ -package cn.iocoder.yudao.module.crm.controller.admin.business.vo; +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.type; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.status.CrmBusinessStatusSaveReqVO; import com.google.common.collect.Lists; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -21,6 +22,7 @@ public class CrmBusinessStatusTypeSaveReqVO { @Schema(description = "使用的部门编号", requiredMode = Schema.RequiredMode.REQUIRED) private List deptIds = Lists.newArrayList(); + // TODO @ljlleo VO 里面,我们不使用默认值哈。这里 Lists.newArrayList() 看看怎么去掉。上面 deptIds 也是类似噢 @Schema(description = "商机状态集合", requiredMode = Schema.RequiredMode.REQUIRED) private List statusList = Lists.newArrayList(); diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/business/CrmBusinessConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/business/CrmBusinessConvert.java index 6de4c1241..e93fc9ab3 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/business/CrmBusinessConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/business/CrmBusinessConvert.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.crm.convert.business; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.*; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.*; import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO; import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO; import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusTypeDO; @@ -46,14 +46,14 @@ public interface CrmBusinessConvert { default PageResult convertPage(PageResult page, List customerList, List statusTypeList, List statusList) { PageResult result = convertPage(page); + // 拼接关联字段 Map customerMap = convertMap(customerList, CrmCustomerDO::getId, CrmCustomerDO::getName); Map statusTypeMap = convertMap(statusTypeList, CrmBusinessStatusTypeDO::getId, CrmBusinessStatusTypeDO::getName); Map statusMap = convertMap(statusList, CrmBusinessStatusDO::getId, CrmBusinessStatusDO::getName); - result.getList().stream().forEach(t -> { - t.setCustomerName(customerMap.get(t.getCustomerId())); - t.setStatusTypeName(statusTypeMap.get(t.getStatusTypeId())); - t.setStatusName(statusMap.get(t.getStatusId())); - }); + result.getList().forEach(type -> type + .setCustomerName(customerMap.get(type.getCustomerId())) + .setStatusTypeName(statusTypeMap.get(type.getStatusTypeId())) + .setStatusName(statusMap.get(type.getStatusId()))); return result; } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/businessstatus/CrmBusinessStatusConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/businessstatus/CrmBusinessStatusConvert.java index 19fb76171..db49e5a6d 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/businessstatus/CrmBusinessStatusConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/businessstatus/CrmBusinessStatusConvert.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.module.crm.convert.businessstatus; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusRespVO; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusSaveReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.status.CrmBusinessStatusRespVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.status.CrmBusinessStatusSaveReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/businessstatustype/CrmBusinessStatusTypeConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/businessstatustype/CrmBusinessStatusTypeConvert.java index ef3788233..ae7e36122 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/businessstatustype/CrmBusinessStatusTypeConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/businessstatustype/CrmBusinessStatusTypeConvert.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.module.crm.convert.businessstatustype; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusTypeRespVO; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusTypeSaveReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypeRespVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypeSaveReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO; import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusTypeDO; import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; @@ -33,18 +33,17 @@ public interface CrmBusinessStatusTypeConvert { default PageResult convertPage(PageResult page, List deptList) { PageResult pageResult = convertPage(page); + // 拼接关联字段 Map deptMap = convertMap(deptList, DeptRespDTO::getId, DeptRespDTO::getName); - pageResult.getList().stream().forEach(r -> { - r.setDeptNames(convertList(r.getDeptIds(), deptMap::get)); - }); + pageResult.getList().forEach(type -> type.setDeptNames(convertList(type.getDeptIds(), deptMap::get))); return pageResult; } default CrmBusinessStatusTypeRespVO convert(CrmBusinessStatusTypeDO bean, List statusList) { + // TODO @ljlleo 可以链式赋值,简化成一行; CrmBusinessStatusTypeRespVO result = convert(bean); result.setStatusList(statusList); return result; } - } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessDO.java index f748525d4..2bc1daa41 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessDO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessDO.java @@ -69,8 +69,7 @@ public class CrmBusinessDO extends BaseDO { */ private Integer discountPercent; /** - * 产品总金额 - * + * 产品总金额,单位:分 */ private Integer productPrice; /** diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessStatusDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessStatusDO.java index b6ae23bce..f83d0fb27 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessStatusDO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessStatusDO.java @@ -26,6 +26,8 @@ public class CrmBusinessStatusDO { private Long id; /** * 状态类型编号 + * + * 关联 {@link CrmBusinessStatusTypeDO#getId()} */ private Long typeId; /** @@ -34,6 +36,8 @@ public class CrmBusinessStatusDO { private String name; /** * 赢单率 + * + * TODO 这里是不是改成 Integer 存储,百分比 * 100 ; */ private String percent; /** diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessStatusTypeDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessStatusTypeDO.java index d5dcef0ba..d0d2f11f2 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessStatusTypeDO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessStatusTypeDO.java @@ -41,6 +41,8 @@ public class CrmBusinessStatusTypeDO extends BaseDO { private List deptIds; /** * 开启状态 + * + * TODO 改成 Integer,关联 CommonStatus */ private Boolean status; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessMapper.java index 1596bdd39..236ec38fb 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessMapper.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessMapper.java @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.crm.dal.mysql.business; 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.business.vo.CrmBusinessExportReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessPageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessExportReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessPageReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO; import org.apache.ibatis.annotations.Mapper; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessStatusMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessStatusMapper.java index d78ecab5c..be847ab9d 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessStatusMapper.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessStatusMapper.java @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.crm.dal.mysql.business; 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.business.vo.CrmBusinessStatusPageReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusQueryVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.status.CrmBusinessStatusPageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.status.CrmBusinessStatusQueryVO; import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO; import org.apache.ibatis.annotations.Mapper; @@ -31,8 +31,7 @@ public interface CrmBusinessStatusMapper extends BaseMapperX() - .eq(CrmBusinessStatusDO::getTypeId, typeId)); + return delete(CrmBusinessStatusDO::getTypeId, typeId); } } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessStatusTypeMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessStatusTypeMapper.java index d3f3e1e2e..af10bf8c7 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessStatusTypeMapper.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessStatusTypeMapper.java @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.crm.dal.mysql.business; 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.business.vo.CrmBusinessStatusTypePageReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusTypeQueryVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypePageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypeQueryVO; import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusTypeDO; import org.apache.ibatis.annotations.Mapper; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessService.java index ec5dbe1d4..90bdecfc8 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessService.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessService.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.crm.service.business; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.*; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.*; import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO; import javax.validation.Valid; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java index 9d440f670..ff2439cfd 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.crm.service.business; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.*; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.*; 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.permission.CrmPermissionDO; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusService.java index 48686de11..a5897faaf 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusService.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusService.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.module.crm.service.business; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusPageReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusQueryVO; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusSaveReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.status.CrmBusinessStatusPageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.status.CrmBusinessStatusQueryVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.status.CrmBusinessStatusSaveReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO; import javax.validation.Valid; @@ -54,6 +54,8 @@ public interface CrmBusinessStatusService { */ PageResult getBusinessStatusPage(CrmBusinessStatusPageReqVO pageReqVO); + // TODO @ljlleo 常用的 ids 之类的查询,可以封装单独的方法,不用走类似 QueryVO,用起来更方便。 + // TODO @ljlleo 方法名用 getBusinessStatusList /** * 获得商机状态分页 * diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusServiceImpl.java index 1f68fc89e..dac8c65ed 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusServiceImpl.java @@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.crm.service.business; 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.CrmBusinessStatusPageReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusQueryVO; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusSaveReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.status.CrmBusinessStatusPageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.status.CrmBusinessStatusQueryVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.status.CrmBusinessStatusSaveReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO; import cn.iocoder.yudao.module.crm.dal.mysql.business.CrmBusinessStatusMapper; import org.springframework.stereotype.Service; @@ -51,6 +51,7 @@ public class CrmBusinessStatusServiceImpl implements CrmBusinessStatusService { public void deleteBusinessStatus(Long id) { // 校验存在 validateBusinessStatusExists(id); + // TODO @ljlleo 这里可以考虑,如果有商机在使用,不允许删除 // 删除 businessStatusMapper.deleteById(id); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusTypeService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusTypeService.java index 0b0bea7e0..a463f76b1 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusTypeService.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusTypeService.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.module.crm.service.business; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusTypePageReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusTypeQueryVO; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusTypeSaveReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypePageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypeQueryVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypeSaveReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusTypeDO; import javax.validation.Valid; @@ -54,6 +54,7 @@ public interface CrmBusinessStatusTypeService { */ PageResult getBusinessStatusTypePage(CrmBusinessStatusTypePageReqVO pageReqVO); + // TODO @ljlleo 常用的 ids 之类的查询,可以封装单独的方法,不用走类似 QueryVO,用起来更方便。 /** * 获得商机状态类型列表 * @@ -61,4 +62,5 @@ public interface CrmBusinessStatusTypeService { * @return 商机状态类型列表 */ List selectList(CrmBusinessStatusTypeQueryVO queryVO); + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusTypeServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusTypeServiceImpl.java index d8226e8f8..1decb08c4 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusTypeServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusTypeServiceImpl.java @@ -1,11 +1,12 @@ package cn.iocoder.yudao.module.crm.service.business; +import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; 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.CrmBusinessStatusTypePageReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusTypeQueryVO; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessStatusTypeSaveReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypePageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypeQueryVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypeSaveReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO; import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusTypeDO; import cn.iocoder.yudao.module.crm.dal.mysql.business.CrmBusinessStatusMapper; @@ -42,15 +43,14 @@ public class CrmBusinessStatusTypeServiceImpl implements CrmBusinessStatusTypeSe public Long createBusinessStatusType(CrmBusinessStatusTypeSaveReqVO createReqVO) { //检验名称是否存在 validateBusinessStatusTypeExists(createReqVO.getName(), null); - // 插入 + // 插入类型 CrmBusinessStatusTypeDO businessStatusType = BeanUtils.toBean(createReqVO, CrmBusinessStatusTypeDO.class); businessStatusTypeMapper.insert(businessStatusType); - createReqVO.getStatusList().stream().forEach(status -> { - status.setTypeId(businessStatusType.getId()); - }); - //插入状态 - businessStatusMapper.insertBatch(BeanUtils.toBean(createReqVO.getStatusList(), CrmBusinessStatusDO.class)); - // 返回 + // 插入状态 + if (CollUtil.isNotEmpty(createReqVO.getStatusList())) { + createReqVO.getStatusList().forEach(status -> status.setTypeId(businessStatusType.getId())); + businessStatusMapper.insertBatch(BeanUtils.toBean(createReqVO.getStatusList(), CrmBusinessStatusDO.class)); + } return businessStatusType.getId(); } @@ -61,29 +61,27 @@ public class CrmBusinessStatusTypeServiceImpl implements CrmBusinessStatusTypeSe validateBusinessStatusTypeExists(updateReqVO.getId()); // 校验名称是否存在 validateBusinessStatusTypeExists(updateReqVO.getName(), updateReqVO.getId()); - // 更新 + // 更新类型 CrmBusinessStatusTypeDO updateObj = BeanUtils.toBean(updateReqVO, CrmBusinessStatusTypeDO.class); businessStatusTypeMapper.updateById(updateObj); - //删除状态 + // 更新状态(删除 + 更新) + // TODO @ljlleo 可以参考 DeliveryExpressTemplateServiceImpl 的 updateExpressTemplateFree 方法;主要没变化的,还是不删除了哈。 businessStatusMapper.delete(updateReqVO.getId()); - //插入状态 - updateReqVO.getStatusList().stream().forEach(status -> { - status.setTypeId(updateReqVO.getId()); - }); + updateReqVO.getStatusList().forEach(status -> status.setTypeId(updateReqVO.getId())); businessStatusMapper.insertBatch(BeanUtils.toBean(updateReqVO.getStatusList(), CrmBusinessStatusDO.class)); } @Override @Transactional(rollbackFor = Exception.class) public void deleteBusinessStatusType(Long id) { - //TODO 待添加被引用校验 + // TODO 待添加被引用校验 //... // 校验存在 validateBusinessStatusTypeExists(id); - // 删除 + // 删除类型 businessStatusTypeMapper.deleteById(id); - //删除状态 + // 删除状态 businessStatusMapper.delete(id); } @@ -93,6 +91,7 @@ public class CrmBusinessStatusTypeServiceImpl implements CrmBusinessStatusTypeSe } } + // TODO @ljlleo 这个方法,这个参考 validateDeptNameUnique 实现。 private void validateBusinessStatusTypeExists(String name, Long id) { LambdaQueryWrapper wrapper = new LambdaQueryWrapperX<>(); if(null != id) { @@ -118,4 +117,5 @@ public class CrmBusinessStatusTypeServiceImpl implements CrmBusinessStatusTypeSe public List selectList(CrmBusinessStatusTypeQueryVO queryVO) { return businessStatusTypeMapper.selectList(queryVO); } + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/business/BusinessStatusTypeServiceImplTest.java b/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/business/BusinessStatusTypeServiceImplTest.java index b28ccf6f7..9d76424f6 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/business/BusinessStatusTypeServiceImplTest.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/business/BusinessStatusTypeServiceImplTest.java @@ -2,10 +2,10 @@ package cn.iocoder.yudao.module.crm.service.business; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.BusinessStatusTypePageReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.BusinessStatusTypeSaveReqVO; -import cn.iocoder.yudao.module.crm.dal.dataobject.business.BusinessStatusTypeDO; -import cn.iocoder.yudao.module.crm.dal.mysql.business.BusinessStatusTypeMapper; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypePageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypeSaveReqVO; +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusTypeDO; +import cn.iocoder.yudao.module.crm.dal.mysql.business.CrmBusinessStatusTypeMapper; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; @@ -19,55 +19,56 @@ import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.BUSINESS_STATUS_TYPE_NOT_EXISTS; import static org.junit.jupiter.api.Assertions.*; +// TODO 芋艿:后续再 review /** - * {@link BusinessStatusTypeServiceImpl} 的单元测试类 + * {@link CrmBusinessStatusTypeServiceImpl} 的单元测试类 * * @author ljlleo */ -@Import(BusinessStatusTypeServiceImpl.class) +@Import(CrmBusinessStatusTypeServiceImpl.class) public class BusinessStatusTypeServiceImplTest extends BaseDbUnitTest { @Resource - private BusinessStatusTypeServiceImpl businessStatusTypeService; + private CrmBusinessStatusTypeServiceImpl businessStatusTypeService; @Resource - private BusinessStatusTypeMapper businessStatusTypeMapper; + private CrmBusinessStatusTypeMapper businessStatusTypeMapper; @Test public void testCreateBusinessStatusType_success() { // 准备参数 - BusinessStatusTypeSaveReqVO createReqVO = randomPojo(BusinessStatusTypeSaveReqVO.class).setId(null); + CrmBusinessStatusTypeSaveReqVO createReqVO = randomPojo(CrmBusinessStatusTypeSaveReqVO.class).setId(null); // 调用 Long businessStatusTypeId = businessStatusTypeService.createBusinessStatusType(createReqVO); // 断言 assertNotNull(businessStatusTypeId); // 校验记录的属性是否正确 - BusinessStatusTypeDO businessStatusType = businessStatusTypeMapper.selectById(businessStatusTypeId); + CrmBusinessStatusTypeDO businessStatusType = businessStatusTypeMapper.selectById(businessStatusTypeId); assertPojoEquals(createReqVO, businessStatusType, "id"); } @Test public void testUpdateBusinessStatusType_success() { // mock 数据 - BusinessStatusTypeDO dbBusinessStatusType = randomPojo(BusinessStatusTypeDO.class); + CrmBusinessStatusTypeDO dbBusinessStatusType = randomPojo(CrmBusinessStatusTypeDO.class); businessStatusTypeMapper.insert(dbBusinessStatusType);// @Sql: 先插入出一条存在的数据 // 准备参数 - BusinessStatusTypeSaveReqVO updateReqVO = randomPojo(BusinessStatusTypeSaveReqVO.class, o -> { + CrmBusinessStatusTypeSaveReqVO updateReqVO = randomPojo(CrmBusinessStatusTypeSaveReqVO.class, o -> { o.setId(dbBusinessStatusType.getId()); // 设置更新的 ID }); // 调用 businessStatusTypeService.updateBusinessStatusType(updateReqVO); // 校验是否更新正确 - BusinessStatusTypeDO businessStatusType = businessStatusTypeMapper.selectById(updateReqVO.getId()); // 获取最新的 + CrmBusinessStatusTypeDO businessStatusType = businessStatusTypeMapper.selectById(updateReqVO.getId()); // 获取最新的 assertPojoEquals(updateReqVO, businessStatusType); } @Test public void testUpdateBusinessStatusType_notExists() { // 准备参数 - BusinessStatusTypeSaveReqVO updateReqVO = randomPojo(BusinessStatusTypeSaveReqVO.class); + CrmBusinessStatusTypeSaveReqVO updateReqVO = randomPojo(CrmBusinessStatusTypeSaveReqVO.class); // 调用, 并断言异常 assertServiceException(() -> businessStatusTypeService.updateBusinessStatusType(updateReqVO), BUSINESS_STATUS_TYPE_NOT_EXISTS); @@ -76,7 +77,7 @@ public class BusinessStatusTypeServiceImplTest extends BaseDbUnitTest { @Test public void testDeleteBusinessStatusType_success() { // mock 数据 - BusinessStatusTypeDO dbBusinessStatusType = randomPojo(BusinessStatusTypeDO.class); + CrmBusinessStatusTypeDO dbBusinessStatusType = randomPojo(CrmBusinessStatusTypeDO.class); businessStatusTypeMapper.insert(dbBusinessStatusType);// @Sql: 先插入出一条存在的数据 // 准备参数 Long id = dbBusinessStatusType.getId(); @@ -100,14 +101,14 @@ public class BusinessStatusTypeServiceImplTest extends BaseDbUnitTest { @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 public void testGetBusinessStatusTypePage() { // mock 数据 - BusinessStatusTypeDO dbBusinessStatusType = randomPojo(BusinessStatusTypeDO.class, o -> { // 等会查询到 + CrmBusinessStatusTypeDO dbBusinessStatusType = randomPojo(CrmBusinessStatusTypeDO.class, o -> { // 等会查询到 }); businessStatusTypeMapper.insert(dbBusinessStatusType); // 准备参数 - BusinessStatusTypePageReqVO reqVO = new BusinessStatusTypePageReqVO(); + CrmBusinessStatusTypePageReqVO reqVO = new CrmBusinessStatusTypePageReqVO(); // 调用 - PageResult pageResult = businessStatusTypeService.getBusinessStatusTypePage(reqVO); + PageResult pageResult = businessStatusTypeService.getBusinessStatusTypePage(reqVO); // 断言 assertEquals(1, pageResult.getTotal()); assertEquals(1, pageResult.getList().size()); diff --git a/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImplTest.java b/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImplTest.java index 9f199954e..78b51e94a 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImplTest.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImplTest.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.module.crm.service.business; import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessCreateReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessExportReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessUpdateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessCreateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessExportReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessUpdateReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO; import cn.iocoder.yudao.module.crm.dal.mysql.business.CrmBusinessMapper; import org.junit.jupiter.api.Disabled; From ab3748d102aae646fe1ffc5ca1c6bb1206e61d1e Mon Sep 17 00:00:00 2001 From: Wanwan <913752709@qq.com> Date: Sat, 25 Nov 2023 23:54:08 +0800 Subject: [PATCH 13/35] =?UTF-8?q?feat:=20=E5=AE=A2=E6=88=B7=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=20review=20=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/crm/enums/ErrorCodeConstants.java | 5 +-- .../enums/customer/LimitConfigTypeEnum.java | 43 +++++++++++++++++++ .../CrmCustomerLimitConfigController.java | 8 ++-- .../CrmCustomerPoolConfigController.java | 9 ++-- .../vo/CrmCustomerPoolConfigUpdateReqVO.java | 14 ------ .../CrmCustomerLimitConfigBaseVO.java | 3 +- .../CrmCustomerLimitConfigCreateReqVO.java | 2 +- .../CrmCustomerLimitConfigPageReqVO.java | 2 +- .../CrmCustomerLimitConfigRespVO.java | 3 +- .../CrmCustomerLimitConfigUpdateReqVO.java | 2 +- .../CrmCustomerPoolConfigBaseVO.java | 3 +- .../CrmCustomerPoolConfigRespVO.java | 2 +- .../CrmCustomerPoolConfigUpdateReqVO.java | 34 +++++++++++++++ .../convert/customer/CrmCustomerConvert.java | 2 + .../CrmCustomerLimitConfigConvert.java | 6 +-- .../CrmCustomerLimitConfigDO.java | 4 +- .../CrmCustomerLimitConfigMapper.java | 2 +- .../CrmCustomerPoolConfigService.java | 2 +- .../CrmCustomerPoolConfigServiceImpl.java | 15 +------ .../CrmCustomerLimitConfigService.java | 6 +-- .../CrmCustomerLimitConfigServiceImpl.java | 6 +-- ...CrmCustomerLimitConfigServiceImplTest.java | 6 +-- 22 files changed, 113 insertions(+), 66 deletions(-) create mode 100644 yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/LimitConfigTypeEnum.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerPoolConfigUpdateReqVO.java rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/{ => limitconfig}/CrmCustomerLimitConfigBaseVO.java (93%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/{ => limitconfig}/CrmCustomerLimitConfigCreateReqVO.java (96%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/{ => limitconfig}/CrmCustomerLimitConfigPageReqVO.java (97%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/{ => limitconfig}/CrmCustomerLimitConfigRespVO.java (97%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/{ => limitconfig}/CrmCustomerLimitConfigUpdateReqVO.java (97%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/{ => poolconfig}/CrmCustomerPoolConfigBaseVO.java (96%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/{ => poolconfig}/CrmCustomerPoolConfigRespVO.java (97%) create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigUpdateReqVO.java diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java index 0669a3c03..42c5dc9e9 100644 --- a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java @@ -38,9 +38,6 @@ public interface ErrorCodeConstants { ErrorCode CUSTOMER_NOT_IN_POOL = new ErrorCode(1_020_006_004, "客户领取失败,原因:不是公海客户"); ErrorCode CUSTOMER_IN_POOL = new ErrorCode(1_020_006_005, "客户放入公海失败,原因:已经是公海客户"); ErrorCode CUSTOMER_LOCKED_PUT_POOL_FAIL = new ErrorCode(1_020_006_006, "客户放入公海失败,原因:客户已锁定"); - // TODO @wanwan:这 2 个单独配置段噢 - ErrorCode CUSTOMER_POOL_CONFIG_ERROR = new ErrorCode(1_020_006_001, "客户公海规则设置不正确"); - ErrorCode CUSTOMER_LIMIT_CONFIG_NOT_EXISTS = new ErrorCode(1_020_006_002, "客户限制配置不存在"); // ========== 权限管理 1_020_007_000 ========== ErrorCode CRM_PERMISSION_NOT_EXISTS = new ErrorCode(1_020_007_000, "数据权限不存在"); @@ -66,4 +63,6 @@ public interface ErrorCodeConstants { // ========== 商机状态 1_020_011_000 ========== ErrorCode BUSINESS_STATUS_NOT_EXISTS = new ErrorCode(1_020_011_000, "商机状态不存在"); + // ========== 客户公海规则设置 1_020_011_000 ========== + ErrorCode CUSTOMER_LIMIT_CONFIG_NOT_EXISTS = new ErrorCode(1_020_012_000, "客户限制配置不存在"); } diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/LimitConfigTypeEnum.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/LimitConfigTypeEnum.java new file mode 100644 index 000000000..dce8ae4d6 --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/LimitConfigTypeEnum.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.module.crm.enums.customer; + +import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * CRM 客户限制配置规则类型 + * + * @author Wanwan + */ +@Getter +@AllArgsConstructor +public enum LimitConfigTypeEnum implements IntArrayValuable { + + /** + * 拥有客户数限制 + */ + CUSTOMER_QUANTITY_LIMIT(1, "拥有客户数限制"), + /** + * 锁定客户数限制 + */ + CUSTOMER_LOCK_LIMIT(2, "锁定客户数限制"), + ; + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(LimitConfigTypeEnum::getCode).toArray(); + + /** + * 状态 + */ + private final Integer code; + /** + * 状态名 + */ + private final String name; + + @Override + public int[] array() { + return ARRAYS; + } +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerLimitConfigController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerLimitConfigController.java index b4d4751fc..13097d9ec 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerLimitConfigController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerLimitConfigController.java @@ -3,10 +3,10 @@ package cn.iocoder.yudao.module.crm.controller.admin.customer; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLimitConfigCreateReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLimitConfigPageReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLimitConfigRespVO; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLimitConfigUpdateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigCreateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigPageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigRespVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigUpdateReqVO; import cn.iocoder.yudao.module.crm.convert.customer.CrmCustomerLimitConfigConvert; import cn.iocoder.yudao.module.crm.dal.dataobject.customerlimitconfig.CrmCustomerLimitConfigDO; import cn.iocoder.yudao.module.crm.service.customerlimitconfig.CrmCustomerLimitConfigService; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerPoolConfigController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerPoolConfigController.java index 6bd1da362..81a08e64e 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerPoolConfigController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerPoolConfigController.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.module.crm.controller.admin.customer; import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPoolConfigRespVO; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPoolConfigUpdateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigRespVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigUpdateReqVO; import cn.iocoder.yudao.module.crm.convert.customer.CrmCustomerConvert; import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerPoolConfigDO; import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerPoolConfigService; @@ -34,11 +34,10 @@ public class CrmCustomerPoolConfigController { return success(CrmCustomerConvert.INSTANCE.convert(customerPoolConfig)); } - // TODO @wanwan:这个请求,搞成 save 哈; - @PutMapping("/update") + @PutMapping("/save") @Operation(summary = "更新客户公海规则设置") @PreAuthorize("@ss.hasPermission('crm:customer-pool-config:update')") - public CommonResult updateCustomerPoolConfig(@Valid @RequestBody CrmCustomerPoolConfigUpdateReqVO updateReqVO) { + public CommonResult saveCustomerPoolConfig(@Valid @RequestBody CrmCustomerPoolConfigUpdateReqVO updateReqVO) { customerPoolConfigService.updateCustomerPoolConfig(updateReqVO); return success(true); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerPoolConfigUpdateReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerPoolConfigUpdateReqVO.java deleted file mode 100644 index ba72a6b23..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerPoolConfigUpdateReqVO.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.iocoder.yudao.module.crm.controller.admin.customer.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@Schema(description = "管理后台 - CRM 客户更新 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class CrmCustomerPoolConfigUpdateReqVO extends CrmCustomerPoolConfigBaseVO { - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerLimitConfigBaseVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigBaseVO.java similarity index 93% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerLimitConfigBaseVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigBaseVO.java index 7b163913e..b851bf4e6 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerLimitConfigBaseVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.controller.admin.customer.vo; +package cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -6,7 +6,6 @@ import lombok.Data; import javax.validation.constraints.NotNull; import java.util.List; -// TODO @wanwan:vo 下,可以新建一个 limitconfig,放它的 vo; /** * 客户限制配置 Base VO,提供给添加、修改、详细的子 VO 使用 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerLimitConfigCreateReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigCreateReqVO.java similarity index 96% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerLimitConfigCreateReqVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigCreateReqVO.java index cb6688297..7aa372901 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerLimitConfigCreateReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.controller.admin.customer.vo; +package cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerLimitConfigPageReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigPageReqVO.java similarity index 97% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerLimitConfigPageReqVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigPageReqVO.java index fb913d196..37ce11009 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerLimitConfigPageReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.controller.admin.customer.vo; +package cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerLimitConfigRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigRespVO.java similarity index 97% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerLimitConfigRespVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigRespVO.java index 7be29c549..f24c4ebfc 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerLimitConfigRespVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.controller.admin.customer.vo; +package cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -6,7 +6,6 @@ import lombok.EqualsAndHashCode; import lombok.ToString; import java.time.LocalDateTime; -import java.util.List; @Schema(description = "管理后台 - 客户限制配置 Response VO") @Data diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerLimitConfigUpdateReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigUpdateReqVO.java similarity index 97% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerLimitConfigUpdateReqVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigUpdateReqVO.java index 038d8f45d..c204728e2 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerLimitConfigUpdateReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.controller.admin.customer.vo; +package cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerPoolConfigBaseVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigBaseVO.java similarity index 96% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerPoolConfigBaseVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigBaseVO.java index 0f6b6f33d..1c6d24cdc 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerPoolConfigBaseVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.controller.admin.customer.vo; +package cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -12,7 +12,6 @@ import javax.validation.constraints.NotNull; @Data public class CrmCustomerPoolConfigBaseVO { - // TODO @wanwan:参数校验 @Schema(description = "是否启用客户公海", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") @NotNull(message = "是否启用客户公海不能为空") private Boolean enabled; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerPoolConfigRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigRespVO.java similarity index 97% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerPoolConfigRespVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigRespVO.java index c5af3cad2..065230efb 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerPoolConfigRespVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.controller.admin.customer.vo; +package cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigUpdateReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigUpdateReqVO.java new file mode 100644 index 000000000..d606e19d9 --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigUpdateReqVO.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig; + +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.ObjectUtil; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.AssertTrue; +import java.util.Objects; + +@Schema(description = "管理后台 - CRM 客户更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CrmCustomerPoolConfigUpdateReqVO extends CrmCustomerPoolConfigBaseVO { + + @AssertTrue(message = "客户公海规则设置不正确") + public boolean poolEnableValid() { + if (!BooleanUtil.isTrue(getEnabled())) { + return true; + } + return ObjectUtil.isAllNotEmpty(getContactExpireDays(), getDealExpireDays()); + } + + @AssertTrue(message = "客户公海规则设置不正确") + public boolean notifyEnableValid() { + if (!BooleanUtil.isTrue(getNotifyEnabled())) { + return true; + } + return Objects.nonNull(getNotifyDays()); + } +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java index 88971d4af..34a8b412a 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java @@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.crm.convert.customer; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.*; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigRespVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigUpdateReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerPoolConfigDO; import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerLimitConfigConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerLimitConfigConvert.java index 33b0cae20..6fc52f968 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerLimitConfigConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerLimitConfigConvert.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.module.crm.convert.customer; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLimitConfigCreateReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLimitConfigRespVO; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLimitConfigUpdateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigCreateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigRespVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigUpdateReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.customerlimitconfig.CrmCustomerLimitConfigDO; import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customerlimitconfig/CrmCustomerLimitConfigDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customerlimitconfig/CrmCustomerLimitConfigDO.java index 5be934b04..80035ac20 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customerlimitconfig/CrmCustomerLimitConfigDO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customerlimitconfig/CrmCustomerLimitConfigDO.java @@ -32,8 +32,8 @@ public class CrmCustomerLimitConfigDO extends BaseDO { private Long id; /** * 规则类型 - * - * TODO @wanwan:搞个枚举哈; + *

+ * 枚举 {@link cn.iocoder.yudao.module.crm.enums.customer.LimitConfigTypeEnum} */ private Integer type; /** diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customerlimitconfig/CrmCustomerLimitConfigMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customerlimitconfig/CrmCustomerLimitConfigMapper.java index 95d5bcdbc..5c6ef672b 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customerlimitconfig/CrmCustomerLimitConfigMapper.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customerlimitconfig/CrmCustomerLimitConfigMapper.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.crm.dal.mysql.customerlimitconfig; 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.customer.vo.CrmCustomerLimitConfigPageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigPageReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.customerlimitconfig.CrmCustomerLimitConfigDO; import org.apache.ibatis.annotations.Mapper; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerPoolConfigService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerPoolConfigService.java index 30e3873ab..0a05c5d20 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerPoolConfigService.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerPoolConfigService.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.crm.service.customer; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPoolConfigUpdateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigUpdateReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerPoolConfigDO; import javax.validation.Valid; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerPoolConfigServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerPoolConfigServiceImpl.java index 1a08adbf5..18d4192c3 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerPoolConfigServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerPoolConfigServiceImpl.java @@ -1,9 +1,7 @@ package cn.iocoder.yudao.module.crm.service.customer; -import cn.hutool.core.util.BooleanUtil; -import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPoolConfigUpdateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigUpdateReqVO; import cn.iocoder.yudao.module.crm.convert.customer.CrmCustomerConvert; import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerPoolConfigDO; import cn.iocoder.yudao.module.crm.dal.mysql.customer.CrmCustomerPoolConfigMapper; @@ -13,9 +11,6 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.Objects; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CUSTOMER_POOL_CONFIG_ERROR; - /** * 客户公海配置 Service 实现类 * @@ -44,14 +39,6 @@ public class CrmCustomerPoolConfigServiceImpl implements CrmCustomerPoolConfigSe */ @Override public void updateCustomerPoolConfig(CrmCustomerPoolConfigUpdateReqVO saveReqVO) { - // TODO @wanwan:看下 @AssertTrue 的逻辑; - if (BooleanUtil.isTrue(saveReqVO.getEnabled()) && (ObjectUtil.hasNull(saveReqVO.getContactExpireDays(), saveReqVO.getDealExpireDays()))) { - throw exception(CUSTOMER_POOL_CONFIG_ERROR); - } - if (BooleanUtil.isTrue(saveReqVO.getNotifyEnabled()) && (Objects.isNull(saveReqVO.getNotifyDays()))) { - throw exception(CUSTOMER_POOL_CONFIG_ERROR); - } - // 存在,则进行更新 CrmCustomerPoolConfigDO dbConfig = getCustomerPoolConfig(); if (Objects.nonNull(dbConfig)) { diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customerlimitconfig/CrmCustomerLimitConfigService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customerlimitconfig/CrmCustomerLimitConfigService.java index 655a0c202..60fabe645 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customerlimitconfig/CrmCustomerLimitConfigService.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customerlimitconfig/CrmCustomerLimitConfigService.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.module.crm.service.customerlimitconfig; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLimitConfigCreateReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLimitConfigPageReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLimitConfigUpdateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigCreateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigPageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigUpdateReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.customerlimitconfig.CrmCustomerLimitConfigDO; import javax.validation.Valid; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customerlimitconfig/CrmCustomerLimitConfigServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customerlimitconfig/CrmCustomerLimitConfigServiceImpl.java index 9f3f3087f..6d2bc97bc 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customerlimitconfig/CrmCustomerLimitConfigServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customerlimitconfig/CrmCustomerLimitConfigServiceImpl.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.module.crm.service.customerlimitconfig; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLimitConfigCreateReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLimitConfigPageReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLimitConfigUpdateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigCreateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigPageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigUpdateReqVO; import cn.iocoder.yudao.module.crm.convert.customer.CrmCustomerLimitConfigConvert; import cn.iocoder.yudao.module.crm.dal.dataobject.customerlimitconfig.CrmCustomerLimitConfigDO; import cn.iocoder.yudao.module.crm.dal.mysql.customerlimitconfig.CrmCustomerLimitConfigMapper; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/customerlimitconfig/CrmCustomerLimitConfigServiceImplTest.java b/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/customerlimitconfig/CrmCustomerLimitConfigServiceImplTest.java index 827fd0e02..00676784f 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/customerlimitconfig/CrmCustomerLimitConfigServiceImplTest.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/customerlimitconfig/CrmCustomerLimitConfigServiceImplTest.java @@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.crm.service.customerlimitconfig; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLimitConfigCreateReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLimitConfigPageReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLimitConfigUpdateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigCreateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigPageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigUpdateReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.customerlimitconfig.CrmCustomerLimitConfigDO; import cn.iocoder.yudao.module.crm.dal.mysql.customerlimitconfig.CrmCustomerLimitConfigMapper; import org.junit.jupiter.api.Disabled; From 033f13c6ada4d3b4f31acda30d90d652b3595ea8 Mon Sep 17 00:00:00 2001 From: Wanwan <913752709@qq.com> Date: Sun, 26 Nov 2023 00:27:09 +0800 Subject: [PATCH 14/35] =?UTF-8?q?feat:=20=E5=AE=A2=E6=88=B7=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=20review=20=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vo/limitconfig/CrmCustomerLimitConfigRespVO.java | 7 +++++-- .../vo/poolconfig/CrmCustomerPoolConfigRespVO.java | 1 - .../customer/CrmCustomerLimitConfigConvert.java | 12 ++++-------- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigRespVO.java index f24c4ebfc..010d0fc10 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigRespVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigRespVO.java @@ -1,11 +1,14 @@ package cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig; +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; import java.time.LocalDateTime; +import java.util.List; @Schema(description = "管理后台 - 客户限制配置 Response VO") @Data @@ -17,10 +20,10 @@ public class CrmCustomerLimitConfigRespVO extends CrmCustomerLimitConfigBaseVO { private Long id; @Schema(description = "规则适用人群名称") - private String userNames; + private List users; @Schema(description = "规则适用部门名称") - private String deptNames; + private List depts; @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) private LocalDateTime createTime; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigRespVO.java index 065230efb..dc48d6da7 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigRespVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigRespVO.java @@ -5,7 +5,6 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; -// TODO @wanwan:vo 下,可以新建一个 poolconfig,放它的 vo; @Schema(description = "管理后台 - CRM 客户公海规则 Response VO") @Data @EqualsAndHashCode(callSuper = true) diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerLimitConfigConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerLimitConfigConvert.java index 6fc52f968..264737f89 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerLimitConfigConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerLimitConfigConvert.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.crm.convert.customer; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigCreateReqVO; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigRespVO; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigUpdateReqVO; @@ -12,8 +13,6 @@ import org.mapstruct.factory.Mappers; import java.util.List; import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; /** * 客户限制配置 Convert @@ -54,14 +53,11 @@ public interface CrmCustomerLimitConfigConvert { * * @param userMap 用户映射 * @param deptMap 部门映射 - * @param respVo 响应实体 + * @param respVo 响应实体 */ static void fillNameField(Map userMap, Map deptMap, CrmCustomerLimitConfigRespVO respVo) { - // TODO wanwan:返回 list,具体怎么拼接叫给前端; - respVo.setUserNames(respVo.getUserIds().stream().map(userMap::get) - .filter(Objects::nonNull).map(AdminUserRespDTO::getNickname).collect(Collectors.joining(","))); - respVo.setDeptNames(respVo.getDeptIds().stream().map(deptMap::get) - .filter(Objects::nonNull).map(DeptRespDTO::getName).collect(Collectors.joining(","))); + respVo.setUsers(CollectionUtils.convertList(respVo.getUserIds(), userMap::get)); + respVo.setDepts(CollectionUtils.convertList(respVo.getDeptIds(), deptMap::get)); } } From fbf864b6b400606ec4a8b616b3362b3043984c54 Mon Sep 17 00:00:00 2001 From: Wanwan <913752709@qq.com> Date: Sun, 26 Nov 2023 02:00:23 +0800 Subject: [PATCH 15/35] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E5=85=AC=E6=B5=B7=E9=85=8D=E7=BD=AE=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E4=B8=BA=E4=B8=8D=E5=90=AF=E7=94=A8=E6=97=B6=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E6=B2=A1=E6=9C=89=E6=B8=85=E7=A9=BA=E7=9A=84?= =?UTF-8?q?=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dal/dataobject/customer/CrmCustomerPoolConfigDO.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customer/CrmCustomerPoolConfigDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customer/CrmCustomerPoolConfigDO.java index 7e3b4cd15..76f20dc3b 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customer/CrmCustomerPoolConfigDO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customer/CrmCustomerPoolConfigDO.java @@ -1,9 +1,7 @@ package cn.iocoder.yudao.module.crm.dal.dataobject.customer; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.*; import lombok.*; /** @@ -33,18 +31,22 @@ public class CrmCustomerPoolConfigDO extends BaseDO { /** * 未跟进放入公海天数 */ + @TableField(updateStrategy = FieldStrategy.ALWAYS) private Integer contactExpireDays; /** * 未成交放入公海天数 */ + @TableField(updateStrategy = FieldStrategy.ALWAYS) private Integer dealExpireDays; /** * 是否开启提前提醒 */ + @TableField(updateStrategy = FieldStrategy.ALWAYS) private Boolean notifyEnabled; /** * 提前提醒天数 */ + @TableField(updateStrategy = FieldStrategy.ALWAYS) private Integer notifyDays; } From f766474ff452e14015a6b19dfbb89d39acca3500 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 26 Nov 2023 19:57:40 +0800 Subject: [PATCH 16/35] =?UTF-8?q?crm=EF=BC=9Acode=20review=20=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/module/crm/enums/ErrorCodeConstants.java | 1 + ...gTypeEnum.java => CrmCustomerLimitConfigTypeEnum.java} | 5 +++-- .../admin/customer/CrmCustomerLimitConfigController.java | 6 +++--- .../admin/customer/CrmCustomerPoolConfigController.java | 6 +++--- ...dateReqVO.java => CrmCustomerPoolConfigSaveReqVO.java} | 8 ++++++-- .../module/crm/convert/customer/CrmCustomerConvert.java | 4 ++-- .../convert/customer/CrmCustomerLimitConfigConvert.java | 2 +- .../CrmCustomerLimitConfigDO.java | 5 +++-- .../customerlimitconfig/CrmCustomerLimitConfigMapper.java | 2 +- .../CrmCustomerLimitConfigService.java | 4 ++-- .../CrmCustomerLimitConfigServiceImpl.java | 4 ++-- .../service/customer/CrmCustomerPoolConfigService.java | 4 ++-- .../customer/CrmCustomerPoolConfigServiceImpl.java | 4 ++-- .../yudao/module/crm/service/customer/package-info.java | 4 ---- .../CrmCustomerLimitConfigServiceImplTest.java | 3 ++- 15 files changed, 33 insertions(+), 29 deletions(-) rename yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/{LimitConfigTypeEnum.java => CrmCustomerLimitConfigTypeEnum.java} (85%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/{CrmCustomerPoolConfigUpdateReqVO.java => CrmCustomerPoolConfigSaveReqVO.java} (64%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/{customerlimitconfig => customer}/CrmCustomerLimitConfigDO.java (88%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/{customerlimitconfig => customer}/CrmCustomerLimitConfigService.java (90%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/{customerlimitconfig => customer}/CrmCustomerLimitConfigServiceImpl.java (95%) delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/package-info.java diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java index 42c5dc9e9..a07717efd 100644 --- a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java @@ -65,4 +65,5 @@ public interface ErrorCodeConstants { // ========== 客户公海规则设置 1_020_011_000 ========== ErrorCode CUSTOMER_LIMIT_CONFIG_NOT_EXISTS = new ErrorCode(1_020_012_000, "客户限制配置不存在"); + } diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/LimitConfigTypeEnum.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/CrmCustomerLimitConfigTypeEnum.java similarity index 85% rename from yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/LimitConfigTypeEnum.java rename to yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/CrmCustomerLimitConfigTypeEnum.java index dce8ae4d6..6300dee0e 100644 --- a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/LimitConfigTypeEnum.java +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/CrmCustomerLimitConfigTypeEnum.java @@ -13,7 +13,7 @@ import java.util.Arrays; */ @Getter @AllArgsConstructor -public enum LimitConfigTypeEnum implements IntArrayValuable { +public enum CrmCustomerLimitConfigTypeEnum implements IntArrayValuable { /** * 拥有客户数限制 @@ -25,7 +25,7 @@ public enum LimitConfigTypeEnum implements IntArrayValuable { CUSTOMER_LOCK_LIMIT(2, "锁定客户数限制"), ; - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(LimitConfigTypeEnum::getCode).toArray(); + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmCustomerLimitConfigTypeEnum::getCode).toArray(); /** * 状态 @@ -40,4 +40,5 @@ public enum LimitConfigTypeEnum implements IntArrayValuable { public int[] array() { return ARRAYS; } + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerLimitConfigController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerLimitConfigController.java index 13097d9ec..ff3303e6c 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerLimitConfigController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerLimitConfigController.java @@ -8,8 +8,8 @@ import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmC import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigRespVO; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigUpdateReqVO; import cn.iocoder.yudao.module.crm.convert.customer.CrmCustomerLimitConfigConvert; -import cn.iocoder.yudao.module.crm.dal.dataobject.customerlimitconfig.CrmCustomerLimitConfigDO; -import cn.iocoder.yudao.module.crm.service.customerlimitconfig.CrmCustomerLimitConfigService; +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerLimitConfigDO; +import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerLimitConfigService; 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; @@ -29,7 +29,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.convertSetByFlatMap; -@Tag(name = "管理后台 - 客户限制配置") +@Tag(name = "管理后台 - CRM 客户限制配置") @RestController @RequestMapping("/crm/customer-limit-config") @Validated diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerPoolConfigController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerPoolConfigController.java index 81a08e64e..c546abd14 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerPoolConfigController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerPoolConfigController.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.crm.controller.admin.customer; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigRespVO; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigUpdateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigSaveReqVO; import cn.iocoder.yudao.module.crm.convert.customer.CrmCustomerConvert; import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerPoolConfigDO; import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerPoolConfigService; @@ -37,8 +37,8 @@ public class CrmCustomerPoolConfigController { @PutMapping("/save") @Operation(summary = "更新客户公海规则设置") @PreAuthorize("@ss.hasPermission('crm:customer-pool-config:update')") - public CommonResult saveCustomerPoolConfig(@Valid @RequestBody CrmCustomerPoolConfigUpdateReqVO updateReqVO) { - customerPoolConfigService.updateCustomerPoolConfig(updateReqVO); + public CommonResult saveCustomerPoolConfig(@Valid @RequestBody CrmCustomerPoolConfigSaveReqVO updateReqVO) { + customerPoolConfigService.saveCustomerPoolConfig(updateReqVO); return success(true); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigUpdateReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigSaveReqVO.java similarity index 64% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigUpdateReqVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigSaveReqVO.java index d606e19d9..45b247156 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigUpdateReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigSaveReqVO.java @@ -10,13 +10,15 @@ import lombok.ToString; import javax.validation.constraints.AssertTrue; import java.util.Objects; -@Schema(description = "管理后台 - CRM 客户更新 Request VO") +@Schema(description = "管理后台 - CRM 客户公海配置的保存 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class CrmCustomerPoolConfigUpdateReqVO extends CrmCustomerPoolConfigBaseVO { +public class CrmCustomerPoolConfigSaveReqVO extends CrmCustomerPoolConfigBaseVO { + // TODO @wanwan:AssertTrue 必须 is 开头哈;注意需要 json 忽略下,避免被序列化; @AssertTrue(message = "客户公海规则设置不正确") + // TODO @wanwan:这个方法,是不是拆成 2 个,一个校验 contactExpireDays、一个校验 dealExpireDays; public boolean poolEnableValid() { if (!BooleanUtil.isTrue(getEnabled())) { return true; @@ -25,10 +27,12 @@ public class CrmCustomerPoolConfigUpdateReqVO extends CrmCustomerPoolConfigBaseV } @AssertTrue(message = "客户公海规则设置不正确") + // TODO @wanwan:这个方法,是不是改成 isNotifyDaysValid() 更好点?本质校验的是 notifyDays 是否为空 public boolean notifyEnableValid() { if (!BooleanUtil.isTrue(getNotifyEnabled())) { return true; } return Objects.nonNull(getNotifyDays()); } + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java index 34a8b412a..2cbc587ba 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java @@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.*; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigRespVO; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigUpdateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigSaveReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerPoolConfigDO; import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; @@ -80,6 +80,6 @@ public interface CrmCustomerConvert { CrmCustomerPoolConfigRespVO convert(CrmCustomerPoolConfigDO customerPoolConfig); - CrmCustomerPoolConfigDO convert(CrmCustomerPoolConfigUpdateReqVO updateReqVO); + CrmCustomerPoolConfigDO convert(CrmCustomerPoolConfigSaveReqVO updateReqVO); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerLimitConfigConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerLimitConfigConvert.java index 264737f89..13a59a1ec 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerLimitConfigConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerLimitConfigConvert.java @@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigCreateReqVO; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigRespVO; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigUpdateReqVO; -import cn.iocoder.yudao.module.crm.dal.dataobject.customerlimitconfig.CrmCustomerLimitConfigDO; +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerLimitConfigDO; import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import org.mapstruct.Mapper; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customerlimitconfig/CrmCustomerLimitConfigDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customer/CrmCustomerLimitConfigDO.java similarity index 88% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customerlimitconfig/CrmCustomerLimitConfigDO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customer/CrmCustomerLimitConfigDO.java index 80035ac20..df3d3be6f 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customerlimitconfig/CrmCustomerLimitConfigDO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customer/CrmCustomerLimitConfigDO.java @@ -1,7 +1,8 @@ -package cn.iocoder.yudao.module.crm.dal.dataobject.customerlimitconfig; +package cn.iocoder.yudao.module.crm.dal.dataobject.customer; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler; +import cn.iocoder.yudao.module.crm.enums.customer.CrmCustomerLimitConfigTypeEnum; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; @@ -33,7 +34,7 @@ public class CrmCustomerLimitConfigDO extends BaseDO { /** * 规则类型 *

- * 枚举 {@link cn.iocoder.yudao.module.crm.enums.customer.LimitConfigTypeEnum} + * 枚举 {@link CrmCustomerLimitConfigTypeEnum} */ private Integer type; /** diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customerlimitconfig/CrmCustomerLimitConfigMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customerlimitconfig/CrmCustomerLimitConfigMapper.java index 5c6ef672b..143d00086 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customerlimitconfig/CrmCustomerLimitConfigMapper.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customerlimitconfig/CrmCustomerLimitConfigMapper.java @@ -4,7 +4,7 @@ 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.customer.vo.limitconfig.CrmCustomerLimitConfigPageReqVO; -import cn.iocoder.yudao.module.crm.dal.dataobject.customerlimitconfig.CrmCustomerLimitConfigDO; +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerLimitConfigDO; import org.apache.ibatis.annotations.Mapper; /** diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customerlimitconfig/CrmCustomerLimitConfigService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerLimitConfigService.java similarity index 90% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customerlimitconfig/CrmCustomerLimitConfigService.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerLimitConfigService.java index 60fabe645..1a2e7ad56 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customerlimitconfig/CrmCustomerLimitConfigService.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerLimitConfigService.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.module.crm.service.customerlimitconfig; +package cn.iocoder.yudao.module.crm.service.customer; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigCreateReqVO; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigPageReqVO; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigUpdateReqVO; -import cn.iocoder.yudao.module.crm.dal.dataobject.customerlimitconfig.CrmCustomerLimitConfigDO; +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerLimitConfigDO; import javax.validation.Valid; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customerlimitconfig/CrmCustomerLimitConfigServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerLimitConfigServiceImpl.java similarity index 95% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customerlimitconfig/CrmCustomerLimitConfigServiceImpl.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerLimitConfigServiceImpl.java index 6d2bc97bc..0e3eed309 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customerlimitconfig/CrmCustomerLimitConfigServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerLimitConfigServiceImpl.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.module.crm.service.customerlimitconfig; +package cn.iocoder.yudao.module.crm.service.customer; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigCreateReqVO; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigPageReqVO; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigUpdateReqVO; import cn.iocoder.yudao.module.crm.convert.customer.CrmCustomerLimitConfigConvert; -import cn.iocoder.yudao.module.crm.dal.dataobject.customerlimitconfig.CrmCustomerLimitConfigDO; +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerLimitConfigDO; import cn.iocoder.yudao.module.crm.dal.mysql.customerlimitconfig.CrmCustomerLimitConfigMapper; import cn.iocoder.yudao.module.system.api.dept.DeptApi; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerPoolConfigService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerPoolConfigService.java index 0a05c5d20..5a7c91842 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerPoolConfigService.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerPoolConfigService.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.crm.service.customer; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigUpdateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigSaveReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerPoolConfigDO; import javax.validation.Valid; @@ -24,6 +24,6 @@ public interface CrmCustomerPoolConfigService { * * @param saveReqVO 更新信息 */ - void updateCustomerPoolConfig(@Valid CrmCustomerPoolConfigUpdateReqVO saveReqVO); + void saveCustomerPoolConfig(@Valid CrmCustomerPoolConfigSaveReqVO saveReqVO); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerPoolConfigServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerPoolConfigServiceImpl.java index 18d4192c3..473cde1a9 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerPoolConfigServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerPoolConfigServiceImpl.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.crm.service.customer; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigUpdateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigSaveReqVO; import cn.iocoder.yudao.module.crm.convert.customer.CrmCustomerConvert; import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerPoolConfigDO; import cn.iocoder.yudao.module.crm.dal.mysql.customer.CrmCustomerPoolConfigMapper; @@ -38,7 +38,7 @@ public class CrmCustomerPoolConfigServiceImpl implements CrmCustomerPoolConfigSe * @param saveReqVO 更新信息 */ @Override - public void updateCustomerPoolConfig(CrmCustomerPoolConfigUpdateReqVO saveReqVO) { + public void saveCustomerPoolConfig(CrmCustomerPoolConfigSaveReqVO saveReqVO) { // 存在,则进行更新 CrmCustomerPoolConfigDO dbConfig = getCustomerPoolConfig(); if (Objects.nonNull(dbConfig)) { diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/package-info.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/package-info.java deleted file mode 100644 index 1ae12a3df..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 客户 - */ -package cn.iocoder.yudao.module.crm.service.customer; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/customerlimitconfig/CrmCustomerLimitConfigServiceImplTest.java b/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/customerlimitconfig/CrmCustomerLimitConfigServiceImplTest.java index 00676784f..0b61af6c5 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/customerlimitconfig/CrmCustomerLimitConfigServiceImplTest.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/customerlimitconfig/CrmCustomerLimitConfigServiceImplTest.java @@ -5,8 +5,9 @@ import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigCreateReqVO; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigPageReqVO; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigUpdateReqVO; -import cn.iocoder.yudao.module.crm.dal.dataobject.customerlimitconfig.CrmCustomerLimitConfigDO; +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerLimitConfigDO; import cn.iocoder.yudao.module.crm.dal.mysql.customerlimitconfig.CrmCustomerLimitConfigMapper; +import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerLimitConfigServiceImpl; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; From d2c6c285f7ede60ea726f124d1aba3fbb8f506c2 Mon Sep 17 00:00:00 2001 From: zyna Date: Sun, 26 Nov 2023 22:00:14 +0800 Subject: [PATCH 17/35] =?UTF-8?q?crm=E8=81=94=E7=B3=BB=E4=BA=BAreview?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=8C=E6=96=B0=E5=A2=9E=E5=9C=B0=E5=8C=BA?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/mysql/crm.sql | 29 +++++ .../crm/enums/contact/ContactConstants.java | 5 + .../admin/contact/ContactController.java | 70 +++++++----- .../admin/contact/vo/ContactBaseVO.java | 107 ++++++++++++------ .../admin/contact/vo/ContactExcelVO.java | 72 ------------ .../admin/contact/vo/ContactExportReqVO.java | 71 ------------ .../admin/contact/vo/ContactPageReqVO.java | 16 +-- .../admin/contact/vo/ContactRespVO.java | 25 +++- .../admin/customer/CrmCustomerController.java | 9 +- .../vo/CrmCustomerQueryAllRespVO.java | 15 +++ .../crm/convert/contact/ContactConvert.java | 52 ++++++++- .../convert/customer/CrmCustomerConvert.java | 2 + .../crm/dal/dataobject/contact/ContactDO.java | 29 ++--- .../crm/dal/mysql/contact/ContactMapper.java | 10 +- .../crm/service/contact/ContactService.java | 5 +- .../service/contact/ContactServiceImpl.java | 12 +- .../service/customer/CrmCustomerService.java | 6 + .../customer/CrmCustomerServiceImpl.java | 5 + .../system/enums/DictTypeConstants.java | 2 + 19 files changed, 290 insertions(+), 252 deletions(-) create mode 100644 yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/contact/ContactConstants.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactExcelVO.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactExportReqVO.java create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerQueryAllRespVO.java diff --git a/sql/mysql/crm.sql b/sql/mysql/crm.sql index e3e2ca0a0..a33204a1e 100644 --- a/sql/mysql/crm.sql +++ b/sql/mysql/crm.sql @@ -1 +1,30 @@ SET NAMES utf8mb4; +-- `ruoyi-vue-pro`.crm_contact definition + +CREATE TABLE `crm_contact` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '联系人名称', + `next_time` datetime DEFAULT NULL COMMENT '下次联系时间', + `mobile` varchar(16) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '手机号', + `telephone` varchar(16) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '电话', + `email` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '电子邮箱', + `post` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '职务', + `customer_id` bigint(20) DEFAULT NULL COMMENT '客户编号', + `address` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '地址', + `remark` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建人', + `owner_user_id` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '负责人用户编号', + `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间', + `update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间', + `last_time` timestamp NULL DEFAULT NULL COMMENT '最后跟进时间', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '更新人', + `deleted` bit(1) NOT NULL DEFAULT b'0', + `tenant_id` bigint(20) DEFAULT NULL, + `parent_id` bigint(20) DEFAULT NULL COMMENT '直系上属', + `qq` int(11) DEFAULT NULL, + `wechat` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `sex` int(11) DEFAULT NULL COMMENT '性别', + `master` bit(1) DEFAULT NULL COMMENT '是否关键决策人', + `area_id` bigint(20) DEFAULT NULL COMMENT '地区', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='CRM 联系人'; \ No newline at end of file diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/contact/ContactConstants.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/contact/ContactConstants.java new file mode 100644 index 000000000..a0a246f34 --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/contact/ContactConstants.java @@ -0,0 +1,5 @@ +package cn.iocoder.yudao.module.crm.enums.contact; + +public class ContactConstants { + public static final String MULTIPLE_SPLIT = ","; +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java index bf376ffa3..7b79faf21 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java @@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerExpor import cn.iocoder.yudao.module.crm.convert.contact.ContactConvert; import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO; 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.ContactService; import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; @@ -19,6 +20,7 @@ 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; +import lombok.extern.slf4j.Slf4j; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -26,12 +28,13 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; +import javax.validation.constraints.NotNull; import java.io.IOException; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; +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.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @@ -41,6 +44,7 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti @RestController @RequestMapping("/crm/contact") @Validated +@Slf4j public class ContactController { @Resource @@ -82,23 +86,25 @@ public class ContactController { @PreAuthorize("@ss.hasPermission('crm:contact:query')") public CommonResult getContact(@RequestParam("id") Long id) { ContactDO contact = contactService.getContact(id); - // TODO @zyna:需要考虑 null 的情况; - ContactRespVO contactRespVO = ContactConvert.INSTANCE.convert(contact); - // TODO @zyna:可以把数据读完后,convert 统一交给 ContactConvert,让 controller 更简洁;而 convert 专门去做一些转换逻辑 + if(contact == null){ + throw exception(ErrorCodeConstants.CONTACT_NOT_EXISTS); + } + //1.获取用户名 Map userMap = adminUserApi.getUserMap(CollUtil.removeNull(Lists.newArrayList( - NumberUtil.parseLong(contact.getCreator())))); - contactRespVO.setCreatorName(Optional.ofNullable(userMap.get(NumberUtil.parseLong(contact.getCreator()))).map(AdminUserRespDTO::getNickname).orElse(null)); - contactRespVO.setCustomerName(Optional.ofNullable(crmCustomerService.getCustomer(contact.getCustomerId())).map(CrmCustomerDO::getName).orElse(null)); + NumberUtil.parseLong(contact.getCreator()),contact.getOwnerUserId()))); + //2.获取客户信息 + List crmCustomerDOList = crmCustomerService.getCustomerList(Collections.singletonList(contact.getCustomerId())); + //3.直属上级 + List contactList = contactService.getContactList(Collections.singletonList(contact.getParentId())); + ContactRespVO contactRespVO = ContactConvert.INSTANCE.convert(contact,userMap,crmCustomerDOList,contactList); return success(contactRespVO); } - - // TODO @zyna:url 使用中划线噢;然后,单词的拼写也要注意呀,AllList 是不是更好呀; - @GetMapping("/simpleAlllist") + @GetMapping("/simple-all-list") @Operation(summary = "获得联系人列表") @PreAuthorize("@ss.hasPermission('crm:contact:query')") public CommonResult> simpleAlllist() { // TODO @zyna:方法名改成,getContactList;方法命名,要动名词,get 动词;all 可以去掉,因为没条件,自然是全部 - List list = contactService.allContactList(); + List list = contactService.getContactList(); return success(ContactConvert.INSTANCE.convertAllList(list)); } @@ -107,16 +113,10 @@ public class ContactController { @PreAuthorize("@ss.hasPermission('crm:contact:query')") public CommonResult> getContactPage(@Valid ContactPageReqVO pageVO) { PageResult pageData = contactService.getContactPage(pageVO); - PageResult pageResult =ContactConvert.INSTANCE.convertPage(pageData); - // TODO @zyna:需要考虑 null 的情况; - // TODO @zyna:可以把数据读完后,convert 统一交给 ContactConvert,让 controller 更简洁;而 convert 专门去做一些转换逻辑 - //待接口实现后修改 - List crmCustomerDOList = crmCustomerService.getCustomerList(new CrmCustomerExportReqVO()); - Map crmCustomerDOMap = crmCustomerDOList.stream().collect(Collectors.toMap(CrmCustomerDO::getId,v->v)); - pageResult.getList().forEach(item -> { - item.setCustomerName(Optional.ofNullable(crmCustomerDOMap.get(item.getCustomerId())).map(CrmCustomerDO::getName).orElse(null)); - }); - return success(pageResult); + List contactRespVOList = convertFieldValue2Name(pageData.getList()); + PageResult pageDataReturn = ContactConvert.INSTANCE.convertPage(pageData); + pageDataReturn.setList(contactRespVOList); + return success(pageDataReturn); } // TODO @zyna:可以看下新的导出写法,这里调整下 @@ -124,12 +124,30 @@ public class ContactController { @Operation(summary = "导出联系人 Excel") @PreAuthorize("@ss.hasPermission('crm:contact:export')") @OperateLog(type = EXPORT) - public void exportContactExcel(@Valid ContactExportReqVO exportReqVO, + public void exportContactExcel(@Valid ContactPageReqVO exportReqVO, HttpServletResponse response) throws IOException { List list = contactService.getContactList(exportReqVO); // 导出 Excel - List datas = ContactConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "crm联系人.xls", "数据", ContactExcelVO.class, datas); + List contactRespVOList = convertFieldValue2Name(list); + ExcelUtils.write(response, "crm联系人.xls", "数据", ContactRespVO.class, contactRespVOList); } + /** + * 翻译字段名称 + * @param contactDOList 联系人List + * @return List + */ + private List convertFieldValue2Name(List contactDOList){ + //1.获取客户列表 + List customerIdList = contactDOList.stream().map(ContactDO::getCustomerId).distinct().collect(Collectors.toList()); + List crmCustomerDOList = crmCustomerService.getCustomerList(customerIdList); + //2.获取创建人、责任人列表 + List userIdsList = contactDOList.stream().flatMap(item-> Stream.of(Long.parseLong(item.getCreator()),item.getOwnerUserId()).distinct()).collect(Collectors.toList()); + Map userMap = adminUserApi.getUserMap(userIdsList); + //3.直属上级 + List contactIdsList = contactDOList.stream().map(ContactDO::getParentId).distinct().collect(Collectors.toList()); + List contactList = contactService.getContactList(contactIdsList); + List pageResult =ContactConvert.INSTANCE.converList(contactDOList,userMap,crmCustomerDOList,contactList); + return pageResult; + } } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java index 9311ad365..99e613c23 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java @@ -1,9 +1,18 @@ package cn.iocoder.yudao.module.crm.controller.admin.contact.vo; +import cn.iocoder.yudao.framework.common.validation.Mobile; +import cn.iocoder.yudao.framework.common.validation.Telephone; +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import org.apache.skywalking.apm.toolkit.trace.IgnoredException; import org.springframework.format.annotation.DateTimeFormat; +import javax.validation.constraints.Email; +import javax.validation.constraints.NotNull; import java.time.LocalDateTime; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; @@ -17,57 +26,83 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ @Data public class ContactBaseVO { - // TODO @zyna:example 最好都写下 - // TODO @zyna:必要的字段校验,例如说 @Mobile,@Emal 等等 - - @Schema(description = "下次联系时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) - private LocalDateTime nextTime; - - @Schema(description = "手机号") - private String mobile; - - @Schema(description = "电话") - private String telephone; - - @Schema(description = "电子邮箱") - private String email; + @ExcelProperty(value = "姓名",order = 1) + @Schema(description = "姓名", example = "芋艿") + @NotNull(message = "姓名不能为空") + private String name; @Schema(description = "客户编号", example = "10795") + @ExcelIgnore private Long customerId; + @ExcelProperty(value = "性别",converter = DictConvert.class ,order = 3) + @DictFormat(cn.iocoder.yudao.module.system.enums.DictTypeConstants.USER_SEX) + @Schema(description = "性别") + private Integer sex; + + @Schema(description = "职位") + @ExcelProperty(value = "职位",order = 3) + private String post; + + @Schema(description = "是否关键决策人") + @ExcelProperty(value = "是否关键决策人",converter = DictConvert.class,order = 3) + @DictFormat(cn.iocoder.yudao.module.system.enums.DictTypeConstants.INFRA_BOOLEAN_STRING) + private Boolean master; + + @Schema(description = "直属上级", example = "23457") + @ExcelIgnore + private Long parentId; + + + @Schema(description = "手机号",example = "1387171766") + @Mobile + @ExcelProperty(value = "手机号",order = 4) + private String mobile; + + @Schema(description = "座机",example = "021-0029922") + @Telephone + @ExcelProperty(value = "座机",order = 4) + private String telephone; + + @ExcelProperty(value = "QQ",order = 4) + @Schema(description = "QQ",example = "197272662") + private Long qq; + + @ExcelProperty(value = "微信",order = 4) + @Schema(description = "微信",example = "zzz3883") + private String wechat; + + @Schema(description = "电子邮箱",example = "1111@22.com") + @Email + @ExcelProperty(value = "邮箱",order = 4) + private String email; + + @ExcelProperty(value = "地址",order = 5) @Schema(description = "地址") private String address; + @Schema(description = "下次联系时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + @ExcelProperty(value = "下次联系时间",order = 6) + private LocalDateTime nextTime; + @Schema(description = "备注", example = "你说的对") + @ExcelProperty(value = "备注",order = 6) private String remark; @Schema(description = "最后跟进时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ExcelProperty(value = "最后跟进时间",order = 6) private LocalDateTime lastTime; - @Schema(description = "直属上级", example = "23457") - private Long parentId; - - @Schema(description = "姓名", example = "芋艿") - private String name; - - @Schema(description = "职位") - private String post; - - @Schema(description = "QQ") - private Long qq; - - @Schema(description = "微信") - private String webchat; - - @Schema(description = "性别") - private Integer sex; - - @Schema(description = "是否关键决策人") - private Boolean policyMakers; @Schema(description = "负责人用户编号", example = "14334") - private String ownerUserId; + @NotNull(message = "负责人不能为空") + @ExcelIgnore + private Long ownerUserId; + + @Schema(description = "地区编号", example = "20158") + @ExcelIgnore + private Integer areaId; } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactExcelVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactExcelVO.java deleted file mode 100644 index d13db6c3e..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactExcelVO.java +++ /dev/null @@ -1,72 +0,0 @@ -package cn.iocoder.yudao.module.crm.controller.admin.contact.vo; - -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -// TODO @zyna:参考新的 VO 结构,把 ContactExcelVO 融合到 ContactRespVO 中 -/** - * crm联系人 Excel VO - * - * @author 芋道源码 - */ -@Data -@Deprecated -public class ContactExcelVO { - - @ExcelProperty("下次联系时间") - private LocalDateTime nextTime; - - @ExcelProperty("手机号") - private String mobile; - - @ExcelProperty("电话") - private String telephone; - - @ExcelProperty("电子邮箱") - private String email; - - @ExcelProperty("客户编号") - private Long customerId; - - @ExcelProperty("地址") - private String address; - - @ExcelProperty("备注") - private String remark; - - @ExcelProperty("创建时间") - private LocalDateTime createTime; - - @ExcelProperty("最后跟进时间") - private LocalDateTime lastTime; - - @ExcelProperty("主键") - private Long id; - - @ExcelProperty("直属上级") - private Long parentId; - - @ExcelProperty("姓名") - private String name; - - @ExcelProperty("职位") - private String post; - - @ExcelProperty("QQ") - private Long qq; - - @ExcelProperty("微信") - private String webchat; - - @ExcelProperty("性别") - private Integer sex; - - @ExcelProperty("是否关键决策人") - private Boolean policyMakers; - - @ExcelProperty("负责人用户编号") - private String ownerUserId; - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactExportReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactExportReqVO.java deleted file mode 100644 index f05f6dcde..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactExportReqVO.java +++ /dev/null @@ -1,71 +0,0 @@ -package cn.iocoder.yudao.module.crm.controller.admin.contact.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -// TODO @zyna:参考新的 VO 结构,使用 ContactPageReqVO 查询导出的数据 -@Schema(description = "管理后台 - crm联系人 Excel 导出 Request VO,参数和 ContactPageReqVO 是一致的") -@Data -@Deprecated -public class ContactExportReqVO { - - @Schema(description = "下次联系时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] nextTime; - - @Schema(description = "手机号") - private String mobile; - - @Schema(description = "电话") - private String telephone; - - @Schema(description = "电子邮箱") - private String email; - - @Schema(description = "客户编号", example = "10795") - private Long customerId; - - @Schema(description = "地址") - private String address; - - @Schema(description = "备注", example = "你说的对") - private String remark; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - - @Schema(description = "最后跟进时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] lastTime; - - @Schema(description = "直属上级", example = "23457") - private Long parentId; - - @Schema(description = "姓名", example = "芋艿") - private String name; - - @Schema(description = "职位") - private String post; - - @Schema(description = "QQ") - private Long qq; - - @Schema(description = "微信") - private String webchat; - - @Schema(description = "性别") - private Integer sex; - - @Schema(description = "是否关键决策人") - private Boolean policyMakers; - - @Schema(description = "负责人用户编号", example = "14334") - private String ownerUserId; - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactPageReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactPageReqVO.java index a20826b0a..f5ed1b275 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactPageReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactPageReqVO.java @@ -26,13 +26,13 @@ public class ContactPageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] nextTime; - @Schema(description = "手机号") + @Schema(description = "手机号",example = "13898273941") private String mobile; - @Schema(description = "电话") + @Schema(description = "电话",example = "021-383773") private String telephone; - @Schema(description = "电子邮箱") + @Schema(description = "电子邮箱",example = "111@22.com") private String email; @Schema(description = "客户编号", example = "10795") @@ -61,19 +61,19 @@ public class ContactPageReqVO extends PageParam { @Schema(description = "职位") private String post; - @Schema(description = "QQ") + @Schema(description = "QQ",example = "3882872") private Long qq; - @Schema(description = "微信") - private String webchat; + @Schema(description = "微信",example = "zzZ98373") + private String wechat; @Schema(description = "性别") private Integer sex; @Schema(description = "是否关键决策人") - private Boolean policyMakers; + private Boolean master; @Schema(description = "负责人用户编号", example = "14334") - private String ownerUserId; + private Long ownerUserId; } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactRespVO.java index 5a69424dc..438a0b336 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactRespVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactRespVO.java @@ -1,5 +1,7 @@ package cn.iocoder.yudao.module.crm.controller.admin.contact.vo; +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.time.LocalDateTime; @@ -11,17 +13,34 @@ import java.time.LocalDateTime; public class ContactRespVO extends ContactBaseVO { @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "3167") + @ExcelIgnore private Long id; @Schema(description = "创建时间") + @ExcelProperty(value = "创建时间",order = 8) private LocalDateTime createTime; - // TODO @zyna:example 最好写下; + @Schema(description = "创建人", example = "25682") + @ExcelIgnore + private String creator; - @Schema(description = "创建人") + @Schema(description = "创建人名字", example = "test") + @ExcelProperty(value = "创建人",order = 8) private String creatorName; - @Schema(description = "客户名字") + @ExcelProperty(value = "客户名称",order = 2) + @Schema(description = "客户名字", example = "test") private String customerName; + @Schema(description = "负责人", example = "test") + @ExcelProperty(value = "负责人",order = 7) + private String ownerUserName; + + @Schema(description = "直属上级名",example = "芋头") + @ExcelProperty(value = "直属上级",order = 4) + private String parentName; + + @Schema(description = "地区名",example = "上海上海市浦东新区") + @ExcelProperty(value = "地区",order = 5) + private String areaName; } 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 e55b8fdd8..3f12055b8 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 @@ -179,5 +179,12 @@ public class CrmCustomerController { customerService.distributeCustomer(ids, ownerUserId); return success(true); } - + @GetMapping("/query-all-list") + @Operation(summary = "查询客户列表") + @PreAuthorize("@ss.hasPermission('crm:customer:all')") + public CommonResult> queryAll(){ + List crmCustomerDOList = customerService.getCustomerList(); + List data = CrmCustomerConvert.INSTANCE.convertQueryAll(crmCustomerDOList); + return success(data); + } } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerQueryAllRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerQueryAllRespVO.java new file mode 100644 index 000000000..18c487997 --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerQueryAllRespVO.java @@ -0,0 +1,15 @@ +package cn.iocoder.yudao.module.crm.controller.admin.customer.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + + +@Schema(description = "管理后台 - CRM 全部客户 Response VO") +@Data +public class CrmCustomerQueryAllRespVO{ + @Schema(description = "客户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") + private String name; + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563") + private Long id; + +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java index a5be7d84f..12a21dd64 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java @@ -1,15 +1,21 @@ package cn.iocoder.yudao.module.crm.convert.contact; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils; import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.*; import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO; +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Mappings; import org.mapstruct.factory.Mappers; - import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen; /** * crm联系人 Convert @@ -31,8 +37,6 @@ public interface ContactConvert { PageResult convertPage(PageResult page); - List convertList02(List list); - List convertAllList(List list); @Mappings({ @@ -41,4 +45,46 @@ public interface ContactConvert { }) CrmPermissionTransferReqBO convert(CrmContactTransferReqVO reqVO, Long userId); + /** + * 详情信息 + * @param contactDO 联系人 + * @param userMap 用户列表 + * @param crmCustomerDOList 客户 + * @return ContactRespVO + */ + default ContactRespVO convert(ContactDO contactDO, Map userMap, List crmCustomerDOList, + List contactList) { + ContactRespVO contactRespVO = convert(contactDO); + setUserInfo(contactRespVO,userMap); + Map crmCustomerDOMap = crmCustomerDOList.stream().collect(Collectors.toMap(CrmCustomerDO::getId,v->v)); + Map contactDOMap = contactList.stream().collect(Collectors.toMap(ContactDO::getId,v->v)); + findAndThen(crmCustomerDOMap,contactDO.getCustomerId(),customer -> {contactRespVO.setCustomerName(customer.getName());}); + findAndThen(contactDOMap,contactDO.getParentId(),contactDOInner -> {contactRespVO.setParentName(contactDOInner.getName());}); + return contactRespVO; + } + default List converList(List contactDOList, Map userMap, + List crmCustomerDOList , List contactList){ + List result = convertList(contactDOList); + Map contactMap = contactList.stream().collect(Collectors.toMap(ContactDO::getId,v->v)); + Map customerMap = crmCustomerDOList.stream().collect(Collectors.toMap(CrmCustomerDO::getId,v->v)); + result.forEach(item -> { + setUserInfo(item, userMap); + findAndThen(customerMap,item.getCustomerId(),customer -> {item.setCustomerName(customer.getName());}); + findAndThen(contactMap,item.getParentId(),contactDO -> {item.setParentName(contactDO.getName());}); + }); + return result; + } + /** + * 设置用户信息 + * + * @param contactRespVO 联系人Response VO + * @param userMap 用户信息 map + */ + static void setUserInfo(ContactRespVO contactRespVO, Map userMap){ + contactRespVO.setAreaName(AreaUtils.format(contactRespVO.getAreaId())); + findAndThen(userMap, contactRespVO.getOwnerUserId(), user -> { + contactRespVO.setOwnerUserName(user == null?"":user.getNickname()); + }); + findAndThen(userMap, Long.parseLong(contactRespVO.getCreator()), user -> contactRespVO.setCreatorName(user.getNickname())); + } } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java index 2cbc587ba..d2661bfb1 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java @@ -82,4 +82,6 @@ public interface CrmCustomerConvert { CrmCustomerPoolConfigDO convert(CrmCustomerPoolConfigSaveReqVO updateReqVO); + CrmCustomerQueryAllRespVO convertQueryAll(CrmCustomerDO crmCustomerDO); + List convertQueryAll(List crmCustomerDO); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/ContactDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/ContactDO.java index f98da52bc..0888d615d 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/ContactDO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/ContactDO.java @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.time.LocalDateTime; @@ -22,8 +23,11 @@ import java.time.LocalDateTime; @NoArgsConstructor @AllArgsConstructor public class ContactDO extends BaseDO { - - // TODO @zyna:这个字段的顺序,是不是整理下; + /** + * 主键 + */ + @TableId + private Long id; /** * 下次联系时间 */ @@ -56,15 +60,8 @@ public class ContactDO extends BaseDO { * 最后跟进时间 */ private LocalDateTime lastTime; - // TODO @zyna:这个放在最前面吧 /** - * 主键 - */ - @TableId - private Long id; - // TODO @zyna:直接上级,最好写下它关联的字段,例如说这个,应该关联 ContactDO 的 id 字段 - /** - * 直属上级 + * 直属上级 @link ContactDO#id */ private Long parentId; /** @@ -79,25 +76,23 @@ public class ContactDO extends BaseDO { * QQ */ private Long qq; - // TODO @zyna:wechat /** * 微信 */ - private String webchat; - // TODO @zyna:关联的枚举 + private String wechat; /** * 性别 + * @See 字典配置 */ private Integer sex; - // TODO @zyna:这个字段改成 master 哈; /** * 是否关键决策人 */ - private Boolean policyMakers; - // TODO @zyna:应该是 Long + private Boolean master; /** * 负责人用户编号 */ - private String ownerUserId; + private Long ownerUserId; + private Integer areaId; } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/ContactMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/ContactMapper.java index ef336c37e..9db1691cb 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/ContactMapper.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/ContactMapper.java @@ -32,14 +32,14 @@ public interface ContactMapper extends BaseMapperX { .likeIfPresent(ContactDO::getName, reqVO.getName()) .eqIfPresent(ContactDO::getPost, reqVO.getPost()) .eqIfPresent(ContactDO::getQq, reqVO.getQq()) - .eqIfPresent(ContactDO::getWebchat, reqVO.getWebchat()) + .eqIfPresent(ContactDO::getWechat, reqVO.getWechat()) .eqIfPresent(ContactDO::getSex, reqVO.getSex()) - .eqIfPresent(ContactDO::getPolicyMakers, reqVO.getPolicyMakers()) + .eqIfPresent(ContactDO::getMaster, reqVO.getMaster()) .eqIfPresent(ContactDO::getOwnerUserId, reqVO.getOwnerUserId()) .orderByDesc(ContactDO::getId)); } - default List selectList(ContactExportReqVO reqVO) { + default List selectList(ContactPageReqVO reqVO) { return selectList(new LambdaQueryWrapperX() .betweenIfPresent(ContactDO::getNextTime, reqVO.getNextTime()) .eqIfPresent(ContactDO::getMobile, reqVO.getMobile()) @@ -54,9 +54,9 @@ public interface ContactMapper extends BaseMapperX { .likeIfPresent(ContactDO::getName, reqVO.getName()) .eqIfPresent(ContactDO::getPost, reqVO.getPost()) .eqIfPresent(ContactDO::getQq, reqVO.getQq()) - .eqIfPresent(ContactDO::getWebchat, reqVO.getWebchat()) + .eqIfPresent(ContactDO::getWechat, reqVO.getWechat()) .eqIfPresent(ContactDO::getSex, reqVO.getSex()) - .eqIfPresent(ContactDO::getPolicyMakers, reqVO.getPolicyMakers()) + .eqIfPresent(ContactDO::getMaster, reqVO.getMaster()) .eqIfPresent(ContactDO::getOwnerUserId, reqVO.getOwnerUserId()) .orderByDesc(ContactDO::getId)); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactService.java index c27c1541a..f1278a529 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactService.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactService.java @@ -2,7 +2,6 @@ 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.ContactCreateReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactExportReqVO; import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactPageReqVO; import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactUpdateReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO; @@ -71,11 +70,11 @@ public interface ContactService { * @param exportReqVO 查询条件 * @return crm联系人列表 */ - List getContactList(ContactExportReqVO exportReqVO); + List getContactList(ContactPageReqVO exportReqVO); /** * 获取所有联系人列表,只返回姓名和id * @return 所有联系人列表 */ - List allContactList(); + List getContactList(); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java index 279bbc568..95f3131e2 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java @@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactCreateReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactExportReqVO; import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactPageReqVO; import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactUpdateReqVO; import cn.iocoder.yudao.module.crm.convert.contact.ContactConvert; @@ -57,7 +56,7 @@ public class ContactServiceImpl implements ContactService { @Override @Transactional(rollbackFor = Exception.class) - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS, level = CrmPermissionLevelEnum.WRITE) + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS,bizId = "#updateReqVO.id", level = CrmPermissionLevelEnum.WRITE) public void updateContact(ContactUpdateReqVO updateReqVO) { // 校验存在 validateContactExists(updateReqVO.getId()); @@ -68,7 +67,7 @@ public class ContactServiceImpl implements ContactService { @Override @Transactional(rollbackFor = Exception.class) - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS, level = CrmPermissionLevelEnum.WRITE) + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS,bizId = "#id", level = CrmPermissionLevelEnum.WRITE) public void deleteContact(Long id) { // 校验存在 validateContactExists(id); @@ -83,7 +82,7 @@ public class ContactServiceImpl implements ContactService { } @Override - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS, level = CrmPermissionLevelEnum.READ) + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS,bizId = "#id", level = CrmPermissionLevelEnum.READ) public ContactDO getContact(Long id) { return contactMapper.selectById(id); } @@ -102,13 +101,12 @@ public class ContactServiceImpl implements ContactService { } @Override - public List getContactList(ContactExportReqVO exportReqVO) { + public List getContactList(ContactPageReqVO exportReqVO) { return contactMapper.selectList(exportReqVO); } @Override - public List allContactList() { + public List getContactList() { return contactMapper.selectList(); } - } 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 ae429c745..d83e06850 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 @@ -128,4 +128,10 @@ public interface CrmCustomerService { */ void receive(Long id, Long userId); + /** + * 获取客户列表 + * @return 客户列表 + * @author zyna + */ + List getCustomerList(); } 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 aa5ef9f5b..d9dd1c05b 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 @@ -230,6 +230,11 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { .setBizId(customer.getId()).setUserId(userId).setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); // 设置当前操作的人为负责人 } + @Override + public List getCustomerList() { + return customerMapper.selectList(); + } + @Override @Transactional(rollbackFor = Exception.class) @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#id", level = CrmPermissionLevelEnum.OWNER) diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java index c0e342383..7a78f18f3 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java @@ -26,4 +26,6 @@ public interface DictTypeConstants { String SMS_SEND_STATUS = "system_sms_send_status"; // 短信发送状态 String SMS_RECEIVE_STATUS = "system_sms_receive_status"; // 短信接收状态 + String INFRA_BOOLEAN_STRING = "infra_boolean_string"; // boolean字典 + } From 930b5a8dd5a6b047435414a646381093bf72fe61 Mon Sep 17 00:00:00 2001 From: zyna Date: Sun, 26 Nov 2023 22:03:06 +0800 Subject: [PATCH 18/35] =?UTF-8?q?crm=E8=81=94=E7=B3=BB=E4=BA=BA=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=A4=9A=E4=BD=99=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/module/crm/enums/contact/ContactConstants.java | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/contact/ContactConstants.java diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/contact/ContactConstants.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/contact/ContactConstants.java deleted file mode 100644 index a0a246f34..000000000 --- a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/contact/ContactConstants.java +++ /dev/null @@ -1,5 +0,0 @@ -package cn.iocoder.yudao.module.crm.enums.contact; - -public class ContactConstants { - public static final String MULTIPLE_SPLIT = ","; -} From 7f569f32998b7a8f036c8ede96389ff18de8b0e2 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Mon, 27 Nov 2023 10:55:32 +0800 Subject: [PATCH 19/35] =?UTF-8?q?crm-=E6=95=B0=E6=8D=AE=E6=9D=83=E9=99=90?= =?UTF-8?q?=EF=BC=9A=E5=AE=8C=E5=96=84=E6=95=B0=E6=8D=AE=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../permission/CrmPermissionController.java | 51 ++------------- .../permission/CrmPermissionConvert.java | 2 + .../permission/CrmPermissionService.java | 34 +++++----- .../permission/CrmPermissionServiceImpl.java | 64 +++++++++++++------ .../module/crm/util/CrmPermissionUtils.java | 27 -------- 5 files changed, 67 insertions(+), 111 deletions(-) delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmPermissionUtils.java diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.java index 34a912a2e..2d593c7ce 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.java @@ -1,7 +1,6 @@ package cn.iocoder.yudao.module.crm.controller.admin.permission; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionCreateReqVO; @@ -30,11 +29,9 @@ import javax.annotation.Resource; import javax.validation.Valid; import java.util.*; -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.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; -import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*; @Tag(name = "管理后台 - CRM 数据权限") @RestController @@ -71,59 +68,21 @@ public class CrmPermissionController { return success(true); } - // TODO @puhui999:这个要不要放到 Service 实现,让 Controller 还轻一点; @DeleteMapping("/delete") @Operation(summary = "删除数据权限") @Parameter(name = "ids", description = "数据权限编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('crm:permission:delete')") public CommonResult deletePermission(@RequestParam("ids") Collection ids) { - List permissions = permissionService.getPermissionList(ids); - if (CollUtil.isEmpty(permissions)) { - throw exception(CRM_PERMISSION_NOT_EXISTS); - } - Set bizIds = convertSet(permissions, CrmPermissionDO::getBizId); - if (bizIds.size() > 1) { // 情况一:数据权限的模块数据编号是一致的不可能存在两个 TODO @puhui999:这里可以额外说明下原因,就是批量删除权限的时候,只能属于同一个 bizId 下; - throw exception(CRM_PERMISSION_DELETE_FAIL); - } - // TODO @puhui999:下面 2 个,可以忽略。简单点哈; - if (permissions.size() != ids.size()) { // 情况二:期望数量和实际结果不一致 - throw exception(CRM_PERMISSION_NOT_EXISTS); - } - // 情况三:不能包含负责人 - // TODO @puhui999:isOwner 可以直接放到判断里,不用单独取个变量名 - boolean isOwner = CollectionUtils.anyMatch(permissions, item -> ObjUtil.equal(item.getLevel(), CrmPermissionLevelEnum.OWNER.getLevel())); - if (isOwner) { - throw exception(CRM_PERMISSION_DELETE_FAIL_EXIST_OWNER); - } - // 校验操作人是否为负责人 - CrmPermissionDO permission = permissionService.getPermission(permissions.get(0).getBizId(), getLoginUserId()); - if (!CrmPermissionLevelEnum.isOwner(permission.getLevel())) { - throw exception(CRM_PERMISSION_DELETE_DENIED); - } - // 删除数据权限 - permissionService.deletePermission(ids); + permissionService.deletePermissionBatch(ids, getLoginUserId()); return success(true); } - // TODO @puhui999:这个要不要放到 Service 实现,让 Controller 还轻一点; - // TODO @puhui999:delete-self 就可以啦。方法名叫 deleteSelfPermission - @DeleteMapping("/deleteSelfPermission") + @DeleteMapping("/delete-self") @Operation(summary = "删除自己的数据权限") @Parameter(name = "id", description = "数据权限编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('crm:permission:delete')") - public CommonResult deletePermission(@RequestParam("id") Long id) { - // 校验数据存在且是自己 - CrmPermissionDO permission = permissionService.getPermission(id, getLoginUserId()); - if (permission == null) { - throw exception(CRM_PERMISSION_NOT_EXISTS); - } - // 校验是否是负责人 - if (CrmPermissionLevelEnum.isOwner(permission.getLevel())) { - throw exception(CRM_PERMISSION_DELETE_SELF_PERMISSION_FAIL_EXIST_OWNER); - } - - // 删除 - permissionService.deletePermission(Collections.singletonList(id)); + @PreAuthorize("@ss.hasPermission('crm:permission:delete')") // TODO puhui999: 数据权限在页面上只是已团队成员组件的形式出现,那么这个权限怎么分配? + public CommonResult deleteSelfPermission(@RequestParam("id") Long id) { + permissionService.deleteSelfPermission(id, getLoginUserId()); return success(true); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/permission/CrmPermissionConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/permission/CrmPermissionConvert.java index 03492b2c0..cab0c76b3 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/permission/CrmPermissionConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/permission/CrmPermissionConvert.java @@ -61,4 +61,6 @@ public interface CrmPermissionConvert { id -> new CrmPermissionDO().setId(id).setLevel(updateReqVO.getLevel())); } + List convertList(List createBOs); + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java index 3067bf7c2..b7df1f4a0 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java @@ -27,6 +27,13 @@ public interface CrmPermissionService { */ Long createPermission(@Valid CrmPermissionCreateReqBO createBO); + /** + * 创建数据权限 + * + * @param createBOs 创建信息 + */ + void createPermissionBatch(@Valid List createBOs); + /** * 更新数据权限 * @@ -41,13 +48,6 @@ public interface CrmPermissionService { */ void transferPermission(@Valid CrmPermissionTransferReqBO crmPermissionTransferReqBO); - /** - * 删除数据权限 - * - * @param ids 编号 - */ - void deletePermission(Collection ids); - /** * 删除数据权限 * @@ -58,13 +58,19 @@ public interface CrmPermissionService { void deletePermission(Integer bizType, Long bizId, Integer level); /** - * 获取用户数据权限通过 权限编号 x 用户编号 + * 批量删除数据权限 + * + * @param ids 权限编号 + */ + void deletePermissionBatch(Collection ids, Long userId); + + /** + * 删除指定用户数据权限 * * @param id 权限编号 * @param userId 用户编号 - * @return 数据权限 */ - CrmPermissionDO getPermission(Long id, Long userId); + void deleteSelfPermission(Long id, Long userId); /** * 获取数据权限列表,通过 数据类型 x 某个数据 @@ -75,14 +81,6 @@ public interface CrmPermissionService { */ List getPermissionListByBiz(Integer bizType, Long bizId); - /** - * 获得数据权限列表 - * - * @param ids 数据权限编号列表 - * @return 数据权限列表 - */ - List getPermissionList(Collection ids); - /** * 获取用户参与的模块数据列表 * diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java index 935b6f0e0..dc584fce7 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java @@ -19,6 +19,7 @@ import javax.annotation.Resource; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Set; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; @@ -52,6 +53,16 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { return permission.getId(); } + @Override + public void createPermissionBatch(List createBOs) { + // 1. 校验用户是否存在 + adminUserApi.validateUserList(convertSet(createBOs, CrmPermissionCreateReqBO::getUserId)); + + // 2. 创建 + List permissions = CrmPermissionConvert.INSTANCE.convertList(createBOs); + crmPermissionMapper.insertBatch(permissions); + } + @Override @Transactional(rollbackFor = Exception.class) public void updatePermission(CrmPermissionUpdateReqVO updateReqVO) { @@ -110,16 +121,6 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { } } - @Override - @Transactional(rollbackFor = Exception.class) - public void deletePermission(Collection ids) { - // 校验存在 - validateCrmPermissionExists(ids); - - // 删除 - crmPermissionMapper.deleteBatchIds(ids); - } - @Override @Transactional(rollbackFor = Exception.class) public void deletePermission(Integer bizType, Long bizId, Integer level) { @@ -135,8 +136,39 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { } @Override - public CrmPermissionDO getPermission(Long id, Long userId) { - return crmPermissionMapper.selectByIdAndUserId(id, userId); + public void deletePermissionBatch(Collection ids, Long userId) { + List permissions = crmPermissionMapper.selectBatchIds(ids); + if (CollUtil.isEmpty(permissions)) { + throw exception(CRM_PERMISSION_NOT_EXISTS); + } + Set bizIds = convertSet(permissions, CrmPermissionDO::getBizId); + if (bizIds.size() > 1) { // 情况一:数据权限的模块数据编号是一致的不可能存在两个 + throw exception(CRM_PERMISSION_DELETE_FAIL); + } + // 校验操作人是否为负责人 + CrmPermissionDO permission = crmPermissionMapper.selectByIdAndUserId(permissions.get(0).getBizId(), userId); + if (!CrmPermissionLevelEnum.isOwner(permission.getLevel())) { + throw exception(CRM_PERMISSION_DELETE_DENIED); + } + + // 删除数据权限 + crmPermissionMapper.deleteBatchIds(ids); + } + + @Override + public void deleteSelfPermission(Long id, Long userId) { + // 校验数据存在且是自己 + CrmPermissionDO permission = crmPermissionMapper.selectByIdAndUserId(id, userId); + if (permission == null) { + throw exception(CRM_PERMISSION_NOT_EXISTS); + } + // 校验是否是负责人 + if (CrmPermissionLevelEnum.isOwner(permission.getLevel())) { + throw exception(CRM_PERMISSION_DELETE_SELF_PERMISSION_FAIL_EXIST_OWNER); + } + + // 删除 + crmPermissionMapper.deleteById(id); } @Override @@ -144,14 +176,6 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { return crmPermissionMapper.selectByBizTypeAndBizId(bizType, bizId); } - @Override - public List getPermissionList(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return Collections.emptyList(); - } - return crmPermissionMapper.selectBatchIds(ids); - } - @Override public List getPermissionListByBizTypeAndUserId(Integer bizType, Long userId) { return crmPermissionMapper.selectListByBizTypeAndUserId(bizType, userId); diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmPermissionUtils.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmPermissionUtils.java deleted file mode 100644 index 7c15b5f1f..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmPermissionUtils.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.iocoder.yudao.module.crm.util; - -import cn.hutool.core.util.StrUtil; -import com.github.yulichang.wrapper.MPJLambdaWrapper; - -// TODO @puhui999:这个类还要哇? -/** - * 数据权限工具类 - * - * @author HUIHUI - */ -public class CrmPermissionUtils { - - /** - * 构建用户可查看数据连表条件 - * - * @param mpjLambdaWrapper 多表查询 wrapper - * @param bizTyp 模块类型 - * @param userId 用户 - */ - public static void builderRightJoinQuery(MPJLambdaWrapper mpjLambdaWrapper, Integer bizTyp, Long userId) { - String querySql = "(SELECT t1.biz_id FROM crm_permission t1 WHERE (t1.biz_type = {} AND t1.user_id = {})) t2 on t.id = t2.biz_id"; - // 默认主表别名是 t - mpjLambdaWrapper.rightJoin(StrUtil.format(querySql, bizTyp, userId)); - } - -} From 8f06d022930f013e253f4ac2df7fe4232b351b0c Mon Sep 17 00:00:00 2001 From: puhui999 Date: Mon, 27 Nov 2023 12:00:53 +0800 Subject: [PATCH 20/35] =?UTF-8?q?crm-=E5=AE=A2=E6=88=B7=EF=BC=9A=E5=AE=8C?= =?UTF-8?q?=E5=96=84=20code=20review=20=E6=8F=90=E5=88=B0=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/crm/enums/ErrorCodeConstants.java | 12 +- .../admin/contact/ContactController.java | 15 +- .../admin/customer/CrmCustomerController.java | 25 +-- .../customer/vo/CrmCustomerExportReqVO.java | 17 -- .../dal/mysql/customer/CrmCustomerMapper.java | 128 ++++++------- .../service/customer/CrmCustomerService.java | 37 +--- .../customer/CrmCustomerServiceImpl.java | 159 +++++++--------- .../BusinessStatusTypeServiceImplTest.java | 117 ------------ .../CrmBusinessStatusServiceImplTest.java | 168 ----------------- .../CrmBusinessStatusTypeServiceImplTest.java | 171 ------------------ .../customer/CrmCustomerServiceImplTest.java | 16 +- 11 files changed, 157 insertions(+), 708 deletions(-) delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerExportReqVO.java diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java index 0669a3c03..50ab195bc 100644 --- a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java @@ -32,12 +32,12 @@ public interface ErrorCodeConstants { // ========== 客户管理 1_020_006_000 ========== ErrorCode CUSTOMER_NOT_EXISTS = new ErrorCode(1_020_006_000, "客户不存在"); - ErrorCode CUSTOMER_OWNER_EXISTS = new ErrorCode(1_020_006_001, "客户已存在所属负责人"); - ErrorCode CUSTOMER_LOCKED = new ErrorCode(1_020_006_002, "客户状态已锁定"); + ErrorCode CUSTOMER_OWNER_EXISTS = new ErrorCode(1_020_006_001, "客户【{}】已存在所属负责人"); + ErrorCode CUSTOMER_LOCKED = new ErrorCode(1_020_006_002, "客户【{}】状态已锁定"); ErrorCode CUSTOMER_ALREADY_DEAL = new ErrorCode(1_020_006_003, "客户已交易"); - ErrorCode CUSTOMER_NOT_IN_POOL = new ErrorCode(1_020_006_004, "客户领取失败,原因:不是公海客户"); - ErrorCode CUSTOMER_IN_POOL = new ErrorCode(1_020_006_005, "客户放入公海失败,原因:已经是公海客户"); - ErrorCode CUSTOMER_LOCKED_PUT_POOL_FAIL = new ErrorCode(1_020_006_006, "客户放入公海失败,原因:客户已锁定"); + ErrorCode CUSTOMER_IN_POOL = new ErrorCode(1_020_006_004, "客户【{}】放入公海失败,原因:已经是公海客户"); + ErrorCode CUSTOMER_LOCKED_PUT_POOL_FAIL = new ErrorCode(1_020_006_005, "客户【{}】放入公海失败,原因:客户已锁定"); + ErrorCode CUSTOMER_UPDATE_OWNER_USER_FAIL = new ErrorCode(1_020_006_006, "更新客户【{}】负责人失败, 原因:系统异常"); // TODO @wanwan:这 2 个单独配置段噢 ErrorCode CUSTOMER_POOL_CONFIG_ERROR = new ErrorCode(1_020_006_001, "客户公海规则设置不正确"); ErrorCode CUSTOMER_LIMIT_CONFIG_NOT_EXISTS = new ErrorCode(1_020_006_002, "客户限制配置不存在"); @@ -47,7 +47,7 @@ public interface ErrorCodeConstants { ErrorCode CRM_PERMISSION_DENIED = new ErrorCode(1_020_007_001, "{}操作失败,原因:没有权限"); ErrorCode CRM_PERMISSION_MODEL_NOT_EXISTS = new ErrorCode(1_020_007_002, "{}不存在"); ErrorCode CRM_PERMISSION_MODEL_TRANSFER_FAIL_OWNER_USER_EXISTS = new ErrorCode(1_020_007_003, "{}操作失败,原因:转移对象已经是该负责人"); - ErrorCode CRM_PERMISSION_DELETE_FAIL = new ErrorCode(1_020_007_004, "删除数据权限失败,原因:参数异常"); + ErrorCode CRM_PERMISSION_DELETE_FAIL = new ErrorCode(1_020_007_004, "删除数据权限失败,原因:批量删除权限的时候,只能属于同一个 bizId 下"); ErrorCode CRM_PERMISSION_DELETE_FAIL_EXIST_OWNER = new ErrorCode(1_020_007_005, "删除数据权限失败,原因:存在负责人"); ErrorCode CRM_PERMISSION_DELETE_DENIED = new ErrorCode(1_020_007_006, "删除数据权限失败,原因:没有权限"); ErrorCode CRM_PERMISSION_DELETE_SELF_PERMISSION_FAIL_EXIST_OWNER = new ErrorCode(1_020_007_007, "删除数据权限失败,原因:不能删除负责人"); diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java index bf376ffa3..933e46901 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java @@ -7,7 +7,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; 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.contact.vo.*; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerExportReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPageReqVO; import cn.iocoder.yudao.module.crm.convert.contact.ContactConvert; import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO; import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; @@ -33,6 +33,7 @@ import java.util.Optional; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.pojo.PageParam.PAGE_SIZE_NONE; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @@ -83,7 +84,7 @@ public class ContactController { public CommonResult getContact(@RequestParam("id") Long id) { ContactDO contact = contactService.getContact(id); // TODO @zyna:需要考虑 null 的情况; - ContactRespVO contactRespVO = ContactConvert.INSTANCE.convert(contact); + ContactRespVO contactRespVO = ContactConvert.INSTANCE.convert(contact); // TODO @zyna:可以把数据读完后,convert 统一交给 ContactConvert,让 controller 更简洁;而 convert 专门去做一些转换逻辑 Map userMap = adminUserApi.getUserMap(CollUtil.removeNull(Lists.newArrayList( NumberUtil.parseLong(contact.getCreator())))); @@ -107,12 +108,14 @@ public class ContactController { @PreAuthorize("@ss.hasPermission('crm:contact:query')") public CommonResult> getContactPage(@Valid ContactPageReqVO pageVO) { PageResult pageData = contactService.getContactPage(pageVO); - PageResult pageResult =ContactConvert.INSTANCE.convertPage(pageData); + PageResult pageResult = ContactConvert.INSTANCE.convertPage(pageData); // TODO @zyna:需要考虑 null 的情况; // TODO @zyna:可以把数据读完后,convert 统一交给 ContactConvert,让 controller 更简洁;而 convert 专门去做一些转换逻辑 //待接口实现后修改 - List crmCustomerDOList = crmCustomerService.getCustomerList(new CrmCustomerExportReqVO()); - Map crmCustomerDOMap = crmCustomerDOList.stream().collect(Collectors.toMap(CrmCustomerDO::getId,v->v)); + CrmCustomerPageReqVO reqVO = new CrmCustomerPageReqVO(); + reqVO.setPageSize(PAGE_SIZE_NONE); + List crmCustomerDOList = crmCustomerService.getCustomerPage(reqVO, getLoginUserId()).getList(); + Map crmCustomerDOMap = crmCustomerDOList.stream().collect(Collectors.toMap(CrmCustomerDO::getId, v -> v)); pageResult.getList().forEach(item -> { item.setCustomerName(Optional.ofNullable(crmCustomerDOMap.get(item.getCustomerId())).map(CrmCustomerDO::getName).orElse(null)); }); @@ -125,7 +128,7 @@ public class ContactController { @PreAuthorize("@ss.hasPermission('crm:contact:export')") @OperateLog(type = EXPORT) public void exportContactExcel(@Valid ContactExportReqVO exportReqVO, - HttpServletResponse response) throws IOException { + HttpServletResponse response) throws IOException { List list = contactService.getContactList(exportReqVO); // 导出 Excel List datas = ContactConvert.INSTANCE.convertList02(list); 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 e55b8fdd8..d86e24f7c 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 @@ -91,16 +91,6 @@ public class CrmCustomerController { return success(CrmCustomerConvert.INSTANCE.convert(customer, userMap, deptMap)); } - // TODO @puhui999:合并到 receiveCustomer - @PutMapping("/receive-") - @Operation(summary = "领取客户公海数据") - @Parameter(name = "id", description = "客户编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('crm:customer:update')") - public CommonResult receive(@RequestParam("id") Long id) { - customerService.receive(id, getLoginUserId()); - return success(true); - } - @GetMapping("/page") @Operation(summary = "获得客户分页") @PreAuthorize("@ss.hasPermission('crm:customer:query')") @@ -122,9 +112,9 @@ public class CrmCustomerController { @Operation(summary = "导出客户 Excel") @PreAuthorize("@ss.hasPermission('crm:customer:export')") @OperateLog(type = EXPORT) - public void exportCustomerExcel(@Valid CrmCustomerExportReqVO exportReqVO, + public void exportCustomerExcel(@Valid CrmCustomerPageReqVO pageVO, HttpServletResponse response) throws IOException { - List list = customerService.getCustomerList(exportReqVO); + List list = customerService.getCustomerPage(pageVO, getLoginUserId()).getList(); // 导出 Excel List datas = CrmCustomerConvert.INSTANCE.convertList02(list); ExcelUtils.write(response, "客户.xls", "数据", CrmCustomerExcelVO.class, datas); @@ -160,9 +150,9 @@ public class CrmCustomerController { @PutMapping("/receive") @Operation(summary = "领取公海客户") - @Parameter(name = "ids", description = "编号数组", required = true,example = "1,2,3") + @Parameter(name = "ids", description = "编号数组", required = true, example = "1,2,3") @PreAuthorize("@ss.hasPermission('crm:customer:receive')") - public CommonResult receiveCustomer(@RequestParam(value = "ids") List ids){ + public CommonResult receiveCustomer(@RequestParam(value = "ids") List ids) { customerService.receiveCustomer(ids, getLoginUserId()); return success(true); } @@ -175,8 +165,11 @@ public class CrmCustomerController { }) @PreAuthorize("@ss.hasPermission('crm:customer:distribute')") public CommonResult distributeCustomer(@RequestParam(value = "ids") List ids, - @RequestParam(value = "ownerUserId") Long ownerUserId){ - customerService.distributeCustomer(ids, ownerUserId); + @RequestParam(value = "ownerUserId") Long ownerUserId) { + // 校验负责人是否存在 + adminUserApi.validateUserList(java.util.Collections.singletonList(ownerUserId)); + // 领取公海数据 + customerService.receiveCustomer(ids, ownerUserId); return success(true); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerExportReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerExportReqVO.java deleted file mode 100644 index 3a37c2834..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerExportReqVO.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.iocoder.yudao.module.crm.controller.admin.customer.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -// TODO 芋艿:导出最后做,等基本确认的差不多之后; -@Schema(description = "管理后台 - CRM 客户 Excel 导出 Request VO,参数和 CrmCustomerPageReqVO 是一致的") -@Data -public class CrmCustomerExportReqVO { - - @Schema(description = "客户名称", example = "赵六") - private String name; - - @Schema(description = "手机", example = "18000000000") - private String mobile; - -} 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 de545ac51..f996b8601 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 @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.crm.dal.mysql.customer; +import cn.iocoder.yudao.framework.common.pojo.PageParam; 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; @@ -14,6 +15,8 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import org.apache.ibatis.annotations.Mapper; +import java.util.List; + /** * 客户 Mapper * @@ -22,74 +25,7 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface CrmCustomerMapper extends BaseMapperX { - default PageResult selectPage(CrmCustomerPageReqVO pageReqVO) { - LambdaQueryWrapperX queryWrapperX = new LambdaQueryWrapperX<>(); - if (pageReqVO.getPool()) { // 情况一:公海 - queryWrapperX.isNull(CrmCustomerDO::getOwnerUserId); - } else {// 情况一:不是公海 - queryWrapperX.isNotNull(CrmCustomerDO::getOwnerUserId); - } - return selectPage(pageReqVO, queryWrapperX - .likeIfPresent(CrmCustomerDO::getName, pageReqVO.getName()) - .eqIfPresent(CrmCustomerDO::getMobile, pageReqVO.getMobile()) - .eqIfPresent(CrmCustomerDO::getIndustryId, pageReqVO.getIndustryId()) - .eqIfPresent(CrmCustomerDO::getLevel, pageReqVO.getLevel()) - .eqIfPresent(CrmCustomerDO::getSource, pageReqVO.getSource())); - } - - // TODO @puhui999:这个方法还要哇? - default PageResult selectPage1(CrmCustomerPageReqVO pageReqVO, Long userId) { - LambdaQueryWrapperX queryWrapperX = new LambdaQueryWrapperX<>(); - //queryWrapperX.sql - if (pageReqVO.getPool()) { // 情况一:公海 - queryWrapperX.isNull(CrmCustomerDO::getOwnerUserId); - } else {// 情况一:不是公海 - queryWrapperX.isNotNull(CrmCustomerDO::getOwnerUserId); - } - return selectPage(pageReqVO, queryWrapperX - .likeIfPresent(CrmCustomerDO::getName, pageReqVO.getName()) - .eqIfPresent(CrmCustomerDO::getMobile, pageReqVO.getMobile()) - .eqIfPresent(CrmCustomerDO::getIndustryId, pageReqVO.getIndustryId()) - .eqIfPresent(CrmCustomerDO::getLevel, pageReqVO.getLevel()) - .eqIfPresent(CrmCustomerDO::getSource, pageReqVO.getSource())); - } - - default PageResult selectPage(CrmCustomerPageReqVO pageReqVO, Long userId) { - IPage mpPage = MyBatisUtils.buildPage(pageReqVO); - MPJLambdaWrapperX mpjLambdaWrapperX = new MPJLambdaWrapperX<>(); - // 构建数据权限连表条件 - //CrmPermissionUtils.builderRightJoinQuery(mpjLambdaWrapperX, CrmBizTypeEnum.CRM_CUSTOMER.getType(), userId); - mpjLambdaWrapperX - //.rightJoin("(SELECT t1.biz_id FROM crm_permission t1 WHERE (t1.biz_type = 1 AND t1.user_id = 1)) t2 on t.id = t2.biz_id"); - .rightJoin(CrmPermissionDO.class, CrmPermissionDO::getBizId, CrmCustomerDO::getId) // TODO @puhui999:应该是 inner join? - .eq(CrmPermissionDO::getBizType, CrmBizTypeEnum.CRM_CUSTOMER.getType()) - .eq(CrmPermissionDO::getUserId, userId); - /** TODO @芋艿: - -- 常规连表-查询正常 - | ==> Preparing: - SELECT t.id, t.name, t.follow_up_status, t.lock_status, t.deal_status, - t.industry_id, t.level, t.source, t.mobile, t.telephone, t.website, - t.qq, t.wechat, t.email, t.description, t.remark, t.owner_user_id, - t.area_id, t.detail_address, t.contact_last_time, t.contact_next_time, - t.create_time, t.update_time, t.creator, t.updater, t.deleted - FROM crm_customer t RIGHT JOIN crm_permission t1 ON (t1.biz_id = t.id) AND t.tenant_id = 1 - WHERE t.deleted = 0 AND t1.deleted = 0 - AND (t1.biz_type = ? AND t1.user_id = ? - AND t.owner_user_id IS NOT NULL AND t.level = ?) AND t1.tenant_id = 1 LIMIT ? - | ==> Parameters: 2(Integer), 1(Long), 3(Integer), 10(Long) - - -- 连接子查询-报错,但是复制到 navicat 是可以正常执行的 - -- 区别点:常规连表会自动拼接租户 AND t.tenant_id = 1 - SELECT - t.id,t.name,t.follow_up_status,t.lock_status,t.deal_status,t.industry_id,t.level, - t.source,t.mobile,t.telephone,t.website,t.qq,t.wechat,t.email,t.description,t.remark, - t.owner_user_id,t.area_id,t.detail_address,t.contact_last_time,t.contact_next_time, - t.create_time,t.update_time,t.creator,t.updater,t.deleted - FROM crm_customer t - RIGHT JOIN (SELECT t1.biz_id FROM crm_permission t1 WHERE (t1.biz_type = 2 AND t1.user_id = 1)) t2 on t.id = t2.biz_id - WHERE t.deleted=0 - AND (t.owner_user_id IS NOT NULL) - */ + static void appendQueryParams(MPJLambdaWrapperX mpjLambdaWrapperX, CrmCustomerPageReqVO pageReqVO, Long userId) { if (pageReqVO.getPool()) { // 情况一:公海 mpjLambdaWrapperX.isNull(CrmCustomerDO::getOwnerUserId); } else { // 情况二:不是公海 @@ -99,20 +35,60 @@ public interface CrmCustomerMapper extends BaseMapperX { if (CrmSceneEnum.isOwner(pageReqVO.getSceneType())) { // 场景一:我负责的数据 mpjLambdaWrapperX.eq(CrmCustomerDO::getOwnerUserId, userId); } - mpPage = selectJoinPage(mpPage, CrmCustomerDO.class, mpjLambdaWrapperX + } + + static void appendQueryParams(LambdaQueryWrapperX lambdaQueryWrapperX, CrmCustomerPageReqVO pageReqVO, Long userId) { + if (pageReqVO.getPool()) { // 情况一:公海 + lambdaQueryWrapperX.isNull(CrmCustomerDO::getOwnerUserId); + } else { // 情况二:不是公海 + lambdaQueryWrapperX.isNotNull(CrmCustomerDO::getOwnerUserId); + } + // TODO 场景数据过滤 + if (CrmSceneEnum.isOwner(pageReqVO.getSceneType())) { // 场景一:我负责的数据 + lambdaQueryWrapperX.eq(CrmCustomerDO::getOwnerUserId, userId); + } + } + + default int updateOwnerUserIdById(Long id, Long ownerUserId) { + return update(new LambdaUpdateWrapper() + .eq(CrmCustomerDO::getId, id) + .set(CrmCustomerDO::getOwnerUserId, ownerUserId)); + } + + default PageResult selectPage(CrmCustomerPageReqVO pageReqVO, Long userId, Boolean admin) { + if (admin) { // 情况一:管理员查看 + LambdaQueryWrapperX queryWrapperX = new LambdaQueryWrapperX<>(); + appendQueryParams(queryWrapperX, pageReqVO, userId); + return selectPage(pageReqVO, queryWrapperX + .likeIfPresent(CrmCustomerDO::getName, pageReqVO.getName()) + .eqIfPresent(CrmCustomerDO::getMobile, pageReqVO.getMobile()) + .eqIfPresent(CrmCustomerDO::getIndustryId, pageReqVO.getIndustryId()) + .eqIfPresent(CrmCustomerDO::getLevel, pageReqVO.getLevel()) + .eqIfPresent(CrmCustomerDO::getSource, pageReqVO.getSource())); + } + // 情况二:获取当前用户能看的分页数据 + IPage mpPage = MyBatisUtils.buildPage(pageReqVO); + MPJLambdaWrapperX mpjLambdaWrapperX = new MPJLambdaWrapperX<>(); + // 构建数据权限连表条件 + mpjLambdaWrapperX + .innerJoin(CrmPermissionDO.class, CrmPermissionDO::getBizId, CrmCustomerDO::getId) + .eq(CrmPermissionDO::getBizType, CrmBizTypeEnum.CRM_CUSTOMER.getType()) + .eq(CrmPermissionDO::getUserId, userId); + appendQueryParams(mpjLambdaWrapperX, pageReqVO, userId); + mpjLambdaWrapperX .selectAll(CrmCustomerDO.class) .likeIfPresent(CrmCustomerDO::getName, pageReqVO.getName()) .eqIfPresent(CrmCustomerDO::getMobile, pageReqVO.getMobile()) .eqIfPresent(CrmCustomerDO::getIndustryId, pageReqVO.getIndustryId()) .eqIfPresent(CrmCustomerDO::getLevel, pageReqVO.getLevel()) - .eqIfPresent(CrmCustomerDO::getSource, pageReqVO.getSource())); + .eqIfPresent(CrmCustomerDO::getSource, pageReqVO.getSource()); + // 特殊:不分页,直接查询全部 + if (PageParam.PAGE_SIZE_NONE.equals(pageReqVO.getPageNo())) { + List list = selectJoinList(CrmCustomerDO.class, mpjLambdaWrapperX); + return new PageResult<>(list, (long) list.size()); + } + mpPage = selectJoinPage(mpPage, CrmCustomerDO.class, mpjLambdaWrapperX); return new PageResult<>(mpPage.getRecords(), mpPage.getTotal()); } - default void updateCustomerByOwnerUserIdIsNull(Long id, CrmCustomerDO updateObj) { - update(updateObj, new LambdaUpdateWrapper() - .eq(CrmCustomerDO::getId, id) - .isNull(CrmCustomerDO::getOwnerUserId)); - } - } 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 ae429c745..8f745ba78 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 @@ -1,7 +1,10 @@ package cn.iocoder.yudao.module.crm.service.customer; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.*; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerCreateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerTransferReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerUpdateReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; import javax.validation.Valid; @@ -50,8 +53,8 @@ public interface CrmCustomerService { * 获得客户列表 * * @param ids 客户编号数组 - * @author ljlleo * @return 客户列表 + * @author ljlleo */ List getCustomerList(Collection ids); @@ -64,14 +67,6 @@ public interface CrmCustomerService { */ PageResult getCustomerPage(CrmCustomerPageReqVO pageReqVO, Long userId); - /** - * 获得客户列表, 用于 Excel 导出 - * - * @param exportReqVO 查询条件 - * @return 客户列表 - */ - List getCustomerList(CrmCustomerExportReqVO exportReqVO); - /** * 校验客户是否存在 * @@ -107,25 +102,9 @@ public interface CrmCustomerService { /** * 领取公海客户 * - * @param ids 要领取的客户编号数组 + * @param ids 要领取的客户编号数组 + * @param ownerUserId 负责人 */ - void receiveCustomer(Listids, Long ownerUserId); - - /** - * 分配公海客户 - * - * @param ids 要分配的客户编号数组 - * @param ownerUserId 分配的负责人编号 - * @author xiaqing - */ - void distributeCustomer(Listids, Long ownerUserId); - - /** - * 领取公海客户 - * - * @param id 编号 - * @param userId 用户编号 - */ - void receive(Long id, Long userId); + void receiveCustomer(List ids, Long ownerUserId); } 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 aa5ef9f5b..4f1e1c367 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 @@ -1,7 +1,10 @@ package cn.iocoder.yudao.module.crm.service.customer; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.*; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerCreateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerTransferReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerUpdateReqVO; 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.dal.mysql.customer.CrmCustomerMapper; @@ -15,8 +18,8 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.List; import java.util.Objects; @@ -95,18 +98,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { public PageResult getCustomerPage(CrmCustomerPageReqVO pageReqVO, Long userId) { // 1.1. TODO 如果是超级管理员 boolean admin = false; - if (admin) { - return customerMapper.selectPage(pageReqVO); - } - // 1.2. 获取当前用户能看的分页数据 - return customerMapper.selectPage(pageReqVO, userId); - } - - @Override - public List getCustomerList(CrmCustomerExportReqVO exportReqVO) { - //return customerMapper.selectList(exportReqVO); - // TODO puhui999: 等数据权限完善后再实现 - return Collections.emptyList(); + return customerMapper.selectPage(pageReqVO, userId, admin); } /** @@ -152,54 +144,81 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @Override @Transactional(rollbackFor = Exception.class) - public void receiveCustomer(List ids,Long ownerUserId) { - transferCustomerOwner(ids, ownerUserId); + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#id", level = CrmPermissionLevelEnum.OWNER) + public void putCustomerPool(Long id) { + // 1. 校验存在 + CrmCustomerDO customer = customerMapper.selectById(id); + if (customer == null) { + throw exception(CUSTOMER_NOT_EXISTS); + } + // 1.2. 校验是否为公海数据 + validateCustomerOwnerExists(customer, true); + // 1.3. 校验客户是否锁定 + validateCustomerIsLocked(customer, true); + + // 2. 设置负责人为 NULL + int updateOwnerUserIncr = customerMapper.updateOwnerUserIdById(customer.getId(), null); + if (updateOwnerUserIncr == 0) { + throw exception(CUSTOMER_UPDATE_OWNER_USER_FAIL); + } + // 3. 删除负责人数据权限 + crmPermissionService.deletePermission(CrmBizTypeEnum.CRM_CUSTOMER.getType(), customer.getId(), + CrmPermissionLevelEnum.OWNER.getLevel()); } @Override @Transactional(rollbackFor = Exception.class) - public void distributeCustomer(List ids, Long ownerUserId) { - transferCustomerOwner(ids, ownerUserId); - } - - /** - * 转移客户负责人 - * - * @param ids 客户编号数组 - * @param ownerUserId 负责人编号 - */ - private void transferCustomerOwner(List ids, Long ownerUserId) { - // 先一次性加载所有数据,校验客户是否可用 - List customers = customerMapper.selectBatchIds(ids); - for (CrmCustomerDO customer : customers) { + public void receiveCustomer(List ids, Long ownerUserId) { + // 1. 校验存在 + List customers = customerMapper.selectBatchIds(ids); + if (customers.size() != ids.size()) { + throw exception(CUSTOMER_NOT_EXISTS); + } + // 1.2. 校验状态 + customers.forEach(customer -> { // 校验是否已有负责人 - validateCustomerOwnerExists(customer); + validateCustomerOwnerExists(customer, false); // 校验是否锁定 - validateCustomerIsLocked(customer); + validateCustomerIsLocked(customer, false); // 校验成交状态 validateCustomerDeal(customer); - } + }); - // TODO @QingX:这里是不是改成一次性更新;不然,如果有 20 个客户,就要执行 20 次 SQL 了; - // 统一修改状态 - CrmCustomerDO updateDo = new CrmCustomerDO(); - updateDo.setOwnerUserId(ownerUserId); - // TODO @QingX:如果更新的数量不对,则应该抛出异常,回滚,并错误提示; - for (Long id : ids) { - customerMapper.updateCustomerByOwnerUserIdIsNull(id,updateDo); - } + // 2. 领取公海数据 + List updateCustomers = new ArrayList<>(); + List createPermissions = new ArrayList<>(); + customers.forEach(customer -> { + // 2.1. 设置负责人 + updateCustomers.add(new CrmCustomerDO().setId(customer.getId()).setOwnerUserId(ownerUserId)); + // 2.2. 创建负责人数据权限 + createPermissions.add(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType()) + .setBizId(customer.getId()).setUserId(ownerUserId).setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); + }); + + // 3.1 更新客户负责人 + customerMapper.updateBatch(updateCustomers); + // 3.2 创建负责人数据权限 + crmPermissionService.createPermissionBatch(createPermissions); } - // TODO @QingX:错误提示里面,可以把客户的名字带上哈;不然不知道是谁; - private void validateCustomerOwnerExists(CrmCustomerDO customer) { + private void validateCustomerOwnerExists(CrmCustomerDO customer, Boolean pool) { + if (customer == null) { // 防御一下 + throw exception(CUSTOMER_NOT_EXISTS); + } + // 校验是否为公海数据 + if (pool && customer.getOwnerUserId() == null) { + throw exception(CUSTOMER_IN_POOL, customer.getName()); + } + // 负责人已存在 if (customer.getOwnerUserId() != null) { - throw exception(CUSTOMER_OWNER_EXISTS); + throw exception(CUSTOMER_OWNER_EXISTS, customer.getName()); } + } - private void validateCustomerIsLocked(CrmCustomerDO customer) { + private void validateCustomerIsLocked(CrmCustomerDO customer, Boolean pool) { if (customer.getLockStatus()) { - throw exception(CUSTOMER_LOCKED); + throw exception(pool ? CUSTOMER_LOCKED_PUT_POOL_FAIL : CUSTOMER_LOCKED, customer.getName()); } } @@ -209,52 +228,4 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { } } - // TODO @puhui999:合并到 receiveCustomer 里 - @Override - @Transactional(rollbackFor = Exception.class) - public void receive(Long id, Long userId) { - // 1. 校验存在 - CrmCustomerDO customer = customerMapper.selectById(id); - if (customer == null) { - throw exception(CUSTOMER_NOT_EXISTS); - } - // 1.2. 校验是否为公海数据 - if (customer.getOwnerUserId() != null) { - throw exception(CUSTOMER_NOT_IN_POOL); - } - - // 2. 领取公海数据-设置负责人 - customerMapper.updateById(new CrmCustomerDO().setId(customer.getId()).setOwnerUserId(userId)); - // 3. 创建负责人数据权限 - crmPermissionService.createPermission(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType()) - .setBizId(customer.getId()).setUserId(userId).setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); // 设置当前操作的人为负责人 - } - - @Override - @Transactional(rollbackFor = Exception.class) - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#id", level = CrmPermissionLevelEnum.OWNER) - public void putCustomerPool(Long id) { - // 1. 校验存在 - CrmCustomerDO customer = customerMapper.selectById(id); - if (customer == null) { - throw exception(CUSTOMER_NOT_EXISTS); - } - // TODO puhui999:校验合并到 validateCustomerOwnerExists、validateCustomerIsLocked - // 1.2. 校验是否为公海数据 - if (customer.getOwnerUserId() == null) { - throw exception(CUSTOMER_IN_POOL); - } - // 1.3. 校验客户是否锁定 - if (customer.getLockStatus()) { - throw exception(CUSTOMER_LOCKED_PUT_POOL_FAIL); - } - - // 2. 设置负责人为 NULL - // TODO @puhui999:updateById 这么操作,是无法设置 null 的; - customerMapper.updateById(new CrmCustomerDO().setId(customer.getId()).setOwnerUserId(null)); - // 3. 删除负责人数据权限 - crmPermissionService.deletePermission(CrmBizTypeEnum.CRM_CUSTOMER.getType(), customer.getId(), - CrmPermissionLevelEnum.OWNER.getLevel()); - } - } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/business/BusinessStatusTypeServiceImplTest.java b/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/business/BusinessStatusTypeServiceImplTest.java index b28ccf6f7..e69de29bb 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/business/BusinessStatusTypeServiceImplTest.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/business/BusinessStatusTypeServiceImplTest.java @@ -1,117 +0,0 @@ -package cn.iocoder.yudao.module.crm.service.business; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.BusinessStatusTypePageReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.BusinessStatusTypeSaveReqVO; -import cn.iocoder.yudao.module.crm.dal.dataobject.business.BusinessStatusTypeDO; -import cn.iocoder.yudao.module.crm.dal.mysql.business.BusinessStatusTypeMapper; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; - -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; -import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.BUSINESS_STATUS_TYPE_NOT_EXISTS; -import static org.junit.jupiter.api.Assertions.*; - -/** - * {@link BusinessStatusTypeServiceImpl} 的单元测试类 - * - * @author ljlleo - */ -@Import(BusinessStatusTypeServiceImpl.class) -public class BusinessStatusTypeServiceImplTest extends BaseDbUnitTest { - - @Resource - private BusinessStatusTypeServiceImpl businessStatusTypeService; - - @Resource - private BusinessStatusTypeMapper businessStatusTypeMapper; - - @Test - public void testCreateBusinessStatusType_success() { - // 准备参数 - BusinessStatusTypeSaveReqVO createReqVO = randomPojo(BusinessStatusTypeSaveReqVO.class).setId(null); - - // 调用 - Long businessStatusTypeId = businessStatusTypeService.createBusinessStatusType(createReqVO); - // 断言 - assertNotNull(businessStatusTypeId); - // 校验记录的属性是否正确 - BusinessStatusTypeDO businessStatusType = businessStatusTypeMapper.selectById(businessStatusTypeId); - assertPojoEquals(createReqVO, businessStatusType, "id"); - } - - @Test - public void testUpdateBusinessStatusType_success() { - // mock 数据 - BusinessStatusTypeDO dbBusinessStatusType = randomPojo(BusinessStatusTypeDO.class); - businessStatusTypeMapper.insert(dbBusinessStatusType);// @Sql: 先插入出一条存在的数据 - // 准备参数 - BusinessStatusTypeSaveReqVO updateReqVO = randomPojo(BusinessStatusTypeSaveReqVO.class, o -> { - o.setId(dbBusinessStatusType.getId()); // 设置更新的 ID - }); - - // 调用 - businessStatusTypeService.updateBusinessStatusType(updateReqVO); - // 校验是否更新正确 - BusinessStatusTypeDO businessStatusType = businessStatusTypeMapper.selectById(updateReqVO.getId()); // 获取最新的 - assertPojoEquals(updateReqVO, businessStatusType); - } - - @Test - public void testUpdateBusinessStatusType_notExists() { - // 准备参数 - BusinessStatusTypeSaveReqVO updateReqVO = randomPojo(BusinessStatusTypeSaveReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> businessStatusTypeService.updateBusinessStatusType(updateReqVO), BUSINESS_STATUS_TYPE_NOT_EXISTS); - } - - @Test - public void testDeleteBusinessStatusType_success() { - // mock 数据 - BusinessStatusTypeDO dbBusinessStatusType = randomPojo(BusinessStatusTypeDO.class); - businessStatusTypeMapper.insert(dbBusinessStatusType);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbBusinessStatusType.getId(); - - // 调用 - businessStatusTypeService.deleteBusinessStatusType(id); - // 校验数据不存在了 - assertNull(businessStatusTypeMapper.selectById(id)); - } - - @Test - public void testDeleteBusinessStatusType_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> businessStatusTypeService.deleteBusinessStatusType(id), BUSINESS_STATUS_TYPE_NOT_EXISTS); - } - - @Test - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 - public void testGetBusinessStatusTypePage() { - // mock 数据 - BusinessStatusTypeDO dbBusinessStatusType = randomPojo(BusinessStatusTypeDO.class, o -> { // 等会查询到 - }); - businessStatusTypeMapper.insert(dbBusinessStatusType); - // 准备参数 - BusinessStatusTypePageReqVO reqVO = new BusinessStatusTypePageReqVO(); - - // 调用 - PageResult pageResult = businessStatusTypeService.getBusinessStatusTypePage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbBusinessStatusType, pageResult.getList().get(0)); - } - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/businessstatus/CrmBusinessStatusServiceImplTest.java b/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/businessstatus/CrmBusinessStatusServiceImplTest.java index 9a59f3bd2..e69de29bb 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/businessstatus/CrmBusinessStatusServiceImplTest.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/businessstatus/CrmBusinessStatusServiceImplTest.java @@ -1,168 +0,0 @@ -package cn.iocoder.yudao.module.crm.service.businessstatus; - -import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo.CrmBusinessStatusCreateReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo.CrmBusinessStatusExportReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo.CrmBusinessStatusUpdateReqVO; -import cn.iocoder.yudao.module.crm.dal.dataobject.businessstatus.CrmBusinessStatusDO; -import cn.iocoder.yudao.module.crm.dal.mysql.businessstatus.CrmBusinessStatusMapper; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; -import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.BUSINESS_STATUS_NOT_EXISTS; -import static org.junit.jupiter.api.Assertions.*; - -/** - * {@link CrmBusinessStatusServiceImpl} 的单元测试类 - * - * @author ljlleo - */ -@Import(CrmBusinessStatusServiceImpl.class) -public class CrmBusinessStatusServiceImplTest extends BaseDbUnitTest { - - @Resource - private CrmBusinessStatusServiceImpl businessStatusService; - - @Resource - private CrmBusinessStatusMapper businessStatusMapper; - - @Test - public void testCreateBusinessStatus_success() { - // 准备参数 - CrmBusinessStatusCreateReqVO reqVO = randomPojo(CrmBusinessStatusCreateReqVO.class); - - // 调用 - Long businessStatusId = businessStatusService.createBusinessStatus(reqVO); - // 断言 - assertNotNull(businessStatusId); - // 校验记录的属性是否正确 - CrmBusinessStatusDO businessStatus = businessStatusMapper.selectById(businessStatusId); - assertPojoEquals(reqVO, businessStatus); - } - - @Test - public void testUpdateBusinessStatus_success() { - // mock 数据 - CrmBusinessStatusDO dbBusinessStatus = randomPojo(CrmBusinessStatusDO.class); - businessStatusMapper.insert(dbBusinessStatus);// @Sql: 先插入出一条存在的数据 - // 准备参数 - CrmBusinessStatusUpdateReqVO reqVO = randomPojo(CrmBusinessStatusUpdateReqVO.class, o -> { - o.setId(dbBusinessStatus.getId()); // 设置更新的 ID - }); - - // 调用 - businessStatusService.updateBusinessStatus(reqVO); - // 校验是否更新正确 - CrmBusinessStatusDO businessStatus = businessStatusMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, businessStatus); - } - - @Test - public void testUpdateBusinessStatus_notExists() { - // 准备参数 - CrmBusinessStatusUpdateReqVO reqVO = randomPojo(CrmBusinessStatusUpdateReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> businessStatusService.updateBusinessStatus(reqVO), BUSINESS_STATUS_NOT_EXISTS); - } - - @Test - public void testDeleteBusinessStatus_success() { - // mock 数据 - CrmBusinessStatusDO dbBusinessStatus = randomPojo(CrmBusinessStatusDO.class); - businessStatusMapper.insert(dbBusinessStatus);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbBusinessStatus.getId(); - - // 调用 - businessStatusService.deleteBusinessStatus(id); - // 校验数据不存在了 - assertNull(businessStatusMapper.selectById(id)); - } - - @Test - public void testDeleteBusinessStatus_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> businessStatusService.deleteBusinessStatus(id), BUSINESS_STATUS_NOT_EXISTS); - } - - @Test - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 - public void testGetBusinessStatusPage() { - // mock 数据 - CrmBusinessStatusDO dbBusinessStatus = randomPojo(CrmBusinessStatusDO.class, o -> { // 等会查询到 - o.setTypeId(null); - o.setName(null); - o.setPercent(null); - o.setSort(null); - }); - businessStatusMapper.insert(dbBusinessStatus); - // 测试 typeId 不匹配 - businessStatusMapper.insert(cloneIgnoreId(dbBusinessStatus, o -> o.setTypeId(null))); - // 测试 name 不匹配 - businessStatusMapper.insert(cloneIgnoreId(dbBusinessStatus, o -> o.setName(null))); - // 测试 percent 不匹配 - businessStatusMapper.insert(cloneIgnoreId(dbBusinessStatus, o -> o.setPercent(null))); - // 测试 sort 不匹配 - businessStatusMapper.insert(cloneIgnoreId(dbBusinessStatus, o -> o.setSort(null))); - // 准备参数 - //CrmBusinessStatusPageReqVO reqVO = new CrmBusinessStatusPageReqVO(); - //reqVO.setTypeId(null); - //reqVO.setName(null); - //reqVO.setPercent(null); - //reqVO.setSort(null); - // - //// 调用 - //PageResult pageResult = businessStatusService.getBusinessStatusPage(reqVO); - //// 断言 - //assertEquals(1, pageResult.getTotal()); - //assertEquals(1, pageResult.getList().size()); - //assertPojoEquals(dbBusinessStatus, pageResult.getList().get(0)); - } - - @Test - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 - public void testGetBusinessStatusList() { - // mock 数据 - CrmBusinessStatusDO dbBusinessStatus = randomPojo(CrmBusinessStatusDO.class, o -> { // 等会查询到 - o.setTypeId(null); - o.setName(null); - o.setPercent(null); - o.setSort(null); - }); - businessStatusMapper.insert(dbBusinessStatus); - // 测试 typeId 不匹配 - businessStatusMapper.insert(cloneIgnoreId(dbBusinessStatus, o -> o.setTypeId(null))); - // 测试 name 不匹配 - businessStatusMapper.insert(cloneIgnoreId(dbBusinessStatus, o -> o.setName(null))); - // 测试 percent 不匹配 - businessStatusMapper.insert(cloneIgnoreId(dbBusinessStatus, o -> o.setPercent(null))); - // 测试 sort 不匹配 - businessStatusMapper.insert(cloneIgnoreId(dbBusinessStatus, o -> o.setSort(null))); - // 准备参数 - CrmBusinessStatusExportReqVO reqVO = new CrmBusinessStatusExportReqVO(); - reqVO.setTypeId(null); - reqVO.setName(null); - reqVO.setPercent(null); - reqVO.setSort(null); - - // 调用 - List list = businessStatusService.getBusinessStatusList(reqVO); - // 断言 - assertEquals(1, list.size()); - assertPojoEquals(dbBusinessStatus, list.get(0)); - } - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/businessstatustype/CrmBusinessStatusTypeServiceImplTest.java b/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/businessstatustype/CrmBusinessStatusTypeServiceImplTest.java index bf778b989..e69de29bb 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/businessstatustype/CrmBusinessStatusTypeServiceImplTest.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/businessstatustype/CrmBusinessStatusTypeServiceImplTest.java @@ -1,171 +0,0 @@ -package cn.iocoder.yudao.module.crm.service.businessstatustype; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo.CrmBusinessStatusTypeCreateReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo.CrmBusinessStatusTypeExportReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo.CrmBusinessStatusTypePageReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo.CrmBusinessStatusTypeUpdateReqVO; -import cn.iocoder.yudao.module.crm.dal.dataobject.businessstatustype.CrmBusinessStatusTypeDO; -import cn.iocoder.yudao.module.crm.dal.mysql.businessstatustype.CrmBusinessStatusTypeMapper; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import javax.annotation.Resource; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime; -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; -import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.BUSINESS_STATUS_TYPE_NOT_EXISTS; -import static org.junit.jupiter.api.Assertions.*; - -/** - * {@link CrmBusinessStatusTypeServiceImpl} 的单元测试类 - * - * @author ljlleo - */ -@Import(CrmBusinessStatusTypeServiceImpl.class) -public class CrmBusinessStatusTypeServiceImplTest extends BaseDbUnitTest { - - @Resource - private CrmBusinessStatusTypeServiceImpl businessStatusTypeService; - - @Resource - private CrmBusinessStatusTypeMapper businessStatusTypeMapper; - - @Test - public void testCreateBusinessStatusType_success() { - // 准备参数 - CrmBusinessStatusTypeCreateReqVO reqVO = randomPojo(CrmBusinessStatusTypeCreateReqVO.class); - - // 调用 - Long businessStatusTypeId = businessStatusTypeService.createBusinessStatusType(reqVO); - // 断言 - assertNotNull(businessStatusTypeId); - // 校验记录的属性是否正确 - CrmBusinessStatusTypeDO businessStatusType = businessStatusTypeMapper.selectById(businessStatusTypeId); - assertPojoEquals(reqVO, businessStatusType); - } - - @Test - public void testUpdateBusinessStatusType_success() { - // mock 数据 - CrmBusinessStatusTypeDO dbBusinessStatusType = randomPojo(CrmBusinessStatusTypeDO.class); - businessStatusTypeMapper.insert(dbBusinessStatusType);// @Sql: 先插入出一条存在的数据 - // 准备参数 - CrmBusinessStatusTypeUpdateReqVO reqVO = randomPojo(CrmBusinessStatusTypeUpdateReqVO.class, o -> { - o.setId(dbBusinessStatusType.getId()); // 设置更新的 ID - }); - - // 调用 - businessStatusTypeService.updateBusinessStatusType(reqVO); - // 校验是否更新正确 - CrmBusinessStatusTypeDO businessStatusType = businessStatusTypeMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, businessStatusType); - } - - @Test - public void testUpdateBusinessStatusType_notExists() { - // 准备参数 - CrmBusinessStatusTypeUpdateReqVO reqVO = randomPojo(CrmBusinessStatusTypeUpdateReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> businessStatusTypeService.updateBusinessStatusType(reqVO), BUSINESS_STATUS_TYPE_NOT_EXISTS); - } - - @Test - public void testDeleteBusinessStatusType_success() { - // mock 数据 - CrmBusinessStatusTypeDO dbBusinessStatusType = randomPojo(CrmBusinessStatusTypeDO.class); - businessStatusTypeMapper.insert(dbBusinessStatusType);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbBusinessStatusType.getId(); - - // 调用 - businessStatusTypeService.deleteBusinessStatusType(id); - // 校验数据不存在了 - assertNull(businessStatusTypeMapper.selectById(id)); - } - - @Test - public void testDeleteBusinessStatusType_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> businessStatusTypeService.deleteBusinessStatusType(id), BUSINESS_STATUS_TYPE_NOT_EXISTS); - } - - @Test - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 - public void testGetBusinessStatusTypePage() { - // mock 数据 - CrmBusinessStatusTypeDO dbBusinessStatusType = randomPojo(CrmBusinessStatusTypeDO.class, o -> { // 等会查询到 - o.setName(null); - o.setDeptIds(null); - o.setStatus(null); - //o.setCreateTime(null); - }); - businessStatusTypeMapper.insert(dbBusinessStatusType); - // 测试 name 不匹配 - businessStatusTypeMapper.insert(cloneIgnoreId(dbBusinessStatusType, o -> o.setName(null))); - // 测试 deptIds 不匹配 - businessStatusTypeMapper.insert(cloneIgnoreId(dbBusinessStatusType, o -> o.setDeptIds(null))); - // 测试 status 不匹配 - businessStatusTypeMapper.insert(cloneIgnoreId(dbBusinessStatusType, o -> o.setStatus(null))); - // 测试 createTime 不匹配 - //businessStatusTypeMapper.insert(cloneIgnoreId(dbBusinessStatusType, o -> o.setCreateTime(null))); - // 准备参数 - CrmBusinessStatusTypePageReqVO reqVO = new CrmBusinessStatusTypePageReqVO(); - reqVO.setName(null); - //reqVO.setDeptIds(null); - reqVO.setStatus(null); - //reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); - - // 调用 - PageResult pageResult = businessStatusTypeService.getBusinessStatusTypePage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbBusinessStatusType, pageResult.getList().get(0)); - } - - @Test - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 - public void testGetBusinessStatusTypeList() { - // mock 数据 - CrmBusinessStatusTypeDO dbBusinessStatusType = randomPojo(CrmBusinessStatusTypeDO.class, o -> { // 等会查询到 - o.setName(null); - o.setDeptIds(null); - o.setStatus(null); - //o.setCreateTime(null); - }); - businessStatusTypeMapper.insert(dbBusinessStatusType); - // 测试 name 不匹配 - businessStatusTypeMapper.insert(cloneIgnoreId(dbBusinessStatusType, o -> o.setName(null))); - // 测试 deptIds 不匹配 - businessStatusTypeMapper.insert(cloneIgnoreId(dbBusinessStatusType, o -> o.setDeptIds(null))); - // 测试 status 不匹配 - businessStatusTypeMapper.insert(cloneIgnoreId(dbBusinessStatusType, o -> o.setStatus(null))); - // 测试 createTime 不匹配 - //businessStatusTypeMapper.insert(cloneIgnoreId(dbBusinessStatusType, o -> o.setCreateTime(null))); - // 准备参数 - CrmBusinessStatusTypeExportReqVO reqVO = new CrmBusinessStatusTypeExportReqVO(); - reqVO.setName(null); - reqVO.setDeptIds(null); - reqVO.setStatus(null); - reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); - - // 调用 - List list = businessStatusTypeService.getBusinessStatusTypeList(reqVO); - // 断言 - assertEquals(1, list.size()); - assertPojoEquals(dbBusinessStatusType, list.get(0)); - } - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImplTest.java b/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImplTest.java index db5511d3c..43dfb69d6 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImplTest.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImplTest.java @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.crm.service.customer; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerCreateReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerExportReqVO; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPageReqVO; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerUpdateReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; @@ -15,8 +14,8 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; import javax.annotation.Resource; -import java.util.List; +import static cn.iocoder.yudao.framework.common.pojo.PageParam.PAGE_SIZE_NONE; import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; @@ -160,17 +159,18 @@ public class CrmCustomerServiceImplTest extends BaseDbUnitTest { // 测试 website 不匹配 customerMapper.insert(cloneIgnoreId(dbCustomer, o -> o.setWebsite(null))); // 准备参数 - CrmCustomerExportReqVO reqVO = new CrmCustomerExportReqVO(); - reqVO.setName(null); - reqVO.setMobile(null); + CrmCustomerPageReqVO reqVO = new CrmCustomerPageReqVO(); + reqVO.setName("张三"); + reqVO.setMobile("13888888888"); + reqVO.setPageSize(PAGE_SIZE_NONE); //reqVO.setTelephone(null); //reqVO.setWebsite(null); // 调用 - List list = customerService.getCustomerList(reqVO); + PageResult pageResult = customerService.getCustomerPage(reqVO, 1L); // 断言 - assertEquals(1, list.size()); - assertPojoEquals(dbCustomer, list.get(0)); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbCustomer, pageResult.getList().get(0)); } } From 4a51b20155a4d6711b0238bd4bbf5be8903fef72 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Mon, 27 Nov 2023 12:14:32 +0800 Subject: [PATCH 21/35] =?UTF-8?q?crm-=E5=AE=A2=E6=88=B7=EF=BC=9A=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=90=88=E5=B9=B6=E5=B7=AE=E5=BC=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java index 1fa542a03..60f08a1eb 100644 --- a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java @@ -38,9 +38,6 @@ public interface ErrorCodeConstants { ErrorCode CUSTOMER_IN_POOL = new ErrorCode(1_020_006_004, "客户【{}】放入公海失败,原因:已经是公海客户"); ErrorCode CUSTOMER_LOCKED_PUT_POOL_FAIL = new ErrorCode(1_020_006_005, "客户【{}】放入公海失败,原因:客户已锁定"); ErrorCode CUSTOMER_UPDATE_OWNER_USER_FAIL = new ErrorCode(1_020_006_006, "更新客户【{}】负责人失败, 原因:系统异常"); - // TODO @wanwan:这 2 个单独配置段噢 - ErrorCode CUSTOMER_POOL_CONFIG_ERROR = new ErrorCode(1_020_006_001, "客户公海规则设置不正确"); - ErrorCode CUSTOMER_LIMIT_CONFIG_NOT_EXISTS = new ErrorCode(1_020_006_002, "客户限制配置不存在"); // ========== 权限管理 1_020_007_000 ========== ErrorCode CRM_PERMISSION_NOT_EXISTS = new ErrorCode(1_020_007_000, "数据权限不存在"); From d6d4e50c4b8e78edb231fe7f32cc1be27978bd61 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 27 Nov 2023 20:28:18 +0800 Subject: [PATCH 22/35] =?UTF-8?q?crm=EF=BC=9Acode=20review=20=E8=81=94?= =?UTF-8?q?=E7=B3=BB=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/mysql/crm.sql | 27 ---------- .../admin/contact/ContactController.java | 54 ++++++++++--------- .../admin/contact/vo/ContactBaseVO.java | 13 +++-- .../admin/contact/vo/ContactPageReqVO.java | 14 ++--- .../admin/customer/CrmCustomerController.java | 3 ++ .../vo/CrmCustomerQueryAllRespVO.java | 8 +-- .../crm/convert/contact/ContactConvert.java | 32 ++++++----- .../convert/customer/CrmCustomerConvert.java | 6 +-- .../crm/dal/dataobject/contact/ContactDO.java | 17 ++++-- .../service/contact/ContactServiceImpl.java | 6 +-- .../system/enums/DictTypeConstants.java | 2 - 11 files changed, 87 insertions(+), 95 deletions(-) diff --git a/sql/mysql/crm.sql b/sql/mysql/crm.sql index a33204a1e..135826585 100644 --- a/sql/mysql/crm.sql +++ b/sql/mysql/crm.sql @@ -1,30 +1,3 @@ SET NAMES utf8mb4; -- `ruoyi-vue-pro`.crm_contact definition -CREATE TABLE `crm_contact` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', - `name` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '联系人名称', - `next_time` datetime DEFAULT NULL COMMENT '下次联系时间', - `mobile` varchar(16) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '手机号', - `telephone` varchar(16) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '电话', - `email` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '电子邮箱', - `post` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '职务', - `customer_id` bigint(20) DEFAULT NULL COMMENT '客户编号', - `address` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '地址', - `remark` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注', - `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建人', - `owner_user_id` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '负责人用户编号', - `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间', - `update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间', - `last_time` timestamp NULL DEFAULT NULL COMMENT '最后跟进时间', - `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '更新人', - `deleted` bit(1) NOT NULL DEFAULT b'0', - `tenant_id` bigint(20) DEFAULT NULL, - `parent_id` bigint(20) DEFAULT NULL COMMENT '直系上属', - `qq` int(11) DEFAULT NULL, - `wechat` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `sex` int(11) DEFAULT NULL COMMENT '性别', - `master` bit(1) DEFAULT NULL COMMENT '是否关键决策人', - `area_id` bigint(20) DEFAULT NULL COMMENT '地区', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='CRM 联系人'; \ No newline at end of file diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java index 7b79faf21..32f72ddc9 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java @@ -7,7 +7,6 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; 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.contact.vo.*; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerExportReqVO; import cn.iocoder.yudao.module.crm.convert.contact.ContactConvert; import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO; import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; @@ -28,9 +27,10 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; -import javax.validation.constraints.NotNull; import java.io.IOException; -import java.util.*; +import java.util.Collections; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -86,24 +86,23 @@ public class ContactController { @PreAuthorize("@ss.hasPermission('crm:contact:query')") public CommonResult getContact(@RequestParam("id") Long id) { ContactDO contact = contactService.getContact(id); - if(contact == null){ + if (contact == null) { throw exception(ErrorCodeConstants.CONTACT_NOT_EXISTS); } - //1.获取用户名 + // 1. 获取用户名 Map userMap = adminUserApi.getUserMap(CollUtil.removeNull(Lists.newArrayList( - NumberUtil.parseLong(contact.getCreator()),contact.getOwnerUserId()))); - //2.获取客户信息 - List crmCustomerDOList = crmCustomerService.getCustomerList(Collections.singletonList(contact.getCustomerId())); - //3.直属上级 - List contactList = contactService.getContactList(Collections.singletonList(contact.getParentId())); - ContactRespVO contactRespVO = ContactConvert.INSTANCE.convert(contact,userMap,crmCustomerDOList,contactList); - return success(contactRespVO); + NumberUtil.parseLong(contact.getCreator()), contact.getOwnerUserId()))); + // 2. 获取客户信息 + List customerList = crmCustomerService.getCustomerList(Collections.singletonList(contact.getCustomerId())); + // 3. 直属上级 + List parentContactList = contactService.getContactList(Collections.singletonList(contact.getParentId())); + return success(ContactConvert.INSTANCE.convert(contact, userMap, customerList, parentContactList)); } + @GetMapping("/simple-all-list") @Operation(summary = "获得联系人列表") @PreAuthorize("@ss.hasPermission('crm:contact:query')") - public CommonResult> simpleAlllist() { - // TODO @zyna:方法名改成,getContactList;方法命名,要动名词,get 动词;all 可以去掉,因为没条件,自然是全部 + public CommonResult> getContactList() { List list = contactService.getContactList(); return success(ContactConvert.INSTANCE.convertAllList(list)); } @@ -112,11 +111,12 @@ public class ContactController { @Operation(summary = "获得联系人分页") @PreAuthorize("@ss.hasPermission('crm:contact:query')") public CommonResult> getContactPage(@Valid ContactPageReqVO pageVO) { - PageResult pageData = contactService.getContactPage(pageVO); - List contactRespVOList = convertFieldValue2Name(pageData.getList()); - PageResult pageDataReturn = ContactConvert.INSTANCE.convertPage(pageData); - pageDataReturn.setList(contactRespVOList); - return success(pageDataReturn); + PageResult pageResult = contactService.getContactPage(pageVO); + if (CollUtil.isEmpty(pageResult.getList())) { + return success(PageResult.empty(pageResult.getTotal())); + } + List contactVOList = convertFieldValue2Name(pageResult.getList()); + return success(new PageResult<>(contactVOList, pageResult.getTotal())); } // TODO @zyna:可以看下新的导出写法,这里调整下 @@ -127,27 +127,31 @@ public class ContactController { public void exportContactExcel(@Valid ContactPageReqVO exportReqVO, HttpServletResponse response) throws IOException { List list = contactService.getContactList(exportReqVO); + // TODO @zya:可以改成直接调用 getContactPage 方法;只要把 ContactPageReqVO 设置成不分页,PAGE_SIZE_NONE // 导出 Excel List contactRespVOList = convertFieldValue2Name(list); - ExcelUtils.write(response, "crm联系人.xls", "数据", ContactRespVO.class, contactRespVOList); + ExcelUtils.write(response, "crm 联系人.xls", "数据", ContactRespVO.class, contactRespVOList); } + // TODO 芋艿:后续会合并下, /** * 翻译字段名称 * @param contactDOList 联系人List * @return List */ private List convertFieldValue2Name(List contactDOList){ - //1.获取客户列表 + // 1. 获取客户列表 + // TODO @zyna:简单的转换,可以使用 CollectionUtils.convertSet List customerIdList = contactDOList.stream().map(ContactDO::getCustomerId).distinct().collect(Collectors.toList()); List crmCustomerDOList = crmCustomerService.getCustomerList(customerIdList); - //2.获取创建人、责任人列表 + // 2. 获取创建人、责任人列表 + // TODO @zyna:简单的转换,可以使用 CollectionUtils.convertSetByFlatMap List userIdsList = contactDOList.stream().flatMap(item-> Stream.of(Long.parseLong(item.getCreator()),item.getOwnerUserId()).distinct()).collect(Collectors.toList()); Map userMap = adminUserApi.getUserMap(userIdsList); - //3.直属上级 + // 3. 直属上级 List contactIdsList = contactDOList.stream().map(ContactDO::getParentId).distinct().collect(Collectors.toList()); List contactList = contactService.getContactList(contactIdsList); - List pageResult =ContactConvert.INSTANCE.converList(contactDOList,userMap,crmCustomerDOList,contactList); - return pageResult; + return ContactConvert.INSTANCE.converList(contactDOList,userMap,crmCustomerDOList,contactList); } + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java index 99e613c23..6f6a57891 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java @@ -4,11 +4,11 @@ import cn.iocoder.yudao.framework.common.validation.Mobile; import cn.iocoder.yudao.framework.common.validation.Telephone; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.module.infra.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -import org.apache.skywalking.apm.toolkit.trace.IgnoredException; import org.springframework.format.annotation.DateTimeFormat; import javax.validation.constraints.Email; @@ -35,25 +35,24 @@ public class ContactBaseVO { @ExcelIgnore private Long customerId; - @ExcelProperty(value = "性别",converter = DictConvert.class ,order = 3) + @ExcelProperty(value = "性别", converter = DictConvert.class, order = 3) @DictFormat(cn.iocoder.yudao.module.system.enums.DictTypeConstants.USER_SEX) @Schema(description = "性别") private Integer sex; @Schema(description = "职位") - @ExcelProperty(value = "职位",order = 3) + @ExcelProperty(value = "职位", order = 3) private String post; @Schema(description = "是否关键决策人") - @ExcelProperty(value = "是否关键决策人",converter = DictConvert.class,order = 3) - @DictFormat(cn.iocoder.yudao.module.system.enums.DictTypeConstants.INFRA_BOOLEAN_STRING) + @ExcelProperty(value = "是否关键决策人", converter = DictConvert.class, order = 3) + @DictFormat(DictTypeConstants.BOOLEAN_STRING) private Boolean master; @Schema(description = "直属上级", example = "23457") @ExcelIgnore private Long parentId; - @Schema(description = "手机号",example = "1387171766") @Mobile @ExcelProperty(value = "手机号",order = 4) @@ -98,7 +97,7 @@ public class ContactBaseVO { @Schema(description = "负责人用户编号", example = "14334") @NotNull(message = "负责人不能为空") - @ExcelIgnore + @ExcelIgnore // TODO @zyna:可以使用 ExcelIgnoreUnannotated private Long ownerUserId; @Schema(description = "地区编号", example = "20158") diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactPageReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactPageReqVO.java index f5ed1b275..db408405e 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactPageReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactPageReqVO.java @@ -11,13 +11,13 @@ import java.time.LocalDateTime; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@Schema(description = "管理后台 - crm联系人分页 Request VO") +@Schema(description = "管理后台 - CRM 联系人分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) public class ContactPageReqVO extends PageParam { - // TODO @zyna:筛选条件 + // TODO @zyna:筛选条件(多余的可以删除哈)还有部分 example 少了,可以补充下; // ●客户: // ●姓名: // ●手机、电话、座机、QQ、微信、邮箱 @@ -26,13 +26,13 @@ public class ContactPageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] nextTime; - @Schema(description = "手机号",example = "13898273941") + @Schema(description = "手机号", example = "13898273941") private String mobile; - @Schema(description = "电话",example = "021-383773") + @Schema(description = "电话", example = "021-383773") private String telephone; - @Schema(description = "电子邮箱",example = "111@22.com") + @Schema(description = "电子邮箱", example = "111@22.com") private String email; @Schema(description = "客户编号", example = "10795") @@ -61,10 +61,10 @@ public class ContactPageReqVO extends PageParam { @Schema(description = "职位") private String post; - @Schema(description = "QQ",example = "3882872") + @Schema(description = "QQ", example = "3882872") private Long qq; - @Schema(description = "微信",example = "zzZ98373") + @Schema(description = "微信", example = "zzZ98373") private String wechat; @Schema(description = "性别") 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 3f12055b8..31453778c 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 @@ -179,6 +179,8 @@ public class CrmCustomerController { customerService.distributeCustomer(ids, ownerUserId); return success(true); } + + // TODO 芋艿:这个接口要调整下 @GetMapping("/query-all-list") @Operation(summary = "查询客户列表") @PreAuthorize("@ss.hasPermission('crm:customer:all')") @@ -187,4 +189,5 @@ public class CrmCustomerController { List data = CrmCustomerConvert.INSTANCE.convertQueryAll(crmCustomerDOList); return success(data); } + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerQueryAllRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerQueryAllRespVO.java index 18c487997..a66b8d810 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerQueryAllRespVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerQueryAllRespVO.java @@ -3,13 +3,15 @@ package cn.iocoder.yudao.module.crm.controller.admin.customer.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; - +// TODO 芋艿:这块要统一下; @Schema(description = "管理后台 - CRM 全部客户 Response VO") @Data public class CrmCustomerQueryAllRespVO{ - @Schema(description = "客户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") - private String name; + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563") private Long id; + @Schema(description = "客户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") + private String name; + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java index 12a21dd64..c4452e076 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java @@ -46,7 +46,8 @@ public interface ContactConvert { CrmPermissionTransferReqBO convert(CrmContactTransferReqVO reqVO, Long userId); /** - * 详情信息 + * 转换详情信息 + * * @param contactDO 联系人 * @param userMap 用户列表 * @param crmCustomerDOList 客户 @@ -54,26 +55,28 @@ public interface ContactConvert { */ default ContactRespVO convert(ContactDO contactDO, Map userMap, List crmCustomerDOList, List contactList) { - ContactRespVO contactRespVO = convert(contactDO); - setUserInfo(contactRespVO,userMap); - Map crmCustomerDOMap = crmCustomerDOList.stream().collect(Collectors.toMap(CrmCustomerDO::getId,v->v)); - Map contactDOMap = contactList.stream().collect(Collectors.toMap(ContactDO::getId,v->v)); - findAndThen(crmCustomerDOMap,contactDO.getCustomerId(),customer -> {contactRespVO.setCustomerName(customer.getName());}); - findAndThen(contactDOMap,contactDO.getParentId(),contactDOInner -> {contactRespVO.setParentName(contactDOInner.getName());}); - return contactRespVO; - } - default List converList(List contactDOList, Map userMap, - List crmCustomerDOList , List contactList){ - List result = convertList(contactDOList); + ContactRespVO contactVO = convert(contactDO); + setUserInfo(contactVO, userMap); + Map ustomerMap = crmCustomerDOList.stream().collect(Collectors.toMap(CrmCustomerDO::getId,v->v)); Map contactMap = contactList.stream().collect(Collectors.toMap(ContactDO::getId,v->v)); - Map customerMap = crmCustomerDOList.stream().collect(Collectors.toMap(CrmCustomerDO::getId,v->v)); + findAndThen(ustomerMap, contactDO.getCustomerId(), customer -> contactVO.setCustomerName(customer.getName())); + findAndThen(contactMap, contactDO.getParentId(), contact -> contactVO.setParentName(contact.getName())); + return contactVO; + } + default List converList(List contactList, Map userMap, + List customerList, List parentContactList) { + List result = convertList(contactList); + // TODO @zyna:简单的转换,可以使用 CollectionUtils.convertMap + Map parentContactMap = parentContactList.stream().collect(Collectors.toMap(ContactDO::getId,v->v)); + Map customerMap = customerList.stream().collect(Collectors.toMap(CrmCustomerDO::getId,v->v)); result.forEach(item -> { setUserInfo(item, userMap); findAndThen(customerMap,item.getCustomerId(),customer -> {item.setCustomerName(customer.getName());}); - findAndThen(contactMap,item.getParentId(),contactDO -> {item.setParentName(contactDO.getName());}); + findAndThen(parentContactMap,item.getParentId(),contactDO -> {item.setParentName(contactDO.getName());}); }); return result; } + /** * 设置用户信息 * @@ -87,4 +90,5 @@ public interface ContactConvert { }); findAndThen(userMap, Long.parseLong(contactRespVO.getCreator()), user -> contactRespVO.setCreatorName(user.getNickname())); } + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java index d2661bfb1..fcf643f66 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java @@ -72,9 +72,7 @@ public interface CrmCustomerConvert { default PageResult convertPage(PageResult pageResult, Map userMap, Map deptMap) { PageResult result = convertPage(pageResult); - result.getList().forEach(item -> { - setUserInfo(item, userMap, deptMap); - }); + result.getList().forEach(item -> setUserInfo(item, userMap, deptMap)); return result; } @@ -82,6 +80,6 @@ public interface CrmCustomerConvert { CrmCustomerPoolConfigDO convert(CrmCustomerPoolConfigSaveReqVO updateReqVO); - CrmCustomerQueryAllRespVO convertQueryAll(CrmCustomerDO crmCustomerDO); List convertQueryAll(List crmCustomerDO); + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/ContactDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/ContactDO.java index 0888d615d..f5fd37f42 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/ContactDO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/ContactDO.java @@ -4,7 +4,6 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.time.LocalDateTime; @@ -23,6 +22,7 @@ import java.time.LocalDateTime; @NoArgsConstructor @AllArgsConstructor public class ContactDO extends BaseDO { + /** * 主键 */ @@ -61,7 +61,9 @@ public class ContactDO extends BaseDO { */ private LocalDateTime lastTime; /** - * 直属上级 @link ContactDO#id + * 直属上级 + * + * 关联 {@link ContactDO#id} */ private Long parentId; /** @@ -82,7 +84,8 @@ public class ContactDO extends BaseDO { private String wechat; /** * 性别 - * @See 字典配置 + * + * 枚举 {@link cn.iocoder.yudao.module.system.enums.common.SexEnum} */ private Integer sex; /** @@ -91,8 +94,16 @@ public class ContactDO extends BaseDO { private Boolean master; /** * 负责人用户编号 + * + * 关联 AdminUserDO 的 id 字段 */ private Long ownerUserId; + /** + * 所在地 + * + * 关联 {@link cn.iocoder.yudao.framework.ip.core.Area#getId()} 字段 + */ private Integer areaId; + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java index 95f3131e2..e7408b836 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java @@ -56,7 +56,7 @@ public class ContactServiceImpl implements ContactService { @Override @Transactional(rollbackFor = Exception.class) - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS,bizId = "#updateReqVO.id", level = CrmPermissionLevelEnum.WRITE) + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS, bizId = "#updateReqVO.id", level = CrmPermissionLevelEnum.WRITE) public void updateContact(ContactUpdateReqVO updateReqVO) { // 校验存在 validateContactExists(updateReqVO.getId()); @@ -67,7 +67,7 @@ public class ContactServiceImpl implements ContactService { @Override @Transactional(rollbackFor = Exception.class) - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS,bizId = "#id", level = CrmPermissionLevelEnum.WRITE) + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS, bizId = "#id", level = CrmPermissionLevelEnum.WRITE) public void deleteContact(Long id) { // 校验存在 validateContactExists(id); @@ -82,7 +82,7 @@ public class ContactServiceImpl implements ContactService { } @Override - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS,bizId = "#id", level = CrmPermissionLevelEnum.READ) + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS, bizId = "#id", level = CrmPermissionLevelEnum.READ) public ContactDO getContact(Long id) { return contactMapper.selectById(id); } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java index 7a78f18f3..c0e342383 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java @@ -26,6 +26,4 @@ public interface DictTypeConstants { String SMS_SEND_STATUS = "system_sms_send_status"; // 短信发送状态 String SMS_RECEIVE_STATUS = "system_sms_receive_status"; // 短信接收状态 - String INFRA_BOOLEAN_STRING = "infra_boolean_string"; // boolean字典 - } From 3f3899f5d3a17faf19e065b614c8e391d0204472 Mon Sep 17 00:00:00 2001 From: zyna Date: Sun, 26 Nov 2023 22:00:14 +0800 Subject: [PATCH 23/35] =?UTF-8?q?crm=E8=81=94=E7=B3=BB=E4=BA=BAreview?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=8C=E6=96=B0=E5=A2=9E=E5=9C=B0=E5=8C=BA?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/mysql/crm.sql | 29 +++++ .../crm/enums/contact/ContactConstants.java | 5 + .../admin/contact/ContactController.java | 73 +++++++----- .../admin/contact/vo/ContactBaseVO.java | 107 ++++++++++++------ .../admin/contact/vo/ContactExcelVO.java | 72 ------------ .../admin/contact/vo/ContactExportReqVO.java | 71 ------------ .../admin/contact/vo/ContactPageReqVO.java | 16 +-- .../admin/contact/vo/ContactRespVO.java | 25 +++- .../admin/customer/CrmCustomerController.java | 9 +- .../vo/CrmCustomerQueryAllRespVO.java | 15 +++ .../crm/convert/contact/ContactConvert.java | 52 ++++++++- .../convert/customer/CrmCustomerConvert.java | 2 + .../crm/dal/dataobject/contact/ContactDO.java | 29 ++--- .../crm/dal/mysql/contact/ContactMapper.java | 10 +- .../crm/service/contact/ContactService.java | 5 +- .../service/contact/ContactServiceImpl.java | 12 +- .../service/customer/CrmCustomerService.java | 6 + .../customer/CrmCustomerServiceImpl.java | 53 +++++++++ .../system/enums/DictTypeConstants.java | 2 + 19 files changed, 338 insertions(+), 255 deletions(-) create mode 100644 yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/contact/ContactConstants.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactExcelVO.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactExportReqVO.java create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerQueryAllRespVO.java diff --git a/sql/mysql/crm.sql b/sql/mysql/crm.sql index e3e2ca0a0..a33204a1e 100644 --- a/sql/mysql/crm.sql +++ b/sql/mysql/crm.sql @@ -1 +1,30 @@ SET NAMES utf8mb4; +-- `ruoyi-vue-pro`.crm_contact definition + +CREATE TABLE `crm_contact` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '联系人名称', + `next_time` datetime DEFAULT NULL COMMENT '下次联系时间', + `mobile` varchar(16) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '手机号', + `telephone` varchar(16) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '电话', + `email` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '电子邮箱', + `post` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '职务', + `customer_id` bigint(20) DEFAULT NULL COMMENT '客户编号', + `address` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '地址', + `remark` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注', + `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建人', + `owner_user_id` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '负责人用户编号', + `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间', + `update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间', + `last_time` timestamp NULL DEFAULT NULL COMMENT '最后跟进时间', + `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '更新人', + `deleted` bit(1) NOT NULL DEFAULT b'0', + `tenant_id` bigint(20) DEFAULT NULL, + `parent_id` bigint(20) DEFAULT NULL COMMENT '直系上属', + `qq` int(11) DEFAULT NULL, + `wechat` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `sex` int(11) DEFAULT NULL COMMENT '性别', + `master` bit(1) DEFAULT NULL COMMENT '是否关键决策人', + `area_id` bigint(20) DEFAULT NULL COMMENT '地区', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='CRM 联系人'; \ No newline at end of file diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/contact/ContactConstants.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/contact/ContactConstants.java new file mode 100644 index 000000000..a0a246f34 --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/contact/ContactConstants.java @@ -0,0 +1,5 @@ +package cn.iocoder.yudao.module.crm.enums.contact; + +public class ContactConstants { + public static final String MULTIPLE_SPLIT = ","; +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java index 933e46901..3031f92ef 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java @@ -7,10 +7,10 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; 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.contact.vo.*; -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPageReqVO; import cn.iocoder.yudao.module.crm.convert.contact.ContactConvert; import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO; 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.ContactService; import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; @@ -19,6 +19,7 @@ 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; +import lombok.extern.slf4j.Slf4j; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -27,13 +28,14 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; +import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.stream.Collectors; +import java.util.stream.Stream; +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.framework.common.pojo.PageParam.PAGE_SIZE_NONE; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @@ -42,6 +44,7 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti @RestController @RequestMapping("/crm/contact") @Validated +@Slf4j public class ContactController { @Resource @@ -83,23 +86,25 @@ public class ContactController { @PreAuthorize("@ss.hasPermission('crm:contact:query')") public CommonResult getContact(@RequestParam("id") Long id) { ContactDO contact = contactService.getContact(id); - // TODO @zyna:需要考虑 null 的情况; - ContactRespVO contactRespVO = ContactConvert.INSTANCE.convert(contact); - // TODO @zyna:可以把数据读完后,convert 统一交给 ContactConvert,让 controller 更简洁;而 convert 专门去做一些转换逻辑 + if(contact == null){ + throw exception(ErrorCodeConstants.CONTACT_NOT_EXISTS); + } + //1.获取用户名 Map userMap = adminUserApi.getUserMap(CollUtil.removeNull(Lists.newArrayList( - NumberUtil.parseLong(contact.getCreator())))); - contactRespVO.setCreatorName(Optional.ofNullable(userMap.get(NumberUtil.parseLong(contact.getCreator()))).map(AdminUserRespDTO::getNickname).orElse(null)); - contactRespVO.setCustomerName(Optional.ofNullable(crmCustomerService.getCustomer(contact.getCustomerId())).map(CrmCustomerDO::getName).orElse(null)); + NumberUtil.parseLong(contact.getCreator()),contact.getOwnerUserId()))); + //2.获取客户信息 + List crmCustomerDOList = crmCustomerService.getCustomerList(Collections.singletonList(contact.getCustomerId())); + //3.直属上级 + List contactList = contactService.getContactList(Collections.singletonList(contact.getParentId())); + ContactRespVO contactRespVO = ContactConvert.INSTANCE.convert(contact,userMap,crmCustomerDOList,contactList); return success(contactRespVO); } - - // TODO @zyna:url 使用中划线噢;然后,单词的拼写也要注意呀,AllList 是不是更好呀; - @GetMapping("/simpleAlllist") + @GetMapping("/simple-all-list") @Operation(summary = "获得联系人列表") @PreAuthorize("@ss.hasPermission('crm:contact:query')") public CommonResult> simpleAlllist() { // TODO @zyna:方法名改成,getContactList;方法命名,要动名词,get 动词;all 可以去掉,因为没条件,自然是全部 - List list = contactService.allContactList(); + List list = contactService.getContactList(); return success(ContactConvert.INSTANCE.convertAllList(list)); } @@ -108,18 +113,10 @@ public class ContactController { @PreAuthorize("@ss.hasPermission('crm:contact:query')") public CommonResult> getContactPage(@Valid ContactPageReqVO pageVO) { PageResult pageData = contactService.getContactPage(pageVO); - PageResult pageResult = ContactConvert.INSTANCE.convertPage(pageData); - // TODO @zyna:需要考虑 null 的情况; - // TODO @zyna:可以把数据读完后,convert 统一交给 ContactConvert,让 controller 更简洁;而 convert 专门去做一些转换逻辑 - //待接口实现后修改 - CrmCustomerPageReqVO reqVO = new CrmCustomerPageReqVO(); - reqVO.setPageSize(PAGE_SIZE_NONE); - List crmCustomerDOList = crmCustomerService.getCustomerPage(reqVO, getLoginUserId()).getList(); - Map crmCustomerDOMap = crmCustomerDOList.stream().collect(Collectors.toMap(CrmCustomerDO::getId, v -> v)); - pageResult.getList().forEach(item -> { - item.setCustomerName(Optional.ofNullable(crmCustomerDOMap.get(item.getCustomerId())).map(CrmCustomerDO::getName).orElse(null)); - }); - return success(pageResult); + List contactRespVOList = convertFieldValue2Name(pageData.getList()); + PageResult pageDataReturn = ContactConvert.INSTANCE.convertPage(pageData); + pageDataReturn.setList(contactRespVOList); + return success(pageDataReturn); } // TODO @zyna:可以看下新的导出写法,这里调整下 @@ -127,12 +124,30 @@ public class ContactController { @Operation(summary = "导出联系人 Excel") @PreAuthorize("@ss.hasPermission('crm:contact:export')") @OperateLog(type = EXPORT) - public void exportContactExcel(@Valid ContactExportReqVO exportReqVO, - HttpServletResponse response) throws IOException { + public void exportContactExcel(@Valid ContactPageReqVO exportReqVO, + HttpServletResponse response) throws IOException { List list = contactService.getContactList(exportReqVO); // 导出 Excel - List datas = ContactConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "crm联系人.xls", "数据", ContactExcelVO.class, datas); + List contactRespVOList = convertFieldValue2Name(list); + ExcelUtils.write(response, "crm联系人.xls", "数据", ContactRespVO.class, contactRespVOList); } + /** + * 翻译字段名称 + * @param contactDOList 联系人List + * @return List + */ + private List convertFieldValue2Name(List contactDOList){ + //1.获取客户列表 + List customerIdList = contactDOList.stream().map(ContactDO::getCustomerId).distinct().collect(Collectors.toList()); + List crmCustomerDOList = crmCustomerService.getCustomerList(customerIdList); + //2.获取创建人、责任人列表 + List userIdsList = contactDOList.stream().flatMap(item-> Stream.of(Long.parseLong(item.getCreator()),item.getOwnerUserId()).distinct()).collect(Collectors.toList()); + Map userMap = adminUserApi.getUserMap(userIdsList); + //3.直属上级 + List contactIdsList = contactDOList.stream().map(ContactDO::getParentId).distinct().collect(Collectors.toList()); + List contactList = contactService.getContactList(contactIdsList); + List pageResult =ContactConvert.INSTANCE.converList(contactDOList,userMap,crmCustomerDOList,contactList); + return pageResult; + } } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java index 9311ad365..99e613c23 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java @@ -1,9 +1,18 @@ package cn.iocoder.yudao.module.crm.controller.admin.contact.vo; +import cn.iocoder.yudao.framework.common.validation.Mobile; +import cn.iocoder.yudao.framework.common.validation.Telephone; +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import org.apache.skywalking.apm.toolkit.trace.IgnoredException; import org.springframework.format.annotation.DateTimeFormat; +import javax.validation.constraints.Email; +import javax.validation.constraints.NotNull; import java.time.LocalDateTime; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; @@ -17,57 +26,83 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ @Data public class ContactBaseVO { - // TODO @zyna:example 最好都写下 - // TODO @zyna:必要的字段校验,例如说 @Mobile,@Emal 等等 - - @Schema(description = "下次联系时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) - private LocalDateTime nextTime; - - @Schema(description = "手机号") - private String mobile; - - @Schema(description = "电话") - private String telephone; - - @Schema(description = "电子邮箱") - private String email; + @ExcelProperty(value = "姓名",order = 1) + @Schema(description = "姓名", example = "芋艿") + @NotNull(message = "姓名不能为空") + private String name; @Schema(description = "客户编号", example = "10795") + @ExcelIgnore private Long customerId; + @ExcelProperty(value = "性别",converter = DictConvert.class ,order = 3) + @DictFormat(cn.iocoder.yudao.module.system.enums.DictTypeConstants.USER_SEX) + @Schema(description = "性别") + private Integer sex; + + @Schema(description = "职位") + @ExcelProperty(value = "职位",order = 3) + private String post; + + @Schema(description = "是否关键决策人") + @ExcelProperty(value = "是否关键决策人",converter = DictConvert.class,order = 3) + @DictFormat(cn.iocoder.yudao.module.system.enums.DictTypeConstants.INFRA_BOOLEAN_STRING) + private Boolean master; + + @Schema(description = "直属上级", example = "23457") + @ExcelIgnore + private Long parentId; + + + @Schema(description = "手机号",example = "1387171766") + @Mobile + @ExcelProperty(value = "手机号",order = 4) + private String mobile; + + @Schema(description = "座机",example = "021-0029922") + @Telephone + @ExcelProperty(value = "座机",order = 4) + private String telephone; + + @ExcelProperty(value = "QQ",order = 4) + @Schema(description = "QQ",example = "197272662") + private Long qq; + + @ExcelProperty(value = "微信",order = 4) + @Schema(description = "微信",example = "zzz3883") + private String wechat; + + @Schema(description = "电子邮箱",example = "1111@22.com") + @Email + @ExcelProperty(value = "邮箱",order = 4) + private String email; + + @ExcelProperty(value = "地址",order = 5) @Schema(description = "地址") private String address; + @Schema(description = "下次联系时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + @ExcelProperty(value = "下次联系时间",order = 6) + private LocalDateTime nextTime; + @Schema(description = "备注", example = "你说的对") + @ExcelProperty(value = "备注",order = 6) private String remark; @Schema(description = "最后跟进时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ExcelProperty(value = "最后跟进时间",order = 6) private LocalDateTime lastTime; - @Schema(description = "直属上级", example = "23457") - private Long parentId; - - @Schema(description = "姓名", example = "芋艿") - private String name; - - @Schema(description = "职位") - private String post; - - @Schema(description = "QQ") - private Long qq; - - @Schema(description = "微信") - private String webchat; - - @Schema(description = "性别") - private Integer sex; - - @Schema(description = "是否关键决策人") - private Boolean policyMakers; @Schema(description = "负责人用户编号", example = "14334") - private String ownerUserId; + @NotNull(message = "负责人不能为空") + @ExcelIgnore + private Long ownerUserId; + + @Schema(description = "地区编号", example = "20158") + @ExcelIgnore + private Integer areaId; } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactExcelVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactExcelVO.java deleted file mode 100644 index d13db6c3e..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactExcelVO.java +++ /dev/null @@ -1,72 +0,0 @@ -package cn.iocoder.yudao.module.crm.controller.admin.contact.vo; - -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -// TODO @zyna:参考新的 VO 结构,把 ContactExcelVO 融合到 ContactRespVO 中 -/** - * crm联系人 Excel VO - * - * @author 芋道源码 - */ -@Data -@Deprecated -public class ContactExcelVO { - - @ExcelProperty("下次联系时间") - private LocalDateTime nextTime; - - @ExcelProperty("手机号") - private String mobile; - - @ExcelProperty("电话") - private String telephone; - - @ExcelProperty("电子邮箱") - private String email; - - @ExcelProperty("客户编号") - private Long customerId; - - @ExcelProperty("地址") - private String address; - - @ExcelProperty("备注") - private String remark; - - @ExcelProperty("创建时间") - private LocalDateTime createTime; - - @ExcelProperty("最后跟进时间") - private LocalDateTime lastTime; - - @ExcelProperty("主键") - private Long id; - - @ExcelProperty("直属上级") - private Long parentId; - - @ExcelProperty("姓名") - private String name; - - @ExcelProperty("职位") - private String post; - - @ExcelProperty("QQ") - private Long qq; - - @ExcelProperty("微信") - private String webchat; - - @ExcelProperty("性别") - private Integer sex; - - @ExcelProperty("是否关键决策人") - private Boolean policyMakers; - - @ExcelProperty("负责人用户编号") - private String ownerUserId; - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactExportReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactExportReqVO.java deleted file mode 100644 index f05f6dcde..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactExportReqVO.java +++ /dev/null @@ -1,71 +0,0 @@ -package cn.iocoder.yudao.module.crm.controller.admin.contact.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -// TODO @zyna:参考新的 VO 结构,使用 ContactPageReqVO 查询导出的数据 -@Schema(description = "管理后台 - crm联系人 Excel 导出 Request VO,参数和 ContactPageReqVO 是一致的") -@Data -@Deprecated -public class ContactExportReqVO { - - @Schema(description = "下次联系时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] nextTime; - - @Schema(description = "手机号") - private String mobile; - - @Schema(description = "电话") - private String telephone; - - @Schema(description = "电子邮箱") - private String email; - - @Schema(description = "客户编号", example = "10795") - private Long customerId; - - @Schema(description = "地址") - private String address; - - @Schema(description = "备注", example = "你说的对") - private String remark; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - - @Schema(description = "最后跟进时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] lastTime; - - @Schema(description = "直属上级", example = "23457") - private Long parentId; - - @Schema(description = "姓名", example = "芋艿") - private String name; - - @Schema(description = "职位") - private String post; - - @Schema(description = "QQ") - private Long qq; - - @Schema(description = "微信") - private String webchat; - - @Schema(description = "性别") - private Integer sex; - - @Schema(description = "是否关键决策人") - private Boolean policyMakers; - - @Schema(description = "负责人用户编号", example = "14334") - private String ownerUserId; - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactPageReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactPageReqVO.java index a20826b0a..f5ed1b275 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactPageReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactPageReqVO.java @@ -26,13 +26,13 @@ public class ContactPageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] nextTime; - @Schema(description = "手机号") + @Schema(description = "手机号",example = "13898273941") private String mobile; - @Schema(description = "电话") + @Schema(description = "电话",example = "021-383773") private String telephone; - @Schema(description = "电子邮箱") + @Schema(description = "电子邮箱",example = "111@22.com") private String email; @Schema(description = "客户编号", example = "10795") @@ -61,19 +61,19 @@ public class ContactPageReqVO extends PageParam { @Schema(description = "职位") private String post; - @Schema(description = "QQ") + @Schema(description = "QQ",example = "3882872") private Long qq; - @Schema(description = "微信") - private String webchat; + @Schema(description = "微信",example = "zzZ98373") + private String wechat; @Schema(description = "性别") private Integer sex; @Schema(description = "是否关键决策人") - private Boolean policyMakers; + private Boolean master; @Schema(description = "负责人用户编号", example = "14334") - private String ownerUserId; + private Long ownerUserId; } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactRespVO.java index 5a69424dc..438a0b336 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactRespVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactRespVO.java @@ -1,5 +1,7 @@ package cn.iocoder.yudao.module.crm.controller.admin.contact.vo; +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.time.LocalDateTime; @@ -11,17 +13,34 @@ import java.time.LocalDateTime; public class ContactRespVO extends ContactBaseVO { @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "3167") + @ExcelIgnore private Long id; @Schema(description = "创建时间") + @ExcelProperty(value = "创建时间",order = 8) private LocalDateTime createTime; - // TODO @zyna:example 最好写下; + @Schema(description = "创建人", example = "25682") + @ExcelIgnore + private String creator; - @Schema(description = "创建人") + @Schema(description = "创建人名字", example = "test") + @ExcelProperty(value = "创建人",order = 8) private String creatorName; - @Schema(description = "客户名字") + @ExcelProperty(value = "客户名称",order = 2) + @Schema(description = "客户名字", example = "test") private String customerName; + @Schema(description = "负责人", example = "test") + @ExcelProperty(value = "负责人",order = 7) + private String ownerUserName; + + @Schema(description = "直属上级名",example = "芋头") + @ExcelProperty(value = "直属上级",order = 4) + private String parentName; + + @Schema(description = "地区名",example = "上海上海市浦东新区") + @ExcelProperty(value = "地区",order = 5) + private String areaName; } 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 d86e24f7c..6881518d5 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 @@ -172,5 +172,12 @@ public class CrmCustomerController { customerService.receiveCustomer(ids, ownerUserId); return success(true); } - + @GetMapping("/query-all-list") + @Operation(summary = "查询客户列表") + @PreAuthorize("@ss.hasPermission('crm:customer:all')") + public CommonResult> queryAll(){ + List crmCustomerDOList = customerService.getCustomerList(); + List data = CrmCustomerConvert.INSTANCE.convertQueryAll(crmCustomerDOList); + return success(data); + } } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerQueryAllRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerQueryAllRespVO.java new file mode 100644 index 000000000..18c487997 --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerQueryAllRespVO.java @@ -0,0 +1,15 @@ +package cn.iocoder.yudao.module.crm.controller.admin.customer.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + + +@Schema(description = "管理后台 - CRM 全部客户 Response VO") +@Data +public class CrmCustomerQueryAllRespVO{ + @Schema(description = "客户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") + private String name; + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563") + private Long id; + +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java index a5be7d84f..12a21dd64 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java @@ -1,15 +1,21 @@ package cn.iocoder.yudao.module.crm.convert.contact; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils; import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.*; import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO; +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Mappings; import org.mapstruct.factory.Mappers; - import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen; /** * crm联系人 Convert @@ -31,8 +37,6 @@ public interface ContactConvert { PageResult convertPage(PageResult page); - List convertList02(List list); - List convertAllList(List list); @Mappings({ @@ -41,4 +45,46 @@ public interface ContactConvert { }) CrmPermissionTransferReqBO convert(CrmContactTransferReqVO reqVO, Long userId); + /** + * 详情信息 + * @param contactDO 联系人 + * @param userMap 用户列表 + * @param crmCustomerDOList 客户 + * @return ContactRespVO + */ + default ContactRespVO convert(ContactDO contactDO, Map userMap, List crmCustomerDOList, + List contactList) { + ContactRespVO contactRespVO = convert(contactDO); + setUserInfo(contactRespVO,userMap); + Map crmCustomerDOMap = crmCustomerDOList.stream().collect(Collectors.toMap(CrmCustomerDO::getId,v->v)); + Map contactDOMap = contactList.stream().collect(Collectors.toMap(ContactDO::getId,v->v)); + findAndThen(crmCustomerDOMap,contactDO.getCustomerId(),customer -> {contactRespVO.setCustomerName(customer.getName());}); + findAndThen(contactDOMap,contactDO.getParentId(),contactDOInner -> {contactRespVO.setParentName(contactDOInner.getName());}); + return contactRespVO; + } + default List converList(List contactDOList, Map userMap, + List crmCustomerDOList , List contactList){ + List result = convertList(contactDOList); + Map contactMap = contactList.stream().collect(Collectors.toMap(ContactDO::getId,v->v)); + Map customerMap = crmCustomerDOList.stream().collect(Collectors.toMap(CrmCustomerDO::getId,v->v)); + result.forEach(item -> { + setUserInfo(item, userMap); + findAndThen(customerMap,item.getCustomerId(),customer -> {item.setCustomerName(customer.getName());}); + findAndThen(contactMap,item.getParentId(),contactDO -> {item.setParentName(contactDO.getName());}); + }); + return result; + } + /** + * 设置用户信息 + * + * @param contactRespVO 联系人Response VO + * @param userMap 用户信息 map + */ + static void setUserInfo(ContactRespVO contactRespVO, Map userMap){ + contactRespVO.setAreaName(AreaUtils.format(contactRespVO.getAreaId())); + findAndThen(userMap, contactRespVO.getOwnerUserId(), user -> { + contactRespVO.setOwnerUserName(user == null?"":user.getNickname()); + }); + findAndThen(userMap, Long.parseLong(contactRespVO.getCreator()), user -> contactRespVO.setCreatorName(user.getNickname())); + } } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java index 2cbc587ba..d2661bfb1 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java @@ -82,4 +82,6 @@ public interface CrmCustomerConvert { CrmCustomerPoolConfigDO convert(CrmCustomerPoolConfigSaveReqVO updateReqVO); + CrmCustomerQueryAllRespVO convertQueryAll(CrmCustomerDO crmCustomerDO); + List convertQueryAll(List crmCustomerDO); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/ContactDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/ContactDO.java index f98da52bc..0888d615d 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/ContactDO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/ContactDO.java @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.time.LocalDateTime; @@ -22,8 +23,11 @@ import java.time.LocalDateTime; @NoArgsConstructor @AllArgsConstructor public class ContactDO extends BaseDO { - - // TODO @zyna:这个字段的顺序,是不是整理下; + /** + * 主键 + */ + @TableId + private Long id; /** * 下次联系时间 */ @@ -56,15 +60,8 @@ public class ContactDO extends BaseDO { * 最后跟进时间 */ private LocalDateTime lastTime; - // TODO @zyna:这个放在最前面吧 /** - * 主键 - */ - @TableId - private Long id; - // TODO @zyna:直接上级,最好写下它关联的字段,例如说这个,应该关联 ContactDO 的 id 字段 - /** - * 直属上级 + * 直属上级 @link ContactDO#id */ private Long parentId; /** @@ -79,25 +76,23 @@ public class ContactDO extends BaseDO { * QQ */ private Long qq; - // TODO @zyna:wechat /** * 微信 */ - private String webchat; - // TODO @zyna:关联的枚举 + private String wechat; /** * 性别 + * @See 字典配置 */ private Integer sex; - // TODO @zyna:这个字段改成 master 哈; /** * 是否关键决策人 */ - private Boolean policyMakers; - // TODO @zyna:应该是 Long + private Boolean master; /** * 负责人用户编号 */ - private String ownerUserId; + private Long ownerUserId; + private Integer areaId; } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/ContactMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/ContactMapper.java index ef336c37e..9db1691cb 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/ContactMapper.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/ContactMapper.java @@ -32,14 +32,14 @@ public interface ContactMapper extends BaseMapperX { .likeIfPresent(ContactDO::getName, reqVO.getName()) .eqIfPresent(ContactDO::getPost, reqVO.getPost()) .eqIfPresent(ContactDO::getQq, reqVO.getQq()) - .eqIfPresent(ContactDO::getWebchat, reqVO.getWebchat()) + .eqIfPresent(ContactDO::getWechat, reqVO.getWechat()) .eqIfPresent(ContactDO::getSex, reqVO.getSex()) - .eqIfPresent(ContactDO::getPolicyMakers, reqVO.getPolicyMakers()) + .eqIfPresent(ContactDO::getMaster, reqVO.getMaster()) .eqIfPresent(ContactDO::getOwnerUserId, reqVO.getOwnerUserId()) .orderByDesc(ContactDO::getId)); } - default List selectList(ContactExportReqVO reqVO) { + default List selectList(ContactPageReqVO reqVO) { return selectList(new LambdaQueryWrapperX() .betweenIfPresent(ContactDO::getNextTime, reqVO.getNextTime()) .eqIfPresent(ContactDO::getMobile, reqVO.getMobile()) @@ -54,9 +54,9 @@ public interface ContactMapper extends BaseMapperX { .likeIfPresent(ContactDO::getName, reqVO.getName()) .eqIfPresent(ContactDO::getPost, reqVO.getPost()) .eqIfPresent(ContactDO::getQq, reqVO.getQq()) - .eqIfPresent(ContactDO::getWebchat, reqVO.getWebchat()) + .eqIfPresent(ContactDO::getWechat, reqVO.getWechat()) .eqIfPresent(ContactDO::getSex, reqVO.getSex()) - .eqIfPresent(ContactDO::getPolicyMakers, reqVO.getPolicyMakers()) + .eqIfPresent(ContactDO::getMaster, reqVO.getMaster()) .eqIfPresent(ContactDO::getOwnerUserId, reqVO.getOwnerUserId()) .orderByDesc(ContactDO::getId)); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactService.java index c27c1541a..f1278a529 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactService.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactService.java @@ -2,7 +2,6 @@ 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.ContactCreateReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactExportReqVO; import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactPageReqVO; import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactUpdateReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO; @@ -71,11 +70,11 @@ public interface ContactService { * @param exportReqVO 查询条件 * @return crm联系人列表 */ - List getContactList(ContactExportReqVO exportReqVO); + List getContactList(ContactPageReqVO exportReqVO); /** * 获取所有联系人列表,只返回姓名和id * @return 所有联系人列表 */ - List allContactList(); + List getContactList(); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java index 279bbc568..95f3131e2 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java @@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactCreateReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactExportReqVO; import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactPageReqVO; import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactUpdateReqVO; import cn.iocoder.yudao.module.crm.convert.contact.ContactConvert; @@ -57,7 +56,7 @@ public class ContactServiceImpl implements ContactService { @Override @Transactional(rollbackFor = Exception.class) - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS, level = CrmPermissionLevelEnum.WRITE) + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS,bizId = "#updateReqVO.id", level = CrmPermissionLevelEnum.WRITE) public void updateContact(ContactUpdateReqVO updateReqVO) { // 校验存在 validateContactExists(updateReqVO.getId()); @@ -68,7 +67,7 @@ public class ContactServiceImpl implements ContactService { @Override @Transactional(rollbackFor = Exception.class) - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS, level = CrmPermissionLevelEnum.WRITE) + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS,bizId = "#id", level = CrmPermissionLevelEnum.WRITE) public void deleteContact(Long id) { // 校验存在 validateContactExists(id); @@ -83,7 +82,7 @@ public class ContactServiceImpl implements ContactService { } @Override - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS, level = CrmPermissionLevelEnum.READ) + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS,bizId = "#id", level = CrmPermissionLevelEnum.READ) public ContactDO getContact(Long id) { return contactMapper.selectById(id); } @@ -102,13 +101,12 @@ public class ContactServiceImpl implements ContactService { } @Override - public List getContactList(ContactExportReqVO exportReqVO) { + public List getContactList(ContactPageReqVO exportReqVO) { return contactMapper.selectList(exportReqVO); } @Override - public List allContactList() { + public List getContactList() { return contactMapper.selectList(); } - } 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 8f745ba78..1834f9031 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 @@ -107,4 +107,10 @@ public interface CrmCustomerService { */ void receiveCustomer(List ids, Long ownerUserId); + /** + * 获取客户列表 + * @return 客户列表 + * @author zyna + */ + List getCustomerList(); } 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 4f1e1c367..7d4f27ad0 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 @@ -228,4 +228,57 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { } } + // TODO @puhui999:合并到 receiveCustomer 里 + @Override + @Transactional(rollbackFor = Exception.class) + public void receive(Long id, Long userId) { + // 1. 校验存在 + CrmCustomerDO customer = customerMapper.selectById(id); + if (customer == null) { + throw exception(CUSTOMER_NOT_EXISTS); + } + // 1.2. 校验是否为公海数据 + if (customer.getOwnerUserId() != null) { + throw exception(CUSTOMER_NOT_IN_POOL); + } + + // 2. 领取公海数据-设置负责人 + customerMapper.updateById(new CrmCustomerDO().setId(customer.getId()).setOwnerUserId(userId)); + // 3. 创建负责人数据权限 + crmPermissionService.createPermission(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType()) + .setBizId(customer.getId()).setUserId(userId).setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); // 设置当前操作的人为负责人 + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#id", level = CrmPermissionLevelEnum.OWNER) + public void putCustomerPool(Long id) { + // 1. 校验存在 + CrmCustomerDO customer = customerMapper.selectById(id); + if (customer == null) { + throw exception(CUSTOMER_NOT_EXISTS); + } + // TODO puhui999:校验合并到 validateCustomerOwnerExists、validateCustomerIsLocked + // 1.2. 校验是否为公海数据 + if (customer.getOwnerUserId() == null) { + throw exception(CUSTOMER_IN_POOL); + } + // 1.3. 校验客户是否锁定 + if (customer.getLockStatus()) { + throw exception(CUSTOMER_LOCKED_PUT_POOL_FAIL); + } + + // 2. 设置负责人为 NULL + // TODO @puhui999:updateById 这么操作,是无法设置 null 的; + customerMapper.updateById(new CrmCustomerDO().setId(customer.getId()).setOwnerUserId(null)); + // 3. 删除负责人数据权限 + crmPermissionService.deletePermission(CrmBizTypeEnum.CRM_CUSTOMER.getType(), customer.getId(), + CrmPermissionLevelEnum.OWNER.getLevel()); + } + + @Override + public List getCustomerList() { + return customerMapper.selectList(); + } + } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java index c0e342383..7a78f18f3 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java @@ -26,4 +26,6 @@ public interface DictTypeConstants { String SMS_SEND_STATUS = "system_sms_send_status"; // 短信发送状态 String SMS_RECEIVE_STATUS = "system_sms_receive_status"; // 短信接收状态 + String INFRA_BOOLEAN_STRING = "infra_boolean_string"; // boolean字典 + } From 16084d468d116a258d80b4ff05758e33c3836fe5 Mon Sep 17 00:00:00 2001 From: zyna Date: Sun, 26 Nov 2023 22:03:06 +0800 Subject: [PATCH 24/35] =?UTF-8?q?crm=E8=81=94=E7=B3=BB=E4=BA=BA=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=A4=9A=E4=BD=99=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/module/crm/enums/contact/ContactConstants.java | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/contact/ContactConstants.java diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/contact/ContactConstants.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/contact/ContactConstants.java deleted file mode 100644 index a0a246f34..000000000 --- a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/contact/ContactConstants.java +++ /dev/null @@ -1,5 +0,0 @@ -package cn.iocoder.yudao.module.crm.enums.contact; - -public class ContactConstants { - public static final String MULTIPLE_SPLIT = ","; -} From 455f8e49fb4263c015981ef9b66ba0d8c439a7b9 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 27 Nov 2023 20:28:18 +0800 Subject: [PATCH 25/35] =?UTF-8?q?crm=EF=BC=9Acode=20review=20=E8=81=94?= =?UTF-8?q?=E7=B3=BB=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/mysql/crm.sql | 27 ----------- .../admin/contact/ContactController.java | 48 ++++++++++--------- .../admin/contact/vo/ContactBaseVO.java | 13 +++-- .../admin/contact/vo/ContactPageReqVO.java | 14 +++--- .../admin/customer/CrmCustomerController.java | 3 ++ .../vo/CrmCustomerQueryAllRespVO.java | 8 ++-- .../crm/convert/contact/ContactConvert.java | 32 +++++++------ .../convert/customer/CrmCustomerConvert.java | 6 +-- .../crm/dal/dataobject/contact/ContactDO.java | 17 +++++-- .../service/contact/ContactServiceImpl.java | 6 +-- .../system/enums/DictTypeConstants.java | 2 - 11 files changed, 84 insertions(+), 92 deletions(-) diff --git a/sql/mysql/crm.sql b/sql/mysql/crm.sql index a33204a1e..135826585 100644 --- a/sql/mysql/crm.sql +++ b/sql/mysql/crm.sql @@ -1,30 +1,3 @@ SET NAMES utf8mb4; -- `ruoyi-vue-pro`.crm_contact definition -CREATE TABLE `crm_contact` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', - `name` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '联系人名称', - `next_time` datetime DEFAULT NULL COMMENT '下次联系时间', - `mobile` varchar(16) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '手机号', - `telephone` varchar(16) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '电话', - `email` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '电子邮箱', - `post` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '职务', - `customer_id` bigint(20) DEFAULT NULL COMMENT '客户编号', - `address` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '地址', - `remark` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注', - `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建人', - `owner_user_id` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '负责人用户编号', - `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间', - `update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间', - `last_time` timestamp NULL DEFAULT NULL COMMENT '最后跟进时间', - `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '更新人', - `deleted` bit(1) NOT NULL DEFAULT b'0', - `tenant_id` bigint(20) DEFAULT NULL, - `parent_id` bigint(20) DEFAULT NULL COMMENT '直系上属', - `qq` int(11) DEFAULT NULL, - `wechat` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `sex` int(11) DEFAULT NULL COMMENT '性别', - `master` bit(1) DEFAULT NULL COMMENT '是否关键决策人', - `area_id` bigint(20) DEFAULT NULL COMMENT '地区', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='CRM 联系人'; \ No newline at end of file diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java index 3031f92ef..32f72ddc9 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java @@ -86,24 +86,23 @@ public class ContactController { @PreAuthorize("@ss.hasPermission('crm:contact:query')") public CommonResult getContact(@RequestParam("id") Long id) { ContactDO contact = contactService.getContact(id); - if(contact == null){ + if (contact == null) { throw exception(ErrorCodeConstants.CONTACT_NOT_EXISTS); } - //1.获取用户名 + // 1. 获取用户名 Map userMap = adminUserApi.getUserMap(CollUtil.removeNull(Lists.newArrayList( - NumberUtil.parseLong(contact.getCreator()),contact.getOwnerUserId()))); - //2.获取客户信息 - List crmCustomerDOList = crmCustomerService.getCustomerList(Collections.singletonList(contact.getCustomerId())); - //3.直属上级 - List contactList = contactService.getContactList(Collections.singletonList(contact.getParentId())); - ContactRespVO contactRespVO = ContactConvert.INSTANCE.convert(contact,userMap,crmCustomerDOList,contactList); - return success(contactRespVO); + NumberUtil.parseLong(contact.getCreator()), contact.getOwnerUserId()))); + // 2. 获取客户信息 + List customerList = crmCustomerService.getCustomerList(Collections.singletonList(contact.getCustomerId())); + // 3. 直属上级 + List parentContactList = contactService.getContactList(Collections.singletonList(contact.getParentId())); + return success(ContactConvert.INSTANCE.convert(contact, userMap, customerList, parentContactList)); } + @GetMapping("/simple-all-list") @Operation(summary = "获得联系人列表") @PreAuthorize("@ss.hasPermission('crm:contact:query')") - public CommonResult> simpleAlllist() { - // TODO @zyna:方法名改成,getContactList;方法命名,要动名词,get 动词;all 可以去掉,因为没条件,自然是全部 + public CommonResult> getContactList() { List list = contactService.getContactList(); return success(ContactConvert.INSTANCE.convertAllList(list)); } @@ -112,11 +111,12 @@ public class ContactController { @Operation(summary = "获得联系人分页") @PreAuthorize("@ss.hasPermission('crm:contact:query')") public CommonResult> getContactPage(@Valid ContactPageReqVO pageVO) { - PageResult pageData = contactService.getContactPage(pageVO); - List contactRespVOList = convertFieldValue2Name(pageData.getList()); - PageResult pageDataReturn = ContactConvert.INSTANCE.convertPage(pageData); - pageDataReturn.setList(contactRespVOList); - return success(pageDataReturn); + PageResult pageResult = contactService.getContactPage(pageVO); + if (CollUtil.isEmpty(pageResult.getList())) { + return success(PageResult.empty(pageResult.getTotal())); + } + List contactVOList = convertFieldValue2Name(pageResult.getList()); + return success(new PageResult<>(contactVOList, pageResult.getTotal())); } // TODO @zyna:可以看下新的导出写法,这里调整下 @@ -127,27 +127,31 @@ public class ContactController { public void exportContactExcel(@Valid ContactPageReqVO exportReqVO, HttpServletResponse response) throws IOException { List list = contactService.getContactList(exportReqVO); + // TODO @zya:可以改成直接调用 getContactPage 方法;只要把 ContactPageReqVO 设置成不分页,PAGE_SIZE_NONE // 导出 Excel List contactRespVOList = convertFieldValue2Name(list); - ExcelUtils.write(response, "crm联系人.xls", "数据", ContactRespVO.class, contactRespVOList); + ExcelUtils.write(response, "crm 联系人.xls", "数据", ContactRespVO.class, contactRespVOList); } + // TODO 芋艿:后续会合并下, /** * 翻译字段名称 * @param contactDOList 联系人List * @return List */ private List convertFieldValue2Name(List contactDOList){ - //1.获取客户列表 + // 1. 获取客户列表 + // TODO @zyna:简单的转换,可以使用 CollectionUtils.convertSet List customerIdList = contactDOList.stream().map(ContactDO::getCustomerId).distinct().collect(Collectors.toList()); List crmCustomerDOList = crmCustomerService.getCustomerList(customerIdList); - //2.获取创建人、责任人列表 + // 2. 获取创建人、责任人列表 + // TODO @zyna:简单的转换,可以使用 CollectionUtils.convertSetByFlatMap List userIdsList = contactDOList.stream().flatMap(item-> Stream.of(Long.parseLong(item.getCreator()),item.getOwnerUserId()).distinct()).collect(Collectors.toList()); Map userMap = adminUserApi.getUserMap(userIdsList); - //3.直属上级 + // 3. 直属上级 List contactIdsList = contactDOList.stream().map(ContactDO::getParentId).distinct().collect(Collectors.toList()); List contactList = contactService.getContactList(contactIdsList); - List pageResult =ContactConvert.INSTANCE.converList(contactDOList,userMap,crmCustomerDOList,contactList); - return pageResult; + return ContactConvert.INSTANCE.converList(contactDOList,userMap,crmCustomerDOList,contactList); } + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java index 99e613c23..6f6a57891 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java @@ -4,11 +4,11 @@ import cn.iocoder.yudao.framework.common.validation.Mobile; import cn.iocoder.yudao.framework.common.validation.Telephone; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.module.infra.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -import org.apache.skywalking.apm.toolkit.trace.IgnoredException; import org.springframework.format.annotation.DateTimeFormat; import javax.validation.constraints.Email; @@ -35,25 +35,24 @@ public class ContactBaseVO { @ExcelIgnore private Long customerId; - @ExcelProperty(value = "性别",converter = DictConvert.class ,order = 3) + @ExcelProperty(value = "性别", converter = DictConvert.class, order = 3) @DictFormat(cn.iocoder.yudao.module.system.enums.DictTypeConstants.USER_SEX) @Schema(description = "性别") private Integer sex; @Schema(description = "职位") - @ExcelProperty(value = "职位",order = 3) + @ExcelProperty(value = "职位", order = 3) private String post; @Schema(description = "是否关键决策人") - @ExcelProperty(value = "是否关键决策人",converter = DictConvert.class,order = 3) - @DictFormat(cn.iocoder.yudao.module.system.enums.DictTypeConstants.INFRA_BOOLEAN_STRING) + @ExcelProperty(value = "是否关键决策人", converter = DictConvert.class, order = 3) + @DictFormat(DictTypeConstants.BOOLEAN_STRING) private Boolean master; @Schema(description = "直属上级", example = "23457") @ExcelIgnore private Long parentId; - @Schema(description = "手机号",example = "1387171766") @Mobile @ExcelProperty(value = "手机号",order = 4) @@ -98,7 +97,7 @@ public class ContactBaseVO { @Schema(description = "负责人用户编号", example = "14334") @NotNull(message = "负责人不能为空") - @ExcelIgnore + @ExcelIgnore // TODO @zyna:可以使用 ExcelIgnoreUnannotated private Long ownerUserId; @Schema(description = "地区编号", example = "20158") diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactPageReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactPageReqVO.java index f5ed1b275..db408405e 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactPageReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactPageReqVO.java @@ -11,13 +11,13 @@ import java.time.LocalDateTime; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -@Schema(description = "管理后台 - crm联系人分页 Request VO") +@Schema(description = "管理后台 - CRM 联系人分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) public class ContactPageReqVO extends PageParam { - // TODO @zyna:筛选条件 + // TODO @zyna:筛选条件(多余的可以删除哈)还有部分 example 少了,可以补充下; // ●客户: // ●姓名: // ●手机、电话、座机、QQ、微信、邮箱 @@ -26,13 +26,13 @@ public class ContactPageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] nextTime; - @Schema(description = "手机号",example = "13898273941") + @Schema(description = "手机号", example = "13898273941") private String mobile; - @Schema(description = "电话",example = "021-383773") + @Schema(description = "电话", example = "021-383773") private String telephone; - @Schema(description = "电子邮箱",example = "111@22.com") + @Schema(description = "电子邮箱", example = "111@22.com") private String email; @Schema(description = "客户编号", example = "10795") @@ -61,10 +61,10 @@ public class ContactPageReqVO extends PageParam { @Schema(description = "职位") private String post; - @Schema(description = "QQ",example = "3882872") + @Schema(description = "QQ", example = "3882872") private Long qq; - @Schema(description = "微信",example = "zzZ98373") + @Schema(description = "微信", example = "zzZ98373") private String wechat; @Schema(description = "性别") 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 6881518d5..fc5bbe6a5 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 @@ -172,6 +172,8 @@ public class CrmCustomerController { customerService.receiveCustomer(ids, ownerUserId); return success(true); } + + // TODO 芋艿:这个接口要调整下 @GetMapping("/query-all-list") @Operation(summary = "查询客户列表") @PreAuthorize("@ss.hasPermission('crm:customer:all')") @@ -180,4 +182,5 @@ public class CrmCustomerController { List data = CrmCustomerConvert.INSTANCE.convertQueryAll(crmCustomerDOList); return success(data); } + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerQueryAllRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerQueryAllRespVO.java index 18c487997..a66b8d810 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerQueryAllRespVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerQueryAllRespVO.java @@ -3,13 +3,15 @@ package cn.iocoder.yudao.module.crm.controller.admin.customer.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; - +// TODO 芋艿:这块要统一下; @Schema(description = "管理后台 - CRM 全部客户 Response VO") @Data public class CrmCustomerQueryAllRespVO{ - @Schema(description = "客户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") - private String name; + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563") private Long id; + @Schema(description = "客户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") + private String name; + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java index 12a21dd64..c4452e076 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java @@ -46,7 +46,8 @@ public interface ContactConvert { CrmPermissionTransferReqBO convert(CrmContactTransferReqVO reqVO, Long userId); /** - * 详情信息 + * 转换详情信息 + * * @param contactDO 联系人 * @param userMap 用户列表 * @param crmCustomerDOList 客户 @@ -54,26 +55,28 @@ public interface ContactConvert { */ default ContactRespVO convert(ContactDO contactDO, Map userMap, List crmCustomerDOList, List contactList) { - ContactRespVO contactRespVO = convert(contactDO); - setUserInfo(contactRespVO,userMap); - Map crmCustomerDOMap = crmCustomerDOList.stream().collect(Collectors.toMap(CrmCustomerDO::getId,v->v)); - Map contactDOMap = contactList.stream().collect(Collectors.toMap(ContactDO::getId,v->v)); - findAndThen(crmCustomerDOMap,contactDO.getCustomerId(),customer -> {contactRespVO.setCustomerName(customer.getName());}); - findAndThen(contactDOMap,contactDO.getParentId(),contactDOInner -> {contactRespVO.setParentName(contactDOInner.getName());}); - return contactRespVO; - } - default List converList(List contactDOList, Map userMap, - List crmCustomerDOList , List contactList){ - List result = convertList(contactDOList); + ContactRespVO contactVO = convert(contactDO); + setUserInfo(contactVO, userMap); + Map ustomerMap = crmCustomerDOList.stream().collect(Collectors.toMap(CrmCustomerDO::getId,v->v)); Map contactMap = contactList.stream().collect(Collectors.toMap(ContactDO::getId,v->v)); - Map customerMap = crmCustomerDOList.stream().collect(Collectors.toMap(CrmCustomerDO::getId,v->v)); + findAndThen(ustomerMap, contactDO.getCustomerId(), customer -> contactVO.setCustomerName(customer.getName())); + findAndThen(contactMap, contactDO.getParentId(), contact -> contactVO.setParentName(contact.getName())); + return contactVO; + } + default List converList(List contactList, Map userMap, + List customerList, List parentContactList) { + List result = convertList(contactList); + // TODO @zyna:简单的转换,可以使用 CollectionUtils.convertMap + Map parentContactMap = parentContactList.stream().collect(Collectors.toMap(ContactDO::getId,v->v)); + Map customerMap = customerList.stream().collect(Collectors.toMap(CrmCustomerDO::getId,v->v)); result.forEach(item -> { setUserInfo(item, userMap); findAndThen(customerMap,item.getCustomerId(),customer -> {item.setCustomerName(customer.getName());}); - findAndThen(contactMap,item.getParentId(),contactDO -> {item.setParentName(contactDO.getName());}); + findAndThen(parentContactMap,item.getParentId(),contactDO -> {item.setParentName(contactDO.getName());}); }); return result; } + /** * 设置用户信息 * @@ -87,4 +90,5 @@ public interface ContactConvert { }); findAndThen(userMap, Long.parseLong(contactRespVO.getCreator()), user -> contactRespVO.setCreatorName(user.getNickname())); } + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java index d2661bfb1..fcf643f66 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java @@ -72,9 +72,7 @@ public interface CrmCustomerConvert { default PageResult convertPage(PageResult pageResult, Map userMap, Map deptMap) { PageResult result = convertPage(pageResult); - result.getList().forEach(item -> { - setUserInfo(item, userMap, deptMap); - }); + result.getList().forEach(item -> setUserInfo(item, userMap, deptMap)); return result; } @@ -82,6 +80,6 @@ public interface CrmCustomerConvert { CrmCustomerPoolConfigDO convert(CrmCustomerPoolConfigSaveReqVO updateReqVO); - CrmCustomerQueryAllRespVO convertQueryAll(CrmCustomerDO crmCustomerDO); List convertQueryAll(List crmCustomerDO); + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/ContactDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/ContactDO.java index 0888d615d..f5fd37f42 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/ContactDO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/ContactDO.java @@ -4,7 +4,6 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.time.LocalDateTime; @@ -23,6 +22,7 @@ import java.time.LocalDateTime; @NoArgsConstructor @AllArgsConstructor public class ContactDO extends BaseDO { + /** * 主键 */ @@ -61,7 +61,9 @@ public class ContactDO extends BaseDO { */ private LocalDateTime lastTime; /** - * 直属上级 @link ContactDO#id + * 直属上级 + * + * 关联 {@link ContactDO#id} */ private Long parentId; /** @@ -82,7 +84,8 @@ public class ContactDO extends BaseDO { private String wechat; /** * 性别 - * @See 字典配置 + * + * 枚举 {@link cn.iocoder.yudao.module.system.enums.common.SexEnum} */ private Integer sex; /** @@ -91,8 +94,16 @@ public class ContactDO extends BaseDO { private Boolean master; /** * 负责人用户编号 + * + * 关联 AdminUserDO 的 id 字段 */ private Long ownerUserId; + /** + * 所在地 + * + * 关联 {@link cn.iocoder.yudao.framework.ip.core.Area#getId()} 字段 + */ private Integer areaId; + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java index 95f3131e2..e7408b836 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java @@ -56,7 +56,7 @@ public class ContactServiceImpl implements ContactService { @Override @Transactional(rollbackFor = Exception.class) - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS,bizId = "#updateReqVO.id", level = CrmPermissionLevelEnum.WRITE) + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS, bizId = "#updateReqVO.id", level = CrmPermissionLevelEnum.WRITE) public void updateContact(ContactUpdateReqVO updateReqVO) { // 校验存在 validateContactExists(updateReqVO.getId()); @@ -67,7 +67,7 @@ public class ContactServiceImpl implements ContactService { @Override @Transactional(rollbackFor = Exception.class) - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS,bizId = "#id", level = CrmPermissionLevelEnum.WRITE) + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS, bizId = "#id", level = CrmPermissionLevelEnum.WRITE) public void deleteContact(Long id) { // 校验存在 validateContactExists(id); @@ -82,7 +82,7 @@ public class ContactServiceImpl implements ContactService { } @Override - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS,bizId = "#id", level = CrmPermissionLevelEnum.READ) + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS, bizId = "#id", level = CrmPermissionLevelEnum.READ) public ContactDO getContact(Long id) { return contactMapper.selectById(id); } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java index 7a78f18f3..c0e342383 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java @@ -26,6 +26,4 @@ public interface DictTypeConstants { String SMS_SEND_STATUS = "system_sms_send_status"; // 短信发送状态 String SMS_RECEIVE_STATUS = "system_sms_receive_status"; // 短信接收状态 - String INFRA_BOOLEAN_STRING = "infra_boolean_string"; // boolean字典 - } From 492adfe8e582b7cfcc7450ba8517f81fa7f4813b Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 27 Nov 2023 20:51:51 +0800 Subject: [PATCH 26/35] =?UTF-8?q?crm=EF=BC=9Acode=20review=20=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/customer/CrmCustomerController.java | 5 +- .../permission/CrmPermissionConvert.java | 2 +- .../customer/CrmCustomerServiceImpl.java | 49 ------------------- .../permission/CrmPermissionService.java | 1 + .../permission/CrmPermissionServiceImpl.java | 5 +- .../CrmBusinessStatusServiceImplTest.java | 0 .../CrmBusinessStatusTypeServiceImplTest.java | 0 7 files changed, 8 insertions(+), 54 deletions(-) delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/businessstatus/CrmBusinessStatusServiceImplTest.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/businessstatustype/CrmBusinessStatusTypeServiceImplTest.java 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 fc5bbe6a5..0da8f8fbf 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 @@ -35,6 +35,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSetByFlatMap; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static java.util.Collections.singletonList; @Tag(name = "管理后台 - CRM 客户") @RestController @@ -114,6 +115,7 @@ public class CrmCustomerController { @OperateLog(type = EXPORT) public void exportCustomerExcel(@Valid CrmCustomerPageReqVO pageVO, HttpServletResponse response) throws IOException { + // TODO @puhui999:看看复用 getCustomerPage 方法;然后可以禁用下分页; List list = customerService.getCustomerPage(pageVO, getLoginUserId()).getList(); // 导出 Excel List datas = CrmCustomerConvert.INSTANCE.convertList02(list); @@ -167,7 +169,8 @@ public class CrmCustomerController { public CommonResult distributeCustomer(@RequestParam(value = "ids") List ids, @RequestParam(value = "ownerUserId") Long ownerUserId) { // 校验负责人是否存在 - adminUserApi.validateUserList(java.util.Collections.singletonList(ownerUserId)); + // TODO @puhui999:这个校验,是不是可以收到 validateUserList + adminUserApi.validateUserList(singletonList(ownerUserId)); // 领取公海数据 customerService.receiveCustomer(ids, ownerUserId); return success(true); diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/permission/CrmPermissionConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/permission/CrmPermissionConvert.java index cab0c76b3..5e2522849 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/permission/CrmPermissionConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/permission/CrmPermissionConvert.java @@ -61,6 +61,6 @@ public interface CrmPermissionConvert { id -> new CrmPermissionDO().setId(id).setLevel(updateReqVO.getLevel())); } - List convertList(List createBOs); + List convertList(List list); } 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 7d4f27ad0..925215c23 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 @@ -213,7 +213,6 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { if (customer.getOwnerUserId() != null) { throw exception(CUSTOMER_OWNER_EXISTS, customer.getName()); } - } private void validateCustomerIsLocked(CrmCustomerDO customer, Boolean pool) { @@ -228,54 +227,6 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { } } - // TODO @puhui999:合并到 receiveCustomer 里 - @Override - @Transactional(rollbackFor = Exception.class) - public void receive(Long id, Long userId) { - // 1. 校验存在 - CrmCustomerDO customer = customerMapper.selectById(id); - if (customer == null) { - throw exception(CUSTOMER_NOT_EXISTS); - } - // 1.2. 校验是否为公海数据 - if (customer.getOwnerUserId() != null) { - throw exception(CUSTOMER_NOT_IN_POOL); - } - - // 2. 领取公海数据-设置负责人 - customerMapper.updateById(new CrmCustomerDO().setId(customer.getId()).setOwnerUserId(userId)); - // 3. 创建负责人数据权限 - crmPermissionService.createPermission(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType()) - .setBizId(customer.getId()).setUserId(userId).setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); // 设置当前操作的人为负责人 - } - - @Override - @Transactional(rollbackFor = Exception.class) - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#id", level = CrmPermissionLevelEnum.OWNER) - public void putCustomerPool(Long id) { - // 1. 校验存在 - CrmCustomerDO customer = customerMapper.selectById(id); - if (customer == null) { - throw exception(CUSTOMER_NOT_EXISTS); - } - // TODO puhui999:校验合并到 validateCustomerOwnerExists、validateCustomerIsLocked - // 1.2. 校验是否为公海数据 - if (customer.getOwnerUserId() == null) { - throw exception(CUSTOMER_IN_POOL); - } - // 1.3. 校验客户是否锁定 - if (customer.getLockStatus()) { - throw exception(CUSTOMER_LOCKED_PUT_POOL_FAIL); - } - - // 2. 设置负责人为 NULL - // TODO @puhui999:updateById 这么操作,是无法设置 null 的; - customerMapper.updateById(new CrmCustomerDO().setId(customer.getId()).setOwnerUserId(null)); - // 3. 删除负责人数据权限 - crmPermissionService.deletePermission(CrmBizTypeEnum.CRM_CUSTOMER.getType(), customer.getId(), - CrmPermissionLevelEnum.OWNER.getLevel()); - } - @Override public List getCustomerList() { return customerMapper.selectList(); diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java index b7df1f4a0..516298e5a 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java @@ -61,6 +61,7 @@ public interface CrmPermissionService { * 批量删除数据权限 * * @param ids 权限编号 + * @param userId 用户编号 */ void deletePermissionBatch(Collection ids, Long userId); diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java index dc584fce7..021aa57aa 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java @@ -19,7 +19,6 @@ import javax.annotation.Resource; import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.Set; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; @@ -141,8 +140,8 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { if (CollUtil.isEmpty(permissions)) { throw exception(CRM_PERMISSION_NOT_EXISTS); } - Set bizIds = convertSet(permissions, CrmPermissionDO::getBizId); - if (bizIds.size() > 1) { // 情况一:数据权限的模块数据编号是一致的不可能存在两个 + // 校验:数据权限的模块数据编号是一致的不可能存在两个 + if (convertSet(permissions, CrmPermissionDO::getBizId).size() > 1) { throw exception(CRM_PERMISSION_DELETE_FAIL); } // 校验操作人是否为负责人 diff --git a/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/businessstatus/CrmBusinessStatusServiceImplTest.java b/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/businessstatus/CrmBusinessStatusServiceImplTest.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/businessstatustype/CrmBusinessStatusTypeServiceImplTest.java b/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/businessstatustype/CrmBusinessStatusTypeServiceImplTest.java deleted file mode 100644 index e69de29bb..000000000 From 6c536caad40a74e25ddad516764317982c0a5d50 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Mon, 27 Nov 2023 21:47:56 +0800 Subject: [PATCH 27/35] =?UTF-8?q?crm=EF=BC=9A=E5=AE=8C=E5=96=84=20code=20r?= =?UTF-8?q?eview=20=E6=95=B0=E6=8D=AE=E6=9D=83=E9=99=90=E6=8F=90=E5=88=B0?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/customer/CrmCustomerController.java | 6 ++---- .../admin/permission/CrmPermissionController.java | 2 +- .../crm/service/customer/CrmCustomerServiceImpl.java | 8 +++++++- 3 files changed, 10 insertions(+), 6 deletions(-) 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 0da8f8fbf..61489f7e6 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 @@ -31,6 +31,7 @@ import java.util.Map; import java.util.stream.Stream; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.pojo.PageParam.PAGE_SIZE_NONE; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSetByFlatMap; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; @@ -115,7 +116,7 @@ public class CrmCustomerController { @OperateLog(type = EXPORT) public void exportCustomerExcel(@Valid CrmCustomerPageReqVO pageVO, HttpServletResponse response) throws IOException { - // TODO @puhui999:看看复用 getCustomerPage 方法;然后可以禁用下分页; + pageVO.setPageSize(PAGE_SIZE_NONE); // 不分页 List list = customerService.getCustomerPage(pageVO, getLoginUserId()).getList(); // 导出 Excel List datas = CrmCustomerConvert.INSTANCE.convertList02(list); @@ -168,9 +169,6 @@ public class CrmCustomerController { @PreAuthorize("@ss.hasPermission('crm:customer:distribute')") public CommonResult distributeCustomer(@RequestParam(value = "ids") List ids, @RequestParam(value = "ownerUserId") Long ownerUserId) { - // 校验负责人是否存在 - // TODO @puhui999:这个校验,是不是可以收到 validateUserList - adminUserApi.validateUserList(singletonList(ownerUserId)); // 领取公海数据 customerService.receiveCustomer(ids, ownerUserId); return success(true); diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.java index 2d593c7ce..10b188fbb 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.java @@ -80,7 +80,7 @@ public class CrmPermissionController { @DeleteMapping("/delete-self") @Operation(summary = "删除自己的数据权限") @Parameter(name = "id", description = "数据权限编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('crm:permission:delete')") // TODO puhui999: 数据权限在页面上只是已团队成员组件的形式出现,那么这个权限怎么分配? + @PreAuthorize("@ss.hasPermission('crm:permission:delete')") public CommonResult deleteSelfPermission(@RequestParam("id") Long id) { permissionService.deleteSelfPermission(id, getLoginUserId()); return success(true); 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 925215c23..bb389ac20 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 @@ -13,6 +13,7 @@ import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; 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; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -25,6 +26,7 @@ import java.util.Objects; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*; +import static java.util.Collections.singletonList; /** * 客户 Service 实现类 @@ -40,6 +42,8 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @Resource private CrmPermissionService crmPermissionService; + @Resource + private AdminUserApi adminUserApi; @Override @Transactional(rollbackFor = Exception.class) @@ -174,7 +178,9 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { if (customers.size() != ids.size()) { throw exception(CUSTOMER_NOT_EXISTS); } - // 1.2. 校验状态 + // 1.2. 校验负责人是否存在 + adminUserApi.validateUserList(singletonList(ownerUserId)); + // 1.3. 校验状态 customers.forEach(customer -> { // 校验是否已有负责人 validateCustomerOwnerExists(customer, false); From 158078933498ea610266d9434e69465628b9e188 Mon Sep 17 00:00:00 2001 From: zyna Date: Mon, 27 Nov 2023 23:42:04 +0800 Subject: [PATCH 28/35] =?UTF-8?q?crm=E8=81=94=E7=B3=BB=E4=BA=BAreview?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/contact/ContactController.java | 44 ++++++++-------- .../admin/contact/vo/ContactBaseVO.java | 7 +-- .../admin/contact/vo/ContactPageReqVO.java | 50 ++----------------- .../admin/contact/vo/ContactRespVO.java | 9 ++-- .../admin/contact/vo/ContactSimpleRespVO.java | 6 ++- .../crm/convert/contact/ContactConvert.java | 45 ++++++++++------- .../crm/dal/mysql/contact/ContactMapper.java | 20 -------- .../service/contact/ContactServiceImpl.java | 33 +++++++++++- 8 files changed, 97 insertions(+), 117 deletions(-) diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java index 32f72ddc9..87850cc7f 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java @@ -3,7 +3,9 @@ package cn.iocoder.yudao.module.crm.controller.admin.contact; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.NumberUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.number.NumberUtils; 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.contact.vo.*; @@ -28,14 +30,13 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; +import java.util.*; import java.util.stream.Stream; 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.framework.common.util.collection.CollectionUtils.convertListByFlatMap; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @@ -49,7 +50,6 @@ public class ContactController { @Resource private ContactService contactService; - // TODO @zyna:模块内,注入的变量,不用带 crm 前缀哈 @Resource private CrmCustomerService crmCustomerService; @@ -115,43 +115,41 @@ public class ContactController { if (CollUtil.isEmpty(pageResult.getList())) { return success(PageResult.empty(pageResult.getTotal())); } - List contactVOList = convertFieldValue2Name(pageResult.getList()); - return success(new PageResult<>(contactVOList, pageResult.getTotal())); + return success(convertFieldValue2Name(pageResult)); } - // TODO @zyna:可以看下新的导出写法,这里调整下 @GetMapping("/export-excel") @Operation(summary = "导出联系人 Excel") @PreAuthorize("@ss.hasPermission('crm:contact:export')") @OperateLog(type = EXPORT) public void exportContactExcel(@Valid ContactPageReqVO exportReqVO, - HttpServletResponse response) throws IOException { - List list = contactService.getContactList(exportReqVO); - // TODO @zya:可以改成直接调用 getContactPage 方法;只要把 ContactPageReqVO 设置成不分页,PAGE_SIZE_NONE - // 导出 Excel - List contactRespVOList = convertFieldValue2Name(list); - ExcelUtils.write(response, "crm 联系人.xls", "数据", ContactRespVO.class, contactRespVOList); + HttpServletResponse response) throws IOException { + exportReqVO.setPageNo(PageParam.PAGE_SIZE_NONE); + PageResult pageResult = contactService.getContactPage(exportReqVO); + PageResult exportPage = convertFieldValue2Name(pageResult); + ExcelUtils.write(response, "crm 联系人.xls", "数据", ContactRespVO.class, exportPage.getList()); } // TODO 芋艿:后续会合并下, + /** * 翻译字段名称 - * @param contactDOList 联系人List + * + * @param pageResult 联系人分页参数 * @return List */ - private List convertFieldValue2Name(List contactDOList){ + private PageResult convertFieldValue2Name(PageResult pageResult) { + List contactDOList = pageResult.getList(); // 1. 获取客户列表 - // TODO @zyna:简单的转换,可以使用 CollectionUtils.convertSet - List customerIdList = contactDOList.stream().map(ContactDO::getCustomerId).distinct().collect(Collectors.toList()); - List crmCustomerDOList = crmCustomerService.getCustomerList(customerIdList); + List crmCustomerDOList = crmCustomerService.getCustomerList(convertSet(contactDOList, ContactDO::getCustomerId)); // 2. 获取创建人、责任人列表 - // TODO @zyna:简单的转换,可以使用 CollectionUtils.convertSetByFlatMap - List userIdsList = contactDOList.stream().flatMap(item-> Stream.of(Long.parseLong(item.getCreator()),item.getOwnerUserId()).distinct()).collect(Collectors.toList()); + List userIdsList = convertListByFlatMap(contactDOList, item -> Stream.of(NumberUtils.parseLong(item.getCreator()), item.getOwnerUserId()) + .filter(Objects::nonNull)); Map userMap = adminUserApi.getUserMap(userIdsList); // 3. 直属上级 - List contactIdsList = contactDOList.stream().map(ContactDO::getParentId).distinct().collect(Collectors.toList()); + Set contactIdsList = convertSet(contactDOList, ContactDO::getParentId); List contactList = contactService.getContactList(contactIdsList); - return ContactConvert.INSTANCE.converList(contactDOList,userMap,crmCustomerDOList,contactList); + return ContactConvert.INSTANCE.convertPage(pageResult, userMap, crmCustomerDOList, contactList); } } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java index 6f6a57891..250e78193 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java @@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.common.validation.Telephone; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; import cn.iocoder.yudao.module.infra.enums.DictTypeConstants; -import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -24,6 +24,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data +@ExcelIgnoreUnannotated public class ContactBaseVO { @ExcelProperty(value = "姓名",order = 1) @@ -32,7 +33,6 @@ public class ContactBaseVO { private String name; @Schema(description = "客户编号", example = "10795") - @ExcelIgnore private Long customerId; @ExcelProperty(value = "性别", converter = DictConvert.class, order = 3) @@ -50,7 +50,6 @@ public class ContactBaseVO { private Boolean master; @Schema(description = "直属上级", example = "23457") - @ExcelIgnore private Long parentId; @Schema(description = "手机号",example = "1387171766") @@ -97,11 +96,9 @@ public class ContactBaseVO { @Schema(description = "负责人用户编号", example = "14334") @NotNull(message = "负责人不能为空") - @ExcelIgnore // TODO @zyna:可以使用 ExcelIgnoreUnannotated private Long ownerUserId; @Schema(description = "地区编号", example = "20158") - @ExcelIgnore private Integer areaId; } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactPageReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactPageReqVO.java index db408405e..3d7f0d260 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactPageReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactPageReqVO.java @@ -5,26 +5,20 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @Schema(description = "管理后台 - CRM 联系人分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) public class ContactPageReqVO extends PageParam { - - // TODO @zyna:筛选条件(多余的可以删除哈)还有部分 example 少了,可以补充下; // ●客户: // ●姓名: // ●手机、电话、座机、QQ、微信、邮箱 + @Schema(description = "姓名", example = "芋艿") + private String name; - @Schema(description = "下次联系时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] nextTime; + @Schema(description = "客户编号", example = "10795") + private Long customerId; @Schema(description = "手机号", example = "13898273941") private String mobile; @@ -35,45 +29,9 @@ public class ContactPageReqVO extends PageParam { @Schema(description = "电子邮箱", example = "111@22.com") private String email; - @Schema(description = "客户编号", example = "10795") - private Long customerId; - - @Schema(description = "地址") - private String address; - - @Schema(description = "备注", example = "你说的对") - private String remark; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - - @Schema(description = "最后跟进时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] lastTime; - - @Schema(description = "直属上级", example = "23457") - private Long parentId; - - @Schema(description = "姓名", example = "芋艿") - private String name; - - @Schema(description = "职位") - private String post; - @Schema(description = "QQ", example = "3882872") private Long qq; @Schema(description = "微信", example = "zzZ98373") private String wechat; - - @Schema(description = "性别") - private Integer sex; - - @Schema(description = "是否关键决策人") - private Boolean master; - - @Schema(description = "负责人用户编号", example = "14334") - private Long ownerUserId; - } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactRespVO.java index 438a0b336..0e76fa398 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactRespVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactRespVO.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.crm.controller.admin.contact.vo; -import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; @@ -10,18 +10,21 @@ import java.time.LocalDateTime; @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) +@ExcelIgnoreUnannotated public class ContactRespVO extends ContactBaseVO { @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "3167") - @ExcelIgnore private Long id; @Schema(description = "创建时间") @ExcelProperty(value = "创建时间",order = 8) private LocalDateTime createTime; + @Schema(description = "更新时间") + @ExcelProperty(value = "更新时间",order = 8) + private LocalDateTime updateTime; + @Schema(description = "创建人", example = "25682") - @ExcelIgnore private String creator; @Schema(description = "创建人名字", example = "test") diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactSimpleRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactSimpleRespVO.java index 98d7da034..51342d353 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactSimpleRespVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactSimpleRespVO.java @@ -8,10 +8,12 @@ import lombok.ToString; @Data @ToString(callSuper = true) public class ContactSimpleRespVO { - @Schema(description = "姓名", example = "芋艿") // TODO @zyna:requiredMode = Schema.RequiredMode.REQUIRED;需要空一行;字段的顺序改下,id 在 name 前面,会更干净 - private String name; @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "3167") private Long id; + @Schema(description = "姓名", example = "芋艿") + private String name; + + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java index c4452e076..81767422d 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java @@ -11,10 +11,12 @@ import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Mappings; import org.mapstruct.factory.Mappers; + import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen; /** @@ -37,6 +39,11 @@ public interface ContactConvert { PageResult convertPage(PageResult page); + default PageResult convertPage(PageResult pageResult, Map userMap, + List customerList, List parentContactList) { + List list = converList(pageResult.getList(), userMap, customerList, parentContactList); + return convertPage(pageResult).setList(list); + } List convertAllList(List list); @Mappings({ @@ -48,31 +55,35 @@ public interface ContactConvert { /** * 转换详情信息 * - * @param contactDO 联系人 - * @param userMap 用户列表 + * @param contactDO 联系人 + * @param userMap 用户列表 * @param crmCustomerDOList 客户 * @return ContactRespVO */ - default ContactRespVO convert(ContactDO contactDO, Map userMap, List crmCustomerDOList, - List contactList) { + default ContactRespVO convert(ContactDO contactDO, Map userMap, List crmCustomerDOList, + List contactList) { ContactRespVO contactVO = convert(contactDO); setUserInfo(contactVO, userMap); - Map ustomerMap = crmCustomerDOList.stream().collect(Collectors.toMap(CrmCustomerDO::getId,v->v)); - Map contactMap = contactList.stream().collect(Collectors.toMap(ContactDO::getId,v->v)); + Map ustomerMap = crmCustomerDOList.stream().collect(Collectors.toMap(CrmCustomerDO::getId, v -> v)); + Map contactMap = contactList.stream().collect(Collectors.toMap(ContactDO::getId, v -> v)); findAndThen(ustomerMap, contactDO.getCustomerId(), customer -> contactVO.setCustomerName(customer.getName())); findAndThen(contactMap, contactDO.getParentId(), contact -> contactVO.setParentName(contact.getName())); return contactVO; } - default List converList(List contactList, Map userMap, - List customerList, List parentContactList) { + + default List converList(List contactList, Map userMap, + List customerList, List parentContactList) { List result = convertList(contactList); - // TODO @zyna:简单的转换,可以使用 CollectionUtils.convertMap - Map parentContactMap = parentContactList.stream().collect(Collectors.toMap(ContactDO::getId,v->v)); - Map customerMap = customerList.stream().collect(Collectors.toMap(CrmCustomerDO::getId,v->v)); + Map parentContactMap = convertMap(parentContactList, ContactDO::getId); + Map customerMap = convertMap(customerList, CrmCustomerDO::getId); result.forEach(item -> { setUserInfo(item, userMap); - findAndThen(customerMap,item.getCustomerId(),customer -> {item.setCustomerName(customer.getName());}); - findAndThen(parentContactMap,item.getParentId(),contactDO -> {item.setParentName(contactDO.getName());}); + findAndThen(customerMap, item.getCustomerId(), customer -> { + item.setCustomerName(customer.getName()); + }); + findAndThen(parentContactMap, item.getParentId(), contactDO -> { + item.setParentName(contactDO.getName()); + }); }); return result; } @@ -80,13 +91,13 @@ public interface ContactConvert { /** * 设置用户信息 * - * @param contactRespVO 联系人Response VO - * @param userMap 用户信息 map + * @param contactRespVO 联系人Response VO + * @param userMap 用户信息 map */ - static void setUserInfo(ContactRespVO contactRespVO, Map userMap){ + static void setUserInfo(ContactRespVO contactRespVO, Map userMap) { contactRespVO.setAreaName(AreaUtils.format(contactRespVO.getAreaId())); findAndThen(userMap, contactRespVO.getOwnerUserId(), user -> { - contactRespVO.setOwnerUserName(user == null?"":user.getNickname()); + contactRespVO.setOwnerUserName(user == null ? "" : user.getNickname()); }); findAndThen(userMap, Long.parseLong(contactRespVO.getCreator()), user -> contactRespVO.setCreatorName(user.getNickname())); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/ContactMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/ContactMapper.java index 9db1691cb..1ccb9e662 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/ContactMapper.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/ContactMapper.java @@ -19,45 +19,25 @@ public interface ContactMapper extends BaseMapperX { default PageResult selectPage(ContactPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() - .betweenIfPresent(ContactDO::getNextTime, reqVO.getNextTime()) .eqIfPresent(ContactDO::getMobile, reqVO.getMobile()) .eqIfPresent(ContactDO::getTelephone, reqVO.getTelephone()) .eqIfPresent(ContactDO::getEmail, reqVO.getEmail()) .eqIfPresent(ContactDO::getCustomerId, reqVO.getCustomerId()) - .eqIfPresent(ContactDO::getAddress, reqVO.getAddress()) - .eqIfPresent(ContactDO::getRemark, reqVO.getRemark()) - .betweenIfPresent(ContactDO::getCreateTime, reqVO.getCreateTime()) - .betweenIfPresent(ContactDO::getLastTime, reqVO.getLastTime()) - .eqIfPresent(ContactDO::getParentId, reqVO.getParentId()) .likeIfPresent(ContactDO::getName, reqVO.getName()) - .eqIfPresent(ContactDO::getPost, reqVO.getPost()) .eqIfPresent(ContactDO::getQq, reqVO.getQq()) .eqIfPresent(ContactDO::getWechat, reqVO.getWechat()) - .eqIfPresent(ContactDO::getSex, reqVO.getSex()) - .eqIfPresent(ContactDO::getMaster, reqVO.getMaster()) - .eqIfPresent(ContactDO::getOwnerUserId, reqVO.getOwnerUserId()) .orderByDesc(ContactDO::getId)); } default List selectList(ContactPageReqVO reqVO) { return selectList(new LambdaQueryWrapperX() - .betweenIfPresent(ContactDO::getNextTime, reqVO.getNextTime()) .eqIfPresent(ContactDO::getMobile, reqVO.getMobile()) .eqIfPresent(ContactDO::getTelephone, reqVO.getTelephone()) .eqIfPresent(ContactDO::getEmail, reqVO.getEmail()) .eqIfPresent(ContactDO::getCustomerId, reqVO.getCustomerId()) - .eqIfPresent(ContactDO::getAddress, reqVO.getAddress()) - .eqIfPresent(ContactDO::getRemark, reqVO.getRemark()) - .betweenIfPresent(ContactDO::getCreateTime, reqVO.getCreateTime()) - .betweenIfPresent(ContactDO::getLastTime, reqVO.getLastTime()) - .eqIfPresent(ContactDO::getParentId, reqVO.getParentId()) .likeIfPresent(ContactDO::getName, reqVO.getName()) - .eqIfPresent(ContactDO::getPost, reqVO.getPost()) .eqIfPresent(ContactDO::getQq, reqVO.getQq()) .eqIfPresent(ContactDO::getWechat, reqVO.getWechat()) - .eqIfPresent(ContactDO::getSex, reqVO.getSex()) - .eqIfPresent(ContactDO::getMaster, reqVO.getMaster()) - .eqIfPresent(ContactDO::getOwnerUserId, reqVO.getOwnerUserId()) .orderByDesc(ContactDO::getId)); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java index e7408b836..94c4d1e11 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.crm.service.contact; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactBaseVO; import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactCreateReqVO; import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactPageReqVO; import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactUpdateReqVO; @@ -12,8 +13,10 @@ import cn.iocoder.yudao.module.crm.dal.mysql.contact.ContactMapper; import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission; import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; +import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; 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; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -21,9 +24,12 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.Collection; import java.util.List; +import java.util.Optional; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CONTACT_NOT_EXISTS; +import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CUSTOMER_NOT_EXISTS; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_NOT_EXISTS; /** * crm联系人 Service 实现类 @@ -37,11 +43,20 @@ public class ContactServiceImpl implements ContactService { @Resource private ContactMapper contactMapper; + @Resource + private CrmCustomerService customerService; + + @Resource + private AdminUserApi adminUserApi; + @Resource private CrmPermissionService crmPermissionService; - @Override // TODO @zyna:新增和修改时,关联字段要校验,例如说 直属上级,是不是真的存在; + @Override public Long createContact(ContactCreateReqVO createReqVO, Long userId) { + //@todo + //校验 + validateDataExist(createReqVO); // 插入 ContactDO contact = ContactConvert.INSTANCE.convert(createReqVO); contactMapper.insert(contact); @@ -60,6 +75,7 @@ public class ContactServiceImpl implements ContactService { public void updateContact(ContactUpdateReqVO updateReqVO) { // 校验存在 validateContactExists(updateReqVO.getId()); + validateDataExist(updateReqVO); // 更新 ContactDO updateObj = ContactConvert.INSTANCE.convert(updateReqVO); contactMapper.updateById(updateObj); @@ -109,4 +125,19 @@ public class ContactServiceImpl implements ContactService { public List getContactList() { return contactMapper.selectList(); } + + private void validateDataExist(ContactBaseVO contactBaseVO){ + //1.校验客户 + if (contactBaseVO.getCustomerId() != null) { + Optional.ofNullable(customerService.getCustomer(contactBaseVO.getCustomerId())).orElseThrow(() -> exception(CUSTOMER_NOT_EXISTS)); + } + //2.校验负责人 + if (contactBaseVO.getOwnerUserId() != null) { + Optional.ofNullable(adminUserApi.getUser(contactBaseVO.getOwnerUserId())).orElseThrow(() -> exception(USER_NOT_EXISTS)); + } + //3.直属上级 + if (contactBaseVO.getParentId() != null) { + Optional.ofNullable(contactMapper.selectById(contactBaseVO.getParentId())).orElseThrow(() -> exception(CONTACT_NOT_EXISTS)); + } + } } From 79600774ecc8f3111361e92c420140f7ffa18dea Mon Sep 17 00:00:00 2001 From: puhui999 Date: Tue, 28 Nov 2023 14:27:36 +0800 Subject: [PATCH 29/35] =?UTF-8?q?crm-=E5=AE=A2=E6=88=B7=EF=BC=9A=E5=88=86?= =?UTF-8?q?=E9=A1=B5=E6=9F=A5=E8=AF=A2=20mapper=20=E8=BF=98=E6=98=AF?= =?UTF-8?q?=E5=BE=97=E6=8B=86=E6=88=90=E4=B8=A4=E4=B8=AA=EF=BC=8C=E6=80=8E?= =?UTF-8?q?=E4=B9=88=E6=9F=A5=E9=80=BB=E8=BE=91=E4=BA=A4=E7=BB=99=20servic?= =?UTF-8?q?e=20=E5=8E=BB=E5=81=9A=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../permission/CrmPermissionConvert.java | 2 +- .../dal/mysql/customer/CrmCustomerMapper.java | 72 ++++++++++--------- .../customer/CrmCustomerServiceImpl.java | 7 +- .../admin/banner/vo/BannerPageReqVO.java | 5 +- 4 files changed, 45 insertions(+), 41 deletions(-) diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/permission/CrmPermissionConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/permission/CrmPermissionConvert.java index 5e2522849..0f3c77e5f 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/permission/CrmPermissionConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/permission/CrmPermissionConvert.java @@ -23,7 +23,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAnd /** * Crm 数据权限 Convert * - * @author Wanwan + * @author HUIHUI */ @Mapper public interface CrmPermissionConvert { 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 f996b8601..1bd039fb2 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 @@ -25,47 +25,25 @@ import java.util.List; @Mapper public interface CrmCustomerMapper extends BaseMapperX { - static void appendQueryParams(MPJLambdaWrapperX mpjLambdaWrapperX, CrmCustomerPageReqVO pageReqVO, Long userId) { - if (pageReqVO.getPool()) { // 情况一:公海 - mpjLambdaWrapperX.isNull(CrmCustomerDO::getOwnerUserId); - } else { // 情况二:不是公海 - mpjLambdaWrapperX.isNotNull(CrmCustomerDO::getOwnerUserId); - } - // TODO 场景数据过滤 - if (CrmSceneEnum.isOwner(pageReqVO.getSceneType())) { // 场景一:我负责的数据 - mpjLambdaWrapperX.eq(CrmCustomerDO::getOwnerUserId, userId); - } - } - - static void appendQueryParams(LambdaQueryWrapperX lambdaQueryWrapperX, CrmCustomerPageReqVO pageReqVO, Long userId) { - if (pageReqVO.getPool()) { // 情况一:公海 - lambdaQueryWrapperX.isNull(CrmCustomerDO::getOwnerUserId); - } else { // 情况二:不是公海 - lambdaQueryWrapperX.isNotNull(CrmCustomerDO::getOwnerUserId); - } - // TODO 场景数据过滤 - if (CrmSceneEnum.isOwner(pageReqVO.getSceneType())) { // 场景一:我负责的数据 - lambdaQueryWrapperX.eq(CrmCustomerDO::getOwnerUserId, userId); - } - } - default int updateOwnerUserIdById(Long id, Long ownerUserId) { return update(new LambdaUpdateWrapper() .eq(CrmCustomerDO::getId, id) .set(CrmCustomerDO::getOwnerUserId, ownerUserId)); } - default PageResult selectPage(CrmCustomerPageReqVO pageReqVO, Long userId, Boolean admin) { - if (admin) { // 情况一:管理员查看 - LambdaQueryWrapperX queryWrapperX = new LambdaQueryWrapperX<>(); - appendQueryParams(queryWrapperX, pageReqVO, userId); - return selectPage(pageReqVO, queryWrapperX - .likeIfPresent(CrmCustomerDO::getName, pageReqVO.getName()) - .eqIfPresent(CrmCustomerDO::getMobile, pageReqVO.getMobile()) - .eqIfPresent(CrmCustomerDO::getIndustryId, pageReqVO.getIndustryId()) - .eqIfPresent(CrmCustomerDO::getLevel, pageReqVO.getLevel()) - .eqIfPresent(CrmCustomerDO::getSource, pageReqVO.getSource())); - } + default PageResult selectPageWithAdmin(CrmCustomerPageReqVO pageReqVO, Long userId) { + // 情况一:管理员查看 + LambdaQueryWrapperX queryWrapperX = new LambdaQueryWrapperX<>(); + appendQueryParams(queryWrapperX, pageReqVO, userId); + return selectPage(pageReqVO, queryWrapperX + .likeIfPresent(CrmCustomerDO::getName, pageReqVO.getName()) + .eqIfPresent(CrmCustomerDO::getMobile, pageReqVO.getMobile()) + .eqIfPresent(CrmCustomerDO::getIndustryId, pageReqVO.getIndustryId()) + .eqIfPresent(CrmCustomerDO::getLevel, pageReqVO.getLevel()) + .eqIfPresent(CrmCustomerDO::getSource, pageReqVO.getSource())); + } + + default PageResult selectPage(CrmCustomerPageReqVO pageReqVO, Long userId) { // 情况二:获取当前用户能看的分页数据 IPage mpPage = MyBatisUtils.buildPage(pageReqVO); MPJLambdaWrapperX mpjLambdaWrapperX = new MPJLambdaWrapperX<>(); @@ -91,4 +69,28 @@ public interface CrmCustomerMapper extends BaseMapperX { return new PageResult<>(mpPage.getRecords(), mpPage.getTotal()); } + static void appendQueryParams(MPJLambdaWrapperX mpjLambdaWrapperX, CrmCustomerPageReqVO pageReqVO, Long userId) { + if (pageReqVO.getPool()) { // 情况一:公海 + mpjLambdaWrapperX.isNull(CrmCustomerDO::getOwnerUserId); + } else { // 情况二:不是公海 + mpjLambdaWrapperX.isNotNull(CrmCustomerDO::getOwnerUserId); + } + // TODO 场景数据过滤 + if (CrmSceneEnum.isOwner(pageReqVO.getSceneType())) { // 场景一:我负责的数据 + mpjLambdaWrapperX.eq(CrmCustomerDO::getOwnerUserId, userId); + } + } + + static void appendQueryParams(LambdaQueryWrapperX lambdaQueryWrapperX, CrmCustomerPageReqVO pageReqVO, Long userId) { + if (pageReqVO.getPool()) { // 情况一:公海 + lambdaQueryWrapperX.isNull(CrmCustomerDO::getOwnerUserId); + } else { // 情况二:不是公海 + lambdaQueryWrapperX.isNotNull(CrmCustomerDO::getOwnerUserId); + } + // TODO 场景数据过滤 + if (CrmSceneEnum.isOwner(pageReqVO.getSceneType())) { // 场景一:我负责的数据 + lambdaQueryWrapperX.eq(CrmCustomerDO::getOwnerUserId, userId); + } + } + } 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 bb389ac20..d12943321 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 @@ -100,9 +100,12 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @Override public PageResult getCustomerPage(CrmCustomerPageReqVO pageReqVO, Long userId) { - // 1.1. TODO 如果是超级管理员 boolean admin = false; - return customerMapper.selectPage(pageReqVO, userId, admin); + if (admin) { // 1.1. 情况一: TODO 如果是管理员 + customerMapper.selectPageWithAdmin(pageReqVO, userId); + } + // 1.2. 情况二:获取当前用户能看的分页数据 + return customerMapper.selectPage(pageReqVO, userId); } /** diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/banner/vo/BannerPageReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/banner/vo/BannerPageReqVO.java index d4efa0df1..c2ac49d71 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/banner/vo/BannerPageReqVO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/banner/vo/BannerPageReqVO.java @@ -19,11 +19,10 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ @ToString(callSuper = true) public class BannerPageReqVO extends PageParam { - // TODO @puhui999:example - @Schema(description = "标题") + @Schema(description = "标题", example = "这是一个标题") private String title; - @Schema(description = "状态") + @Schema(description = "状态", example = "1") @InEnum(CommonStatusEnum.class) private Integer status; From 36a51b68d93972bcb9693df02805ea04cb103c40 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 28 Nov 2023 20:36:57 +0800 Subject: [PATCH 30/35] =?UTF-8?q?crm=EF=BC=9Acode=20review=20=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/crm/service/customer/CrmCustomerServiceImpl.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 d12943321..f24e16a1c 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 @@ -42,6 +42,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @Resource private CrmPermissionService crmPermissionService; + @Resource private AdminUserApi adminUserApi; @@ -101,7 +102,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @Override public PageResult getCustomerPage(CrmCustomerPageReqVO pageReqVO, Long userId) { boolean admin = false; - if (admin) { // 1.1. 情况一: TODO 如果是管理员 + if (admin) { // 1.1. 情况一: TODO 如果是管理员; TODO @puhui999:要不如果是超管,就复用 selectPage; customerMapper.selectPageWithAdmin(pageReqVO, userId); } // 1.2. 情况二:获取当前用户能看的分页数据 @@ -176,7 +177,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @Override @Transactional(rollbackFor = Exception.class) public void receiveCustomer(List ids, Long ownerUserId) { - // 1. 校验存在 + // 1.1 校验存在 List customers = customerMapper.selectBatchIds(ids); if (customers.size() != ids.size()) { throw exception(CUSTOMER_NOT_EXISTS); From 1a93e3a1101243fb249b98d277fe20603c11accb Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 28 Nov 2023 21:07:23 +0800 Subject: [PATCH 31/35] =?UTF-8?q?crm=EF=BC=9Acode=20review=20=E8=81=94?= =?UTF-8?q?=E7=B3=BB=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/contact/ContactController.java | 2 +- .../controller/admin/contact/vo/ContactBaseVO.java | 2 +- .../admin/contact/vo/ContactSimpleRespVO.java | 3 +-- .../module/crm/convert/contact/ContactConvert.java | 4 ++-- .../crm/service/contact/ContactServiceImpl.java | 13 +++++++------ 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java index 87850cc7f..5f3da2d91 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java @@ -144,7 +144,7 @@ public class ContactController { List crmCustomerDOList = crmCustomerService.getCustomerList(convertSet(contactDOList, ContactDO::getCustomerId)); // 2. 获取创建人、责任人列表 List userIdsList = convertListByFlatMap(contactDOList, item -> Stream.of(NumberUtils.parseLong(item.getCreator()), item.getOwnerUserId()) - .filter(Objects::nonNull)); + .filter(Objects::nonNull)); // TODO @zyna:里面已经忽略 null 啦 Map userMap = adminUserApi.getUserMap(userIdsList); // 3. 直属上级 Set contactIdsList = convertSet(contactDOList, ContactDO::getParentId); diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java index 250e78193..c15b882dc 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java @@ -18,7 +18,7 @@ import java.time.LocalDateTime; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -// TODO zyna:参考新的 vo,重新拆分下 VO +// TODO zyna:要不按照新的,干掉这个 basevo,都放子类里 /** * CRM 联系人 Base VO,提供给添加、修改、详细的子 VO 使用 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactSimpleRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactSimpleRespVO.java index 51342d353..872a0c77d 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactSimpleRespVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactSimpleRespVO.java @@ -14,6 +14,5 @@ public class ContactSimpleRespVO { @Schema(description = "姓名", example = "芋艿") private String name; - - + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java index 81767422d..ea2c614f4 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java @@ -78,10 +78,10 @@ public interface ContactConvert { Map customerMap = convertMap(customerList, CrmCustomerDO::getId); result.forEach(item -> { setUserInfo(item, userMap); - findAndThen(customerMap, item.getCustomerId(), customer -> { + findAndThen(customerMap, item.getCustomerId(), customer -> { // TODO @zyna:这里的 { 可以去掉 item.setCustomerName(customer.getName()); }); - findAndThen(parentContactMap, item.getParentId(), contactDO -> { + findAndThen(parentContactMap, item.getParentId(), contactDO -> { // TODO @zyna:这里的 { 可以去掉 item.setParentName(contactDO.getName()); }); }); diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java index 94c4d1e11..d0c9f1226 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java @@ -45,13 +45,12 @@ public class ContactServiceImpl implements ContactService { @Resource private CrmCustomerService customerService; + @Resource + private CrmPermissionService crmPermissionService; @Resource private AdminUserApi adminUserApi; - @Resource - private CrmPermissionService crmPermissionService; - @Override public Long createContact(ContactCreateReqVO createReqVO, Long userId) { //@todo @@ -126,18 +125,20 @@ public class ContactServiceImpl implements ContactService { return contactMapper.selectList(); } + // TODO 芋艿:后面在看下这个方法; private void validateDataExist(ContactBaseVO contactBaseVO){ - //1.校验客户 + // 1.校验客户 if (contactBaseVO.getCustomerId() != null) { Optional.ofNullable(customerService.getCustomer(contactBaseVO.getCustomerId())).orElseThrow(() -> exception(CUSTOMER_NOT_EXISTS)); } - //2.校验负责人 + // 2.校验负责人 if (contactBaseVO.getOwnerUserId() != null) { Optional.ofNullable(adminUserApi.getUser(contactBaseVO.getOwnerUserId())).orElseThrow(() -> exception(USER_NOT_EXISTS)); } - //3.直属上级 + // 3.直属上级 if (contactBaseVO.getParentId() != null) { Optional.ofNullable(contactMapper.selectById(contactBaseVO.getParentId())).orElseThrow(() -> exception(CONTACT_NOT_EXISTS)); } } + } From 53b8e37f36236ba3789abb80807fce7381a27902 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 29 Nov 2023 22:33:47 +0800 Subject: [PATCH 32/35] =?UTF-8?q?crm:=20=E5=A2=9E=E5=8A=A0=E8=81=94?= =?UTF-8?q?=E7=B3=BB=E4=BA=BA=EF=BC=8C=E5=9F=BA=E4=BA=8E=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=9A=84=E8=AF=BB=E5=8F=96=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...troller.java => CrmContactController.java} | 86 ++++++++------- ...ntactBaseVO.java => CrmContactBaseVO.java} | 2 +- ...eReqVO.java => CrmContactCreateReqVO.java} | 2 +- ...ageReqVO.java => CrmContactPageReqVO.java} | 7 +- ...ntactRespVO.java => CrmContactRespVO.java} | 19 ++-- ...espVO.java => CrmContactSimpleRespVO.java} | 6 +- ...eReqVO.java => CrmContactUpdateReqVO.java} | 2 +- .../crm/convert/contact/ContactConvert.java | 40 +++---- .../{ContactDO.java => CrmContactDO.java} | 4 +- .../crm/dal/mysql/contact/ContactMapper.java | 44 -------- .../dal/mysql/contact/CrmContactMapper.java | 43 ++++++++ .../crm/service/contact/ContactService.java | 80 -------------- .../service/contact/CrmContactService.java | 87 +++++++++++++++ ...ceImpl.java => CrmContactServiceImpl.java} | 103 +++++++++--------- .../crm/service/contact/package-info.java | 4 - .../customer/CrmCustomerServiceImpl.java | 9 +- 16 files changed, 276 insertions(+), 262 deletions(-) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/{ContactController.java => CrmContactController.java} (62%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/{ContactBaseVO.java => CrmContactBaseVO.java} (99%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/{ContactCreateReqVO.java => CrmContactCreateReqVO.java} (84%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/{ContactPageReqVO.java => CrmContactPageReqVO.java} (87%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/{ContactRespVO.java => CrmContactRespVO.java} (70%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/{ContactSimpleRespVO.java => CrmContactSimpleRespVO.java} (77%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/{ContactUpdateReqVO.java => CrmContactUpdateReqVO.java} (89%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/{ContactDO.java => CrmContactDO.java} (96%) delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/ContactMapper.java create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/CrmContactMapper.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactService.java create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactService.java rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/{ContactServiceImpl.java => CrmContactServiceImpl.java} (57%) delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/package-info.java diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/CrmContactController.java similarity index 62% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/CrmContactController.java index 5f3da2d91..b39331338 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/CrmContactController.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.crm.controller.admin.contact; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.NumberUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageParam; @@ -10,10 +11,10 @@ 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.contact.vo.*; import cn.iocoder.yudao.module.crm.convert.contact.ContactConvert; -import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO; +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.ContactService; +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; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; @@ -30,7 +31,9 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; -import java.util.*; +import java.util.Collections; +import java.util.List; +import java.util.Map; import java.util.stream.Stream; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -40,18 +43,17 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; -// TODO @zya:crm 所有的类,dou带 Crm 前缀,因为它的名字太通用了,可能和后续的 erp 之类的冲突 @Tag(name = "管理后台 - CRM 联系人") @RestController @RequestMapping("/crm/contact") @Validated @Slf4j -public class ContactController { +public class CrmContactController { @Resource - private ContactService contactService; + private CrmContactService contactService; @Resource - private CrmCustomerService crmCustomerService; + private CrmCustomerService customerService; @Resource private AdminUserApi adminUserApi; @@ -59,14 +61,14 @@ public class ContactController { @PostMapping("/create") @Operation(summary = "创建联系人") @PreAuthorize("@ss.hasPermission('crm:contact:create')") - public CommonResult createContact(@Valid @RequestBody ContactCreateReqVO createReqVO) { + public CommonResult createContact(@Valid @RequestBody CrmContactCreateReqVO createReqVO) { return success(contactService.createContact(createReqVO, getLoginUserId())); } @PutMapping("/update") @Operation(summary = "更新联系人") @PreAuthorize("@ss.hasPermission('crm:contact:update')") - public CommonResult updateContact(@Valid @RequestBody ContactUpdateReqVO updateReqVO) { + public CommonResult updateContact(@Valid @RequestBody CrmContactUpdateReqVO updateReqVO) { contactService.updateContact(updateReqVO); return success(true); } @@ -84,8 +86,8 @@ public class ContactController { @Operation(summary = "获得联系人") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('crm:contact:query')") - public CommonResult getContact(@RequestParam("id") Long id) { - ContactDO contact = contactService.getContact(id); + public CommonResult getContact(@RequestParam("id") Long id) { + CrmContactDO contact = contactService.getContact(id); if (contact == null) { throw exception(ErrorCodeConstants.CONTACT_NOT_EXISTS); } @@ -93,63 +95,69 @@ public class ContactController { Map userMap = adminUserApi.getUserMap(CollUtil.removeNull(Lists.newArrayList( NumberUtil.parseLong(contact.getCreator()), contact.getOwnerUserId()))); // 2. 获取客户信息 - List customerList = crmCustomerService.getCustomerList(Collections.singletonList(contact.getCustomerId())); + List customerList = customerService.getCustomerList(Collections.singletonList(contact.getCustomerId())); // 3. 直属上级 - List parentContactList = contactService.getContactList(Collections.singletonList(contact.getParentId())); + List parentContactList = contactService.getContactList(Collections.singletonList(contact.getParentId())); return success(ContactConvert.INSTANCE.convert(contact, userMap, customerList, parentContactList)); } @GetMapping("/simple-all-list") @Operation(summary = "获得联系人列表") @PreAuthorize("@ss.hasPermission('crm:contact:query')") - public CommonResult> getContactList() { - List list = contactService.getContactList(); + public CommonResult> getSimpleContactList() { + List list = contactService.getContactList(); return success(ContactConvert.INSTANCE.convertAllList(list)); } @GetMapping("/page") @Operation(summary = "获得联系人分页") @PreAuthorize("@ss.hasPermission('crm:contact:query')") - public CommonResult> getContactPage(@Valid ContactPageReqVO pageVO) { - PageResult pageResult = contactService.getContactPage(pageVO); - if (CollUtil.isEmpty(pageResult.getList())) { - return success(PageResult.empty(pageResult.getTotal())); - } - return success(convertFieldValue2Name(pageResult)); + public CommonResult> getContactPage(@Valid CrmContactPageReqVO pageVO) { + PageResult pageResult = contactService.getContactPage(pageVO); + return success(convertDetailContactPage(pageResult)); + } + + @GetMapping("/page-by-customer") + @Operation(summary = "获得联系人分页,基于指定客户") + public CommonResult> getContactPageByCustomer(@Valid CrmContactPageReqVO pageVO) { + Assert.notNull(pageVO.getCustomerId(), "客户编号不能为空"); + PageResult pageResult = contactService.getContactPageByCustomer(pageVO); + return success(convertDetailContactPage(pageResult)); } @GetMapping("/export-excel") @Operation(summary = "导出联系人 Excel") @PreAuthorize("@ss.hasPermission('crm:contact:export')") @OperateLog(type = EXPORT) - public void exportContactExcel(@Valid ContactPageReqVO exportReqVO, + public void exportContactExcel(@Valid CrmContactPageReqVO exportReqVO, HttpServletResponse response) throws IOException { exportReqVO.setPageNo(PageParam.PAGE_SIZE_NONE); - PageResult pageResult = contactService.getContactPage(exportReqVO); - PageResult exportPage = convertFieldValue2Name(pageResult); - ExcelUtils.write(response, "crm 联系人.xls", "数据", ContactRespVO.class, exportPage.getList()); + PageResult pageResult = contactService.getContactPage(exportReqVO); + ExcelUtils.write(response, "联系人.xls", "数据", CrmContactRespVO.class, + convertDetailContactPage(pageResult).getList()); } - // TODO 芋艿:后续会合并下, - /** - * 翻译字段名称 + * 转换成详细的联系人分页,即读取关联信息 * - * @param pageResult 联系人分页参数 - * @return List + * @param pageResult 联系人分页 + * @return 详细的联系人分页 */ - private PageResult convertFieldValue2Name(PageResult pageResult) { - List contactDOList = pageResult.getList(); + private PageResult convertDetailContactPage(PageResult pageResult) { + List contactList = pageResult.getList(); + if (CollUtil.isEmpty(contactList)) { + return PageResult.empty(pageResult.getTotal()); + } // 1. 获取客户列表 - List crmCustomerDOList = crmCustomerService.getCustomerList(convertSet(contactDOList, ContactDO::getCustomerId)); + List crmCustomerDOList = customerService.getCustomerList( + convertSet(contactList, CrmContactDO::getCustomerId)); // 2. 获取创建人、责任人列表 - List userIdsList = convertListByFlatMap(contactDOList, item -> Stream.of(NumberUtils.parseLong(item.getCreator()), item.getOwnerUserId()) - .filter(Objects::nonNull)); // TODO @zyna:里面已经忽略 null 啦 - Map userMap = adminUserApi.getUserMap(userIdsList); + Map userMap = adminUserApi.getUserMap(convertListByFlatMap(contactList, + contact -> Stream.of(NumberUtils.parseLong(contact.getCreator()), contact.getOwnerUserId()))); // 3. 直属上级 - Set contactIdsList = convertSet(contactDOList, ContactDO::getParentId); - List contactList = contactService.getContactList(contactIdsList); - return ContactConvert.INSTANCE.convertPage(pageResult, userMap, crmCustomerDOList, contactList); + List parentContactList = contactService.getContactList( + convertSet(contactList, CrmContactDO::getParentId)); + return ContactConvert.INSTANCE.convertPage(pageResult, userMap, crmCustomerDOList, parentContactList); } } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactBaseVO.java similarity index 99% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactBaseVO.java index c15b882dc..44e803cef 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactBaseVO.java @@ -25,7 +25,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ */ @Data @ExcelIgnoreUnannotated -public class ContactBaseVO { +public class CrmContactBaseVO { @ExcelProperty(value = "姓名",order = 1) @Schema(description = "姓名", example = "芋艿") diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactCreateReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactCreateReqVO.java similarity index 84% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactCreateReqVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactCreateReqVO.java index 5eccfea74..33f2db852 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactCreateReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactCreateReqVO.java @@ -9,6 +9,6 @@ import lombok.ToString; @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class ContactCreateReqVO extends ContactBaseVO { +public class CrmContactCreateReqVO extends CrmContactBaseVO { } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactPageReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactPageReqVO.java similarity index 87% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactPageReqVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactPageReqVO.java index 3d7f0d260..1adfc341d 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactPageReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactPageReqVO.java @@ -10,10 +10,8 @@ import lombok.ToString; @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class ContactPageReqVO extends PageParam { - // ●客户: - // ●姓名: - // ●手机、电话、座机、QQ、微信、邮箱 +public class CrmContactPageReqVO extends PageParam { + @Schema(description = "姓名", example = "芋艿") private String name; @@ -34,4 +32,5 @@ public class ContactPageReqVO extends PageParam { @Schema(description = "微信", example = "zzZ98373") private String wechat; + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactRespVO.java similarity index 70% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactRespVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactRespVO.java index 0e76fa398..e52f4d0c1 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactRespVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactRespVO.java @@ -11,24 +11,24 @@ import java.time.LocalDateTime; @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @ExcelIgnoreUnannotated -public class ContactRespVO extends ContactBaseVO { +public class CrmContactRespVO extends CrmContactBaseVO { @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "3167") private Long id; @Schema(description = "创建时间") - @ExcelProperty(value = "创建时间",order = 8) + @ExcelProperty(value = "创建时间", order = 8) private LocalDateTime createTime; @Schema(description = "更新时间") - @ExcelProperty(value = "更新时间",order = 8) + @ExcelProperty(value = "更新时间", order = 8) private LocalDateTime updateTime; @Schema(description = "创建人", example = "25682") private String creator; @Schema(description = "创建人名字", example = "test") - @ExcelProperty(value = "创建人",order = 8) + @ExcelProperty(value = "创建人", order = 8) private String creatorName; @ExcelProperty(value = "客户名称",order = 2) @@ -36,14 +36,15 @@ public class ContactRespVO extends ContactBaseVO { private String customerName; @Schema(description = "负责人", example = "test") - @ExcelProperty(value = "负责人",order = 7) + @ExcelProperty(value = "负责人", order = 7) private String ownerUserName; - @Schema(description = "直属上级名",example = "芋头") - @ExcelProperty(value = "直属上级",order = 4) + @Schema(description = "直属上级名", example = "芋头") + @ExcelProperty(value = "直属上级", order = 4) private String parentName; - @Schema(description = "地区名",example = "上海上海市浦东新区") - @ExcelProperty(value = "地区",order = 5) + @Schema(description = "地区名", example = "上海上海市浦东新区") + @ExcelProperty(value = "地区", order = 5) private String areaName; + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactSimpleRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactSimpleRespVO.java similarity index 77% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactSimpleRespVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactSimpleRespVO.java index 872a0c77d..4ebf44a30 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactSimpleRespVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactSimpleRespVO.java @@ -4,15 +4,15 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.ToString; -@Schema(description = "管理后台 - CRM 联系人 Response VO") +@Schema(description = "管理后台 - CRM 联系人的精简 Response VO") @Data @ToString(callSuper = true) -public class ContactSimpleRespVO { +public class CrmContactSimpleRespVO { @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "3167") private Long id; @Schema(description = "姓名", example = "芋艿") private String name; - + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactUpdateReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactUpdateReqVO.java similarity index 89% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactUpdateReqVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactUpdateReqVO.java index 809009b0e..58dedbbc4 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactUpdateReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactUpdateReqVO.java @@ -11,7 +11,7 @@ import javax.validation.constraints.NotNull; @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class ContactUpdateReqVO extends ContactBaseVO { +public class CrmContactUpdateReqVO extends CrmContactBaseVO { @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "3167") @NotNull(message = "主键不能为空") diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java index ea2c614f4..9b214941a 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.crm.convert.contact; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils; import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.*; -import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO; +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.permission.bo.CrmPermissionTransferReqBO; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; @@ -20,7 +20,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen; /** - * crm联系人 Convert + * CRM 联系人 Convert * * @author 芋道源码 */ @@ -29,22 +29,22 @@ public interface ContactConvert { ContactConvert INSTANCE = Mappers.getMapper(ContactConvert.class); - ContactDO convert(ContactCreateReqVO bean); + CrmContactDO convert(CrmContactCreateReqVO bean); - ContactDO convert(ContactUpdateReqVO bean); + CrmContactDO convert(CrmContactUpdateReqVO bean); - ContactRespVO convert(ContactDO bean); + CrmContactRespVO convert(CrmContactDO bean); - List convertList(List list); + List convertList(List list); - PageResult convertPage(PageResult page); + PageResult convertPage(PageResult page); - default PageResult convertPage(PageResult pageResult, Map userMap, - List customerList, List parentContactList) { - List list = converList(pageResult.getList(), userMap, customerList, parentContactList); + default PageResult convertPage(PageResult pageResult, Map userMap, + List customerList, List parentContactList) { + List list = converList(pageResult.getList(), userMap, customerList, parentContactList); return convertPage(pageResult).setList(list); } - List convertAllList(List list); + List convertAllList(List list); @Mappings({ @Mapping(target = "bizId", source = "reqVO.id"), @@ -60,21 +60,21 @@ public interface ContactConvert { * @param crmCustomerDOList 客户 * @return ContactRespVO */ - default ContactRespVO convert(ContactDO contactDO, Map userMap, List crmCustomerDOList, - List contactList) { - ContactRespVO contactVO = convert(contactDO); + default CrmContactRespVO convert(CrmContactDO contactDO, Map userMap, List crmCustomerDOList, + List contactList) { + CrmContactRespVO contactVO = convert(contactDO); setUserInfo(contactVO, userMap); Map ustomerMap = crmCustomerDOList.stream().collect(Collectors.toMap(CrmCustomerDO::getId, v -> v)); - Map contactMap = contactList.stream().collect(Collectors.toMap(ContactDO::getId, v -> v)); + Map contactMap = contactList.stream().collect(Collectors.toMap(CrmContactDO::getId, v -> v)); findAndThen(ustomerMap, contactDO.getCustomerId(), customer -> contactVO.setCustomerName(customer.getName())); findAndThen(contactMap, contactDO.getParentId(), contact -> contactVO.setParentName(contact.getName())); return contactVO; } - default List converList(List contactList, Map userMap, - List customerList, List parentContactList) { - List result = convertList(contactList); - Map parentContactMap = convertMap(parentContactList, ContactDO::getId); + default List converList(List contactList, Map userMap, + List customerList, List parentContactList) { + List result = convertList(contactList); + Map parentContactMap = convertMap(parentContactList, CrmContactDO::getId); Map customerMap = convertMap(customerList, CrmCustomerDO::getId); result.forEach(item -> { setUserInfo(item, userMap); @@ -94,7 +94,7 @@ public interface ContactConvert { * @param contactRespVO 联系人Response VO * @param userMap 用户信息 map */ - static void setUserInfo(ContactRespVO contactRespVO, Map userMap) { + static void setUserInfo(CrmContactRespVO contactRespVO, Map userMap) { contactRespVO.setAreaName(AreaUtils.format(contactRespVO.getAreaId())); findAndThen(userMap, contactRespVO.getOwnerUserId(), user -> { contactRespVO.setOwnerUserName(user == null ? "" : user.getNickname()); diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/ContactDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/CrmContactDO.java similarity index 96% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/ContactDO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/CrmContactDO.java index f5fd37f42..75d6bd565 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/ContactDO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/CrmContactDO.java @@ -21,7 +21,7 @@ import java.time.LocalDateTime; @Builder @NoArgsConstructor @AllArgsConstructor -public class ContactDO extends BaseDO { +public class CrmContactDO extends BaseDO { /** * 主键 @@ -63,7 +63,7 @@ public class ContactDO extends BaseDO { /** * 直属上级 * - * 关联 {@link ContactDO#id} + * 关联 {@link CrmContactDO#id} */ private Long parentId; /** diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/ContactMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/ContactMapper.java deleted file mode 100644 index 1ccb9e662..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/ContactMapper.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.iocoder.yudao.module.crm.dal.mysql.contact; - -import java.util.*; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO; -import org.apache.ibatis.annotations.Mapper; -import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.*; - -/** - * crm联系人 Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface ContactMapper extends BaseMapperX { - - default PageResult selectPage(ContactPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(ContactDO::getMobile, reqVO.getMobile()) - .eqIfPresent(ContactDO::getTelephone, reqVO.getTelephone()) - .eqIfPresent(ContactDO::getEmail, reqVO.getEmail()) - .eqIfPresent(ContactDO::getCustomerId, reqVO.getCustomerId()) - .likeIfPresent(ContactDO::getName, reqVO.getName()) - .eqIfPresent(ContactDO::getQq, reqVO.getQq()) - .eqIfPresent(ContactDO::getWechat, reqVO.getWechat()) - .orderByDesc(ContactDO::getId)); - } - - default List selectList(ContactPageReqVO reqVO) { - return selectList(new LambdaQueryWrapperX() - .eqIfPresent(ContactDO::getMobile, reqVO.getMobile()) - .eqIfPresent(ContactDO::getTelephone, reqVO.getTelephone()) - .eqIfPresent(ContactDO::getEmail, reqVO.getEmail()) - .eqIfPresent(ContactDO::getCustomerId, reqVO.getCustomerId()) - .likeIfPresent(ContactDO::getName, reqVO.getName()) - .eqIfPresent(ContactDO::getQq, reqVO.getQq()) - .eqIfPresent(ContactDO::getWechat, reqVO.getWechat()) - .orderByDesc(ContactDO::getId)); - } - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/CrmContactMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/CrmContactMapper.java new file mode 100644 index 000000000..b459e8f5c --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/CrmContactMapper.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.module.crm.dal.mysql.contact; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactPageReqVO; +import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * CRM 联系人 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface CrmContactMapper extends BaseMapperX { + + // TODO @puhui999:数据权限 + default PageResult selectPage(CrmContactPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(CrmContactDO::getMobile, reqVO.getMobile()) + .eqIfPresent(CrmContactDO::getTelephone, reqVO.getTelephone()) + .eqIfPresent(CrmContactDO::getEmail, reqVO.getEmail()) + .eqIfPresent(CrmContactDO::getCustomerId, reqVO.getCustomerId()) + .likeIfPresent(CrmContactDO::getName, reqVO.getName()) + .eqIfPresent(CrmContactDO::getQq, reqVO.getQq()) + .eqIfPresent(CrmContactDO::getWechat, reqVO.getWechat()) + .orderByDesc(CrmContactDO::getId)); + } + + default PageResult selectPageByCustomer(CrmContactPageReqVO pageVO) { + return selectPage(pageVO, new LambdaQueryWrapperX() + .eq(CrmContactDO::getCustomerId, pageVO.getCustomerId()) + .likeIfPresent(CrmContactDO::getName, pageVO.getName()) + .eqIfPresent(CrmContactDO::getMobile, pageVO.getMobile()) + .eqIfPresent(CrmContactDO::getTelephone, pageVO.getTelephone()) + .eqIfPresent(CrmContactDO::getEmail, pageVO.getEmail()) + .eqIfPresent(CrmContactDO::getQq, pageVO.getQq()) + .eqIfPresent(CrmContactDO::getWechat, pageVO.getWechat()) + .orderByDesc(CrmContactDO::getId)); + } + +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactService.java deleted file mode 100644 index f1278a529..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactService.java +++ /dev/null @@ -1,80 +0,0 @@ -package cn.iocoder.yudao.module.crm.service.contact; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactCreateReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactPageReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactUpdateReqVO; -import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; - -/** - * crm联系人 Service 接口 - * - * @author 芋道源码 - */ -public interface ContactService { - - /** - * 创建crm联系人 - * - * @param createReqVO 创建信息 - * @param userId 用户编号 - * @return 编号 - */ - Long createContact(@Valid ContactCreateReqVO createReqVO, Long userId); - - /** - * 更新crm联系人 - * - * @param updateReqVO 更新信息 - */ - void updateContact(@Valid ContactUpdateReqVO updateReqVO); - - /** - * 删除crm联系人 - * - * @param id 编号 - */ - void deleteContact(Long id); - - /** - * 获得crm联系人 - * - * @param id 编号 - * @return crm联系人 - */ - ContactDO getContact(Long id); - - /** - * 获得crm联系人列表 - * - * @param ids 编号 - * @return crm联系人列表 - */ - List getContactList(Collection ids); - - /** - * 获得crm联系人分页 - * - * @param pageReqVO 分页查询 - * @return crm联系人分页 - */ - PageResult getContactPage(ContactPageReqVO pageReqVO); - - /** - * 获得crm联系人列表, 用于 Excel 导出 - * - * @param exportReqVO 查询条件 - * @return crm联系人列表 - */ - List getContactList(ContactPageReqVO exportReqVO); - - /** - * 获取所有联系人列表,只返回姓名和id - * @return 所有联系人列表 - */ - List getContactList(); -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactService.java new file mode 100644 index 000000000..393f745c3 --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactService.java @@ -0,0 +1,87 @@ +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.CrmContactCreateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactPageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactUpdateReqVO; +import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO; +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * CRM 联系人 Service 接口 + * + * @author 芋道源码 + */ +public interface CrmContactService { + + /** + * 创建联系人 + * + * @param createReqVO 创建信息 + * @param userId 用户编号 + * @return 编号 + */ + Long createContact(@Valid CrmContactCreateReqVO createReqVO, Long userId); + + /** + * 更新联系人 + * + * @param updateReqVO 更新信息 + */ + void updateContact(@Valid CrmContactUpdateReqVO updateReqVO); + + /** + * 删除联系人 + * + * @param id 编号 + */ + void deleteContact(Long id); + + /** + * 获得联系人 + * + * @param id 编号 + * @return 联系人 + */ + CrmContactDO getContact(Long id); + + /** + * 获得联系人列表 + * + * @param ids 编号 + * @return 联系人列表 + */ + List getContactList(Collection ids); + + /** + * 获得联系人分页 + * + * 数据权限:基于 {@link CrmContactDO} + * + * @param pageReqVO 分页查询 + * @return 联系人分页 + */ + PageResult getContactPage(CrmContactPageReqVO pageReqVO); + + /** + * 获得联系人分页,基于指定客户 + * + * 数据权限:基于 {@link CrmCustomerDO} 读取 + * + * @param pageVO 分页查询 + * @return 联系人分页 + */ + PageResult getContactPageByCustomer(CrmContactPageReqVO pageVO); + + /** + * 获取所有联系人列表 + * + * @return 所有联系人列表 + */ + List getContactList(); + +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactServiceImpl.java similarity index 57% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactServiceImpl.java index d0c9f1226..81e5f25a7 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactServiceImpl.java @@ -3,13 +3,13 @@ package cn.iocoder.yudao.module.crm.service.contact; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactBaseVO; -import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactCreateReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactPageReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.ContactUpdateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactBaseVO; +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.CrmContactUpdateReqVO; import cn.iocoder.yudao.module.crm.convert.contact.ContactConvert; -import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO; -import cn.iocoder.yudao.module.crm.dal.mysql.contact.ContactMapper; +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.framework.core.annotations.CrmPermission; import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; @@ -24,7 +24,6 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.Collection; import java.util.List; -import java.util.Optional; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CONTACT_NOT_EXISTS; @@ -32,16 +31,16 @@ import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CUSTOMER_NOT_ import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_NOT_EXISTS; /** - * crm联系人 Service 实现类 + * CRM 联系人 Service 实现类 * * @author 芋道源码 */ @Service @Validated -public class ContactServiceImpl implements ContactService { +public class CrmContactServiceImpl implements CrmContactService { @Resource - private ContactMapper contactMapper; + private CrmContactMapper contactMapper; @Resource private CrmCustomerService customerService; @@ -52,36 +51,53 @@ public class ContactServiceImpl implements ContactService { private AdminUserApi adminUserApi; @Override - public Long createContact(ContactCreateReqVO createReqVO, Long userId) { - //@todo - //校验 - validateDataExist(createReqVO); - // 插入 - ContactDO contact = ContactConvert.INSTANCE.convert(createReqVO); + @Transactional(rollbackFor = Exception.class) + public Long createContact(CrmContactCreateReqVO createReqVO, Long userId) { + // 1.1 校验 + validateRelationDataExists(createReqVO); + // 1.2 插入 + CrmContactDO contact = ContactConvert.INSTANCE.convert(createReqVO); contactMapper.insert(contact); - // 创建数据权限 - crmPermissionService.createPermission(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_CONTACTS.getType()) - .setBizId(contact.getId()).setUserId(userId).setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); // 设置当前操作的人为负责人 - - // 返回 + // 2. 创建数据权限 + crmPermissionService.createPermission(new CrmPermissionCreateReqBO().setUserId(userId) + .setBizType(CrmBizTypeEnum.CRM_CONTACTS.getType()).setBizId(contact.getId()) + .setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); return contact.getId(); } @Override - @Transactional(rollbackFor = Exception.class) @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS, bizId = "#updateReqVO.id", level = CrmPermissionLevelEnum.WRITE) - public void updateContact(ContactUpdateReqVO updateReqVO) { - // 校验存在 + public void updateContact(CrmContactUpdateReqVO updateReqVO) { + // 1. 校验存在 validateContactExists(updateReqVO.getId()); - validateDataExist(updateReqVO); - // 更新 - ContactDO updateObj = ContactConvert.INSTANCE.convert(updateReqVO); + validateRelationDataExists(updateReqVO); + // 2. 更新 + CrmContactDO updateObj = ContactConvert.INSTANCE.convert(updateReqVO); contactMapper.updateById(updateObj); } + /** + * 校验关联的数据都存在 + * + * @param saveReqVO 新增/修改请求 VO + */ + private void validateRelationDataExists(CrmContactBaseVO saveReqVO){ + // 1. 校验客户 + if (saveReqVO.getCustomerId() != null && customerService.getCustomer(saveReqVO.getCustomerId()) == null) { + throw exception(CUSTOMER_NOT_EXISTS); + } + // 2. 校验负责人 + if (saveReqVO.getOwnerUserId() != null && adminUserApi.getUser(saveReqVO.getOwnerUserId()) == null) { + throw exception(USER_NOT_EXISTS); + } + // 3. 直属上级 + if (saveReqVO.getParentId() != null && contactMapper.selectById(saveReqVO.getParentId()) == null) { + throw exception(CONTACT_NOT_EXISTS); + } + } + @Override - @Transactional(rollbackFor = Exception.class) @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS, bizId = "#id", level = CrmPermissionLevelEnum.WRITE) public void deleteContact(Long id) { // 校验存在 @@ -96,14 +112,15 @@ public class ContactServiceImpl implements ContactService { } } + // TODO 芋艿:是否要做数据权限的校验??? @Override @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS, bizId = "#id", level = CrmPermissionLevelEnum.READ) - public ContactDO getContact(Long id) { + public CrmContactDO getContact(Long id) { return contactMapper.selectById(id); } @Override - public List getContactList(Collection ids) { + public List getContactList(Collection ids) { if (CollUtil.isEmpty(ids)) { return ListUtil.empty(); } @@ -111,34 +128,20 @@ public class ContactServiceImpl implements ContactService { } @Override - public PageResult getContactPage(ContactPageReqVO pageReqVO) { + public PageResult getContactPage(CrmContactPageReqVO pageReqVO) { + // TODO puhui999:后面要改成,基于数据权限的查询 return contactMapper.selectPage(pageReqVO); } @Override - public List getContactList(ContactPageReqVO exportReqVO) { - return contactMapper.selectList(exportReqVO); + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#pageVO.customerId", level = CrmPermissionLevelEnum.READ) + public PageResult getContactPageByCustomer(CrmContactPageReqVO pageVO) { + return contactMapper.selectPageByCustomer(pageVO); } @Override - public List getContactList() { + public List getContactList() { return contactMapper.selectList(); } - // TODO 芋艿:后面在看下这个方法; - private void validateDataExist(ContactBaseVO contactBaseVO){ - // 1.校验客户 - if (contactBaseVO.getCustomerId() != null) { - Optional.ofNullable(customerService.getCustomer(contactBaseVO.getCustomerId())).orElseThrow(() -> exception(CUSTOMER_NOT_EXISTS)); - } - // 2.校验负责人 - if (contactBaseVO.getOwnerUserId() != null) { - Optional.ofNullable(adminUserApi.getUser(contactBaseVO.getOwnerUserId())).orElseThrow(() -> exception(USER_NOT_EXISTS)); - } - // 3.直属上级 - if (contactBaseVO.getParentId() != null) { - Optional.ofNullable(contactMapper.selectById(contactBaseVO.getParentId())).orElseThrow(() -> exception(CONTACT_NOT_EXISTS)); - } - } - } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/package-info.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/package-info.java deleted file mode 100644 index e72077dd7..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 联系人 - */ -package cn.iocoder.yudao.module.crm.service.contact; 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 f24e16a1c..51c8cd9a0 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 @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.crm.service.customer; +import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerCreateReqVO; import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPageReqVO; @@ -19,10 +20,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Objects; +import java.util.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*; @@ -96,6 +94,9 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @Override public List getCustomerList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } return customerMapper.selectBatchIds(ids); } From fe4b51b9ada2f0185f6ceeb8f35bddbae9c4c704 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 30 Nov 2023 13:42:36 +0800 Subject: [PATCH 33/35] =?UTF-8?q?crm:=20=E5=AE=8C=E5=96=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=9D=83=E9=99=90=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../crm/enums/common}/CrmBizTypeEnum.java | 4 ++-- .../permission}/CrmPermissionLevelEnum.java | 4 ++-- .../vo/business/CrmBusinessTransferReqVO.java | 2 +- .../contact/vo/CrmContactTransferReqVO.java | 2 +- .../contract/vo/CrmContractTransferReqVO.java | 2 +- .../customer/vo/CrmCustomerTransferReqVO.java | 2 +- .../permission/CrmPermissionController.java | 4 ++-- .../permission/vo/CrmPermissionBaseVO.java | 4 ++-- .../vo/CrmPermissionUpdateReqVO.java | 4 ++-- .../permission/CrmPermissionDO.java | 4 ++-- .../dal/mysql/customer/CrmCustomerMapper.java | 2 +- .../core/annotations/CrmPermission.java | 4 ++-- .../core/aop/CrmPermissionAspect.java | 4 ++-- .../business/CrmBusinessServiceImpl.java | 4 ++-- .../contact/CrmContactServiceImpl.java | 4 ++-- .../service/contract/ContractServiceImpl.java | 4 ++-- .../customer/CrmCustomerServiceImpl.java | 4 ++-- .../permission/CrmPermissionService.java | 12 +++++------ .../permission/CrmPermissionServiceImpl.java | 21 +++++++++++-------- .../bo/CrmPermissionCreateReqBO.java | 4 ++-- .../bo/CrmPermissionTransferReqBO.java | 4 ++-- .../bo/CrmPermissionUpdateReqBO.java | 2 +- 22 files changed, 52 insertions(+), 49 deletions(-) rename yudao-module-crm/{yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/enums => yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common}/CrmBizTypeEnum.java (93%) rename yudao-module-crm/{yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/enums => yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/permission}/CrmPermissionLevelEnum.java (92%) diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/enums/CrmBizTypeEnum.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmBizTypeEnum.java similarity index 93% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/enums/CrmBizTypeEnum.java rename to yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmBizTypeEnum.java index 1e780df5c..539bfc291 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/enums/CrmBizTypeEnum.java +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmBizTypeEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.framework.enums; +package cn.iocoder.yudao.module.crm.enums.common; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; @@ -9,7 +9,7 @@ import lombok.RequiredArgsConstructor; import java.util.Arrays; /** - * CRM 类型枚举 + * CRM 业务类型枚举 * * @author HUIHUI */ diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/enums/CrmPermissionLevelEnum.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/permission/CrmPermissionLevelEnum.java similarity index 92% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/enums/CrmPermissionLevelEnum.java rename to yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/permission/CrmPermissionLevelEnum.java index ff09f766f..56b0366aa 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/enums/CrmPermissionLevelEnum.java +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/permission/CrmPermissionLevelEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.crm.framework.enums; +package cn.iocoder.yudao.module.crm.enums.permission; import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.core.IntArrayValuable; @@ -8,7 +8,7 @@ import lombok.Getter; import java.util.Arrays; /** - * Crm 数据权限级别枚举 + * CRM 数据权限级别枚举 * * @author HUIHUI */ diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessTransferReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessTransferReqVO.java index 6a19eca9e..60980b243 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessTransferReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessTransferReqVO.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.crm.controller.admin.business.vo.business; -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactTransferReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactTransferReqVO.java index 2acc26a97..213c977db 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactTransferReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactTransferReqVO.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.crm.controller.admin.contact.vo; -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractTransferReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractTransferReqVO.java index 4ebef5943..09ce1e9f3 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractTransferReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractTransferReqVO.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.crm.controller.admin.contract.vo; -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerTransferReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerTransferReqVO.java index ed7cfb5c5..e267f4da0 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerTransferReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerTransferReqVO.java @@ -1,6 +1,6 @@ package cn.iocoder.yudao.module.crm.controller.admin.customer.vo; -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.java index 10b188fbb..bb25afccc 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.java @@ -9,7 +9,7 @@ import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionU import cn.iocoder.yudao.module.crm.convert.permission.CrmPermissionConvert; import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission; -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; import cn.iocoder.yudao.module.system.api.dept.DeptApi; import cn.iocoder.yudao.module.system.api.dept.PostApi; @@ -87,7 +87,7 @@ public class CrmPermissionController { } @GetMapping("/list") - @Operation(summary = "获取数据权限列表") + @Operation(summary = "获得数据权限列表") @Parameters({ @Parameter(name = "bizType", description = "CRM 类型", required = true, example = "2"), @Parameter(name = "bizId", description = "CRM 类型数据编号", required = true, example = "1024") diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionBaseVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionBaseVO.java index 086cbb42b..1b56dde2e 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionBaseVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionBaseVO.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.module.crm.controller.admin.permission.vo; import cn.iocoder.yudao.framework.common.validation.InEnum; -import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionUpdateReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionUpdateReqVO.java index a6f0b1133..d49f5662f 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionUpdateReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionUpdateReqVO.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.module.crm.controller.admin.permission.vo; import cn.iocoder.yudao.framework.common.validation.InEnum; -import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/permission/CrmPermissionDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/permission/CrmPermissionDO.java index 33cb2dbeb..59e47a5a8 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/permission/CrmPermissionDO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/permission/CrmPermissionDO.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.module.crm.dal.dataobject.permission; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; 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 1bd039fb2..09f97a654 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 @@ -10,7 +10,7 @@ import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPageR import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; import cn.iocoder.yudao.module.crm.enums.common.CrmSceneEnum; -import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import org.apache.ibatis.annotations.Mapper; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/annotations/CrmPermission.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/annotations/CrmPermission.java index 794c03906..410637829 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/annotations/CrmPermission.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/annotations/CrmPermission.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.crm.framework.core.annotations; -import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/aop/CrmPermissionAspect.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/aop/CrmPermissionAspect.java index f1a9075cd..debc000c1 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/aop/CrmPermissionAspect.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/aop/CrmPermissionAspect.java @@ -7,8 +7,8 @@ import cn.iocoder.yudao.framework.common.util.spring.SpringExpressionUtils; import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission; -import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java index ff2439cfd..0bf67fe1d 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java @@ -9,8 +9,8 @@ import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO; 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.framework.core.annotations.CrmPermission; -import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; import org.springframework.stereotype.Service; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactServiceImpl.java index 81e5f25a7..d5e908400 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactServiceImpl.java @@ -11,8 +11,8 @@ import cn.iocoder.yudao.module.crm.convert.contact.ContactConvert; 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.framework.core.annotations.CrmPermission; -import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/ContractServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/ContractServiceImpl.java index 393487d97..a3d139e8a 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/ContractServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/ContractServiceImpl.java @@ -8,8 +8,8 @@ import cn.iocoder.yudao.module.crm.convert.contract.ContractConvert; import cn.iocoder.yudao.module.crm.dal.dataobject.contract.ContractDO; import cn.iocoder.yudao.module.crm.dal.mysql.contract.ContractMapper; import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission; -import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; import org.springframework.stereotype.Service; 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 51c8cd9a0..98a0b352b 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 @@ -10,8 +10,8 @@ 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.dal.mysql.customer.CrmCustomerMapper; import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission; -import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; 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; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java index 516298e5a..f1e8c68d3 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.crm.service.permission; import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionUpdateReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; -import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; @@ -22,17 +22,17 @@ public interface CrmPermissionService { /** * 创建数据权限 * - * @param createBO 创建信息 + * @param createReqBO 创建信息 * @return 编号 */ - Long createPermission(@Valid CrmPermissionCreateReqBO createBO); + Long createPermission(@Valid CrmPermissionCreateReqBO createReqBO); /** * 创建数据权限 * - * @param createBOs 创建信息 + * @param createReqBOs 创建信息 */ - void createPermissionBatch(@Valid List createBOs); + void createPermissionBatch(@Valid List createReqBOs); /** * 更新数据权限 diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java index 021aa57aa..7acb0ecda 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java @@ -6,8 +6,8 @@ import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionU import cn.iocoder.yudao.module.crm.convert.permission.CrmPermissionConvert; import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; import cn.iocoder.yudao.module.crm.dal.mysql.permission.CrmPermissionMapper; -import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; @@ -23,7 +23,7 @@ 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.convertSet; import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*; -import static cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum.isOwner; +import static cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum.isOwner; /** * CRM 数据权限 Service 接口实现类 @@ -42,29 +42,32 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { @Override @Transactional(rollbackFor = Exception.class) - public Long createPermission(CrmPermissionCreateReqBO createBO) { + public Long createPermission(CrmPermissionCreateReqBO createReqBO) { + // TODO @puhui999:排重 // 1. 校验用户是否存在 - adminUserApi.validateUserList(Collections.singletonList(createBO.getUserId())); + adminUserApi.validateUserList(Collections.singletonList(createReqBO.getUserId())); // 2. 创建 - CrmPermissionDO permission = CrmPermissionConvert.INSTANCE.convert(createBO); + CrmPermissionDO permission = CrmPermissionConvert.INSTANCE.convert(createReqBO); crmPermissionMapper.insert(permission); return permission.getId(); } @Override - public void createPermissionBatch(List createBOs) { + public void createPermissionBatch(List createReqBOs) { + // TODO @puhui999:排重 // 1. 校验用户是否存在 - adminUserApi.validateUserList(convertSet(createBOs, CrmPermissionCreateReqBO::getUserId)); + adminUserApi.validateUserList(convertSet(createReqBOs, CrmPermissionCreateReqBO::getUserId)); // 2. 创建 - List permissions = CrmPermissionConvert.INSTANCE.convertList(createBOs); + List permissions = CrmPermissionConvert.INSTANCE.convertList(createReqBOs); crmPermissionMapper.insertBatch(permissions); } @Override @Transactional(rollbackFor = Exception.class) public void updatePermission(CrmPermissionUpdateReqVO updateReqVO) { + // TODO @puhui999:排重 // 1. 校验存在 validateCrmPermissionExists(updateReqVO.getIds()); // 2. 更新 diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/CrmPermissionCreateReqBO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/CrmPermissionCreateReqBO.java index fce59cac1..ce13a2d17 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/CrmPermissionCreateReqBO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/CrmPermissionCreateReqBO.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.module.crm.service.permission.bo; import cn.iocoder.yudao.framework.common.validation.InEnum; -import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; import lombok.Data; import javax.validation.constraints.NotNull; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/CrmPermissionTransferReqBO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/CrmPermissionTransferReqBO.java index 3e3873b47..976d70097 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/CrmPermissionTransferReqBO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/CrmPermissionTransferReqBO.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.module.crm.service.permission.bo; import cn.iocoder.yudao.framework.common.validation.InEnum; -import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum; -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; import lombok.Data; import javax.validation.constraints.NotNull; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/CrmPermissionUpdateReqBO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/CrmPermissionUpdateReqBO.java index 9cd198cdf..2e38b958f 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/CrmPermissionUpdateReqBO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/CrmPermissionUpdateReqBO.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.crm.service.permission.bo; import cn.iocoder.yudao.framework.common.validation.InEnum; -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum; +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; import lombok.Data; import javax.validation.constraints.NotNull; From 2d9f5cc4d0992af69f4ba7971de82840a97e7c6f Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 30 Nov 2023 19:12:37 +0800 Subject: [PATCH 34/35] =?UTF-8?q?crm:=201=EF=BC=89=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E5=90=88=E5=90=8C=E7=9A=84=20CRM=20=E5=89=8D=E7=BC=80=EF=BC=9B?= =?UTF-8?q?2=EF=BC=89=E5=A2=9E=E5=8A=A0=E5=9F=BA=E4=BA=8E=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E6=9F=A5=E8=AF=A2=E5=90=88=E5=90=8C=E5=88=86=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/crm/enums/AuditStatusEnum.java | 61 ------------- .../module/crm/enums/DictTypeConstants.java | 2 +- .../module/crm/enums/ReturnTypeEnum.java | 8 -- .../crm/enums/common/CrmAuditStatusEnum.java | 34 +++++++ .../crm/enums/common/CrmBizTypeEnum.java | 2 +- .../admin/contact/CrmContactController.java | 2 +- ...roller.java => CrmContractController.java} | 72 ++++++++++++--- .../contract/vo/ContractExportReqVO.java | 37 -------- .../admin/contract/vo/ContractRespVO.java | 17 +++- ...ractBaseVO.java => CrmContractBaseVO.java} | 3 +- ...ReqVO.java => CrmContractCreateReqVO.java} | 2 +- ...ctExcelVO.java => CrmContractExcelVO.java} | 2 +- ...geReqVO.java => CrmContractPageReqVO.java} | 23 +---- .../contract/vo/CrmContractTransferReqVO.java | 10 +-- ...ReqVO.java => CrmContractUpdateReqVO.java} | 2 +- .../receivable/vo/CrmReceivableBaseVO.java | 4 +- .../receivable/vo/CrmReceivableExcelVO.java | 2 +- .../vo/CrmReceivablePlanBaseVO.java | 4 +- .../vo/CrmReceivablePlanExcelVO.java | 2 +- .../crm/convert/contact/ContactConvert.java | 2 + .../crm/convert/contract/ContractConvert.java | 41 +++++++-- .../{ContractDO.java => CrmContractDO.java} | 20 ++++- .../receivable/CrmReceivableDO.java | 5 +- .../receivable/CrmReceivablePlanDO.java | 2 +- .../dal/mysql/contact/CrmContactMapper.java | 2 +- .../dal/mysql/contract/ContractMapper.java | 45 ---------- .../dal/mysql/contract/CrmContractMapper.java | 36 ++++++++ .../contact/CrmContactServiceImpl.java | 14 +-- .../crm/service/contract/ContractService.java | 81 ----------------- .../service/contract/CrmContractService.java | 89 +++++++++++++++++++ ...eImpl.java => CrmContractServiceImpl.java} | 52 ++++++----- .../crm/service/contract/package-info.java | 4 - .../CrmReceivablePlanServiceImpl.java | 12 +-- .../receivable/CrmReceivableServiceImpl.java | 12 +-- .../contract/ContractServiceImplTest.java | 42 ++++----- 35 files changed, 379 insertions(+), 369 deletions(-) delete mode 100644 yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/AuditStatusEnum.java delete mode 100644 yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ReturnTypeEnum.java create mode 100644 yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmAuditStatusEnum.java rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/{ContractController.java => CrmContractController.java} (52%) delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractExportReqVO.java rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/{ContractBaseVO.java => CrmContractBaseVO.java} (96%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/{ContractCreateReqVO.java => CrmContractCreateReqVO.java} (84%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/{ContractExcelVO.java => CrmContractExcelVO.java} (97%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/{ContractPageReqVO.java => CrmContractPageReqVO.java} (52%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/{ContractUpdateReqVO.java => CrmContractUpdateReqVO.java} (89%) rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contract/{ContractDO.java => CrmContractDO.java} (81%) delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/ContractMapper.java create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/ContractService.java create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractService.java rename yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/{ContractServiceImpl.java => CrmContractServiceImpl.java} (59%) delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/package-info.java diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/AuditStatusEnum.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/AuditStatusEnum.java deleted file mode 100644 index 85236fdd2..000000000 --- a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/AuditStatusEnum.java +++ /dev/null @@ -1,61 +0,0 @@ -package cn.iocoder.yudao.module.crm.enums; - -import cn.iocoder.yudao.framework.common.core.IntArrayValuable; - -import java.util.Arrays; - -// TODO @liuhongfeng:这个状态,还是搞成专属 CrmReceivableDO 专属的 status; -/** - * 流程审批状态枚举类 - * 0 未审核 1 审核通过 2 审核拒绝 3 审核中 4 已撤回 TODO @liuhongfeng:这一行可以删除,因为已经有枚举属性了哈; - * @author 赤焰 - */ -// TODO @liuhongfeng:可以使用 @Getter、@AllArgsConstructor 简化 get、构造方法 -public enum AuditStatusEnum implements IntArrayValuable { - - // TODO @liuhongfeng:草稿 0;10 审核中;20 审核通过;30 审核拒绝;40 已撤回;主要是留好间隙,万一每个地方要做点拓展; 然后,枚举字段的顺序调整下,审批中,一定要放两个审批通过、拒绝前面哈; - /** - * 未审批 - */ - AUDIT_NEW(0, "未审批"), - /** - * 审核通过 - */ - AUDIT_FINISH(1, "审核通过"), - /** - * 审核拒绝 - */ - AUDIT_REJECT(2, "审核拒绝"), - /** - * 审核中 - */ - AUDIT_DOING(3, "审核中"), - /** - * 已撤回 - */ - AUDIT_RETURN(4, "已撤回"); - - // TODO liuhongfeng:value 改成 status;desc 改成 name; - private final Integer value; - private final String desc; - - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(AuditStatusEnum::getValue).toArray(); - - AuditStatusEnum(Integer value, String desc) { - this.value = value; - this.desc = desc; - } - - public Integer getValue() { - return value; - } - - public String getDesc() { - return desc; - } - - @Override - public int[] array() { - return ARRAYS; - } -} diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/DictTypeConstants.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/DictTypeConstants.java index 71f550775..a7313f91a 100644 --- a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/DictTypeConstants.java +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/DictTypeConstants.java @@ -11,6 +11,6 @@ public interface DictTypeConstants { String CRM_CUSTOMER_INDUSTRY = "crm_customer_industry"; // CRM 客户所属行业 String CRM_CUSTOMER_LEVEL = "crm_customer_level"; // CRM 客户等级 String CRM_CUSTOMER_SOURCE = "crm_customer_source"; // CRM 客户来源 - String CRM_RECEIVABLE_CHECK_STATUS = "crm_receivable_check_status"; // CRM 审批状态 + String CRM_AUDIT_STATUS = "crm_audit_status"; // CRM 审批状态 } diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ReturnTypeEnum.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ReturnTypeEnum.java deleted file mode 100644 index e6074c432..000000000 --- a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ReturnTypeEnum.java +++ /dev/null @@ -1,8 +0,0 @@ -package cn.iocoder.yudao.module.crm.enums; - -// TODO @liuhongfeng:这个的作用是? -/** - * @author 赤焰 - */ -public enum ReturnTypeEnum { -} diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmAuditStatusEnum.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmAuditStatusEnum.java new file mode 100644 index 000000000..67709e95b --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmAuditStatusEnum.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.crm.enums.common; + +import cn.iocoder.yudao.framework.common.core.IntArrayValuable; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.util.Arrays; + +/** + * CRM 的审批状态 + * + * @author 赤焰 + */ +@RequiredArgsConstructor +@Getter +public enum CrmAuditStatusEnum implements IntArrayValuable { + + DRAFT(0, "未提交"), + PROCESS(10, "审批中"), + APPROVE(20, "审核通过"), + REJECT(30, "审核不通过"), + CANCEL(40, "已取消"); + + private final Integer status; + private final String name; + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmAuditStatusEnum::getStatus).toArray(); + + @Override + public int[] array() { + return ARRAYS; + } + +} diff --git a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmBizTypeEnum.java b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmBizTypeEnum.java index 539bfc291..3e92ff18e 100644 --- a/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmBizTypeEnum.java +++ b/yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmBizTypeEnum.java @@ -19,7 +19,7 @@ public enum CrmBizTypeEnum implements IntArrayValuable { CRM_LEADS(1, "线索"), CRM_CUSTOMER(2, "客户"), - CRM_CONTACTS(3, "联系人"), + CRM_CONTACT(3, "联系人"), CRM_BUSINESS(4, "商机"), CRM_CONTRACT(5, "合同"); diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/CrmContactController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/CrmContactController.java index b39331338..f39f67ac4 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/CrmContactController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/CrmContactController.java @@ -151,7 +151,7 @@ public class CrmContactController { // 1. 获取客户列表 List crmCustomerDOList = customerService.getCustomerList( convertSet(contactList, CrmContactDO::getCustomerId)); - // 2. 获取创建人、责任人列表 + // 2. 获取创建人、负责人列表 Map userMap = adminUserApi.getUserMap(convertListByFlatMap(contactList, contact -> Stream.of(NumberUtils.parseLong(contact.getCreator()), contact.getOwnerUserId()))); // 3. 直属上级 diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/ContractController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/CrmContractController.java similarity index 52% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/ContractController.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/CrmContractController.java index 1028929db..70b124196 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/ContractController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/CrmContractController.java @@ -1,13 +1,20 @@ package cn.iocoder.yudao.module.crm.controller.admin.contract; +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.number.NumberUtils; 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.contract.vo.*; import cn.iocoder.yudao.module.crm.convert.contract.ContractConvert; -import cn.iocoder.yudao.module.crm.dal.dataobject.contract.ContractDO; -import cn.iocoder.yudao.module.crm.service.contract.ContractService; +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.CrmContractService; +import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -20,8 +27,12 @@ import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; import java.util.List; +import java.util.Map; +import java.util.stream.Stream; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertListByFlatMap; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @@ -29,22 +40,27 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti @RestController @RequestMapping("/crm/contract") @Validated -public class ContractController { +public class CrmContractController { @Resource - private ContractService contractService; + private CrmContractService contractService; + @Resource + private CrmCustomerService customerService; + + @Resource + private AdminUserApi adminUserApi; @PostMapping("/create") @Operation(summary = "创建合同") @PreAuthorize("@ss.hasPermission('crm:contract:create')") - public CommonResult createContract(@Valid @RequestBody ContractCreateReqVO createReqVO) { + public CommonResult createContract(@Valid @RequestBody CrmContractCreateReqVO createReqVO) { return success(contractService.createContract(createReqVO, getLoginUserId())); } @PutMapping("/update") @Operation(summary = "更新合同") @PreAuthorize("@ss.hasPermission('crm:contract:update')") - public CommonResult updateContract(@Valid @RequestBody ContractUpdateReqVO updateReqVO) { + public CommonResult updateContract(@Valid @RequestBody CrmContractUpdateReqVO updateReqVO) { contractService.updateContract(updateReqVO); return success(true); } @@ -63,28 +79,56 @@ public class ContractController { @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('crm:contract:query')") public CommonResult getContract(@RequestParam("id") Long id) { - ContractDO contract = contractService.getContract(id); + CrmContractDO contract = contractService.getContract(id); return success(ContractConvert.INSTANCE.convert(contract)); } @GetMapping("/page") @Operation(summary = "获得合同分页") @PreAuthorize("@ss.hasPermission('crm:contract:query')") - public CommonResult> getContractPage(@Valid ContractPageReqVO pageVO) { - PageResult pageResult = contractService.getContractPage(pageVO); - return success(ContractConvert.INSTANCE.convertPage(pageResult)); + public CommonResult> getContractPage(@Valid CrmContractPageReqVO pageVO) { + PageResult pageResult = contractService.getContractPage(pageVO); + return success(convertDetailContractPage(pageResult)); + } + + @GetMapping("/page-by-customer") + @Operation(summary = "获得联系人分页,基于指定客户") + public CommonResult> getContractPageByCustomer(@Valid CrmContractPageReqVO pageVO) { + Assert.notNull(pageVO.getCustomerId(), "客户编号不能为空"); + PageResult pageResult = contractService.getContractPageByCustomer(pageVO); + return success(convertDetailContractPage(pageResult)); } @GetMapping("/export-excel") @Operation(summary = "导出合同 Excel") @PreAuthorize("@ss.hasPermission('crm:contract:export')") @OperateLog(type = EXPORT) - public void exportContractExcel(@Valid ContractExportReqVO exportReqVO, + public void exportContractExcel(@Valid CrmContractPageReqVO exportReqVO, HttpServletResponse response) throws IOException { - List list = contractService.getContractList(exportReqVO); + PageResult pageResult = contractService.getContractPage(exportReqVO); // 导出 Excel - List datas = ContractConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "合同.xls", "数据", ContractExcelVO.class, datas); + ExcelUtils.write(response, "合同.xls", "数据", CrmContractExcelVO.class, + ContractConvert.INSTANCE.convertList02(pageResult.getList())); + } + + /** + * 转换成详细的联系人分页,即读取关联信息 + * + * @param pageResult 联系人分页 + * @return 详细的联系人分页 + */ + private PageResult convertDetailContractPage(PageResult pageResult) { + List contactList = pageResult.getList(); + if (CollUtil.isEmpty(contactList)) { + return PageResult.empty(pageResult.getTotal()); + } + // 1. 获取客户列表 + List customerList = customerService.getCustomerList( + convertSet(contactList, CrmContractDO::getCustomerId)); + // 2. 获取创建人、负责人列表 + Map userMap = adminUserApi.getUserMap(convertListByFlatMap(contactList, + contact -> Stream.of(NumberUtils.parseLong(contact.getCreator()), contact.getOwnerUserId()))); + return ContractConvert.INSTANCE.convertPage(pageResult, userMap, customerList); } @PutMapping("/transfer") diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractExportReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractExportReqVO.java deleted file mode 100644 index 003e1f57c..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractExportReqVO.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.iocoder.yudao.module.crm.controller.admin.contract.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@Schema(description = "管理后台 - CRM 合同 Excel 导出 Request VO,参数和 ContractPageReqVO 是一致的") -@Data -public class ContractExportReqVO { - - @Schema(description = "合同名称", example = "王五") - private String name; - - @Schema(description = "客户编号", example = "18336") - private Long customerId; - - @Schema(description = "商机编号", example = "10864") - private Long businessId; - - @Schema(description = "下单日期") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] orderDate; - - @Schema(description = "合同编号") - private String no; - - @Schema(description = "整单折扣") - private Integer discountPercent; - - @Schema(description = "产品总金额", example = "19510") - private Integer productPrice; - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractRespVO.java index 4a22251b0..cfe746bcb 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractRespVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractRespVO.java @@ -11,7 +11,7 @@ import java.time.LocalDateTime; @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class ContractRespVO extends ContractBaseVO { +public class ContractRespVO extends CrmContractBaseVO { @Schema(description = "合同编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430") private Long id; @@ -19,4 +19,19 @@ public class ContractRespVO extends ContractBaseVO { @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) private LocalDateTime createTime; + @Schema(description = "创建人", example = "25682") + private String creator; + + @Schema(description = "创建人名字", example = "test") + private String creatorName; + + @Schema(description = "客户名字", example = "test") + private String customerName; + + @Schema(description = "负责人", example = "test") + private String ownerUserName; + + @Schema(description = "审批状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + private Integer auditStatus; + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractBaseVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractBaseVO.java similarity index 96% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractBaseVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractBaseVO.java index 756ee0d1f..5dd46e976 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractBaseVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractBaseVO.java @@ -9,13 +9,12 @@ import java.time.LocalDateTime; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -// TODO @dhb52:所有类,带下 Crm 前缀,避免和别的模块重复 /** * 合同 Base VO,提供给添加、修改、详细的子 VO 使用 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 */ @Data -public class ContractBaseVO { +public class CrmContractBaseVO { // TODO @dhb52:类似 no 字段的 example 要写xia 哈; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractCreateReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractCreateReqVO.java similarity index 84% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractCreateReqVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractCreateReqVO.java index 7793d7737..17196473a 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractCreateReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractCreateReqVO.java @@ -9,6 +9,6 @@ import lombok.ToString; @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class ContractCreateReqVO extends ContractBaseVO { +public class CrmContractCreateReqVO extends CrmContractBaseVO { } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractExcelVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractExcelVO.java similarity index 97% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractExcelVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractExcelVO.java index 2fb521321..72f9f3cfa 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractExcelVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractExcelVO.java @@ -11,7 +11,7 @@ import java.time.LocalDateTime; * @author dhb52 */ @Data -public class ContractExcelVO { +public class CrmContractExcelVO { @ExcelProperty("合同编号") private Long id; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractPageReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractPageReqVO.java similarity index 52% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractPageReqVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractPageReqVO.java index 36c7e14be..e2f286a99 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractPageReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractPageReqVO.java @@ -5,17 +5,15 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @Schema(description = "管理后台 - CRM 合同分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class ContractPageReqVO extends PageParam { +public class CrmContractPageReqVO extends PageParam { + + @Schema(description = "合同编号", example = "XYZ008") + private String no; @Schema(description = "合同名称", example = "王五") private String name; @@ -26,17 +24,4 @@ public class ContractPageReqVO extends PageParam { @Schema(description = "商机编号", example = "10864") private Long businessId; - @Schema(description = "下单日期") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] orderDate; - - @Schema(description = "合同编号") - private String no; - - @Schema(description = "整单折扣") - private Integer discountPercent; - - @Schema(description = "产品总金额", example = "19510") - private Integer productPrice; - } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractTransferReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractTransferReqVO.java index 09ce1e9f3..f13af856c 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractTransferReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractTransferReqVO.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.crm.controller.admin.contract.vo; +import cn.iocoder.yudao.framework.common.validation.InEnum; import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -14,19 +15,12 @@ public class CrmContractTransferReqVO { @NotNull(message = "联系人编号不能为空") private Long id; - /** - * 新负责人的用户编号 - */ @Schema(description = "新负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430") @NotNull(message = "新负责人的用户编号不能为空") private Long newOwnerUserId; - /** - * 老负责人加入团队后的权限级别。如果 null 说明移除 - * - * 关联 {@link CrmPermissionLevelEnum} - */ @Schema(description = "老负责人加入团队后的权限级别", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @InEnum(value = CrmPermissionLevelEnum.class) private Integer oldOwnerPermissionLevel; } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractUpdateReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractUpdateReqVO.java similarity index 89% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractUpdateReqVO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractUpdateReqVO.java index 34a9797f4..5892cb789 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractUpdateReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractUpdateReqVO.java @@ -11,7 +11,7 @@ import javax.validation.constraints.NotNull; @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class ContractUpdateReqVO extends ContractBaseVO { +public class CrmContractUpdateReqVO extends CrmContractBaseVO { @Schema(description = "合同编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430") @NotNull(message = "合同编号不能为空") diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/CrmReceivableBaseVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/CrmReceivableBaseVO.java index 7b3ffd881..aeefd94cc 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/CrmReceivableBaseVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/CrmReceivableBaseVO.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.crm.controller.admin.receivable.vo; import cn.iocoder.yudao.framework.common.validation.InEnum; -import cn.iocoder.yudao.module.crm.enums.AuditStatusEnum; +import cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; @@ -34,7 +34,7 @@ public class CrmReceivableBaseVO { // TODO @liuhongfeng:这个字段,应该不是前端传递的噢,而是后端自己生成的 @Schema(description = "审批状态", example = "1") - @InEnum(AuditStatusEnum.class) + @InEnum(CrmAuditStatusEnum.class) private Integer checkStatus; @Schema(description = "回款日期") diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/CrmReceivableExcelVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/CrmReceivableExcelVO.java index 291431e2c..3d81378a8 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/CrmReceivableExcelVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/CrmReceivableExcelVO.java @@ -28,7 +28,7 @@ public class CrmReceivableExcelVO { private Long contractId; @ExcelProperty(value = "审批状态", converter = DictConvert.class) - @DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_RECEIVABLE_CHECK_STATUS) + @DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_AUDIT_STATUS) private Integer checkStatus; @ExcelProperty("工作流编号") diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/CrmReceivablePlanBaseVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/CrmReceivablePlanBaseVO.java index eaba43dce..517ac9811 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/CrmReceivablePlanBaseVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/CrmReceivablePlanBaseVO.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.crm.controller.admin.receivable.vo; import cn.iocoder.yudao.framework.common.validation.InEnum; -import cn.iocoder.yudao.module.crm.enums.AuditStatusEnum; +import cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; @@ -28,7 +28,7 @@ public class CrmReceivablePlanBaseVO { private Integer status; @Schema(description = "审批状态", example = "1") - @InEnum(AuditStatusEnum.class) + @InEnum(CrmAuditStatusEnum.class) private Integer checkStatus; @Schema(description = "计划回款金额", example = "29675") diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/CrmReceivablePlanExcelVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/CrmReceivablePlanExcelVO.java index f4dd28366..7c25bf18e 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/CrmReceivablePlanExcelVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/CrmReceivablePlanExcelVO.java @@ -31,7 +31,7 @@ public class CrmReceivablePlanExcelVO { private Integer status; @ExcelProperty(value = "审批状态", converter = DictConvert.class) - @DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_RECEIVABLE_CHECK_STATUS) + @DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_AUDIT_STATUS) private Integer checkStatus; //@ExcelProperty("工作流编号") diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java index 9b214941a..636835be7 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java @@ -19,6 +19,7 @@ import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen; +// TODO 芋艿:convert 后面在梳理下,略微有点乱 /** * CRM 联系人 Convert * @@ -44,6 +45,7 @@ public interface ContactConvert { List list = converList(pageResult.getList(), userMap, customerList, parentContactList); return convertPage(pageResult).setList(list); } + List convertAllList(List list); @Mappings({ diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contract/ContractConvert.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contract/ContractConvert.java index 09c61dd6d..2041ba5de 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contract/ContractConvert.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contract/ContractConvert.java @@ -2,14 +2,20 @@ package cn.iocoder.yudao.module.crm.convert.contract; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.*; -import cn.iocoder.yudao.module.crm.dal.dataobject.contract.ContractDO; +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.permission.bo.CrmPermissionTransferReqBO; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Mappings; import org.mapstruct.factory.Mappers; import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; +import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen; /** * 合同 Convert @@ -21,17 +27,17 @@ public interface ContractConvert { ContractConvert INSTANCE = Mappers.getMapper(ContractConvert.class); - ContractDO convert(ContractCreateReqVO bean); + CrmContractDO convert(CrmContractCreateReqVO bean); - ContractDO convert(ContractUpdateReqVO bean); + CrmContractDO convert(CrmContractUpdateReqVO bean); - ContractRespVO convert(ContractDO bean); + ContractRespVO convert(CrmContractDO bean); - List convertList(List list); + List convertList(List list); - PageResult convertPage(PageResult page); + PageResult convertPage(PageResult page); - List convertList02(List list); + List convertList02(List list); @Mappings({ @Mapping(target = "bizId", source = "reqVO.id"), @@ -39,4 +45,25 @@ public interface ContractConvert { }) CrmPermissionTransferReqBO convert(CrmContractTransferReqVO reqVO, Long userId); + default PageResult convertPage(PageResult pageResult, Map userMap, + List customerList) { + return new PageResult<>(converList(pageResult.getList(), userMap, customerList), pageResult.getTotal()); + } + + default List converList(List contractList, Map userMap, + List customerList) { + List result = convertList(contractList); + Map customerMap = convertMap(customerList, CrmCustomerDO::getId); + result.forEach(item -> { + setUserInfo(item, userMap); + findAndThen(customerMap, item.getCustomerId(), customer -> item.setCustomerName(customer.getName())); + }); + return result; + } + + static void setUserInfo(ContractRespVO contract, Map userMap) { + findAndThen(userMap, contract.getOwnerUserId(), user -> contract.setOwnerUserName(user.getNickname())); + findAndThen(userMap, Long.parseLong(contract.getCreator()), user -> contract.setCreatorName(user.getNickname())); + } + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contract/ContractDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contract/CrmContractDO.java similarity index 81% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contract/ContractDO.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contract/CrmContractDO.java index f32786791..bdaff7271 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contract/ContractDO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contract/CrmContractDO.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.crm.dal.dataobject.contract; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -8,8 +9,9 @@ import lombok.*; import java.time.LocalDateTime; +// TODO 芋艿:实体的梳理 /** - * 合同 DO + * CRM 合同 DO * * @author dhb52 */ @@ -21,7 +23,7 @@ import java.time.LocalDateTime; @Builder @NoArgsConstructor @AllArgsConstructor -public class ContractDO extends BaseDO { +public class CrmContractDO extends BaseDO { /** * 合同编号 @@ -89,4 +91,18 @@ public class ContractDO extends BaseDO { */ private String remark; + /** + * 负责人的用户编号 + * + * 关联 AdminUserDO 的 id 字段 + */ + private Long ownerUserId; + + /** + * 审批状态 + * + * 枚举 {@link CrmAuditStatusEnum} + */ + private Integer auditStatus; + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/receivable/CrmReceivableDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/receivable/CrmReceivableDO.java index a8c3e3fed..16cbebe56 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/receivable/CrmReceivableDO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/receivable/CrmReceivableDO.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.crm.dal.dataobject.receivable; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -50,13 +51,13 @@ public class CrmReceivableDO extends BaseDO { /** * 合同 ID * - * 对应实体 {@link cn.iocoder.yudao.module.crm.dal.dataobject.contract.ContractDO} + * 对应实体 {@link CrmContractDO} */ private Long contractId; // TODO @liuhongfeng:“对应字典”,参考别的模块,枚举 {@link XXXX};另外,这个字段就叫 status,整体状态,不只审批 /** * 审批状态 - * 对应字典 {@link cn.iocoder.yudao.module.crm.enums.DictTypeConstants#CRM_RECEIVABLE_CHECK_STATUS} + * 对应字典 {@link cn.iocoder.yudao.module.crm.enums.DictTypeConstants#CRM_AUDIT_STATUS} */ private Integer checkStatus; /** diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/receivable/CrmReceivablePlanDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/receivable/CrmReceivablePlanDO.java index 52c0d2745..bec57cc9e 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/receivable/CrmReceivablePlanDO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/receivable/CrmReceivablePlanDO.java @@ -48,7 +48,7 @@ public class CrmReceivablePlanDO extends BaseDO { /** * 审批状态 * - * 对应字典 {@link cn.iocoder.yudao.module.crm.enums.DictTypeConstants#CRM_RECEIVABLE_CHECK_STATUS} + * 对应字典 {@link cn.iocoder.yudao.module.crm.enums.DictTypeConstants#CRM_AUDIT_STATUS} * // TODO @liuhongfeng:关联的枚举 */ private Integer checkStatus; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/CrmContactMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/CrmContactMapper.java index b459e8f5c..4c8f82f1a 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/CrmContactMapper.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/CrmContactMapper.java @@ -30,7 +30,7 @@ public interface CrmContactMapper extends BaseMapperX { default PageResult selectPageByCustomer(CrmContactPageReqVO pageVO) { return selectPage(pageVO, new LambdaQueryWrapperX() - .eq(CrmContactDO::getCustomerId, pageVO.getCustomerId()) + .eq(CrmContactDO::getCustomerId, pageVO.getCustomerId()) // 必须传递 .likeIfPresent(CrmContactDO::getName, pageVO.getName()) .eqIfPresent(CrmContactDO::getMobile, pageVO.getMobile()) .eqIfPresent(CrmContactDO::getTelephone, pageVO.getTelephone()) diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/ContractMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/ContractMapper.java deleted file mode 100644 index 47337518b..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/ContractMapper.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.iocoder.yudao.module.crm.dal.mysql.contract; - -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.contract.vo.ContractExportReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.ContractPageReqVO; -import cn.iocoder.yudao.module.crm.dal.dataobject.contract.ContractDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * 合同 Mapper - * - * @author dhb52 - */ -@Mapper -public interface ContractMapper extends BaseMapperX { - - default PageResult selectPage(ContractPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(ContractDO::getName, reqVO.getName()) - .eqIfPresent(ContractDO::getCustomerId, reqVO.getCustomerId()) - .eqIfPresent(ContractDO::getBusinessId, reqVO.getBusinessId()) - .betweenIfPresent(ContractDO::getOrderDate, reqVO.getOrderDate()) - .eqIfPresent(ContractDO::getNo, reqVO.getNo()) - .eqIfPresent(ContractDO::getDiscountPercent, reqVO.getDiscountPercent()) - .eqIfPresent(ContractDO::getProductPrice, reqVO.getProductPrice()) - .orderByDesc(ContractDO::getId)); - } - - default List selectList(ContractExportReqVO reqVO) { - return selectList(new LambdaQueryWrapperX() - .likeIfPresent(ContractDO::getName, reqVO.getName()) - .eqIfPresent(ContractDO::getCustomerId, reqVO.getCustomerId()) - .eqIfPresent(ContractDO::getBusinessId, reqVO.getBusinessId()) - .betweenIfPresent(ContractDO::getOrderDate, reqVO.getOrderDate()) - .eqIfPresent(ContractDO::getNo, reqVO.getNo()) - .eqIfPresent(ContractDO::getDiscountPercent, reqVO.getDiscountPercent()) - .eqIfPresent(ContractDO::getProductPrice, reqVO.getProductPrice()) - .orderByDesc(ContractDO::getId)); - } - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java new file mode 100644 index 000000000..a22912162 --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.crm.dal.mysql.contract; + +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.contract.vo.CrmContractPageReqVO; +import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * CRM 合同 Mapper + * + * @author dhb52 + */ +@Mapper +public interface CrmContractMapper extends BaseMapperX { + + default PageResult selectPage(CrmContractPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(CrmContractDO::getNo, reqVO.getNo()) + .likeIfPresent(CrmContractDO::getName, reqVO.getName()) + .eqIfPresent(CrmContractDO::getCustomerId, reqVO.getCustomerId()) + .eqIfPresent(CrmContractDO::getBusinessId, reqVO.getBusinessId()) + .orderByDesc(CrmContractDO::getId)); + } + + default PageResult selectPageByCustomer(CrmContractPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eq(CrmContractDO::getCustomerId, reqVO.getCustomerId()) // 必须传递 + .likeIfPresent(CrmContractDO::getNo, reqVO.getNo()) + .likeIfPresent(CrmContractDO::getName, reqVO.getName()) + .eqIfPresent(CrmContractDO::getBusinessId, reqVO.getBusinessId()) + .orderByDesc(CrmContractDO::getId)); + } + +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactServiceImpl.java index d5e908400..57ebdf4e1 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactServiceImpl.java @@ -61,13 +61,13 @@ public class CrmContactServiceImpl implements CrmContactService { // 2. 创建数据权限 crmPermissionService.createPermission(new CrmPermissionCreateReqBO().setUserId(userId) - .setBizType(CrmBizTypeEnum.CRM_CONTACTS.getType()).setBizId(contact.getId()) + .setBizType(CrmBizTypeEnum.CRM_CONTACT.getType()).setBizId(contact.getId()) .setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); return contact.getId(); } @Override - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS, bizId = "#updateReqVO.id", level = CrmPermissionLevelEnum.WRITE) + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACT, bizId = "#updateReqVO.id", level = CrmPermissionLevelEnum.WRITE) public void updateContact(CrmContactUpdateReqVO updateReqVO) { // 1. 校验存在 validateContactExists(updateReqVO.getId()); @@ -98,7 +98,7 @@ public class CrmContactServiceImpl implements CrmContactService { } @Override - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS, bizId = "#id", level = CrmPermissionLevelEnum.WRITE) + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACT, bizId = "#id", level = CrmPermissionLevelEnum.WRITE) public void deleteContact(Long id) { // 校验存在 validateContactExists(id); @@ -114,7 +114,7 @@ public class CrmContactServiceImpl implements CrmContactService { // TODO 芋艿:是否要做数据权限的校验??? @Override - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS, bizId = "#id", level = CrmPermissionLevelEnum.READ) + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACT, bizId = "#id", level = CrmPermissionLevelEnum.READ) public CrmContactDO getContact(Long id) { return contactMapper.selectById(id); } @@ -134,9 +134,9 @@ public class CrmContactServiceImpl implements CrmContactService { } @Override - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#pageVO.customerId", level = CrmPermissionLevelEnum.READ) - public PageResult getContactPageByCustomer(CrmContactPageReqVO pageVO) { - return contactMapper.selectPageByCustomer(pageVO); + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#pageReqVO.customerId", level = CrmPermissionLevelEnum.READ) + public PageResult getContactPageByCustomer(CrmContactPageReqVO pageReqVO) { + return contactMapper.selectPageByCustomer(pageReqVO); } @Override diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/ContractService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/ContractService.java deleted file mode 100644 index 201684bd8..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/ContractService.java +++ /dev/null @@ -1,81 +0,0 @@ -package cn.iocoder.yudao.module.crm.service.contract; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.*; -import cn.iocoder.yudao.module.crm.dal.dataobject.contract.ContractDO; - -import javax.validation.Valid; -import java.util.Collection; -import java.util.List; - -/** - * 合同 Service 接口 - * - * @author dhb52 - */ -public interface ContractService { - - /** - * 创建合同 - * - * @param createReqVO 创建信息 - * @param userId 用户编号 - * @return 编号 - */ - Long createContract(@Valid ContractCreateReqVO createReqVO, Long userId); - - /** - * 更新合同 - * - * @param updateReqVO 更新信息 - */ - void updateContract(@Valid ContractUpdateReqVO updateReqVO); - - /** - * 删除合同 - * - * @param id 编号 - */ - void deleteContract(Long id); - - /** - * 获得合同 - * - * @param id 编号 - * @return 合同 - */ - ContractDO getContract(Long id); - - /** - * 获得合同列表 - * - * @param ids 编号 - * @return 合同列表 - */ - List getContractList(Collection ids); - - /** - * 获得合同分页 - * - * @param pageReqVO 分页查询 - * @return 合同分页 - */ - PageResult getContractPage(ContractPageReqVO pageReqVO); - - /** - * 获得合同列表, 用于 Excel 导出 - * - * @param exportReqVO 查询条件 - * @return 合同列表 - */ - List getContractList(ContractExportReqVO exportReqVO); - - /** - * 合同转移 - * - * @param reqVO 请求 - * @param userId 用户编号 - */ - void transferContract(CrmContractTransferReqVO reqVO, Long userId); - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractService.java new file mode 100644 index 000000000..3b16d7778 --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractService.java @@ -0,0 +1,89 @@ +package cn.iocoder.yudao.module.crm.service.contract; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractCreateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractPageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractUpdateReqVO; +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 javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * CRM 合同 Service 接口 + * + * @author dhb52 + */ +public interface CrmContractService { + + /** + * 创建合同 + * + * @param createReqVO 创建信息 + * @param userId 用户编号 + * @return 编号 + */ + Long createContract(@Valid CrmContractCreateReqVO createReqVO, Long userId); + + /** + * 更新合同 + * + * @param updateReqVO 更新信息 + */ + void updateContract(@Valid CrmContractUpdateReqVO updateReqVO); + + /** + * 删除合同 + * + * @param id 编号 + */ + void deleteContract(Long id); + + /** + * 获得合同 + * + * @param id 编号 + * @return 合同 + */ + CrmContractDO getContract(Long id); + + /** + * 获得合同列表 + * + * @param ids 编号 + * @return 合同列表 + */ + List getContractList(Collection ids); + + /** + * 获得合同分页 + * + * 数据权限:基于 {@link CrmContractDO} 读取 + * + * @param pageReqVO 分页查询 + * @return 合同分页 + */ + PageResult getContractPage(CrmContractPageReqVO pageReqVO); + + /** + * 获得合同分页,基于指定客户 + * + * 数据权限:基于 {@link CrmCustomerDO} 读取 + * + * @param pageReqVO 分页查询 + * @return 联系人分页 + */ + PageResult getContractPageByCustomer(CrmContractPageReqVO pageReqVO); + + /** + * 合同转移 + * + * @param reqVO 请求 + * @param userId 用户编号 + */ + void transferContract(CrmContractTransferReqVO reqVO, Long userId); + +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/ContractServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java similarity index 59% rename from yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/ContractServiceImpl.java rename to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java index a3d139e8a..0445dfca2 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/ContractServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java @@ -3,13 +3,16 @@ package cn.iocoder.yudao.module.crm.service.contract; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.*; +import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractCreateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractPageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractUpdateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractTransferReqVO; import cn.iocoder.yudao.module.crm.convert.contract.ContractConvert; -import cn.iocoder.yudao.module.crm.dal.dataobject.contract.ContractDO; -import cn.iocoder.yudao.module.crm.dal.mysql.contract.ContractMapper; -import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission; +import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO; +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.core.annotations.CrmPermission; import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; import org.springframework.stereotype.Service; @@ -24,48 +27,47 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CONTRACT_NOT_EXISTS; /** - * 合同 Service 实现类 + * CRM 合同 Service 实现类 * * @author dhb52 */ @Service @Validated -public class ContractServiceImpl implements ContractService { +public class CrmContractServiceImpl implements CrmContractService { @Resource - private ContractMapper contractMapper; + private CrmContractMapper contractMapper; @Resource private CrmPermissionService crmPermissionService; @Override - public Long createContract(ContractCreateReqVO createReqVO, Long userId) { + public Long createContract(CrmContractCreateReqVO createReqVO, Long userId) { // 插入 - ContractDO contract = ContractConvert.INSTANCE.convert(createReqVO); + CrmContractDO contract = ContractConvert.INSTANCE.convert(createReqVO); contractMapper.insert(contract); // 创建数据权限 - crmPermissionService.createPermission(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_CONTRACT.getType()) - .setBizId(contract.getId()).setUserId(userId).setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); // 设置当前操作的人为负责人 - - // 返回 + crmPermissionService.createPermission(new CrmPermissionCreateReqBO().setUserId(userId) + .setBizType(CrmBizTypeEnum.CRM_CONTRACT.getType()).setBizId(contract.getId()) + .setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); return contract.getId(); } @Override @Transactional(rollbackFor = Exception.class) @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTRACT, level = CrmPermissionLevelEnum.WRITE) - public void updateContract(ContractUpdateReqVO updateReqVO) { + public void updateContract(CrmContractUpdateReqVO updateReqVO) { // 校验存在 validateContractExists(updateReqVO.getId()); // 更新 - ContractDO updateObj = ContractConvert.INSTANCE.convert(updateReqVO); + CrmContractDO updateObj = ContractConvert.INSTANCE.convert(updateReqVO); contractMapper.updateById(updateObj); } @Override @Transactional(rollbackFor = Exception.class) - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTRACT, level = CrmPermissionLevelEnum.WRITE) + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTRACT, bizId = "#id", level = CrmPermissionLevelEnum.WRITE) public void deleteContract(Long id) { // 校验存在 validateContractExists(id); @@ -73,22 +75,23 @@ public class ContractServiceImpl implements ContractService { contractMapper.deleteById(id); } - private ContractDO validateContractExists(Long id) { - ContractDO contract = contractMapper.selectById(id); + private CrmContractDO validateContractExists(Long id) { + CrmContractDO contract = contractMapper.selectById(id); if (contract == null) { throw exception(CONTRACT_NOT_EXISTS); } return contract; } + // TODO 芋艿:是否要做数据权限的校验??? @Override - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTRACT, level = CrmPermissionLevelEnum.READ) - public ContractDO getContract(Long id) { + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTRACT, bizId = "#id", level = CrmPermissionLevelEnum.READ) + public CrmContractDO getContract(Long id) { return contractMapper.selectById(id); } @Override - public List getContractList(Collection ids) { + public List getContractList(Collection ids) { if (CollUtil.isEmpty(ids)) { return ListUtil.empty(); } @@ -96,13 +99,14 @@ public class ContractServiceImpl implements ContractService { } @Override - public PageResult getContractPage(ContractPageReqVO pageReqVO) { + public PageResult getContractPage(CrmContractPageReqVO pageReqVO) { return contractMapper.selectPage(pageReqVO); } @Override - public List getContractList(ContractExportReqVO exportReqVO) { - return contractMapper.selectList(exportReqVO); + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#pageReqVO.customerId", level = CrmPermissionLevelEnum.READ) + public PageResult getContractPageByCustomer(CrmContractPageReqVO pageReqVO) { + return contractMapper.selectPageByCustomer(pageReqVO); } @Override diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/package-info.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/package-info.java deleted file mode 100644 index 743f159b7..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 合同 - */ -package cn.iocoder.yudao.module.crm.service.contract; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/CrmReceivablePlanServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/CrmReceivablePlanServiceImpl.java index 30523a095..1946c7ece 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/CrmReceivablePlanServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/CrmReceivablePlanServiceImpl.java @@ -10,12 +10,12 @@ import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.CrmReceivableP import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.CrmReceivablePlanPageReqVO; import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.CrmReceivablePlanUpdateReqVO; import cn.iocoder.yudao.module.crm.convert.receivable.CrmReceivablePlanConvert; -import cn.iocoder.yudao.module.crm.dal.dataobject.contract.ContractDO; +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.dal.dataobject.receivable.CrmReceivablePlanDO; import cn.iocoder.yudao.module.crm.dal.mysql.receivable.CrmReceivablePlanMapper; -import cn.iocoder.yudao.module.crm.enums.AuditStatusEnum; -import cn.iocoder.yudao.module.crm.service.contract.ContractService; +import cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum; +import cn.iocoder.yudao.module.crm.service.contract.CrmContractService; import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -40,7 +40,7 @@ public class CrmReceivablePlanServiceImpl implements CrmReceivablePlanService { @Resource private CrmReceivablePlanMapper crmReceivablePlanMapper; @Resource - private ContractService contractService; + private CrmContractService contractService; @Resource private CrmCustomerService crmCustomerService; @@ -52,7 +52,7 @@ public class CrmReceivablePlanServiceImpl implements CrmReceivablePlanService { receivablePlan.setStatus(CommonStatusEnum.ENABLE.getStatus()); } if (ObjectUtil.isNull(receivablePlan.getCheckStatus())){ - receivablePlan.setCheckStatus(AuditStatusEnum.AUDIT_NEW.getValue()); + receivablePlan.setCheckStatus(CrmAuditStatusEnum.DRAFT.getStatus()); } checkReceivablePlan(receivablePlan); @@ -68,7 +68,7 @@ public class CrmReceivablePlanServiceImpl implements CrmReceivablePlanService { throw exception(CONTRACT_NOT_EXISTS); } - ContractDO contract = contractService.getContract(receivablePlan.getContractId()); + CrmContractDO contract = contractService.getContract(receivablePlan.getContractId()); if(ObjectUtil.isNull(contract)){ throw exception(CONTRACT_NOT_EXISTS); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/CrmReceivableServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/CrmReceivableServiceImpl.java index 08d97d8fe..b1b9d3ede 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/CrmReceivableServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/CrmReceivableServiceImpl.java @@ -10,13 +10,13 @@ import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.CrmReceivableE import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.CrmReceivablePageReqVO; import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.CrmReceivableUpdateReqVO; import cn.iocoder.yudao.module.crm.convert.receivable.CrmReceivableConvert; -import cn.iocoder.yudao.module.crm.dal.dataobject.contract.ContractDO; +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.dal.dataobject.receivable.CrmReceivableDO; import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.CrmReceivablePlanDO; import cn.iocoder.yudao.module.crm.dal.mysql.receivable.CrmReceivableMapper; -import cn.iocoder.yudao.module.crm.enums.AuditStatusEnum; -import cn.iocoder.yudao.module.crm.service.contract.ContractService; +import cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum; +import cn.iocoder.yudao.module.crm.service.contract.CrmContractService; import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -41,7 +41,7 @@ public class CrmReceivableServiceImpl implements CrmReceivableService { @Resource private CrmReceivableMapper crmReceivableMapper; @Resource - private ContractService contractService; + private CrmContractService contractService; @Resource private CrmCustomerService crmCustomerService; @Resource @@ -57,7 +57,7 @@ public class CrmReceivableServiceImpl implements CrmReceivableService { receivable.setStatus(CommonStatusEnum.ENABLE.getStatus()); } if (ObjectUtil.isNull(receivable.getCheckStatus())){ - receivable.setCheckStatus(AuditStatusEnum.AUDIT_NEW.getValue()); + receivable.setCheckStatus(CrmAuditStatusEnum.DRAFT.getStatus()); } // TODO @liuhongfeng:一般来说,逻辑的写法,是要先检查,后操作 db;所以,你这个 check 应该放到 CrmReceivableDO receivable 之前; @@ -75,7 +75,7 @@ public class CrmReceivableServiceImpl implements CrmReceivableService { throw exception(CONTRACT_NOT_EXISTS); } - ContractDO contract = contractService.getContract(receivable.getContractId()); + CrmContractDO contract = contractService.getContract(receivable.getContractId()); if(ObjectUtil.isNull(contract)){ throw exception(CONTRACT_NOT_EXISTS); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/contract/ContractServiceImplTest.java b/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/contract/ContractServiceImplTest.java index 1406b5916..2e80a6955 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/contract/ContractServiceImplTest.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/contract/ContractServiceImplTest.java @@ -2,12 +2,12 @@ package cn.iocoder.yudao.module.crm.service.contract; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; -import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.ContractCreateReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractCreateReqVO; import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.ContractExportReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.ContractPageReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.ContractUpdateReqVO; -import cn.iocoder.yudao.module.crm.dal.dataobject.contract.ContractDO; -import cn.iocoder.yudao.module.crm.dal.mysql.contract.ContractMapper; +import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractPageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractUpdateReqVO; +import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO; +import cn.iocoder.yudao.module.crm.dal.mysql.contract.CrmContractMapper; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; @@ -26,54 +26,54 @@ import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CONTRACT_NOT_ import static org.junit.jupiter.api.Assertions.*; /** - * {@link ContractServiceImpl} 的单元测试类 + * {@link CrmContractServiceImpl} 的单元测试类 * * @author dhb52 */ -@Import(ContractServiceImpl.class) +@Import(CrmContractServiceImpl.class) public class ContractServiceImplTest extends BaseDbUnitTest { @Resource - private ContractServiceImpl contractService; + private CrmContractServiceImpl contractService; @Resource - private ContractMapper contractMapper; + private CrmContractMapper contractMapper; @Test public void testCreateContract_success() { // 准备参数 - ContractCreateReqVO reqVO = randomPojo(ContractCreateReqVO.class); + CrmContractCreateReqVO reqVO = randomPojo(CrmContractCreateReqVO.class); // 调用 Long contractId = contractService.createContract(reqVO, getLoginUserId()); // 断言 assertNotNull(contractId); // 校验记录的属性是否正确 - ContractDO contract = contractMapper.selectById(contractId); + CrmContractDO contract = contractMapper.selectById(contractId); assertPojoEquals(reqVO, contract); } @Test public void testUpdateContract_success() { // mock 数据 - ContractDO dbContract = randomPojo(ContractDO.class); + CrmContractDO dbContract = randomPojo(CrmContractDO.class); contractMapper.insert(dbContract);// @Sql: 先插入出一条存在的数据 // 准备参数 - ContractUpdateReqVO reqVO = randomPojo(ContractUpdateReqVO.class, o -> { + CrmContractUpdateReqVO reqVO = randomPojo(CrmContractUpdateReqVO.class, o -> { o.setId(dbContract.getId()); // 设置更新的 ID }); // 调用 contractService.updateContract(reqVO); // 校验是否更新正确 - ContractDO contract = contractMapper.selectById(reqVO.getId()); // 获取最新的 + CrmContractDO contract = contractMapper.selectById(reqVO.getId()); // 获取最新的 assertPojoEquals(reqVO, contract); } @Test public void testUpdateContract_notExists() { // 准备参数 - ContractUpdateReqVO reqVO = randomPojo(ContractUpdateReqVO.class); + CrmContractUpdateReqVO reqVO = randomPojo(CrmContractUpdateReqVO.class); // 调用, 并断言异常 assertServiceException(() -> contractService.updateContract(reqVO), CONTRACT_NOT_EXISTS); @@ -82,7 +82,7 @@ public class ContractServiceImplTest extends BaseDbUnitTest { @Test public void testDeleteContract_success() { // mock 数据 - ContractDO dbContract = randomPojo(ContractDO.class); + CrmContractDO dbContract = randomPojo(CrmContractDO.class); contractMapper.insert(dbContract);// @Sql: 先插入出一条存在的数据 // 准备参数 Long id = dbContract.getId(); @@ -106,7 +106,7 @@ public class ContractServiceImplTest extends BaseDbUnitTest { @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 public void testGetContractPage() { // mock 数据 - ContractDO dbContract = randomPojo(ContractDO.class, o -> { // 等会查询到 + CrmContractDO dbContract = randomPojo(CrmContractDO.class, o -> { // 等会查询到 o.setName(null); o.setCustomerId(null); o.setBusinessId(null); @@ -131,7 +131,7 @@ public class ContractServiceImplTest extends BaseDbUnitTest { // 测试 productPrice 不匹配 contractMapper.insert(cloneIgnoreId(dbContract, o -> o.setProductPrice(null))); // 准备参数 - ContractPageReqVO reqVO = new ContractPageReqVO(); + CrmContractPageReqVO reqVO = new CrmContractPageReqVO(); reqVO.setName(null); reqVO.setCustomerId(null); reqVO.setBusinessId(null); @@ -141,7 +141,7 @@ public class ContractServiceImplTest extends BaseDbUnitTest { reqVO.setProductPrice(null); // 调用 - PageResult pageResult = contractService.getContractPage(reqVO); + PageResult pageResult = contractService.getContractPage(reqVO); // 断言 assertEquals(1, pageResult.getTotal()); assertEquals(1, pageResult.getList().size()); @@ -152,7 +152,7 @@ public class ContractServiceImplTest extends BaseDbUnitTest { @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 public void testGetContractList() { // mock 数据 - ContractDO dbContract = randomPojo(ContractDO.class, o -> { // 等会查询到 + CrmContractDO dbContract = randomPojo(CrmContractDO.class, o -> { // 等会查询到 o.setName("合同名称"); o.setCustomerId(null); o.setBusinessId(null); @@ -187,7 +187,7 @@ public class ContractServiceImplTest extends BaseDbUnitTest { reqVO.setProductPrice(null); // 调用 - List list = contractService.getContractList(reqVO); + List list = contractService.getContractList(reqVO); // 断言 assertEquals(1, list.size()); assertPojoEquals(dbContract, list.get(0)); From db03b10d2419c00cd7d973da12340398e40b1b0b Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 30 Nov 2023 20:21:39 +0800 Subject: [PATCH 35/35] =?UTF-8?q?crm:=20=E5=A2=9E=E5=8A=A0=E5=9F=BA?= =?UTF-8?q?=E4=BA=8E=E5=AE=A2=E6=88=B7=E6=9F=A5=E8=AF=A2=E5=95=86=E6=9C=BA?= =?UTF-8?q?=E5=88=86=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/business/CrmBusinessController.java | 35 ++++++++- .../vo/business/CrmBusinessExportReqVO.java | 74 ------------------- .../vo/business/CrmBusinessPageReqVO.java | 3 + .../admin/contact/vo/CrmContactBaseVO.java | 1 - .../dal/mysql/business/CrmBusinessMapper.java | 22 +----- .../service/business/CrmBusinessService.java | 19 +++-- .../business/CrmBusinessServiceImpl.java | 6 +- .../service/contact/CrmContactService.java | 4 +- 8 files changed, 58 insertions(+), 106 deletions(-) delete mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessExportReqVO.java diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java index 997c5667c..7b924c88a 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.crm.controller.admin.business; 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.excel.core.util.ExcelUtils; @@ -8,6 +9,7 @@ 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.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; @@ -109,7 +111,32 @@ public class CrmBusinessController { List statusTypeList = businessStatusTypeService.selectList(queryStatusTypeVO); // 处理商机状态名称回显 Set statusIds = pageResult.getList().stream() + .map(CrmBusinessDO::getStatusId).filter(Objects::nonNull).collect(Collectors.toSet()); + CrmBusinessStatusQueryVO queryVO = new CrmBusinessStatusQueryVO(); + queryVO.setIdList(statusIds); + List statusList = businessStatusService.selectList(queryVO); + return success(CrmBusinessConvert.INSTANCE.convertPage(pageResult, customerList, statusTypeList, statusList)); + } + + @GetMapping("/page-by-customer") + @Operation(summary = "获得商机分页,基于指定客户") + public CommonResult> getBusinessPageByCustomer(@Valid CrmContractPageReqVO pageReqVO) { + Assert.notNull(pageReqVO.getCustomerId(), "客户编号不能为空"); + PageResult pageResult = businessService.getBusinessPageByCustomer(pageReqVO); + // 处理客户名称回显 + // TODO @ljlleo:可以使用 CollectionUtils.convertSet 替代常用的 stream 操作,更简洁一点;下面几个也是哈; + Set customerIds = pageResult.getList().stream() .map(CrmBusinessDO::getCustomerId).filter(Objects::nonNull).collect(Collectors.toSet()); + List customerList = customerService.getCustomerList(customerIds); + // 处理商机状态类型名称回显 + Set statusTypeIds = pageResult.getList().stream() + .map(CrmBusinessDO::getStatusTypeId).filter(Objects::nonNull).collect(Collectors.toSet()); + CrmBusinessStatusTypeQueryVO queryStatusTypeVO = new CrmBusinessStatusTypeQueryVO(); + queryStatusTypeVO.setIdList(statusTypeIds); + List statusTypeList = businessStatusTypeService.selectList(queryStatusTypeVO); + // 处理商机状态名称回显 + Set statusIds = pageResult.getList().stream() + .map(CrmBusinessDO::getStatusId).filter(Objects::nonNull).collect(Collectors.toSet()); CrmBusinessStatusQueryVO queryVO = new CrmBusinessStatusQueryVO(); queryVO.setIdList(statusIds); List statusList = businessStatusService.selectList(queryVO); @@ -128,12 +155,12 @@ public class CrmBusinessController { @Operation(summary = "导出商机 Excel") @PreAuthorize("@ss.hasPermission('crm:business:export')") @OperateLog(type = EXPORT) - public void exportBusinessExcel(@Valid CrmBusinessExportReqVO exportReqVO, + public void exportBusinessExcel(@Valid CrmBusinessPageReqVO exportReqVO, HttpServletResponse response) throws IOException { - List list = businessService.getBusinessList(exportReqVO); + PageResult pageResult = businessService.getBusinessPage(exportReqVO, getLoginUserId()); // 导出 Excel - List datas = CrmBusinessConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "商机.xls", "数据", CrmBusinessExcelVO.class, datas); + ExcelUtils.write(response, "商机.xls", "数据", CrmBusinessExcelVO.class, + CrmBusinessConvert.INSTANCE.convertList02(pageResult.getList())); } @PutMapping("/transfer") diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessExportReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessExportReqVO.java deleted file mode 100644 index 6b78e21c3..000000000 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessExportReqVO.java +++ /dev/null @@ -1,74 +0,0 @@ -package cn.iocoder.yudao.module.crm.controller.admin.business.vo.business; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@Schema(description = "管理后台 - 商机 Excel 导出 Request VO,参数和 CrmBusinessPageReqVO 是一致的") -@Data -public class CrmBusinessExportReqVO { - - @Schema(description = "商机名称", example = "李四") - private String name; - - @Schema(description = "商机状态类型编号", example = "25714") - private Long statusTypeId; - - @Schema(description = "商机状态编号", example = "30320") - private Long statusId; - - @Schema(description = "下次联系时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] contactNextTime; - - @Schema(description = "客户编号", example = "10299") - private Long customerId; - - @Schema(description = "预计成交日期") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] dealTime; - - @Schema(description = "商机金额", example = "12371") - private BigDecimal price; - - @Schema(description = "整单折扣") - private BigDecimal discountPercent; - - @Schema(description = "产品总金额", example = "12025") - private BigDecimal productPrice; - - @Schema(description = "备注", example = "随便") - private String remark; - - @Schema(description = "负责人的用户编号", example = "25562") - private Long ownerUserId; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - - @Schema(description = "只读权限的用户编号数组") - private String roUserIds; - - @Schema(description = "读写权限的用户编号数组") - private String rwUserIds; - - @Schema(description = "1赢单2输单3无效", example = "1") - private Integer endStatus; - - @Schema(description = "结束时的备注", example = "你说的对") - private String endRemark; - - @Schema(description = "最后跟进时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] contactLastTime; - - @Schema(description = "跟进状态", example = "1") - private Integer followUpStatus; - -} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessPageReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessPageReqVO.java index ab1770302..c756b79cb 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessPageReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessPageReqVO.java @@ -15,4 +15,7 @@ public class CrmBusinessPageReqVO extends PageParam { @Schema(description = "商机名称", example = "李四") private String name; + @Schema(description = "客户编号", example = "10795") + private Long customerId; + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactBaseVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactBaseVO.java index 44e803cef..6b9569232 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactBaseVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactBaseVO.java @@ -93,7 +93,6 @@ public class CrmContactBaseVO { @ExcelProperty(value = "最后跟进时间",order = 6) private LocalDateTime lastTime; - @Schema(description = "负责人用户编号", example = "14334") @NotNull(message = "负责人不能为空") private Long ownerUserId; diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessMapper.java index 236ec38fb..0f3964bf7 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessMapper.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessMapper.java @@ -3,13 +3,12 @@ package cn.iocoder.yudao.module.crm.dal.mysql.business; 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.business.vo.business.CrmBusinessExportReqVO; import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessPageReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractPageReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO; import org.apache.ibatis.annotations.Mapper; import java.util.Collection; -import java.util.List; /** * 商机 Mapper @@ -26,23 +25,10 @@ public interface CrmBusinessMapper extends BaseMapperX { .orderByDesc(CrmBusinessDO::getId)); } - default List selectList(CrmBusinessExportReqVO reqVO) { - return selectList(new LambdaQueryWrapperX() + default PageResult selectPageByCustomer(CrmContractPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eq(CrmBusinessDO::getCustomerId, reqVO.getCustomerId()) // 必须传递 .likeIfPresent(CrmBusinessDO::getName, reqVO.getName()) - .eqIfPresent(CrmBusinessDO::getStatusTypeId, reqVO.getStatusTypeId()) - .eqIfPresent(CrmBusinessDO::getStatusId, reqVO.getStatusId()) - .betweenIfPresent(CrmBusinessDO::getContactNextTime, reqVO.getContactNextTime()) - .eqIfPresent(CrmBusinessDO::getCustomerId, reqVO.getCustomerId()) - .betweenIfPresent(CrmBusinessDO::getDealTime, reqVO.getDealTime()) - .eqIfPresent(CrmBusinessDO::getPrice, reqVO.getPrice()) - .eqIfPresent(CrmBusinessDO::getDiscountPercent, reqVO.getDiscountPercent()) - .eqIfPresent(CrmBusinessDO::getProductPrice, reqVO.getProductPrice()) - .eqIfPresent(CrmBusinessDO::getRemark, reqVO.getRemark()) - .betweenIfPresent(CrmBusinessDO::getCreateTime, reqVO.getCreateTime()) - .eqIfPresent(CrmBusinessDO::getEndStatus, reqVO.getEndStatus()) - .eqIfPresent(CrmBusinessDO::getEndRemark, reqVO.getEndRemark()) - .betweenIfPresent(CrmBusinessDO::getContactLastTime, reqVO.getContactLastTime()) - .eqIfPresent(CrmBusinessDO::getFollowUpStatus, reqVO.getFollowUpStatus()) .orderByDesc(CrmBusinessDO::getId)); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessService.java index 90bdecfc8..2e62db48d 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessService.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessService.java @@ -1,8 +1,13 @@ package cn.iocoder.yudao.module.crm.service.business; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.*; +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessCreateReqVO; +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.contract.vo.CrmContractPageReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO; +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; import javax.validation.Valid; import java.util.Collection; @@ -57,6 +62,8 @@ public interface CrmBusinessService { /** * 获得商机分页 * + * 数据权限:基于 {@link CrmBusinessDO} + * * @param pageReqVO 分页查询 * @param userId 用户编号 * @return 商机分页 @@ -64,12 +71,14 @@ public interface CrmBusinessService { PageResult getBusinessPage(CrmBusinessPageReqVO pageReqVO, Long userId); /** - * 获得商机列表, 用于 Excel 导出 + * 获得商机分页,基于指定客户 * - * @param exportReqVO 查询条件 - * @return 商机列表 + * 数据权限:基于 {@link CrmCustomerDO} 读取 + * + * @param pageReqVO 分页查询 + * @return 联系人分页 */ - List getBusinessList(CrmBusinessExportReqVO exportReqVO); + PageResult getBusinessPageByCustomer(CrmContractPageReqVO pageReqVO); /** * 商机转移 diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java index 0bf67fe1d..697587fa3 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.*; +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.permission.CrmPermissionDO; @@ -116,8 +117,9 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { } @Override - public List getBusinessList(CrmBusinessExportReqVO exportReqVO) { - return businessMapper.selectList(exportReqVO); + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#pageReqVO.customerId", level = CrmPermissionLevelEnum.READ) + public PageResult getBusinessPageByCustomer(CrmContractPageReqVO pageReqVO) { + return businessMapper.selectPageByCustomer(pageReqVO); } @Override diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactService.java index 393f745c3..6f49f7661 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactService.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactService.java @@ -72,10 +72,10 @@ public interface CrmContactService { * * 数据权限:基于 {@link CrmCustomerDO} 读取 * - * @param pageVO 分页查询 + * @param pageReqVO 分页查询 * @return 联系人分页 */ - PageResult getContactPageByCustomer(CrmContactPageReqVO pageVO); + PageResult getContactPageByCustomer(CrmContactPageReqVO pageReqVO); /** * 获取所有联系人列表