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

This commit is contained in:
YunaiV 2024-02-24 17:55:40 +08:00
parent 0b0830f445
commit 53ebd39c73
4 changed files with 41 additions and 32 deletions

View File

@ -215,18 +215,18 @@ public class CrmContractController {
}); });
} }
@GetMapping("/check-contract-count") @GetMapping("/audit-count")
@Operation(summary = "获得待审核合同数量") @Operation(summary = "获得待审核合同数量")
@PreAuthorize("@ss.hasPermission('crm:contract:query')") @PreAuthorize("@ss.hasPermission('crm:contract:query')")
public CommonResult<Long> getCheckContractCount() { public CommonResult<Long> getAuditContractCount() {
return success(contractService.getCheckContractCount(getLoginUserId())); return success(contractService.getAuditContractCount(getLoginUserId()));
} }
@GetMapping("/end-contract-count") @GetMapping("/remind-count")
@Operation(summary = "获得即将到期的合同数量") @Operation(summary = "获得即将到期(提醒)的合同数量")
@PreAuthorize("@ss.hasPermission('crm:contract:query')") @PreAuthorize("@ss.hasPermission('crm:contract:query')")
public CommonResult<Long> getEndContractCount() { public CommonResult<Long> getRemindContractCount() {
return success(contractService.getEndContractCount(getLoginUserId())); return success(contractService.getRemindContractCount(getLoginUserId()));
} }
} }

View File

@ -6,6 +6,7 @@ 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.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractPageReqVO; import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractPageReqVO;
import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractConfigDO;
import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO; import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO;
import cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum; import cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum;
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
@ -49,7 +50,7 @@ public interface CrmContractMapper extends BaseMapperX<CrmContractDO> {
.orderByDesc(CrmContractDO::getId)); .orderByDesc(CrmContractDO::getId));
} }
default PageResult<CrmContractDO> selectPage(CrmContractPageReqVO pageReqVO, Long userId) { default PageResult<CrmContractDO> selectPage(CrmContractPageReqVO pageReqVO, Long userId, CrmContractConfigDO config) {
MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>(); MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>();
// 拼接数据权限的查询条件 // 拼接数据权限的查询条件
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(), CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(),
@ -67,10 +68,8 @@ public interface CrmContractMapper extends BaseMapperX<CrmContractDO> {
LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now()); LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now()); LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now());
if (CrmContractPageReqVO.EXPIRY_TYPE_ABOUT_TO_EXPIRE.equals(pageReqVO.getExpiryType())) { // 即将到期 if (CrmContractPageReqVO.EXPIRY_TYPE_ABOUT_TO_EXPIRE.equals(pageReqVO.getExpiryType())) { // 即将到期
// TODO: @芋艿 需要配置 提前提醒天数
int REMIND_DAYS = 20;
query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.APPROVE.getStatus()) query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.APPROVE.getStatus())
.between(CrmContractDO::getEndTime, beginOfToday, endOfToday.plusDays(REMIND_DAYS)); .between(CrmContractDO::getEndTime, beginOfToday, endOfToday.plusDays(config.getNotifyDays()));
} else if (CrmContractPageReqVO.EXPIRY_TYPE_EXPIRED.equals(pageReqVO.getExpiryType())) { // 已到期 } else if (CrmContractPageReqVO.EXPIRY_TYPE_EXPIRED.equals(pageReqVO.getExpiryType())) { // 已到期
query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.APPROVE.getStatus()) query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.APPROVE.getStatus())
.lt(CrmContractDO::getEndTime, endOfToday); .lt(CrmContractDO::getEndTime, endOfToday);
@ -95,17 +94,17 @@ public interface CrmContractMapper extends BaseMapperX<CrmContractDO> {
return selectCount(CrmContractDO::getBusinessId, businessId); return selectCount(CrmContractDO::getBusinessId, businessId);
} }
default Long selectCheckContractCount(Long userId) { default Long selectCountByAudit(Long userId) {
MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>(); MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>();
// 我负责的 + 非公海 // 我负责的 + 非公海
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(), CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(),
CrmContractDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE); CrmContractDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
// 提交 or 审核不通过 // 审核
query.in(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.DRAFT.getStatus(), CrmAuditStatusEnum.REJECT.getStatus()); query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.PROCESS.getStatus());
return selectCount(query); return selectCount(query);
} }
default Long selectEndContractCount(Long userId) { default Long selectCountByRemind(Long userId, CrmContractConfigDO config) {
MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>(); MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>();
// 我负责的 + 非公海 // 我负责的 + 非公海
CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(), CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(),
@ -113,10 +112,8 @@ public interface CrmContractMapper extends BaseMapperX<CrmContractDO> {
// 即将到期 // 即将到期
LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now()); LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now()); LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now());
// TODO: @dhb52 需要配置 提前提醒天数 query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.APPROVE.getStatus()) // 必须审批通过
int REMIND_DAYS = 20; .between(CrmContractDO::getEndTime, beginOfToday, endOfToday.plusDays(config.getNotifyDays()));
query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.APPROVE.getStatus())
.between(CrmContractDO::getEndTime, beginOfToday, endOfToday.plusDays(REMIND_DAYS));
return selectCount(query); return selectCount(query);
} }

View File

@ -162,14 +162,14 @@ public interface CrmContractService {
* @param userId 用户编号 * @param userId 用户编号
* @return 提醒数量 * @return 提醒数量
*/ */
Long getCheckContractCount(Long userId); Long getAuditContractCount(Long userId);
/** /**
* 获得即将到期的合同数量 * 获得即将到期提醒的合同数量
* *
* @param userId 用户编号 * @param userId 用户编号
* @return 提醒数量 * @return 提醒数量
*/ */
Long getEndContractCount(Long userId); Long getRemindContractCount(Long userId);
} }

View File

@ -13,6 +13,7 @@ import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractPageReqVO; import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractPageReqVO;
import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractSaveReqVO; import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractSaveReqVO;
import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractTransferReqVO; import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractTransferReqVO;
import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractConfigDO;
import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO; import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO;
import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractProductDO; import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractProductDO;
import cn.iocoder.yudao.module.crm.dal.mysql.contract.CrmContractMapper; import cn.iocoder.yudao.module.crm.dal.mysql.contract.CrmContractMapper;
@ -83,6 +84,8 @@ public class CrmContractServiceImpl implements CrmContractService {
private CrmBusinessService businessService; private CrmBusinessService businessService;
@Resource @Resource
private CrmContactService contactService; private CrmContactService contactService;
@Resource
private CrmContractConfigService contractConfigService;
@Resource @Resource
private AdminUserApi adminUserApi; private AdminUserApi adminUserApi;
@ -172,8 +175,6 @@ public class CrmContractServiceImpl implements CrmContractService {
} }
} }
// TODO @合同待定缺一个取消合同的接口只有草稿审批中可以取消CrmAuditStatusEnum
/** /**
* 校验关联数据是否存在 * 校验关联数据是否存在
* *
@ -314,7 +315,7 @@ public class CrmContractServiceImpl implements CrmContractService {
contractMapper.updateById(new CrmContractDO().setId(id).setAuditStatus(auditStatus)); contractMapper.updateById(new CrmContractDO().setId(id).setAuditStatus(auditStatus));
} }
//======================= 查询相关 ======================= // ======================= 查询相关 =======================
@Override @Override
@CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTRACT, bizId = "#id", level = CrmPermissionLevelEnum.READ) @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTRACT, bizId = "#id", level = CrmPermissionLevelEnum.READ)
@ -332,7 +333,16 @@ public class CrmContractServiceImpl implements CrmContractService {
@Override @Override
public PageResult<CrmContractDO> getContractPage(CrmContractPageReqVO pageReqVO, Long userId) { public PageResult<CrmContractDO> getContractPage(CrmContractPageReqVO pageReqVO, Long userId) {
return contractMapper.selectPage(pageReqVO, userId); // 1. 即将到期需要查询合同配置
CrmContractConfigDO config = null;
if (CrmContractPageReqVO.EXPIRY_TYPE_ABOUT_TO_EXPIRE.equals(pageReqVO.getExpiryType())) {
config = contractConfigService.getContractConfig();
if (config != null && Boolean.FALSE.equals(config.getNotifyEnabled())) {
config = null;
}
}
// 2. 查询分页
return contractMapper.selectPage(pageReqVO, userId, config);
} }
@Override @Override
@ -367,16 +377,18 @@ public class CrmContractServiceImpl implements CrmContractService {
return contractProductMapper.selectListByContractId(contactId); return contractProductMapper.selectListByContractId(contactId);
} }
// TODO @合同待定需要新增一个 ContractConfigDO 合同配置重点是到期提醒
@Override @Override
public Long getCheckContractCount(Long userId) { public Long getAuditContractCount(Long userId) {
return contractMapper.selectCheckContractCount(userId); return contractMapper.selectCountByAudit(userId);
} }
@Override @Override
public Long getEndContractCount(Long userId) { public Long getRemindContractCount(Long userId) {
return contractMapper.selectEndContractCount(userId); CrmContractConfigDO config = contractConfigService.getContractConfig();
if (config == null || Boolean.FALSE.equals(config.getNotifyEnabled())) {
return 0L;
}
return contractMapper.selectCountByRemind(userId, config);
} }
} }