Commit d9f6fb241a1013c7da355f5d3ef376b44e3788fd

Authored by puhui999
1 parent 81b6aebf

合同:新增合同转移接口

yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java
... ... @@ -11,6 +11,7 @@ public interface ErrorCodeConstants {
11 11  
12 12 // ========== 合同管理 1-020-000-000 ==========
13 13 ErrorCode CONTRACT_NOT_EXISTS = new ErrorCode(1_020_000_000, "合同不存在");
  14 + ErrorCode CONTRACT_TRANSFER_FAIL_PERMISSION_DENIED = new ErrorCode(1_020_000_001, "合同转移失败,原因:没有转移权限");
14 15  
15 16 // ========== 线索管理 1-020-001-000 ==========
16 17 ErrorCode CLUE_NOT_EXISTS = new ErrorCode(1_020_001_000, "线索不存在");
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/ContractController.java
... ... @@ -23,6 +23,7 @@ import java.util.List;
23 23  
24 24 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
25 25 import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
  26 +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
26 27  
27 28 @Tag(name = "管理后台 - 合同")
28 29 @RestController
... ... @@ -86,4 +87,13 @@ public class ContractController {
86 87 ExcelUtils.write(response, "合同.xls", "数据", ContractExcelVO.class, datas);
87 88 }
88 89  
  90 + @PutMapping("/transfer")
  91 + @Operation(summary = "合同转移")
  92 + @PreAuthorize("@ss.hasPermission('crm:contract:update')")
  93 + public CommonResult<Boolean> transfer(@Valid @RequestBody CrmContractTransferReqVO reqVO) {
  94 + contractService.contractTransfer(reqVO, getLoginUserId());
  95 + return success(true);
  96 + }
  97 +
  98 +
89 99 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractCreateReqVO.java
... ... @@ -5,6 +5,8 @@ import lombok.Data;
5 5 import lombok.EqualsAndHashCode;
6 6 import lombok.ToString;
7 7  
  8 +import java.util.Set;
  9 +
8 10 @Schema(description = "管理后台 - 合同创建 Request VO")
9 11 @Data
10 12 @EqualsAndHashCode(callSuper = true)
... ... @@ -12,9 +14,9 @@ import lombok.ToString;
12 14 public class ContractCreateReqVO extends ContractBaseVO {
13 15  
14 16 @Schema(description = "只读权限的用户编号数组")
15   - private String roUserIds;
  17 + private Set<Long> roUserIds;
16 18  
17 19 @Schema(description = "读写权限的用户编号数组")
18   - private String rwUserIds;
  20 + private Set<Long> rwUserIds;
19 21  
20 22 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractUpdateReqVO.java
... ... @@ -6,6 +6,7 @@ import lombok.EqualsAndHashCode;
6 6 import lombok.ToString;
7 7  
8 8 import javax.validation.constraints.NotNull;
  9 +import java.util.Set;
9 10  
10 11 @Schema(description = "管理后台 - 合同更新 Request VO")
11 12 @Data
... ... @@ -18,9 +19,9 @@ public class ContractUpdateReqVO extends ContractBaseVO {
18 19 private Long id;
19 20  
20 21 @Schema(description = "只读权限的用户编号数组")
21   - private String roUserIds;
  22 + private Set<Long> roUserIds;
22 23  
23 24 @Schema(description = "读写权限的用户编号数组")
24   - private String rwUserIds;
  25 + private Set<Long> rwUserIds;
25 26  
26 27 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractTransferReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.controller.admin.contract.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +import javax.validation.constraints.NotNull;
  7 +
  8 +@Schema(description = "管理后台 - 合同转移 Request VO")
  9 +@Data
  10 +public class CrmContractTransferReqVO {
  11 +
  12 + @Schema(description = "合同编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
  13 + @NotNull(message = "合同编号不能为空")
  14 + private Long id;
  15 +
  16 + @Schema(description = "新负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
  17 + @NotNull(message = "新负责人的用户编号不能为空")
  18 + private Long ownerUserId; // 新的负责人
  19 +
  20 +}
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contract/ContractConvert.java
1 1 package cn.iocoder.yudao.module.crm.convert.contract;
2 2  
  3 +import cn.hutool.core.util.ObjUtil;
3 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.ContractCreateReqVO;
5   -import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.ContractExcelVO;
6   -import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.ContractRespVO;
7   -import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.ContractUpdateReqVO;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.*;
8 6 import cn.iocoder.yudao.module.crm.dal.dataobject.contract.ContractDO;
9 7 import org.mapstruct.Mapper;
10 8 import org.mapstruct.factory.Mappers;
11 9  
12 10 import java.util.List;
  11 +import java.util.Set;
13 12  
14 13 /**
15 14 * 合同 Convert
... ... @@ -33,4 +32,12 @@ public interface ContractConvert {
33 32  
34 33 List<ContractExcelVO> convertList02(List<ContractDO> list);
35 34  
  35 + default ContractDO convert(ContractDO contract, CrmContractTransferReqVO reqVO, Long userId) {
  36 + Set<Long> rwUserIds = contract.getRwUserIds();
  37 + rwUserIds.removeIf(item -> ObjUtil.equal(item, userId.toString())); // 移除老负责人
  38 + rwUserIds.add(reqVO.getOwnerUserId()); // 读写权限加入新的负人
  39 + return new ContractDO().setId(contract.getId()).setOwnerUserId(reqVO.getOwnerUserId()) // 设置新负责人
  40 + .setRwUserIds(rwUserIds);
  41 + }
  42 +
36 43 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contract/ContractDO.java
1 1 package cn.iocoder.yudao.module.crm.dal.dataobject.contract;
2 2  
3 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import cn.iocoder.yudao.framework.mybatis.core.type.JsonLongSetTypeHandler;
4 5 import com.baomidou.mybatisplus.annotation.KeySequence;
  6 +import com.baomidou.mybatisplus.annotation.TableField;
5 7 import com.baomidou.mybatisplus.annotation.TableId;
6 8 import com.baomidou.mybatisplus.annotation.TableName;
7 9 import lombok.*;
8 10  
9 11 import java.time.LocalDateTime;
  12 +import java.util.Set;
10 13  
11 14 /**
12 15 * 合同 DO
... ... @@ -79,11 +82,13 @@ public class ContractDO extends BaseDO {
79 82 /**
80 83 * 只读权限的用户编号数组
81 84 */
82   - private String roUserIds;
  85 + @TableField(typeHandler = JsonLongSetTypeHandler.class)
  86 + private Set<Long> roUserIds;
83 87 /**
84 88 * 读写权限的用户编号数组
85 89 */
86   - private String rwUserIds;
  90 + @TableField(typeHandler = JsonLongSetTypeHandler.class)
  91 + private Set<Long> rwUserIds;
87 92 /**
88 93 * 联系人编号
89 94 */
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/utils/AuthUtil.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.framework.utils;
  2 +
  3 +import java.util.Collection;
  4 +
  5 +/**
  6 + * 数据读写权限校验工具类
  7 + *
  8 + * @author HUIHUI
  9 + */
  10 +public class AuthUtil {
  11 +
  12 + /**
  13 + * 判断当前数据对用户来说是否是只读的
  14 + *
  15 + * @param roUserIds 当前操作数据的只读权限的用户编号数组
  16 + * @param userId 当前操作数据的用户编号
  17 + * @return boolean 是/否
  18 + */
  19 + public static boolean isReadOnly(Collection<Long> roUserIds, Long userId) {
  20 + return roUserIds.contains(userId);
  21 + }
  22 +
  23 + /**
  24 + * 判断当前数据对用户来说是否是可读写的
  25 + *
  26 + * @param rwUserIds 当前操作数据的读写权限的用户编号数组
  27 + * @param userId 当前操作数据的用户编号
  28 + * @return boolean 是/否
  29 + */
  30 + public static boolean isReadAndWrite(Collection<Long> rwUserIds, Long userId) {
  31 + return rwUserIds.contains(userId);
  32 + }
  33 +
  34 +}
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/ContractService.java
1 1 package cn.iocoder.yudao.module.crm.service.contract;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.ContractCreateReqVO;
5   -import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.ContractExportReqVO;
6   -import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.ContractPageReqVO;
7   -import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.ContractUpdateReqVO;
  4 +import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.*;
8 5 import cn.iocoder.yudao.module.crm.dal.dataobject.contract.ContractDO;
9 6  
10 7 import javax.validation.Valid;
... ... @@ -72,4 +69,12 @@ public interface ContractService {
72 69 */
73 70 List<ContractDO> getContractList(ContractExportReqVO exportReqVO);
74 71  
  72 + /**
  73 + * 合同转移
  74 + *
  75 + * @param reqVO 请求
  76 + * @param userId 用户编号
  77 + */
  78 + void contractTransfer(CrmContractTransferReqVO reqVO, Long userId);
  79 +
75 80 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/ContractServiceImpl.java
... ... @@ -3,10 +3,7 @@ package cn.iocoder.yudao.module.crm.service.contract;
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.collection.ListUtil;
5 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6   -import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.ContractCreateReqVO;
7   -import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.ContractExportReqVO;
8   -import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.ContractPageReqVO;
9   -import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.ContractUpdateReqVO;
  6 +import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.*;
10 7 import cn.iocoder.yudao.module.crm.convert.contract.ContractConvert;
11 8 import cn.iocoder.yudao.module.crm.dal.dataobject.contract.ContractDO;
12 9 import cn.iocoder.yudao.module.crm.dal.mysql.contract.ContractMapper;
... ... @@ -19,6 +16,8 @@ import java.util.List;
19 16  
20 17 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
21 18 import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CONTRACT_NOT_EXISTS;
  19 +import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CONTRACT_TRANSFER_FAIL_PERMISSION_DENIED;
  20 +import static cn.iocoder.yudao.module.crm.framework.utils.AuthUtil.isReadAndWrite;
22 21  
23 22 /**
24 23 * 合同 Service 实现类
... ... @@ -58,10 +57,12 @@ public class ContractServiceImpl implements ContractService {
58 57 contractMapper.deleteById(id);
59 58 }
60 59  
61   - private void validateContractExists(Long id) {
62   - if (contractMapper.selectById(id) == null) {
  60 + private ContractDO validateContractExists(Long id) {
  61 + ContractDO contract = contractMapper.selectById(id);
  62 + if (contract == null) {
63 63 throw exception(CONTRACT_NOT_EXISTS);
64 64 }
  65 + return contract;
65 66 }
66 67  
67 68 @Override
... ... @@ -87,4 +88,21 @@ public class ContractServiceImpl implements ContractService {
87 88 return contractMapper.selectList(exportReqVO);
88 89 }
89 90  
  91 + @Override
  92 + public void contractTransfer(CrmContractTransferReqVO reqVO, Long userId) {
  93 + // 1. 校验合同是否存在
  94 + ContractDO contract = validateContractExists(reqVO.getId());
  95 + // 1.2. 校验用户是否拥有读写权限
  96 + if (!isReadAndWrite(contract.getRwUserIds(), userId)) {
  97 + throw exception(CONTRACT_TRANSFER_FAIL_PERMISSION_DENIED);
  98 + }
  99 +
  100 + // 2. 更新新的负责人
  101 + ContractDO updateContract = ContractConvert.INSTANCE.convert(contract, reqVO, userId);
  102 + contractMapper.updateById(updateContract);
  103 +
  104 + // 3. TODO 记录合同转移日志
  105 +
  106 + }
  107 +
90 108 }
... ...