Commit 1cab3c009c516513a2128d37278f3cfcb77d2d8b

Authored by puhui999
1 parent a877bb47

CRM-合同:新增发起合同审批

yudao-module-crm/yudao-module-crm-biz/pom.xml
@@ -27,6 +27,11 @@ @@ -27,6 +27,11 @@
27 <artifactId>yudao-module-crm-api</artifactId> 27 <artifactId>yudao-module-crm-api</artifactId>
28 <version>${revision}</version> 28 <version>${revision}</version>
29 </dependency> 29 </dependency>
  30 + <dependency>
  31 + <groupId>cn.iocoder.boot</groupId>
  32 + <artifactId>yudao-module-bpm-api</artifactId>
  33 + <version>${revision}</version>
  34 + </dependency>
30 35
31 <!-- 业务组件 --> 36 <!-- 业务组件 -->
32 <dependency> 37 <dependency>
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/CrmContractController.java
@@ -140,4 +140,12 @@ public class CrmContractController { @@ -140,4 +140,12 @@ public class CrmContractController {
140 return success(true); 140 return success(true);
141 } 141 }
142 142
  143 + @PutMapping("/approve")
  144 + @Operation(summary = "发起合同审批流程")
  145 + @PreAuthorize("@ss.hasPermission('crm:contract:update')")
  146 + public CommonResult<Boolean> transfer(@RequestParam("id") Long id) {
  147 + contractService.handleApprove(id, getLoginUserId());
  148 + return success(true);
  149 + }
  150 +
143 } 151 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractSaveReqVO.java
@@ -7,10 +7,13 @@ import cn.iocoder.yudao.module.crm.framework.operatelog.core.SysAdminUserParseFu @@ -7,10 +7,13 @@ import cn.iocoder.yudao.module.crm.framework.operatelog.core.SysAdminUserParseFu
7 import com.mzt.logapi.starter.annotation.DiffLogField; 7 import com.mzt.logapi.starter.annotation.DiffLogField;
8 import io.swagger.v3.oas.annotations.media.Schema; 8 import io.swagger.v3.oas.annotations.media.Schema;
9 import jakarta.validation.constraints.NotNull; 9 import jakarta.validation.constraints.NotNull;
  10 +import lombok.AllArgsConstructor;
10 import lombok.Data; 11 import lombok.Data;
  12 +import lombok.NoArgsConstructor;
11 import org.springframework.format.annotation.DateTimeFormat; 13 import org.springframework.format.annotation.DateTimeFormat;
12 14
13 import java.time.LocalDateTime; 15 import java.time.LocalDateTime;
  16 +import java.util.List;
14 17
15 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; 18 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
16 19
@@ -35,10 +38,6 @@ public class CrmContractSaveReqVO { @@ -35,10 +38,6 @@ public class CrmContractSaveReqVO {
35 @DiffLogField(name = "商机", function = CrmBusinessParseFunction.NAME) 38 @DiffLogField(name = "商机", function = CrmBusinessParseFunction.NAME)
36 private Long businessId; 39 private Long businessId;
37 40
38 - @Schema(description = "工作流编号", example = "1043")  
39 - @DiffLogField(name = "工作流编号")  
40 - private Long processInstanceId;  
41 -  
42 @Schema(description = "下单日期", requiredMode = Schema.RequiredMode.REQUIRED) 41 @Schema(description = "下单日期", requiredMode = Schema.RequiredMode.REQUIRED)
43 @DiffLogField(name = "下单日期") 42 @DiffLogField(name = "下单日期")
44 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) 43 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@@ -86,16 +85,30 @@ public class CrmContractSaveReqVO { @@ -86,16 +85,30 @@ public class CrmContractSaveReqVO {
86 @DiffLogField(name = "公司签约人", function = SysAdminUserParseFunction.NAME) 85 @DiffLogField(name = "公司签约人", function = SysAdminUserParseFunction.NAME)
87 private Long signUserId; 86 private Long signUserId;
88 87
89 - @Schema(description = "最后跟进时间")  
90 - @DiffLogField(name = "最后跟进时间")  
91 - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)  
92 - private LocalDateTime contactLastTime;  
93 -  
94 @Schema(description = "备注", example = "你猜") 88 @Schema(description = "备注", example = "你猜")
95 @DiffLogField(name = "备注") 89 @DiffLogField(name = "备注")
96 private String remark; 90 private String remark;
97 91
98 - // TODO @dhb52:增加一个 status 字段:具体有哪些值,你来枚举下;主要页面上有个【草稿】【提交审核】的流程,可以看看。然后要对接工作流,这块也可以看看,不确定的地方问我。 92 + @Schema(description = "产品列表")
  93 + private List<CrmContractProductItem> productItems;
  94 +
  95 + @Schema(description = "商品属性")
  96 + @Data
  97 + @NoArgsConstructor
  98 + @AllArgsConstructor
  99 + public static class CrmContractProductItem {
  100 +
  101 + @Schema(description = "产品编号", example = "20529")
  102 + @NotNull(message = "产品编号不能为空")
  103 + private Long id;
  104 +
  105 + @Schema(description = "产品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "8911")
  106 + @NotNull(message = "产品数量不能为空")
  107 + private Long count;
  108 +
  109 + @Schema(description = "产品折扣")
  110 + private Integer discountPercent;
99 111
  112 + }
100 113
101 } 114 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessProductDO.java
@@ -2,13 +2,12 @@ package cn.iocoder.yudao.module.crm.dal.dataobject.business; @@ -2,13 +2,12 @@ package cn.iocoder.yudao.module.crm.dal.dataobject.business;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductDO; 4 import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductDO;
  5 +import cn.iocoder.yudao.module.crm.enums.DictTypeConstants;
5 import com.baomidou.mybatisplus.annotation.KeySequence; 6 import com.baomidou.mybatisplus.annotation.KeySequence;
6 import com.baomidou.mybatisplus.annotation.TableId; 7 import com.baomidou.mybatisplus.annotation.TableId;
7 import com.baomidou.mybatisplus.annotation.TableName; 8 import com.baomidou.mybatisplus.annotation.TableName;
8 import lombok.*; 9 import lombok.*;
9 10
10 -import java.math.BigDecimal;  
11 -  
12 /** 11 /**
13 * 商机产品关联表 DO 12 * 商机产品关联表 DO
14 * 13 *
@@ -29,14 +28,12 @@ public class CrmBusinessProductDO extends BaseDO { @@ -29,14 +28,12 @@ public class CrmBusinessProductDO extends BaseDO {
29 */ 28 */
30 @TableId 29 @TableId
31 private Long id; 30 private Long id;
32 -  
33 /** 31 /**
34 * 商机编号 32 * 商机编号
35 * 33 *
36 * 关联 {@link CrmBusinessDO#getId()} 34 * 关联 {@link CrmBusinessDO#getId()}
37 */ 35 */
38 private Long businessId; 36 private Long businessId;
39 -  
40 /** 37 /**
41 * 产品编号 38 * 产品编号
42 * 39 *
@@ -50,29 +47,27 @@ public class CrmBusinessProductDO extends BaseDO { @@ -50,29 +47,27 @@ public class CrmBusinessProductDO extends BaseDO {
50 private Integer price; 47 private Integer price;
51 48
52 /** 49 /**
53 - * 销售价格 50 + * 销售价格, 单位:分
54 */ 51 */
55 - private BigDecimal salesPrice;  
56 - 52 + private Integer salesPrice;
57 /** 53 /**
58 * 数量 54 * 数量
59 */ 55 */
60 - private BigDecimal count;  
61 -  
62 - // TODO @lzxhqs:改成 discountPercent 56 + private Integer count;
63 /** 57 /**
64 * 折扣 58 * 折扣
65 */ 59 */
66 - private BigDecimal discountPercent;  
67 -  
68 - // TODO @lzxhqs:改成 totalPrice;总计价格,和现有项目风格一致; 60 + private Integer discountPercent;
69 /** 61 /**
70 - * 小计(折扣后价格) 62 + * 总计价格(折扣后价格)
71 */ 63 */
72 - private BigDecimal totalPrice; 64 + private Integer totalPrice;
73 65
74 /** 66 /**
75 * 单位 67 * 单位
  68 + *
  69 + * 字典 {@link DictTypeConstants#CRM_PRODUCT_UNIT}
76 */ 70 */
77 - private String unit; 71 + private Integer unit;
  72 +
78 } 73 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contract/CrmContractDO.java
@@ -45,7 +45,7 @@ public class CrmContractDO extends BaseDO { @@ -45,7 +45,7 @@ public class CrmContractDO extends BaseDO {
45 /** 45 /**
46 * 工作流编号 46 * 工作流编号
47 */ 47 */
48 - private Long processInstanceId; 48 + private String processInstanceId;
49 /** 49 /**
50 * 下单日期 50 * 下单日期
51 */ 51 */
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/product/CrmProductDO.java
1 package cn.iocoder.yudao.module.crm.dal.dataobject.product; 1 package cn.iocoder.yudao.module.crm.dal.dataobject.product;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import cn.iocoder.yudao.module.crm.enums.DictTypeConstants;
4 import cn.iocoder.yudao.module.crm.enums.product.CrmProductStatusEnum; 5 import cn.iocoder.yudao.module.crm.enums.product.CrmProductStatusEnum;
5 import com.baomidou.mybatisplus.annotation.KeySequence; 6 import com.baomidou.mybatisplus.annotation.KeySequence;
6 import com.baomidou.mybatisplus.annotation.TableId; 7 import com.baomidou.mybatisplus.annotation.TableId;
@@ -38,7 +39,7 @@ public class CrmProductDO extends BaseDO { @@ -38,7 +39,7 @@ public class CrmProductDO extends BaseDO {
38 /** 39 /**
39 * 单位 40 * 单位
40 * 41 *
41 - * 字典 {@link cn.iocoder.yudao.module.crm.enums.DictTypeConstants#CRM_PRODUCT_UNIT} 42 + * 字典 {@link DictTypeConstants#CRM_PRODUCT_UNIT}
42 */ 43 */
43 private Integer unit; 44 private Integer unit;
44 /** 45 /**
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java
@@ -41,7 +41,7 @@ public interface CrmContractMapper extends BaseMapperX&lt;CrmContractDO&gt; { @@ -41,7 +41,7 @@ public interface CrmContractMapper extends BaseMapperX&lt;CrmContractDO&gt; {
41 default PageResult<CrmContractDO> selectPage(CrmContractPageReqVO pageReqVO, Long userId) { 41 default PageResult<CrmContractDO> selectPage(CrmContractPageReqVO pageReqVO, Long userId) {
42 MPJLambdaWrapperX<CrmContractDO> mpjLambdaWrapperX = new MPJLambdaWrapperX<>(); 42 MPJLambdaWrapperX<CrmContractDO> mpjLambdaWrapperX = new MPJLambdaWrapperX<>();
43 // 拼接数据权限的查询条件 43 // 拼接数据权限的查询条件
44 - CrmQueryWrapperUtils.appendPermissionCondition(mpjLambdaWrapperX, CrmBizTypeEnum.CRM_CONTACT.getType(), 44 + CrmQueryWrapperUtils.appendPermissionCondition(mpjLambdaWrapperX, CrmBizTypeEnum.CRM_CONTRACT.getType(),
45 CrmContractDO::getId, userId, pageReqVO.getSceneType(), Boolean.FALSE); 45 CrmContractDO::getId, userId, pageReqVO.getSceneType(), Boolean.FALSE);
46 // 拼接自身的查询条件 46 // 拼接自身的查询条件
47 mpjLambdaWrapperX.selectAll(CrmContractDO.class) 47 mpjLambdaWrapperX.selectAll(CrmContractDO.class)
@@ -56,7 +56,7 @@ public interface CrmContractMapper extends BaseMapperX&lt;CrmContractDO&gt; { @@ -56,7 +56,7 @@ public interface CrmContractMapper extends BaseMapperX&lt;CrmContractDO&gt; {
56 default List<CrmContractDO> selectBatchIds(Collection<Long> ids, Long userId) { 56 default List<CrmContractDO> selectBatchIds(Collection<Long> ids, Long userId) {
57 MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>(); 57 MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>();
58 // 构建数据权限连表条件 58 // 构建数据权限连表条件
59 - CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTACT.getType(), ids, userId); 59 + CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(), ids, userId);
60 // 拼接自身的查询条件 60 // 拼接自身的查询条件
61 query.selectAll(CrmContractDO.class).in(CrmContractDO::getId, ids).orderByDesc(CrmContractDO::getId); 61 query.selectAll(CrmContractDO.class).in(CrmContractDO::getId, ids).orderByDesc(CrmContractDO::getId);
62 return selectJoinList(CrmContractDO.class, query); 62 return selectJoinList(CrmContractDO.class, query);
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractService.java
@@ -58,6 +58,14 @@ public interface CrmContractService { @@ -58,6 +58,14 @@ public interface CrmContractService {
58 void updateContractFollowUp(CrmUpdateFollowUpReqBO contractUpdateFollowUpReqBO); 58 void updateContractFollowUp(CrmUpdateFollowUpReqBO contractUpdateFollowUpReqBO);
59 59
60 /** 60 /**
  61 + * 发起合同审批流程
  62 + *
  63 + * @param id 合同编号
  64 + * @param userId 用户编号
  65 + */
  66 + void handleApprove(Long id, Long userId);
  67 +
  68 + /**
61 * 获得合同 69 * 获得合同
62 * 70 *
63 * @param id 编号 71 * @param id 编号
@@ -111,9 +119,11 @@ public interface CrmContractService { @@ -111,9 +119,11 @@ public interface CrmContractService {
111 Long getContractCountByCustomerId(Long customerId); 119 Long getContractCountByCustomerId(Long customerId);
112 120
113 /** 121 /**
114 - * 根据商机ID获取关联客户的合同数量 TODO @lzxhqs:1)方法注释,和参数注释之间要有空行;2)中英文之间有空格,更清晰,例如说 商机 ID  
115 - * @param businessId 商机ID 122 + * 根据商机ID获取关联客户的合同数量
  123 + *
  124 + * @param businessId 商机编号
116 * @return 数量 125 * @return 数量
117 */ 126 */
118 Long selectCountByBusinessId(Long businessId); 127 Long selectCountByBusinessId(Long businessId);
  128 +
119 } 129 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
@@ -4,6 +4,8 @@ import cn.hutool.core.collection.CollUtil; @@ -4,6 +4,8 @@ import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.collection.ListUtil; 4 import cn.hutool.core.collection.ListUtil;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  7 +import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
  8 +import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
7 import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractPageReqVO; 9 import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractPageReqVO;
8 import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractSaveReqVO; 10 import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractSaveReqVO;
9 import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractTransferReqVO; 11 import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractTransferReqVO;
@@ -13,6 +15,7 @@ import cn.iocoder.yudao.module.crm.dal.mysql.contract.CrmContractMapper; @@ -13,6 +15,7 @@ import cn.iocoder.yudao.module.crm.dal.mysql.contract.CrmContractMapper;
13 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; 15 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
14 import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; 16 import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
15 import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission; 17 import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission;
  18 +import cn.iocoder.yudao.module.crm.service.business.CrmBusinessProductService;
16 import cn.iocoder.yudao.module.crm.service.followup.bo.CrmUpdateFollowUpReqBO; 19 import cn.iocoder.yudao.module.crm.service.followup.bo.CrmUpdateFollowUpReqBO;
17 import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; 20 import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
18 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; 21 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
@@ -40,28 +43,33 @@ import static cn.iocoder.yudao.module.crm.enums.LogRecordConstants.*; @@ -40,28 +43,33 @@ import static cn.iocoder.yudao.module.crm.enums.LogRecordConstants.*;
40 @Validated 43 @Validated
41 public class CrmContractServiceImpl implements CrmContractService { 44 public class CrmContractServiceImpl implements CrmContractService {
42 45
  46 + public static final String CONTRACT_APPROVE = "contract-approve"; // 合同审批流程标识
  47 +
43 @Resource 48 @Resource
44 private CrmContractMapper contractMapper; 49 private CrmContractMapper contractMapper;
45 50
46 @Resource 51 @Resource
47 private CrmPermissionService crmPermissionService; 52 private CrmPermissionService crmPermissionService;
  53 + @Resource
  54 + private CrmBusinessProductService businessProductService;
  55 +
  56 + @Resource
  57 + private BpmProcessInstanceApi bpmProcessInstanceApi;
48 58
49 @Override 59 @Override
50 @Transactional(rollbackFor = Exception.class) 60 @Transactional(rollbackFor = Exception.class)
51 @LogRecord(type = CRM_CONTRACT_TYPE, subType = CRM_CONTRACT_CREATE_SUB_TYPE, bizNo = "{{#contract.id}}", 61 @LogRecord(type = CRM_CONTRACT_TYPE, subType = CRM_CONTRACT_CREATE_SUB_TYPE, bizNo = "{{#contract.id}}",
52 success = CRM_CONTRACT_CREATE_SUCCESS) 62 success = CRM_CONTRACT_CREATE_SUCCESS)
53 public Long createContract(CrmContractSaveReqVO createReqVO, Long userId) { 63 public Long createContract(CrmContractSaveReqVO createReqVO, Long userId) {
54 - createReqVO.setId(null);  
55 // TODO @合同待定:插入合同商品;需要搞个 BusinessProductDO 64 // TODO @合同待定:插入合同商品;需要搞个 BusinessProductDO
56 // 插入合同 65 // 插入合同
57 - CrmContractDO contract = BeanUtils.toBean(createReqVO, CrmContractDO.class); 66 + CrmContractDO contract = BeanUtils.toBean(createReqVO, CrmContractDO.class).setId(null);
58 contractMapper.insert(contract); 67 contractMapper.insert(contract);
59 68
60 // 创建数据权限 69 // 创建数据权限
61 crmPermissionService.createPermission(new CrmPermissionCreateReqBO().setUserId(userId) 70 crmPermissionService.createPermission(new CrmPermissionCreateReqBO().setUserId(userId)
62 .setBizType(CrmBizTypeEnum.CRM_CONTRACT.getType()).setBizId(contract.getId()) 71 .setBizType(CrmBizTypeEnum.CRM_CONTRACT.getType()).setBizId(contract.getId())
63 .setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); 72 .setLevel(CrmPermissionLevelEnum.OWNER.getLevel()));
64 -  
65 // 4. 记录操作日志上下文 73 // 4. 记录操作日志上下文
66 LogRecordContext.putVariable("contract", contract); 74 LogRecordContext.putVariable("contract", contract);
67 return contract.getId(); 75 return contract.getId();
@@ -141,6 +149,16 @@ public class CrmContractServiceImpl implements CrmContractService { @@ -141,6 +149,16 @@ public class CrmContractServiceImpl implements CrmContractService {
141 contractMapper.updateById(BeanUtils.toBean(contractUpdateFollowUpReqBO, CrmContractDO.class).setId(contractUpdateFollowUpReqBO.getBizId())); 149 contractMapper.updateById(BeanUtils.toBean(contractUpdateFollowUpReqBO, CrmContractDO.class).setId(contractUpdateFollowUpReqBO.getBizId()));
142 } 150 }
143 151
  152 + @Override
  153 + public void handleApprove(Long id, Long userId) {
  154 + // 创建合同审批流程实例
  155 + String processInstanceId = bpmProcessInstanceApi.createProcessInstance(userId, new BpmProcessInstanceCreateReqDTO()
  156 + .setProcessDefinitionKey(CONTRACT_APPROVE).setBusinessKey(String.valueOf(id)));
  157 +
  158 + // 更新合同工作流编号
  159 + contractMapper.updateById(new CrmContractDO().setId(id).setProcessInstanceId(processInstanceId));
  160 + }
  161 +
144 //======================= 查询相关 ======================= 162 //======================= 查询相关 =======================
145 163
146 @Override 164 @Override
@@ -182,6 +200,5 @@ public class CrmContractServiceImpl implements CrmContractService { @@ -182,6 +200,5 @@ public class CrmContractServiceImpl implements CrmContractService {
182 public Long selectCountByBusinessId(Long businessId) { 200 public Long selectCountByBusinessId(Long businessId) {
183 return contractMapper.selectCountByBusinessId(businessId); 201 return contractMapper.selectCountByBusinessId(businessId);
184 } 202 }
185 -  
186 // TODO @合同待定:需要新增一个 ContractConfigDO 表,合同配置,重点是到期提醒; 203 // TODO @合同待定:需要新增一个 ContractConfigDO 表,合同配置,重点是到期提醒;
187 } 204 }