📖 CRM:code review 待提醒逻辑

This commit is contained in:
YunaiV 2024-02-18 21:47:36 +08:00
parent 51f52ff4b7
commit 1bfb406041
13 changed files with 213 additions and 219 deletions

View File

@ -24,73 +24,47 @@ public class CrmClueRespVO {
@ExcelProperty("编号") @ExcelProperty("编号")
private Long id; private Long id;
@Schema(description = "转化状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") @Schema(description = "线索名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "线索xxx")
@ExcelProperty(value = "转化状态", converter = DictConvert.class) @ExcelProperty("线索名称")
@DictFormat(DictTypeConstants.BOOLEAN_STRING) private String name;
private Boolean transformStatus;
@Schema(description = "跟进状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") @Schema(description = "跟进状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
@ExcelProperty(value = "跟进状态", converter = DictConvert.class) @ExcelProperty(value = "跟进状态", converter = DictConvert.class)
@DictFormat(DictTypeConstants.BOOLEAN_STRING) @DictFormat(DictTypeConstants.BOOLEAN_STRING)
private Boolean followUpStatus; private Boolean followUpStatus;
@Schema(description = "线索名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "线索xxx") @Schema(description = "最后跟进时间")
@ExcelProperty("线索名称") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private String name; @ExcelProperty("最后跟进时间")
private LocalDateTime contactLastTime;
@Schema(description = "客户 id", requiredMode = Schema.RequiredMode.REQUIRED, example = "520")
// TODO 这里需要导出成客户名称
@ExcelProperty("客户id")
private Long customerId;
@Schema(description = "下次联系时间", example = "2023-10-18 01:00:00") @Schema(description = "下次联系时间", example = "2023-10-18 01:00:00")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ExcelProperty("下次联系时间") @ExcelProperty("下次联系时间")
private LocalDateTime contactNextTime; private LocalDateTime contactNextTime;
@Schema(description = "电话", example = "18000000000") @Schema(description = "负责人编号")
@ExcelProperty("电话") @ExcelProperty("负责人的用户编号")
private String telephone; // TODO 这里需要导出成负责人的名字
private Long ownerUserId;
@Schema(description = "转化状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
@ExcelProperty(value = "转化状态", converter = DictConvert.class)
@DictFormat(DictTypeConstants.BOOLEAN_STRING)
private Boolean transformStatus;
@Schema(description = "客户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "520")
// TODO 这里需要导出成客户名称
@ExcelProperty("客户编号")
private Long customerId;
@Schema(description = "手机号", example = "18000000000") @Schema(description = "手机号", example = "18000000000")
@ExcelProperty("手机号") @ExcelProperty("手机号")
private String mobile; private String mobile;
@Schema(description = "地址", example = "北京市海淀区") @Schema(description = "电话", example = "18000000000")
@ExcelProperty("地址") @ExcelProperty("电话")
private String address; private String telephone;
@Schema(description = "负责人编号")
@ExcelProperty("负责人的用户编号")
private Long ownerUserId;
@Schema(description = "最后跟进时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ExcelProperty("最后跟进时间")
private LocalDateTime contactLastTime;
@Schema(description = "备注", example = "随便")
@ExcelProperty("备注")
private String remark;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "所属行业", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563")
@ExcelProperty(value = "所属行业", converter = DictConvert.class)
@DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_INDUSTRY)
private Integer industryId;
@Schema(description = "客户等级", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563")
@ExcelProperty(value = "客户等级", converter = DictConvert.class)
@DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_LEVEL)
private Integer level;
@Schema(description = "客户来源", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563")
@ExcelProperty(value = "客户来源", converter = DictConvert.class)
@DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_SOURCE)
private Integer source;
@Schema(description = "网址", example = "25682") @Schema(description = "网址", example = "25682")
@ExcelProperty("网址") @ExcelProperty("网址")
@ -108,8 +82,35 @@ public class CrmClueRespVO {
@ExcelProperty("email") @ExcelProperty("email")
private String email; private String email;
@Schema(description = "地址", example = "北京市海淀区")
@ExcelProperty("地址")
private String address;
@Schema(description = "所属行业", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563")
@ExcelProperty(value = "所属行业", converter = DictConvert.class)
@DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_INDUSTRY)
private Integer industryId;
@Schema(description = "客户等级", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563")
@ExcelProperty(value = "客户等级", converter = DictConvert.class)
@DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_LEVEL)
private Integer level;
@Schema(description = "客户来源", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563")
@ExcelProperty(value = "客户来源", converter = DictConvert.class)
@DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_SOURCE)
private Integer source;
@Schema(description = "客户描述", example = "25682") @Schema(description = "客户描述", example = "25682")
@ExcelProperty("客户描述") @ExcelProperty("客户描述")
private String description; private String description;
@Schema(description = "备注", example = "随便")
@ExcelProperty("备注")
private String remark;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
} }

View File

@ -21,7 +21,7 @@ import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
import static cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_INDUSTRY; import static cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_INDUSTRY;
@Schema(description = "管理后台 - CRM 线索 创建/更新 Request VO") @Schema(description = "管理后台 - CRM 线索创建/更新 Request VO")
@Data @Data
public class CrmClueSaveReqVO { public class CrmClueSaveReqVO {
@ -33,50 +33,28 @@ public class CrmClueSaveReqVO {
@NotEmpty(message = "线索名称不能为空") @NotEmpty(message = "线索名称不能为空")
private String name; private String name;
@Schema(description = "最后跟进时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@DiffLogField(name = "最后跟进时间")
private LocalDateTime contactLastTime;
@Schema(description = "下次联系时间", example = "2023-10-18 01:00:00") @Schema(description = "下次联系时间", example = "2023-10-18 01:00:00")
@DiffLogField(name = "下次联系时间") @DiffLogField(name = "下次联系时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime contactNextTime; private LocalDateTime contactNextTime;
@Schema(description = "电话", example = "18000000000") @Schema(description = "负责人编号", example = "2048")
@DiffLogField(name = "电话") private Long ownerUserId;
@Telephone
private String telephone;
@Schema(description = "手机号", example = "18000000000") @Schema(description = "手机号", example = "18000000000")
@DiffLogField(name = "手机号") @DiffLogField(name = "手机号")
@Mobile @Mobile
private String mobile; private String mobile;
@Schema(description = "地址", example = "北京市海淀区") @Schema(description = "电话", example = "18000000000")
@DiffLogField(name = "地址") @DiffLogField(name = "电话")
private String address; @Telephone
private String telephone;
@Schema(description = "最后跟进时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@DiffLogField(name = "最后跟进时间")
private LocalDateTime contactLastTime;
@Schema(description = "负责人编号", example = "2048")
private Long ownerUserId;
@Schema(description = "备注", example = "随便")
@DiffLogField(name = "备注")
private String remark;
@Schema(description = "所属行业", example = "1")
@DiffLogField(name = "所属行业", function = CrmCustomerIndustryParseFunction.NAME)
@DictFormat(CRM_CUSTOMER_INDUSTRY)
private Integer industryId;
@Schema(description = "客户等级", example = "2")
@DiffLogField(name = "客户等级", function = CrmCustomerLevelParseFunction.NAME)
@InEnum(CrmCustomerLevelEnum.class)
private Integer level;
@Schema(description = "客户来源", example = "3")
@DiffLogField(name = "客户来源", function = CrmCustomerSourceParseFunction.NAME)
private Integer source;
@Schema(description = "网址", example = "https://www.baidu.com") @Schema(description = "网址", example = "https://www.baidu.com")
@DiffLogField(name = "网址") @DiffLogField(name = "网址")
@ -98,8 +76,31 @@ public class CrmClueSaveReqVO {
@Size(max = 255, message = "邮箱长度不能超过 255 个字符") @Size(max = 255, message = "邮箱长度不能超过 255 个字符")
private String email; private String email;
@Schema(description = "地址", example = "北京市海淀区")
@DiffLogField(name = "地址")
private String address;
@Schema(description = "所属行业", example = "1")
@DiffLogField(name = "所属行业", function = CrmCustomerIndustryParseFunction.NAME)
@DictFormat(CRM_CUSTOMER_INDUSTRY)
private Integer industryId;
@Schema(description = "客户等级", example = "2")
@DiffLogField(name = "客户等级", function = CrmCustomerLevelParseFunction.NAME)
@InEnum(CrmCustomerLevelEnum.class)
private Integer level;
@Schema(description = "客户来源", example = "3")
@DiffLogField(name = "客户来源", function = CrmCustomerSourceParseFunction.NAME)
private Integer source;
@Schema(description = "客户描述", example = "任意文字") @Schema(description = "客户描述", example = "任意文字")
@DiffLogField(name = "客户描述") @DiffLogField(name = "客户描述")
@Size(max = 4096, message = "客户描述长度不能超过 4096 个字符") @Size(max = 4096, message = "客户描述长度不能超过 4096 个字符")
private String description; private String description;
@Schema(description = "备注", example = "随便")
@DiffLogField(name = "备注")
private String remark;
} }

View File

@ -191,7 +191,6 @@ public class CrmContractController {
return success(contractService.getCheckContractCount(getLoginUserId())); return success(contractService.getCheckContractCount(getLoginUserId()));
} }
@GetMapping("/end-contract-count") @GetMapping("/end-contract-count")
@Operation(summary = "获得即将到期的合同数量") @Operation(summary = "获得即将到期的合同数量")
@PreAuthorize("@ss.hasPermission('crm:contract:query')") @PreAuthorize("@ss.hasPermission('crm:contract:query')")

View File

@ -152,19 +152,17 @@ public class CrmCustomerController {
@Operation(summary = "获得待进入公海客户数量") @Operation(summary = "获得待进入公海客户数量")
@PreAuthorize("@ss.hasPermission('crm:customer:query')") @PreAuthorize("@ss.hasPermission('crm:customer:query')")
public CommonResult<Long> getPutInPoolRemindCustomerCount() { public CommonResult<Long> getPutInPoolRemindCustomerCount() {
// 获取公海配置 TODO @dbh52合并到 getPutInPoolRemindCustomerPage 会更合适哈 // 获取公海配置
CrmCustomerPoolConfigDO poolConfigDO = customerPoolConfigService.getCustomerPoolConfig(); CrmCustomerPoolConfigDO poolConfigDO = customerPoolConfigService.getCustomerPoolConfig();
if (ObjUtil.isNull(poolConfigDO) if (ObjUtil.isNull(poolConfigDO)
|| Boolean.FALSE.equals(poolConfigDO.getEnabled()) || Boolean.FALSE.equals(poolConfigDO.getEnabled())
|| Boolean.FALSE.equals(poolConfigDO.getNotifyEnabled())) { || Boolean.FALSE.equals(poolConfigDO.getNotifyEnabled())) {
throw exception(CUSTOMER_POOL_CONFIG_NOT_EXISTS_OR_DISABLED); throw exception(CUSTOMER_POOL_CONFIG_NOT_EXISTS_OR_DISABLED);
} }
CrmCustomerPageReqVO pageVO = new CrmCustomerPageReqVO()
CrmCustomerPageReqVO pageVO = new CrmCustomerPageReqVO(); .setPool(null)
pageVO.setPool(null); .setContactStatus(CrmCustomerPageReqVO.CONTACT_TODAY)
pageVO.setContactStatus(CrmCustomerPageReqVO.CONTACT_TODAY); .setSceneType(CrmSceneTypeEnum.OWNER.getType());
pageVO.setSceneType(CrmSceneTypeEnum.OWNER.getType());
return success(customerService.getPutInPoolRemindCustomerCount(pageVO, poolConfigDO, getLoginUserId())); return success(customerService.getPutInPoolRemindCustomerCount(pageVO, poolConfigDO, getLoginUserId()));
} }
@ -182,7 +180,6 @@ public class CrmCustomerController {
return success(customerService.getFollowCustomerCount(getLoginUserId())); return success(customerService.getFollowCustomerCount(getLoginUserId()));
} }
/** /**
* 获取距离进入公海的时间 * 获取距离进入公海的时间
* *

View File

@ -50,10 +50,7 @@ public class CrmCustomerPageReqVO extends PageParam {
private Boolean pool; // null 则表示为不是公海数据 private Boolean pool; // null 则表示为不是公海数据
@Schema(description = "联系状态", example = "1") @Schema(description = "联系状态", example = "1")
private Integer contactStatus; // backlog查询条件, null 则表示为不做查询 private Integer contactStatus; // backlog 查询条件
@Schema(description = "跟进状态", example = "true")
private Boolean followUpStatus; // backlog查询条件, null 则表示为不做查询
@Schema(description = "跟进状态", example = "true") @Schema(description = "跟进状态", example = "true")
private Boolean followUpStatus; private Boolean followUpStatus;

View File

@ -10,7 +10,6 @@ import lombok.*;
import java.time.LocalDateTime; import java.time.LocalDateTime;
// TODO 芋艿字段的顺序需要整理下
/** /**
* 线索 DO * 线索 DO
* *
@ -32,67 +31,51 @@ public class CrmClueDO extends BaseDO {
@TableId @TableId
private Long id; private Long id;
/** /**
* 转化状态 * 线索名称
*/ */
private Boolean transformStatus; private String name;
/** /**
* 跟进状态 * 跟进状态
*/ */
private Boolean followUpStatus; private Boolean followUpStatus;
/** /**
* 线索名称 * 最后跟进时间 TODO 添加跟进记录时更新该值
*/ */
private String name; private LocalDateTime contactLastTime;
/**
* 客户 id
*
* 关联 {@link CrmCustomerDO#getId()}
*/
private Long customerId;
/** /**
* 下次联系时间 * 下次联系时间
*/ */
private LocalDateTime contactNextTime; private LocalDateTime contactNextTime;
/** /**
* 电话 * 负责人的用户编号
*
* 关联 AdminUserDO id 字段
*/ */
private String telephone; private Long ownerUserId;
/**
* 转化状态
*
* true 表示已转换会更新 {@link #customerId} 字段
*/
private Boolean transformStatus;
/**
* 客户编号
*
* 关联 {@link CrmCustomerDO#getId()}
*/
private Long customerId;
/** /**
* 手机号 * 手机号
*/ */
private String mobile; private String mobile;
/** /**
* 地址 * 电话
*/ */
private String address; private String telephone;
/**
* 最后跟进时间 TODO 添加跟进记录时更新该值
*/
private LocalDateTime contactLastTime;
/**
* 备注
*/
private String remark;
/**
* 负责人的用户编号
* 关联 AdminUserDO id 字段
*/
private Long ownerUserId;
/**
* 所属行业
* 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_INDUSTRY}
*/
private Integer industryId;
/**
* 客户等级
* 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_LEVEL}
*/
private Integer level;
/**
* 客户来源
* 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_SOURCE}
*/
private Integer source;
/** /**
* 网址 * 网址
*/ */
@ -109,8 +92,35 @@ public class CrmClueDO extends BaseDO {
* email * email
*/ */
private String email; private String email;
/**
* 地址
*/
private String address;
/**
* 所属行业
*
* 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_INDUSTRY}
*/
private Integer industryId;
/**
* 客户等级
*
* 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_LEVEL}
*/
private Integer level;
/**
* 客户来源
*
* 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_SOURCE}
*/
private Integer source;
/** /**
* 客户描述 * 客户描述
*/ */
private String description; private String description;
/**
* 备注
*/
private String remark;
} }

View File

@ -9,8 +9,6 @@ import lombok.*;
import java.time.LocalDateTime; import java.time.LocalDateTime;
// TODO 芋艿调整下字段
/** /**
* CRM 客户 DO * CRM 客户 DO
* *
@ -35,10 +33,35 @@ public class CrmCustomerDO extends BaseDO {
* 客户名称 * 客户名称
*/ */
private String name; private String name;
/** /**
* 跟进状态 * 跟进状态
*/ */
private Boolean followUpStatus; private Boolean followUpStatus;
/**
* 最后跟进时间
*/
private LocalDateTime contactLastTime;
/**
* 最后跟进内容
*/
private String contactLastContent;
/**
* 下次联系时间
*/
private LocalDateTime contactNextTime;
/**
* 负责人的用户编号
*
* 关联 AdminUserDO id 字段
*/
private Long ownerUserId;
/**
* 最后接收时间
*/
private LocalDateTime receiveTime;
/** /**
* 锁定状态 * 锁定状态
*/ */
@ -47,24 +70,7 @@ public class CrmCustomerDO extends BaseDO {
* 成交状态 * 成交状态
*/ */
private Boolean dealStatus; private Boolean dealStatus;
/**
* 所属行业
*
* 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_INDUSTRY}
*/
private Integer industryId;
/**
* 客户等级
*
* 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_LEVEL}
*/
private Integer level;
/**
* 客户来源
*
* 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_SOURCE}
*/
private Integer source;
/** /**
* 手机 * 手机
*/ */
@ -89,20 +95,6 @@ public class CrmCustomerDO extends BaseDO {
* email * email
*/ */
private String email; private String email;
/**
* 客户描述
*/
private String description;
/**
* 备注
*/
private String remark;
/**
* 负责人的用户编号
*
* 关联 AdminUserDO id 字段
*/
private Long ownerUserId;
/** /**
* 所在地 * 所在地
* *
@ -113,23 +105,31 @@ public class CrmCustomerDO extends BaseDO {
* 详细地址 * 详细地址
*/ */
private String detailAddress; private String detailAddress;
/** /**
* 最后接收时间 * 所属行业
*
* 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_INDUSTRY}
*/ */
private LocalDateTime receiveTime; private Integer industryId;
/** /**
* 最后跟进时间 * 客户等级
*
* 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_LEVEL}
*/ */
private LocalDateTime contactLastTime; private Integer level;
/** /**
* 最后跟进内容 * 客户来源
*
* 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_SOURCE}
*/ */
private String contactLastContent; private Integer source;
/** /**
* 下次联系时间 * 客户描述
*/ */
private LocalDateTime contactNextTime; private String description;
/**
* 备注
*/
private String remark;
} }

View File

@ -55,17 +55,16 @@ public interface CrmClueMapper extends BaseMapperX<CrmClueDO> {
return selectJoinList(CrmClueDO.class, query); return selectJoinList(CrmClueDO.class, query);
} }
// TODO @dhb52db 统一都是 select 关键字
default Long getFollowLeadsCount(Long userId) { default Long getFollowLeadsCount(Long userId) {
MPJLambdaWrapperX<CrmClueDO> query = new MPJLambdaWrapperX<>(); MPJLambdaWrapperX<CrmClueDO> query = new MPJLambdaWrapperX<>();
// 我负责的 + 非公海
// 我负责的, 非公海
CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_LEADS.getType(), CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_LEADS.getType(),
CrmClueDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE); CrmClueDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
// 未跟进 + 未转化 TODO @dhb52是不是 eq 会更好哈mysql 不等于对索引不友好
// 未跟进, 未转化
query.ne(CrmClueDO::getFollowUpStatus, true) query.ne(CrmClueDO::getFollowUpStatus, true)
.ne(CrmClueDO::getTransformStatus, true); .ne(CrmClueDO::getTransformStatus, true);
return selectCount(query); return selectCount(query);
} }
} }

View File

@ -6,7 +6,6 @@ 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.CrmContractPageReqVO; import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractPageReqVO;
import cn.iocoder.yudao.module.crm.dal.dataobject.clue.CrmClueDO;
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;
@ -89,33 +88,31 @@ public interface CrmContractMapper extends BaseMapperX<CrmContractDO> {
return selectCount(CrmContractDO::getBusinessId, businessId); return selectCount(CrmContractDO::getBusinessId, businessId);
} }
// TODO @dhb52db 统一都是 select 关键字
default Long getCheckContractCount(Long userId) { default Long getCheckContractCount(Long userId) {
MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>(); MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>();
// 我负责的 + 非公海
// 我负责的, 非公海
CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(), CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(),
CrmContractDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE); CrmContractDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
// 未提交 or 审核不通过 // 未提交 or 审核不通过
query.in(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.DRAFT.getStatus(), CrmAuditStatusEnum.REJECT.getStatus()); query.in(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.DRAFT.getStatus(), CrmAuditStatusEnum.REJECT.getStatus());
return selectCount(query); return selectCount(query);
} }
// TODO @dhb52db 统一都是 select 关键字
default Long getEndContractCount(Long userId) { default Long getEndContractCount(Long userId) {
MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>(); MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>();
// 我负责的 + 非公海
// 我负责的, 非公海
CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(), CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(),
CrmContractDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE); CrmContractDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
// 即将到期 // 即将到期
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: @芋艿 需要配置 提前提醒天数
int REMIND_DAYS = 20; 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(REMIND_DAYS));
return selectCount(query); return selectCount(query);
} }
} }

View File

@ -99,8 +99,7 @@ public interface CrmCustomerMapper extends BaseMapperX<CrmCustomerDO> {
// backlog 查询 // backlog 查询
if (ObjUtil.isNotNull(pageReqVO.getContactStatus())) { if (ObjUtil.isNotNull(pageReqVO.getContactStatus())) {
Assert.isNull(pageReqVO.getPool(), "[是否为公海数据]必须是null"); Assert.isNull(pageReqVO.getPool(), "pool 必须是 null");
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 (pageReqVO.getContactStatus().equals(CrmCustomerPageReqVO.CONTACT_TODAY)) { // 今天需联系 if (pageReqVO.getContactStatus().equals(CrmCustomerPageReqVO.CONTACT_TODAY)) { // 今天需联系
@ -113,7 +112,6 @@ public interface CrmCustomerMapper extends BaseMapperX<CrmCustomerDO> {
throw new IllegalArgumentException("未知联系状态:" + pageReqVO.getContactStatus()); throw new IllegalArgumentException("未知联系状态:" + pageReqVO.getContactStatus());
} }
} }
return selectJoinPage(pageReqVO, CrmCustomerDO.class, query); return selectJoinPage(pageReqVO, CrmCustomerDO.class, query);
} }
@ -150,31 +148,28 @@ public interface CrmCustomerMapper extends BaseMapperX<CrmCustomerDO> {
return selectCount(query); return selectCount(query);
} }
// TODO @dhb52db 统一都是 select 关键字
default Long getTodayCustomerCount(Long userId) { default Long getTodayCustomerCount(Long userId) {
MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>(); MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>();
// 我负责的 + 非公海
// 我负责的, 非公海
CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(), CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(),
CrmCustomerDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE); CrmCustomerDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
// 今天需联系 // 今天需联系
LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now()); LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now()); LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now());
query.between(CrmCustomerDO::getContactNextTime, beginOfToday, endOfToday); query.between(CrmCustomerDO::getContactNextTime, beginOfToday, endOfToday);
return selectCount(query); return selectCount(query);
} }
// TODO @dhb52db 统一都是 select 关键字
default Long getFollowCustomerCount(Long userId) { default Long getFollowCustomerCount(Long userId) {
MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>(); MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>();
// 我负责的 + 非公海
// 我负责的, 非公海
CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(), CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(),
CrmCustomerDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE); CrmCustomerDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
// 未跟进 TODO @dhb52是不是 eq 会更好哈mysql 不等于对索引不友好
// 未跟进
query.ne(CrmClueDO::getFollowUpStatus, true); query.ne(CrmClueDO::getFollowUpStatus, true);
return selectCount(query); return selectCount(query);
} }
} }

View File

@ -62,16 +62,14 @@ public interface CrmReceivableMapper extends BaseMapperX<CrmReceivableDO> {
return selectJoinList(CrmReceivableDO.class, query); return selectJoinList(CrmReceivableDO.class, query);
} }
// TODO @dhb52db 统一都是 select 关键字
default Long getCheckReceivablesCount(Long userId) { default Long getCheckReceivablesCount(Long userId) {
MPJLambdaWrapperX<CrmReceivableDO> query = new MPJLambdaWrapperX<>(); MPJLambdaWrapperX<CrmReceivableDO> query = new MPJLambdaWrapperX<>();
// 我负责的 + 非公海
// 我负责的, 非公海
CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE.getType(), CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE.getType(),
CrmReceivableDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE); CrmReceivableDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
// 未提交 or 审核不通过 // 未提交 or 审核不通过
query.in(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.DRAFT.getStatus(), CrmAuditStatusEnum.REJECT.getStatus()); query.in(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.DRAFT.getStatus(), CrmAuditStatusEnum.REJECT.getStatus());
return selectCount(query); return selectCount(query);
} }

View File

@ -79,19 +79,18 @@ public interface CrmReceivablePlanMapper extends BaseMapperX<CrmReceivablePlanDO
return selectJoinList(CrmReceivablePlanDO.class, query); return selectJoinList(CrmReceivablePlanDO.class, query);
} }
// TODO @dhb52db 统一都是 select 关键字
default Long getRemindReceivablePlanCount(Long userId) { default Long getRemindReceivablePlanCount(Long userId) {
MPJLambdaWrapperX<CrmReceivablePlanDO> query = new MPJLambdaWrapperX<>(); MPJLambdaWrapperX<CrmReceivablePlanDO> query = new MPJLambdaWrapperX<>();
// 我负责的 + 非公海
// 我负责的, 非公海
CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE_PLAN.getType(), CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE_PLAN.getType(),
CrmReceivablePlanDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE); CrmReceivablePlanDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
// 待回款 TODO @dhb52to_days(return_time) <= to_days(now())+ remind_days 看看怎么改成不用数据库自己去计算这样的时间
// 待回款
LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now()); LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
query.isNull(CrmReceivablePlanDO::getReceivableId) query.isNull(CrmReceivablePlanDO::getReceivableId)
.gt(CrmReceivablePlanDO::getReturnTime, beginOfToday) .gt(CrmReceivablePlanDO::getReturnTime, beginOfToday)
.apply("to_days(return_time) <= to_days(now())+ remind_days"); .apply("to_days(return_time) <= to_days(now())+ remind_days");
return selectCount(query); return selectCount(query);
} }
} }

View File

@ -179,4 +179,5 @@ public interface CrmCustomerService {
* @return 提醒数量 * @return 提醒数量
*/ */
Long getFollowCustomerCount(Long userId); Long getFollowCustomerCount(Long userId);
} }