mirror of
https://gitee.com/huangge1199_admin/vue-pro.git
synced 2024-11-26 17:21:53 +08:00
!847 fix: 根据Code Review修改代办消息backlog
Merge pull request !847 from dhb52/crm-msg
This commit is contained in:
commit
422b19caf7
@ -86,4 +86,7 @@ public interface ErrorCodeConstants {
|
|||||||
ErrorCode FOLLOW_UP_RECORD_NOT_EXISTS = new ErrorCode(1_020_013_000, "跟进记录不存在");
|
ErrorCode FOLLOW_UP_RECORD_NOT_EXISTS = new ErrorCode(1_020_013_000, "跟进记录不存在");
|
||||||
ErrorCode FOLLOW_UP_RECORD_DELETE_DENIED = new ErrorCode(1_020_013_001, "删除跟进记录失败,原因:没有权限");
|
ErrorCode FOLLOW_UP_RECORD_DELETE_DENIED = new ErrorCode(1_020_013_001, "删除跟进记录失败,原因:没有权限");
|
||||||
|
|
||||||
|
// ========== 待办消息 1_020_014_000 ==========
|
||||||
|
ErrorCode BACKLOG_CONTACT_STATUS_INVALID = new ErrorCode(1_020_014_000, "客户联系状态有误");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,39 +0,0 @@
|
|||||||
package cn.iocoder.yudao.module.crm.enums.message;
|
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* CRM 联系状态
|
|
||||||
*
|
|
||||||
* @author dhb52
|
|
||||||
*/
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
@Getter
|
|
||||||
public enum CrmContactStatusEnum implements IntArrayValuable {
|
|
||||||
|
|
||||||
NEEDED_TODAY(1, "今日需联系"),
|
|
||||||
EXPIRED(2, "已逾期"),
|
|
||||||
ALREADY_CONTACT(3, "已联系"),
|
|
||||||
;
|
|
||||||
|
|
||||||
public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmContactStatusEnum::getType).toArray();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 状态
|
|
||||||
*/
|
|
||||||
private final Integer type;
|
|
||||||
/**
|
|
||||||
* 状态名
|
|
||||||
*/
|
|
||||||
private final String name;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int[] array() {
|
|
||||||
return ARRAYS;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,12 +1,12 @@
|
|||||||
package cn.iocoder.yudao.module.crm.controller.admin.message;
|
package cn.iocoder.yudao.module.crm.controller.admin.backlog;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerRespVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerRespVO;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.message.vo.CrmTodayCustomerPageReqVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.backlog.vo.CrmTodayCustomerPageReqVO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
|
||||||
import cn.iocoder.yudao.module.crm.service.message.CrmMessageService;
|
import cn.iocoder.yudao.module.crm.service.message.CrmBacklogService;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
@ -20,19 +20,19 @@ import org.springframework.web.bind.annotation.RestController;
|
|||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
||||||
|
|
||||||
@Tag(name = "管理后台 - CRM消息")
|
@Tag(name = "管理后台 - CRM待办消息")
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/crm/message")
|
@RequestMapping("/crm/backlog")
|
||||||
@Validated
|
@Validated
|
||||||
public class CrmMessageController {
|
public class CrmBacklogController {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private CrmMessageService crmMessageService;
|
private CrmBacklogService crmMessageService;
|
||||||
|
|
||||||
// TODO 芋艿:未来可能合并到 CrmCustomerController
|
// TODO 芋艿:未来可能合并到 CrmCustomerController
|
||||||
@GetMapping("/todayCustomer") // TODO @dbh52:【优先级低】url 使用中划线,项目规范。然后叫 today-customer-page,通过 page 体现出它是个分页接口
|
@GetMapping("/today-customer-page")
|
||||||
@Operation(summary = "今日需联系客户")
|
@Operation(summary = "今日需联系客户")
|
||||||
@PreAuthorize("@ss.hasPermission('crm:message:todayCustomer')")
|
@PreAuthorize("@ss.hasPermission('crm:customer:query')")
|
||||||
public CommonResult<PageResult<CrmCustomerRespVO>> getTodayCustomerPage(@Valid CrmTodayCustomerPageReqVO pageReqVO) {
|
public CommonResult<PageResult<CrmCustomerRespVO>> getTodayCustomerPage(@Valid CrmTodayCustomerPageReqVO pageReqVO) {
|
||||||
PageResult<CrmCustomerDO> pageResult = crmMessageService.getTodayCustomerPage(pageReqVO, getLoginUserId());
|
PageResult<CrmCustomerDO> pageResult = crmMessageService.getTodayCustomerPage(pageReqVO, getLoginUserId());
|
||||||
return success(BeanUtils.toBean(pageResult, CrmCustomerRespVO.class));
|
return success(BeanUtils.toBean(pageResult, CrmCustomerRespVO.class));
|
@ -1,9 +1,8 @@
|
|||||||
package cn.iocoder.yudao.module.crm.controller.admin.message.vo;
|
package cn.iocoder.yudao.module.crm.controller.admin.backlog.vo;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||||
import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum;
|
import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum;
|
||||||
import cn.iocoder.yudao.module.crm.enums.message.CrmContactStatusEnum;
|
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
@ -15,10 +14,12 @@ import lombok.ToString;
|
|||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
public class CrmTodayCustomerPageReqVO extends PageParam {
|
public class CrmTodayCustomerPageReqVO extends PageParam {
|
||||||
|
|
||||||
// TODO @dbh52:CrmContactStatusEnum 可以直接枚举三个 Integer;一般来说,枚举类尽量给数据模型用,这样枚举类少,更聚焦;这里的枚举,更多是专门给这个接口用的哈
|
public static final int CONTACT_TODAY = 1;
|
||||||
|
public static final int CONTACT_EXPIRED = 2;
|
||||||
|
public static final int CONTACT_ALREADY = 3;
|
||||||
|
|
||||||
|
|
||||||
@Schema(description = "联系状态", example = "1")
|
@Schema(description = "联系状态", example = "1")
|
||||||
@InEnum(CrmContactStatusEnum.class)
|
|
||||||
private Integer contactStatus;
|
private Integer contactStatus;
|
||||||
|
|
||||||
@Schema(description = "场景类型", example = "1")
|
@Schema(description = "场景类型", example = "1")
|
@ -4,21 +4,24 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|||||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
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.backlog.vo.CrmTodayCustomerPageReqVO;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPageReqVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPageReqVO;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.message.vo.CrmTodayCustomerPageReqVO;
|
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.followup.CrmFollowUpRecordDO;
|
|
||||||
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
|
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
|
||||||
import cn.iocoder.yudao.module.crm.enums.message.CrmContactStatusEnum;
|
|
||||||
import cn.iocoder.yudao.module.crm.util.CrmQueryWrapperUtils;
|
import cn.iocoder.yudao.module.crm.util.CrmQueryWrapperUtils;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
import org.springframework.lang.Nullable;
|
import org.springframework.lang.Nullable;
|
||||||
|
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.LocalTime;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
|
import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.BACKLOG_CONTACT_STATUS_INVALID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 客户 Mapper
|
* 客户 Mapper
|
||||||
*
|
*
|
||||||
@ -82,41 +85,22 @@ public interface CrmCustomerMapper extends BaseMapperX<CrmCustomerDO> {
|
|||||||
CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(),
|
CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(),
|
||||||
CrmCustomerDO::getId, userId, pageReqVO.getSceneType(), null);
|
CrmCustomerDO::getId, userId, pageReqVO.getSceneType(), null);
|
||||||
|
|
||||||
query.selectAll(CrmCustomerDO.class)
|
query.selectAll(CrmCustomerDO.class);
|
||||||
.leftJoin(CrmFollowUpRecordDO.class, CrmFollowUpRecordDO::getBizId, CrmCustomerDO::getId)
|
|
||||||
.eq(CrmFollowUpRecordDO::getType, CrmBizTypeEnum.CRM_CUSTOMER.getType());
|
|
||||||
|
|
||||||
// 拼接自身的查询条件
|
// 拼接自身的查询条件
|
||||||
// TODO @dbh52:这里不仅仅要获得 today、tomorrow。而是 today 要获取今天的 00:00:00 这种;
|
LocalDateTime beginOfToday = LocalDate.now().atTime(LocalTime.MIN);
|
||||||
LocalDate today = LocalDate.now();
|
LocalDateTime endOfToday = LocalDate.now().atTime(LocalTime.MAX);
|
||||||
LocalDate tomorrow = today.plusDays(1);
|
if (pageReqVO.getContactStatus().equals(CrmTodayCustomerPageReqVO.CONTACT_TODAY)) {
|
||||||
LocalDate yesterday = today.minusDays(1);
|
// 今天需联系
|
||||||
if (pageReqVO.getContactStatus().equals(CrmContactStatusEnum.NEEDED_TODAY.getType())) {
|
query.between(CrmCustomerDO::getContactNextTime, beginOfToday, endOfToday);
|
||||||
// 今天需联系:
|
} else if (pageReqVO.getContactStatus().equals(CrmTodayCustomerPageReqVO.CONTACT_EXPIRED)) {
|
||||||
// 1.【客户】的【下一次联系时间】 是【今天】
|
// 已逾期
|
||||||
// 2. 无法找到【今天】创建的【跟进】记录
|
query.lt(CrmCustomerDO::getContactNextTime, beginOfToday);
|
||||||
query.between(CrmCustomerDO::getContactNextTime, today, tomorrow)
|
} else if (pageReqVO.getContactStatus().equals(CrmTodayCustomerPageReqVO.CONTACT_ALREADY)) {
|
||||||
// TODO @dbh52:是不是查询 CrmCustomerDO::contactLastTime < today?因为今天联系过,应该会更新该字段,减少链表查询;
|
// 已联系
|
||||||
.between(CrmFollowUpRecordDO::getCreateTime, today, tomorrow)
|
query.between(CrmCustomerDO::getContactLastTime, beginOfToday, endOfToday);
|
||||||
.isNull(CrmFollowUpRecordDO::getId);
|
|
||||||
} else if (pageReqVO.getContactStatus().equals(CrmContactStatusEnum.EXPIRED.getType())) {
|
|
||||||
// 已逾期:
|
|
||||||
// 1. 【客户】的【下一次联系时间】 <= 【昨天】
|
|
||||||
// 2. 无法找到【今天】创建的【跟进】记录
|
|
||||||
// TODO @dbh52:是不是 contactNextTime 在当前时间之前,且 contactLastTime < contactNextTime?说白了,就是下次联系时间超过当前时间,且最后联系时间没去联系;
|
|
||||||
query.le(CrmCustomerDO::getContactNextTime, yesterday)
|
|
||||||
.between(CrmFollowUpRecordDO::getCreateTime, today, tomorrow)
|
|
||||||
.isNull(CrmFollowUpRecordDO::getId);
|
|
||||||
} else if (pageReqVO.getContactStatus().equals(CrmContactStatusEnum.ALREADY_CONTACT.getType())) {
|
|
||||||
// 已联系:
|
|
||||||
// 1.【客户】的【下一次联系时间】 是【今天】
|
|
||||||
// 2. 找到【今天】创建的【跟进】记录
|
|
||||||
query.between(CrmCustomerDO::getContactNextTime, today, tomorrow)
|
|
||||||
// TODO @dbh52:contactLastTime 是今天
|
|
||||||
.between(CrmFollowUpRecordDO::getCreateTime, today, tomorrow)
|
|
||||||
.isNotNull(CrmFollowUpRecordDO::getId);
|
|
||||||
} else {
|
} else {
|
||||||
// TODO: 参数错误,是不是要兜一下底;直接抛出异常就好啦;
|
throw exception(BACKLOG_CONTACT_STATUS_INVALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
return selectJoinPage(pageReqVO, CrmCustomerDO.class, query);
|
return selectJoinPage(pageReqVO, CrmCustomerDO.class, query);
|
||||||
|
@ -1,22 +1,22 @@
|
|||||||
package cn.iocoder.yudao.module.crm.service.message;
|
package cn.iocoder.yudao.module.crm.service.message;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.message.vo.CrmTodayCustomerPageReqVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.backlog.vo.CrmTodayCustomerPageReqVO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CRM 代办消息 Service 接口
|
* CRM 待办消息 Service 接口
|
||||||
*
|
*
|
||||||
* @author dhb52
|
* @author dhb52
|
||||||
*/
|
*/
|
||||||
public interface CrmMessageService {
|
public interface CrmBacklogService {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO @dbh52:注释要写下
|
* 根据【联系状态】、【场景类型】筛选客户分页
|
||||||
*
|
*
|
||||||
* @param pageReqVO
|
* @param pageReqVO 分页查询
|
||||||
* @return
|
* @return 分页数据
|
||||||
*/
|
*/
|
||||||
PageResult<CrmCustomerDO> getTodayCustomerPage(@Valid CrmTodayCustomerPageReqVO pageReqVO, Long userId);
|
PageResult<CrmCustomerDO> getTodayCustomerPage(@Valid CrmTodayCustomerPageReqVO pageReqVO, Long userId);
|
||||||
|
|
@ -1,17 +1,20 @@
|
|||||||
package cn.iocoder.yudao.module.crm.service.message;
|
package cn.iocoder.yudao.module.crm.service.message;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.message.vo.CrmTodayCustomerPageReqVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.backlog.vo.CrmTodayCustomerPageReqVO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.mysql.customer.CrmCustomerMapper;
|
import cn.iocoder.yudao.module.crm.dal.mysql.customer.CrmCustomerMapper;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
// TODO @dbh52:注释要写下
|
/**
|
||||||
|
* 待办消息 Service 实现类
|
||||||
|
*/
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@Validated
|
@Validated
|
||||||
public class CrmMessageServiceImpl implements CrmMessageService {
|
public class CrmBacklogServiceImpl implements CrmBacklogService {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private CrmCustomerMapper customerMapper;
|
private CrmCustomerMapper customerMapper;
|
Loading…
Reference in New Issue
Block a user