Commit 53ebd39c73783018faf09723b1e4ea68caa432ef

Authored by YunaiV
1 parent 0b0830f4

✨ CRM:待办事项(接入合同)

yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/CrmContractController.java
@@ -215,18 +215,18 @@ public class CrmContractController { @@ -215,18 +215,18 @@ public class CrmContractController {
215 }); 215 });
216 } 216 }
217 217
218 - @GetMapping("/check-contract-count") 218 + @GetMapping("/audit-count")
219 @Operation(summary = "获得待审核合同数量") 219 @Operation(summary = "获得待审核合同数量")
220 @PreAuthorize("@ss.hasPermission('crm:contract:query')") 220 @PreAuthorize("@ss.hasPermission('crm:contract:query')")
221 - public CommonResult<Long> getCheckContractCount() {  
222 - return success(contractService.getCheckContractCount(getLoginUserId())); 221 + public CommonResult<Long> getAuditContractCount() {
  222 + return success(contractService.getAuditContractCount(getLoginUserId()));
223 } 223 }
224 224
225 - @GetMapping("/end-contract-count")  
226 - @Operation(summary = "获得即将到期的合同数量") 225 + @GetMapping("/remind-count")
  226 + @Operation(summary = "获得即将到期(提醒)的合同数量")
227 @PreAuthorize("@ss.hasPermission('crm:contract:query')") 227 @PreAuthorize("@ss.hasPermission('crm:contract:query')")
228 - public CommonResult<Long> getEndContractCount() {  
229 - return success(contractService.getEndContractCount(getLoginUserId())); 228 + public CommonResult<Long> getRemindContractCount() {
  229 + return success(contractService.getRemindContractCount(getLoginUserId()));
230 } 230 }
231 231
232 } 232 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java
@@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; @@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
6 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 6 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
7 import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; 7 import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
8 import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractPageReqVO; 8 import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractPageReqVO;
  9 +import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractConfigDO;
9 import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO; 10 import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO;
10 import cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum; 11 import cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum;
11 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; 12 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
@@ -49,7 +50,7 @@ public interface CrmContractMapper extends BaseMapperX&lt;CrmContractDO&gt; { @@ -49,7 +50,7 @@ public interface CrmContractMapper extends BaseMapperX&lt;CrmContractDO&gt; {
49 .orderByDesc(CrmContractDO::getId)); 50 .orderByDesc(CrmContractDO::getId));
50 } 51 }
51 52
52 - default PageResult<CrmContractDO> selectPage(CrmContractPageReqVO pageReqVO, Long userId) { 53 + default PageResult<CrmContractDO> selectPage(CrmContractPageReqVO pageReqVO, Long userId, CrmContractConfigDO config) {
53 MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>(); 54 MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>();
54 // 拼接数据权限的查询条件 55 // 拼接数据权限的查询条件
55 CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(), 56 CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(),
@@ -67,10 +68,8 @@ public interface CrmContractMapper extends BaseMapperX&lt;CrmContractDO&gt; { @@ -67,10 +68,8 @@ public interface CrmContractMapper extends BaseMapperX&lt;CrmContractDO&gt; {
67 LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now()); 68 LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
68 LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now()); 69 LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now());
69 if (CrmContractPageReqVO.EXPIRY_TYPE_ABOUT_TO_EXPIRE.equals(pageReqVO.getExpiryType())) { // 即将到期 70 if (CrmContractPageReqVO.EXPIRY_TYPE_ABOUT_TO_EXPIRE.equals(pageReqVO.getExpiryType())) { // 即将到期
70 - // TODO: @芋艿 需要配置 提前提醒天数  
71 - int REMIND_DAYS = 20;  
72 query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.APPROVE.getStatus()) 71 query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.APPROVE.getStatus())
73 - .between(CrmContractDO::getEndTime, beginOfToday, endOfToday.plusDays(REMIND_DAYS)); 72 + .between(CrmContractDO::getEndTime, beginOfToday, endOfToday.plusDays(config.getNotifyDays()));
74 } else if (CrmContractPageReqVO.EXPIRY_TYPE_EXPIRED.equals(pageReqVO.getExpiryType())) { // 已到期 73 } else if (CrmContractPageReqVO.EXPIRY_TYPE_EXPIRED.equals(pageReqVO.getExpiryType())) { // 已到期
75 query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.APPROVE.getStatus()) 74 query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.APPROVE.getStatus())
76 .lt(CrmContractDO::getEndTime, endOfToday); 75 .lt(CrmContractDO::getEndTime, endOfToday);
@@ -95,17 +94,17 @@ public interface CrmContractMapper extends BaseMapperX&lt;CrmContractDO&gt; { @@ -95,17 +94,17 @@ public interface CrmContractMapper extends BaseMapperX&lt;CrmContractDO&gt; {
95 return selectCount(CrmContractDO::getBusinessId, businessId); 94 return selectCount(CrmContractDO::getBusinessId, businessId);
96 } 95 }
97 96
98 - default Long selectCheckContractCount(Long userId) { 97 + default Long selectCountByAudit(Long userId) {
99 MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>(); 98 MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>();
100 // 我负责的 + 非公海 99 // 我负责的 + 非公海
101 CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(), 100 CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(),
102 CrmContractDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE); 101 CrmContractDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
103 - // 未提交 or 审核不通过  
104 - query.in(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.DRAFT.getStatus(), CrmAuditStatusEnum.REJECT.getStatus()); 102 + // 未审核
  103 + query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.PROCESS.getStatus());
105 return selectCount(query); 104 return selectCount(query);
106 } 105 }
107 106
108 - default Long selectEndContractCount(Long userId) { 107 + default Long selectCountByRemind(Long userId, CrmContractConfigDO config) {
109 MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>(); 108 MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>();
110 // 我负责的 + 非公海 109 // 我负责的 + 非公海
111 CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(), 110 CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(),
@@ -113,10 +112,8 @@ public interface CrmContractMapper extends BaseMapperX&lt;CrmContractDO&gt; { @@ -113,10 +112,8 @@ public interface CrmContractMapper extends BaseMapperX&lt;CrmContractDO&gt; {
113 // 即将到期 112 // 即将到期
114 LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now()); 113 LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
115 LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now()); 114 LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now());
116 - // TODO: @dhb52 需要配置 提前提醒天数  
117 - int REMIND_DAYS = 20;  
118 - query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.APPROVE.getStatus())  
119 - .between(CrmContractDO::getEndTime, beginOfToday, endOfToday.plusDays(REMIND_DAYS)); 115 + query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.APPROVE.getStatus()) // 必须审批通过!
  116 + .between(CrmContractDO::getEndTime, beginOfToday, endOfToday.plusDays(config.getNotifyDays()));
120 return selectCount(query); 117 return selectCount(query);
121 } 118 }
122 119
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractService.java
@@ -162,14 +162,14 @@ public interface CrmContractService { @@ -162,14 +162,14 @@ public interface CrmContractService {
162 * @param userId 用户编号 162 * @param userId 用户编号
163 * @return 提醒数量 163 * @return 提醒数量
164 */ 164 */
165 - Long getCheckContractCount(Long userId); 165 + Long getAuditContractCount(Long userId);
166 166
167 /** 167 /**
168 - * 获得即将到期的合同数量 168 + * 获得即将到期(提醒)的合同数量
169 * 169 *
170 * @param userId 用户编号 170 * @param userId 用户编号
171 * @return 提醒数量 171 * @return 提醒数量
172 */ 172 */
173 - Long getEndContractCount(Long userId); 173 + Long getRemindContractCount(Long userId);
174 174
175 } 175 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
@@ -13,6 +13,7 @@ import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; @@ -13,6 +13,7 @@ import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
13 import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractPageReqVO; 13 import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractPageReqVO;
14 import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractSaveReqVO; 14 import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractSaveReqVO;
15 import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractTransferReqVO; 15 import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractTransferReqVO;
  16 +import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractConfigDO;
16 import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO; 17 import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO;
17 import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractProductDO; 18 import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractProductDO;
18 import cn.iocoder.yudao.module.crm.dal.mysql.contract.CrmContractMapper; 19 import cn.iocoder.yudao.module.crm.dal.mysql.contract.CrmContractMapper;
@@ -83,6 +84,8 @@ public class CrmContractServiceImpl implements CrmContractService { @@ -83,6 +84,8 @@ public class CrmContractServiceImpl implements CrmContractService {
83 private CrmBusinessService businessService; 84 private CrmBusinessService businessService;
84 @Resource 85 @Resource
85 private CrmContactService contactService; 86 private CrmContactService contactService;
  87 + @Resource
  88 + private CrmContractConfigService contractConfigService;
86 89
87 @Resource 90 @Resource
88 private AdminUserApi adminUserApi; 91 private AdminUserApi adminUserApi;
@@ -172,8 +175,6 @@ public class CrmContractServiceImpl implements CrmContractService { @@ -172,8 +175,6 @@ public class CrmContractServiceImpl implements CrmContractService {
172 } 175 }
173 } 176 }
174 177
175 - // TODO @合同待定:缺一个取消合同的接口;只有草稿、审批中可以取消;CrmAuditStatusEnum  
176 -  
177 /** 178 /**
178 * 校验关联数据是否存在 179 * 校验关联数据是否存在
179 * 180 *
@@ -314,7 +315,7 @@ public class CrmContractServiceImpl implements CrmContractService { @@ -314,7 +315,7 @@ public class CrmContractServiceImpl implements CrmContractService {
314 contractMapper.updateById(new CrmContractDO().setId(id).setAuditStatus(auditStatus)); 315 contractMapper.updateById(new CrmContractDO().setId(id).setAuditStatus(auditStatus));
315 } 316 }
316 317
317 - //======================= 查询相关 ======================= 318 + // ======================= 查询相关 =======================
318 319
319 @Override 320 @Override
320 @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTRACT, bizId = "#id", level = CrmPermissionLevelEnum.READ) 321 @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTRACT, bizId = "#id", level = CrmPermissionLevelEnum.READ)
@@ -332,7 +333,16 @@ public class CrmContractServiceImpl implements CrmContractService { @@ -332,7 +333,16 @@ public class CrmContractServiceImpl implements CrmContractService {
332 333
333 @Override 334 @Override
334 public PageResult<CrmContractDO> getContractPage(CrmContractPageReqVO pageReqVO, Long userId) { 335 public PageResult<CrmContractDO> getContractPage(CrmContractPageReqVO pageReqVO, Long userId) {
335 - return contractMapper.selectPage(pageReqVO, userId); 336 + // 1. 即将到期,需要查询合同配置
  337 + CrmContractConfigDO config = null;
  338 + if (CrmContractPageReqVO.EXPIRY_TYPE_ABOUT_TO_EXPIRE.equals(pageReqVO.getExpiryType())) {
  339 + config = contractConfigService.getContractConfig();
  340 + if (config != null && Boolean.FALSE.equals(config.getNotifyEnabled())) {
  341 + config = null;
  342 + }
  343 + }
  344 + // 2. 查询分页
  345 + return contractMapper.selectPage(pageReqVO, userId, config);
336 } 346 }
337 347
338 @Override 348 @Override
@@ -367,16 +377,18 @@ public class CrmContractServiceImpl implements CrmContractService { @@ -367,16 +377,18 @@ public class CrmContractServiceImpl implements CrmContractService {
367 return contractProductMapper.selectListByContractId(contactId); 377 return contractProductMapper.selectListByContractId(contactId);
368 } 378 }
369 379
370 - // TODO @合同待定:需要新增一个 ContractConfigDO 表,合同配置,重点是到期提醒;  
371 -  
372 @Override 380 @Override
373 - public Long getCheckContractCount(Long userId) {  
374 - return contractMapper.selectCheckContractCount(userId); 381 + public Long getAuditContractCount(Long userId) {
  382 + return contractMapper.selectCountByAudit(userId);
375 } 383 }
376 384
377 @Override 385 @Override
378 - public Long getEndContractCount(Long userId) {  
379 - return contractMapper.selectEndContractCount(userId); 386 + public Long getRemindContractCount(Long userId) {
  387 + CrmContractConfigDO config = contractConfigService.getContractConfig();
  388 + if (config == null || Boolean.FALSE.equals(config.getNotifyEnabled())) {
  389 + return 0L;
  390 + }
  391 + return contractMapper.selectCountByRemind(userId, config);
380 } 392 }
381 393
382 } 394 }