Przeglądaj źródła

feat(sys): 新增预约待办相关接口及数据模型

- 创建后台管理预约待办分页请求DTO类 AdminSysCustomerFollowOrderDTO 和 AdminSysCustomerFollowTodoDTO
- 修改待办新增/修改 DTO,增加预约待办时间字段及格式注解
- 新增 API Controller CustomerDataOrderController,提供预约登记列表、取消预约、待办提醒列表和CRUD接口
- 修改已有私有预约取消接口,增加是否私有标志参数
- 新增预约订单及待办相关响应BO类和订单状态枚举数据支持
- 新增预约待办服务 SysCustomerDataFollowOrderService 和 SysCustomerDataFollowTodoService,支持预约列表数据查询与待办数据分页
- 扩展客户跟进服务 SysCustomerDataFollowService,增加查询订单筛选条件数据和预约待办数据查询方法
- 调整实体 SysCustomerFollowEntity 和 SysCustomerTodoEntity,增加预约待办相关字段
- 修改跟进列表BO,增加预约待办类型、状态、时间等字段
- 修改取消待办状态的 Mapper 及 XML 方法,实现业务逻辑准确更新
- 优化业务逻辑对预约状态、时间范围查询及查询字符串的支持
- 调整和新增多处Swagger注解,完善接口在线文档描述
zhangxf 1 miesiąc temu
rodzic
commit
900f520dfe
21 zmienionych plików z 820 dodań i 118 usunięć
  1. 91 0
      src/main/java/com/jtzx/crm/module/api/web/sys/CustomerDataOrderController.java
  2. 1 1
      src/main/java/com/jtzx/crm/module/api/web/sys/CustomerDataPrivateController.java
  3. 1 1
      src/main/java/com/jtzx/crm/module/sys/entity/SysCustomerFollowEntity.java
  4. 4 0
      src/main/java/com/jtzx/crm/module/sys/entity/SysCustomerTodoEntity.java
  5. 2 0
      src/main/java/com/jtzx/crm/module/sys/mapper/SysCustomerFollowMapper.java
  6. 3 0
      src/main/java/com/jtzx/crm/module/sys/mapper/xml/SysCustomerFollowMapper.xml
  7. 39 0
      src/main/java/com/jtzx/crm/module/sys/model/request/AdminSysCustomerFollowOrderDTO.java
  8. 34 0
      src/main/java/com/jtzx/crm/module/sys/model/request/AdminSysCustomerFollowTodoDTO.java
  9. 6 13
      src/main/java/com/jtzx/crm/module/sys/model/request/AdminSysCustomerTodoInsertOrUpdateDTO.java
  10. 31 0
      src/main/java/com/jtzx/crm/module/sys/model/response/OrderBO.java
  11. 2 0
      src/main/java/com/jtzx/crm/module/sys/model/response/SysCustomerFollowHistorySelectBO.java
  12. 15 0
      src/main/java/com/jtzx/crm/module/sys/model/response/SysCustomerFollowListBO.java
  13. 46 0
      src/main/java/com/jtzx/crm/module/sys/model/response/SysCustomerFollowOrderBO.java
  14. 34 0
      src/main/java/com/jtzx/crm/module/sys/model/response/SysCustomerFollowOrderDetailBO.java
  15. 30 0
      src/main/java/com/jtzx/crm/module/sys/model/response/SysCustomerFollowTodoDataBO.java
  16. 37 0
      src/main/java/com/jtzx/crm/module/sys/model/response/SysCustomerFollowTodoDetailBO.java
  17. 136 0
      src/main/java/com/jtzx/crm/module/sys/service/SysCustomerDataFollowOrderService.java
  18. 104 1
      src/main/java/com/jtzx/crm/module/sys/service/SysCustomerDataFollowService.java
  19. 105 0
      src/main/java/com/jtzx/crm/module/sys/service/SysCustomerDataFollowTodoService.java
  20. 4 2
      src/main/java/com/jtzx/crm/module/sys/service/SysCustomerFollowService.java
  21. 95 100
      src/main/java/com/jtzx/crm/module/sys/service/SysCustomerTodoService.java

+ 91 - 0
src/main/java/com/jtzx/crm/module/api/web/sys/CustomerDataOrderController.java

@@ -0,0 +1,91 @@
+package com.jtzx.crm.module.api.web.sys;
+
+
+import cc.uncarbon.framework.web.model.response.ApiResult;
+import cn.dev33.satoken.annotation.SaCheckLogin;
+import com.jtzx.crm.module.api.constant.ApiConstant;
+import com.jtzx.crm.module.api.util.CrmAdminStpUtil;
+import com.jtzx.crm.module.sys.model.request.AdminSysCustomerFollowOrderDTO;
+import com.jtzx.crm.module.sys.model.request.AdminSysCustomerFollowTodoDTO;
+import com.jtzx.crm.module.sys.model.request.AdminSysCustomerTodoInsertOrUpdateDTO;
+import com.jtzx.crm.module.sys.model.request.CannelOrderDTO;
+import com.jtzx.crm.module.sys.model.response.SysCustomerFollowOrderBO;
+import com.jtzx.crm.module.sys.model.response.SysCustomerFollowTodoDataBO;
+import com.jtzx.crm.module.sys.service.SysCustomerDataFollowOrderService;
+import com.jtzx.crm.module.sys.service.SysCustomerDataFollowTodoService;
+import com.jtzx.crm.module.sys.service.SysCustomerFollowService;
+import com.jtzx.crm.module.sys.service.SysCustomerTodoService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+@SaCheckLogin(type = CrmAdminStpUtil.TYPE)
+@Tag(name = "预约待办接口")
+@RequestMapping(value = ApiConstant.HTTP_API_URL_PREFIX + "/api/v1")
+@RequiredArgsConstructor
+@RestController
+@Slf4j
+public class CustomerDataOrderController {
+
+    private final SysCustomerDataFollowOrderService sysCustomerDataFollowOrderService;
+
+    private final SysCustomerFollowService sysCustomerFollowService;
+
+    private final SysCustomerDataFollowTodoService sysCustomerDataFollowTodoService;
+
+    private final SysCustomerTodoService sysCustomerTodoService;
+
+    @Operation(summary = "查询预约登记接口")
+    @PostMapping(value = "/order/orderList")
+    public ApiResult<SysCustomerFollowOrderBO> orderList(@RequestBody @Valid AdminSysCustomerFollowOrderDTO dto) {
+        SysCustomerFollowOrderBO result = sysCustomerDataFollowOrderService.queryOrderFollowData(dto);
+        return ApiResult.data(result);
+    }
+
+    @Operation(summary = "取消预约接口")
+    @PostMapping(value = "/order/cancelOrder")
+    public ApiResult<Void> cancelOrder(@RequestBody @Valid CannelOrderDTO dto) {
+        sysCustomerFollowService.cancelOrder(dto, false);
+        return ApiResult.success();
+    }
+
+
+    @Operation(summary = "查询待办提醒接口")
+    @PostMapping(value = "/todo/todoList")
+    public ApiResult<SysCustomerFollowTodoDataBO> orderList(@RequestBody @Valid AdminSysCustomerFollowTodoDTO dto) {
+        SysCustomerFollowTodoDataBO result = sysCustomerDataFollowTodoService.queryOrderFollowData(dto);
+        return ApiResult.data(result);
+    }
+
+
+    @Operation(summary = "新增待办提醒接口")
+    @PostMapping(value = "/todo/addTodo")
+    public ApiResult<Void> addTodo(@RequestBody @Valid AdminSysCustomerTodoInsertOrUpdateDTO dto) {
+        sysCustomerTodoService.adminInsert(dto);
+        return ApiResult.success();
+    }
+
+    @Operation(summary = "修改待办提醒接口")
+    @PostMapping(value = "/todo/updateTodo")
+    public ApiResult<Void> updateTodo(@RequestBody @Valid AdminSysCustomerTodoInsertOrUpdateDTO dto) {
+        sysCustomerTodoService.adminUpdate(dto);
+        return ApiResult.success();
+    }
+
+    @Operation(summary = "删除待办提醒接口")
+    @GetMapping(value = "/todo/deleteTodo/{id}")
+    public ApiResult<Void> deleteTodo(@PathVariable Long id) {
+        sysCustomerTodoService.adminDelete(id);
+        return ApiResult.success();
+    }
+
+    @Operation(summary = "关闭待办提醒接口")
+    @GetMapping(value = "/todo/closeTodo/{id}")
+    public ApiResult<Void> closeTodo(@PathVariable Long id) {
+        sysCustomerTodoService.cancelTodoStatus(id);
+        return ApiResult.success();
+    }
+}

+ 1 - 1
src/main/java/com/jtzx/crm/module/api/web/sys/CustomerDataPrivateController.java

@@ -140,7 +140,7 @@ public class CustomerDataPrivateController {
     @Operation(summary = "去消预约跟进接口")
     @PostMapping(value = "/customer/data/cancelOrder", produces = "application/json;charset=UTF-8")
     public ApiResult<Void> cancelOrder(@RequestBody CannelOrderDTO dto) {
-        sysCustomerFollowService.cancelOrder(dto);
+        sysCustomerFollowService.cancelOrder(dto, true);
         return ApiResult.success();
     }
 }

+ 1 - 1
src/main/java/com/jtzx/crm/module/sys/entity/SysCustomerFollowEntity.java

@@ -94,7 +94,7 @@ public class SysCustomerFollowEntity extends HelioBaseEntity<Long> {
     @TableField(value = "order_type")
     private Integer orderType;
 
-    @Schema(description = "待办时间")
+    @Schema(description = "预约待办时间")
     @TableField(value = "order_datetime")
     private LocalDateTime orderDatetime;
 

+ 4 - 0
src/main/java/com/jtzx/crm/module/sys/entity/SysCustomerTodoEntity.java

@@ -49,4 +49,8 @@ public class SysCustomerTodoEntity extends HelioBaseEntity<Long> {
     @Schema(description = "逻辑删除标识", title = "0=否 1=是")
     @TableField("del_flag")
     private Integer delFlag;
+
+    @Schema(description = "预约,待办状态,0-未取消,2-已取消")
+    @TableField(value = "order_status")
+    private Integer orderStatus;
 }

+ 2 - 0
src/main/java/com/jtzx/crm/module/sys/mapper/SysCustomerFollowMapper.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 
 import com.jtzx.crm.module.sys.entity.SysCustomerFollowEntity;
+import org.apache.ibatis.annotations.Param;
 
 
 /**
@@ -12,4 +13,5 @@ import com.jtzx.crm.module.sys.entity.SysCustomerFollowEntity;
 @Mapper
 public interface SysCustomerFollowMapper extends BaseMapper<SysCustomerFollowEntity> {
 
+    public void cancelTodoStatus(@Param("id") Long id);
 }

+ 3 - 0
src/main/java/com/jtzx/crm/module/sys/mapper/xml/SysCustomerFollowMapper.xml

@@ -2,4 +2,7 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.jtzx.crm.module.sys.mapper.SysCustomerFollowMapper">
 
+    <update id="cancelTodoStatus">
+        update sys_customer_follow set order_status = null where id = #{id}
+    </update>
 </mapper>

+ 39 - 0
src/main/java/com/jtzx/crm/module/sys/model/request/AdminSysCustomerFollowOrderDTO.java

@@ -0,0 +1,39 @@
+package com.jtzx.crm.module.sys.model.request;
+
+import cc.uncarbon.framework.core.constant.HelioConstant;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+
+/**
+ * 后台管理-分页列表我的客户(学校)数据 DTO
+ */
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class AdminSysCustomerFollowOrderDTO implements Serializable {
+
+
+    @Schema(description = "日期")
+    private String datetime;
+
+    @Schema(description = "用户id(用户表主id)")
+    private Long userId;
+
+    @Schema(description = "状态")
+    private Integer orderStatus;
+
+    @Schema(description = "查询字符串")
+    private String queryStr;
+}

+ 34 - 0
src/main/java/com/jtzx/crm/module/sys/model/request/AdminSysCustomerFollowTodoDTO.java

@@ -0,0 +1,34 @@
+package com.jtzx.crm.module.sys.model.request;
+
+import cc.uncarbon.framework.core.constant.HelioConstant;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+
+/**
+ * 后台管理-分页列表我的客户(学校)数据 DTO
+ */
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class AdminSysCustomerFollowTodoDTO implements Serializable {
+
+
+    @Schema(description = "月份,格式yyyy-MM")
+    private String datetime;
+
+    @Schema(description = "用户id(用户表主id)")
+    private Long userId;
+
+}

+ 6 - 13
src/main/java/com/jtzx/crm/module/sys/model/request/AdminSysCustomerTodoInsertOrUpdateDTO.java

@@ -1,5 +1,7 @@
 package com.jtzx.crm.module.sys.model.request;
 
+import cc.uncarbon.framework.core.constant.HelioConstant;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -9,6 +11,8 @@ import lombok.experimental.SuperBuilder;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
 import jakarta.validation.constraints.Size;
+import org.springframework.format.annotation.DateTimeFormat;
+
 import java.io.Serializable;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -24,24 +28,13 @@ import java.time.LocalDateTime;
 @Data
 public class AdminSysCustomerTodoInsertOrUpdateDTO implements Serializable {
 
-    @Schema(description = "主键ID", hidden = true, title = "仅更新时使用")
-    private Long id;
-
-    @Schema(description = "认领人(跟进)id")
-    private Long claimUserId;
-
-    @Schema(description = "认领人(跟进)名称")
-    @Size(max = 255, message = "【认领人(跟进)名称】最长255位")
-    private String claimUserName;
-
-    @Schema(description = "认领人员所在的项目组id")
-    private Long claimUserGroupId;
-
     @Schema(description = "跟进(待办)内容")
     @Size(max = 5000, message = "【跟进(待办)内容】最长5000位")
     private String followContent;
 
     @Schema(description = "待办时间")
+    @DateTimeFormat(pattern = HelioConstant.Jackson.DATE_FORMAT)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_FORMAT)
     private LocalDateTime orderDatetime;
 
 }

+ 31 - 0
src/main/java/com/jtzx/crm/module/sys/model/response/OrderBO.java

@@ -0,0 +1,31 @@
+package com.jtzx.crm.module.sys.model.response;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+/**
+ * 全国省省份数据 BO
+ */
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class OrderBO implements Serializable {
+
+    @Schema(description = "名称")
+    private String name;
+
+    @Schema(description = "状态")
+    private Integer status;
+
+
+}

+ 2 - 0
src/main/java/com/jtzx/crm/module/sys/model/response/SysCustomerFollowHistorySelectBO.java

@@ -37,5 +37,7 @@ public class SysCustomerFollowHistorySelectBO implements Serializable {
     @Schema(description = "成员数据")
     private List<BindUserBO> memberData;
 
+    @Schema(description = "预约状态数据")
+    private List<OrderBO> orderStatusData;
 
 }

+ 15 - 0
src/main/java/com/jtzx/crm/module/sys/model/response/SysCustomerFollowListBO.java

@@ -1,6 +1,7 @@
 package com.jtzx.crm.module.sys.model.response;
 
 import cc.uncarbon.framework.core.constant.HelioConstant;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
@@ -63,8 +64,22 @@ public class SysCustomerFollowListBO implements Serializable {
     @Schema(description = "跟进内容")
     private String followContent;
 
+    @Schema(description = "预约待办类型,0-预约,1-待办,(follow_id=33时为预约,其它为待办),这个数据可以为null")
+    private Integer orderType;
+
+    @Schema(description = "预约,待办状态,0-待开始,1-已结束,2-已取消(预约的取消需要填写取消原因)")
+    private Integer orderStatus;
+
     @Schema(description = "跟进时间")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm")
     private LocalDateTime claimDatetime;
+
+    @Schema(description = "预约时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm")
+    private LocalDateTime orderDatetime;
+
+    @Schema(description = "类型,0-跟进的待办不可删除,1-自定义的待办可删除")
+    private Integer type;
 }

+ 46 - 0
src/main/java/com/jtzx/crm/module/sys/model/response/SysCustomerFollowOrderBO.java

@@ -0,0 +1,46 @@
+package com.jtzx.crm.module.sys.model.response;
+
+import cc.uncarbon.framework.core.page.PageResult;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+/**
+ * 预约待办数据
+ */
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class SysCustomerFollowOrderBO implements Serializable {
+
+
+    @Schema(description = "筛选条件数据")
+    private SysCustomerFollowHistorySelectBO selectData;
+
+    @Schema(description = "跟进数据列表")
+    private List<SysCustomerFollowListBO> dataList;
+
+    @Schema(description = "总数量")
+    private Integer totalCount;
+
+    @Schema(description = "待开始的预约数量")
+    private Integer status0Count;
+
+    @Schema(description = "已结束的预约数量")
+    private Integer status1Count;
+
+    @Schema(description = "已取消的预约数量")
+    private Integer status2Count;
+
+    @Schema(description = "日期列表,用于日期标 ‘.’ 的日期的")
+    private List<SysCustomerFollowOrderDetailBO> dateList;
+}

+ 34 - 0
src/main/java/com/jtzx/crm/module/sys/model/response/SysCustomerFollowOrderDetailBO.java

@@ -0,0 +1,34 @@
+package com.jtzx.crm.module.sys.model.response;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+/**
+ * 预约待办数据
+ */
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class SysCustomerFollowOrderDetailBO implements Serializable {
+
+
+    @Schema(description = "每月的天")
+    private String day;
+
+    @Schema(description = "每月的天")
+    private String dayOfMonth;
+
+    @Schema(description = "数据状态,0-无数据,1-有数据")
+    private Integer status;
+
+}

+ 30 - 0
src/main/java/com/jtzx/crm/module/sys/model/response/SysCustomerFollowTodoDataBO.java

@@ -0,0 +1,30 @@
+package com.jtzx.crm.module.sys.model.response;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+/**
+ * 预约待办数据
+ */
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class SysCustomerFollowTodoDataBO implements Serializable {
+
+
+    @Schema(description = "筛选条件数据")
+    private List<BindUserBO> memberData;
+
+    @Schema(description = "跟进数据列表")
+    private List<SysCustomerFollowTodoDetailBO> dataList;
+}

+ 37 - 0
src/main/java/com/jtzx/crm/module/sys/model/response/SysCustomerFollowTodoDetailBO.java

@@ -0,0 +1,37 @@
+package com.jtzx.crm.module.sys.model.response;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+/**
+ * 预约待办数据
+ */
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class SysCustomerFollowTodoDetailBO implements Serializable {
+
+
+    @Schema(description = "每月的天")
+    private String day;
+
+    @Schema(description = "每月的天")
+    private String dayOfMonth;
+
+    @Schema(description = "共多少项")
+    private Integer count;
+
+    @Schema(description = "跟进数据列表")
+    private List<SysCustomerFollowListBO> dataList;
+
+}

+ 136 - 0
src/main/java/com/jtzx/crm/module/sys/service/SysCustomerDataFollowOrderService.java

@@ -0,0 +1,136 @@
+package com.jtzx.crm.module.sys.service;
+
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.google.common.collect.Lists;
+import com.jtzx.crm.module.sys.entity.SysCustomerFollowEntity;
+import com.jtzx.crm.module.sys.mapper.SysCustomerFollowMapper;
+import com.jtzx.crm.module.sys.model.request.AdminSysCustomerFollowOrderDTO;
+import com.jtzx.crm.module.sys.model.response.SysCustomerFollowOrderBO;
+import com.jtzx.crm.module.sys.model.response.SysCustomerFollowOrderDetailBO;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@RequiredArgsConstructor
+@Service
+@Slf4j
+public class SysCustomerDataFollowOrderService {
+
+    private final SysCustomerFollowMapper sysCustomerFollowMapper;
+
+    private final SysCustomerDataFollowService sysCustomerDataFollowService;
+
+
+    /**
+     * 预约登记列表数据查询
+     *
+     * @param dto
+     * @return
+     */
+    public SysCustomerFollowOrderBO queryOrderFollowData(AdminSysCustomerFollowOrderDTO dto) {
+        SysCustomerFollowOrderBO resultData = SysCustomerFollowOrderBO.builder().build();
+        resultData.setStatus0Count(0);
+        resultData.setStatus1Count(0);
+        resultData.setStatus2Count(0);
+        resultData.setTotalCount(0);
+        resultData.setDateList(Lists.newArrayList());
+        // 筛选条件数据
+        resultData.setSelectData(sysCustomerDataFollowService.queryCustomerOrderSelectData(0, true));
+        String monthStr = DateUtil.format(LocalDateTime.now(), "yyyy-MM");
+        String dateStr = DateUtil.format(LocalDateTime.now(), "yyyy-MM-dd");
+        if (dto.getDatetime() != null) {
+            dateStr = dto.getDatetime().trim();
+            monthStr = dto.getDatetime();
+        }
+        //当月开始时间
+        DateTime startMonthDay = DateUtil.beginOfMonth(DateUtil.parse(monthStr));
+        //当月结束时间
+        DateTime endMonthDay = DateUtil.endOfMonth(DateUtil.parse(monthStr));
+        //如果是 yyyy-MM 格式,则需要重新设置为当月开始时间和结束时间
+        DateTime startDateTime = startMonthDay;
+        DateTime endDateTime = endMonthDay;
+        //如果是 yyyy-MM-dd 格式,则需要重新设置为当天开始时间和结束时间
+        if (dateStr.length() == 10) {
+            //当天开始时间
+            startDateTime = DateUtil.beginOfDay(DateUtil.parseTime(dateStr));
+            //当天结束时间
+            endDateTime = DateUtil.endOfDay(DateUtil.parseTime(dateStr));
+        }
+        //数据列表
+        resultData.setDataList(
+                sysCustomerDataFollowService.queryCustomerFollowOrderData(DateUtil.toLocalDateTime(startDateTime),
+                        DateUtil.toLocalDateTime(endDateTime), dto.getUserId(), dto.getOrderStatus(),
+                        dto.getQueryStr(), 0));
+
+        //日期列表
+        List<SysCustomerFollowOrderDetailBO> dateList = Lists.newArrayList();
+        //查询数据
+        List<SysCustomerFollowEntity> listData =
+                sysCustomerFollowMapper.selectList(
+                        new LambdaQueryWrapper<>(SysCustomerFollowEntity.class)
+                                .select(
+                                        SysCustomerFollowEntity::getId,
+                                        SysCustomerFollowEntity::getOrderDatetime,
+                                        SysCustomerFollowEntity::getOrderStatus
+                                )
+                                .ge(SysCustomerFollowEntity::getOrderDatetime, startMonthDay)
+                                .le(SysCustomerFollowEntity::getOrderDatetime, endMonthDay)
+                                .eq(SysCustomerFollowEntity::getOrderType, 0)
+                );
+        if (CollUtil.isNotEmpty(listData)) {
+            //月待开始时间
+            resultData.setStatus0Count(
+                    listData.stream()
+                            .filter(x -> x.getSuccessStatus() == 0)
+                            .toList().size());
+            //月已结束时间
+            resultData.setStatus1Count(
+                    listData.stream()
+                            .filter(x -> x.getSuccessStatus() == 1)
+                            .toList().size());
+            //月已取消时间
+            resultData.setStatus2Count(
+                    listData.stream()
+                            .filter(x -> x.getSuccessStatus() == 2)
+                            .toList().size());
+            //总条数
+            resultData.setTotalCount(listData.size());
+        }
+
+        List<DateTime> dateTimes = DateUtil.rangeToList(startMonthDay, endMonthDay, DateField.DAY_OF_MONTH);
+        dateTimes.forEach(e -> {
+            SysCustomerFollowOrderDetailBO detailBO = SysCustomerFollowOrderDetailBO.builder()
+                    .day(DateUtil.format(e, "yyyy-MM-dd"))
+                    .status(0)
+                    .dayOfMonth(String.valueOf(DateUtil.dayOfMonth(e)))
+                    .build();
+            if (CollUtil.isNotEmpty(listData)) {
+                //当天开始时间
+                DateTime startDateTime1 = DateUtil.beginOfDay(e);
+                //当天结束时间
+                DateTime endDateTime1 = DateUtil.endOfDay(e);
+                int size =
+                        listData.stream()
+                                .filter(x -> !x.getClaimDatetime().isBefore(DateUtil.toLocalDateTime(startDateTime1))
+                                        && !x.getClaimDatetime().isAfter(DateUtil.toLocalDateTime(endDateTime1)))
+                                .toList().size();
+                if (size > 0) {
+                    detailBO.setStatus(1);
+                }
+            }
+            dateList.add(detailBO);
+        });
+        resultData.setDateList(dateList);
+        return resultData;
+    }
+
+
+}

+ 104 - 1
src/main/java/com/jtzx/crm/module/sys/service/SysCustomerDataFollowService.java

@@ -6,6 +6,7 @@ import cc.uncarbon.framework.core.page.PageResult;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.text.CharSequenceUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -27,6 +28,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -198,6 +200,75 @@ public class SysCustomerDataFollowService {
     }
 
 
+    /**
+     * 预约顶部筛选条件数据公开方法
+     *
+     * @return
+     */
+    public SysCustomerFollowHistorySelectBO queryCustomerOrderSelectData(Integer orderType, Boolean orderStatus) {
+        SysCustomerFollowHistorySelectBO resultData = SysCustomerFollowHistorySelectBO.builder().build();
+        List<BindUserBO> memberData = Lists.newArrayList();
+        List<OrderBO> orderStatusData = Lists.newArrayList();
+        //查询跟进数据
+        List<SysCustomerFollowEntity> followEntityList =
+                sysCustomerFollowMapper.selectList(
+                        new LambdaQueryWrapper<>(SysCustomerFollowEntity.class)
+                                .select(
+                                        SysCustomerFollowEntity::getClaimUserId,
+                                        SysCustomerFollowEntity::getClaimUserName,
+                                        SysCustomerFollowEntity::getOrderStatus
+                                )
+                                .eq(SysCustomerFollowEntity::getOrderType, orderType)
+                                .orderByDesc(SysCustomerFollowEntity::getCreatedAt)
+                );
+        if (CollUtil.isNotEmpty(followEntityList)) {
+            followEntityList.forEach(
+                    entity -> {
+
+                        if (CollUtil.isEmpty(memberData) || memberData.stream().map(BindUserBO::getId).noneMatch(entity.getClaimUserId()::equals)) {
+                            BindUserBO memberBO = BindUserBO.builder()
+                                    .id(entity.getClaimUserId())
+                                    .username(entity.getClaimUserName())
+                                    .build();
+                            memberData.add(memberBO);
+                        }
+
+                        if (orderStatus) {
+                            if (CollUtil.isEmpty(orderStatusData) || orderStatusData.stream().map(OrderBO::getStatus).noneMatch(entity.getOrderStatus()::equals)) {
+                                OrderBO orderStatusBO = OrderBO.builder()
+                                        .status(entity.getOrderStatus())
+                                        .build();
+                                if (entity.getOrderStatus() == 0) {
+                                    orderStatusBO.setName("待开始");
+                                }
+                                if (entity.getOrderStatus() == 1) {
+                                    orderStatusBO.setName("已结束");
+                                }
+                                if (entity.getOrderStatus() == 2) {
+                                    orderStatusBO.setName("已取消");
+                                }
+                                orderStatusData.add(orderStatusBO);
+                            }
+                        }
+                    }
+            );
+            BindUserBO memberBO = BindUserBO.builder()
+                    .username("全部")
+                    .build();
+            memberData.addFirst(memberBO);
+        }
+        resultData.setMemberData(memberData);
+        if (orderStatus) {
+            OrderBO orderStatusBO = OrderBO.builder()
+                    .name("全部")
+                    .build();
+            orderStatusData.addFirst(orderStatusBO);
+            resultData.setOrderStatusData(orderStatusData);
+        }
+
+        return resultData;
+    }
+
     /**
      * 客户跟进顶部筛选条件数据公开方法
      *
@@ -222,7 +293,7 @@ public class SysCustomerDataFollowService {
                                         SysCustomerFollowEntity::getClaimUserId,
                                         SysCustomerFollowEntity::getClaimUserName
                                 )
-                                .eq(SysCustomerFollowEntity::getCustomerId, customerId)
+                                .eq(customerId != null, SysCustomerFollowEntity::getCustomerId, customerId)
                                 .ne(userId != null, SysCustomerFollowEntity::getClaimUserId, userId)
                                 .orderByDesc(SysCustomerFollowEntity::getCreatedAt)
                 );
@@ -277,6 +348,7 @@ public class SysCustomerDataFollowService {
         resultData.setMemberData(memberData);
         resultData.setDateData(Lists.newArrayList());
         resultData.setPositionData(Lists.newArrayList());
+        resultData.setOrderStatusData(Lists.newArrayList());
         if (userId != null) {
             resultData.setPositionData(positionData);
             resultData.setDateData(DateSelectUtil.getDateData());
@@ -336,6 +408,36 @@ public class SysCustomerDataFollowService {
         return this.entityPage2BOPage(pageData);
     }
 
+    /**
+     * 查询预约待办数据
+     *
+     * @return
+     */
+    public List<SysCustomerFollowListBO> queryCustomerFollowOrderData(LocalDateTime startDateTime, LocalDateTime endDateTime,
+                                                                      Long userId, Integer status, String queryStr,
+                                                                      Integer orderType) {
+        //查询跟进数据
+        List<SysCustomerFollowEntity> listData =
+                sysCustomerFollowMapper.selectList(
+                        new LambdaQueryWrapper<>(SysCustomerFollowEntity.class)
+                                .eq(userId != null, SysCustomerFollowEntity::getClaimUserId, userId)
+                                .eq(status != null, SysCustomerFollowEntity::getOrderStatus, status)
+                                .ge(startDateTime != null, SysCustomerFollowEntity::getOrderDatetime, startDateTime)
+                                .le(endDateTime != null, SysCustomerFollowEntity::getOrderDatetime, endDateTime)
+                                .eq(SysCustomerFollowEntity::getOrderType, orderType)
+                                .ne(orderType==1,SysCustomerFollowEntity::getOrderStatus, 2)
+                                .and(StrUtil.isNotEmpty(queryStr), z ->
+                                        z.like(SysCustomerFollowEntity::getCustomerName, queryStr)
+                                        .or().like(SysCustomerFollowEntity::getClaimUserName, queryStr)
+//                                        .or().like(SysCustomerFollowEntity::getCustomerPersonName, queryStr)
+//                                        .or().like(SysCustomerFollowEntity::getPositionName, queryStr)
+                                )
+                                .orderByDesc(orderType==0,SysCustomerFollowEntity::getOrderDatetime, SysCustomerFollowEntity::getCreatedAt)
+                                .orderByDesc(orderType==1,SysCustomerFollowEntity::getCreatedAt)
+                );
+        return this.entityList2BOs(listData);
+    }
+
 
     /**
      * 实体分页转 BO 分页
@@ -415,6 +517,7 @@ public class SysCustomerDataFollowService {
                                 .findFirst()
                                 .ifPresent(e -> bo.setFollowName(e.getTitle()));
                     }
+                    bo.setType(0);
                     ret.add(bo);
                 }
         );

+ 105 - 0
src/main/java/com/jtzx/crm/module/sys/service/SysCustomerDataFollowTodoService.java

@@ -0,0 +1,105 @@
+package com.jtzx.crm.module.sys.service;
+
+
+import cc.uncarbon.framework.core.context.UserContextHolder;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import com.google.common.collect.Lists;
+import com.jtzx.crm.module.sys.model.request.AdminSysCustomerFollowTodoDTO;
+import com.jtzx.crm.module.sys.model.response.SysCustomerFollowListBO;
+import com.jtzx.crm.module.sys.model.response.SysCustomerFollowTodoDataBO;
+import com.jtzx.crm.module.sys.model.response.SysCustomerFollowTodoDetailBO;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.Comparator;
+import java.util.List;
+
+@RequiredArgsConstructor
+@Service
+@Slf4j
+public class SysCustomerDataFollowTodoService {
+
+
+    private final SysCustomerTodoService sysCustomerTodoService;
+
+
+    /**
+     * 预约登记列表数据查询
+     *
+     * @param dto
+     * @return
+     */
+    public SysCustomerFollowTodoDataBO queryOrderFollowData(AdminSysCustomerFollowTodoDTO dto) {
+        SysCustomerFollowTodoDataBO resultData = SysCustomerFollowTodoDataBO.builder().build();
+
+        // 筛选条件数据
+        resultData.setMemberData(Lists.newArrayList());
+        if (UserContextHolder.getUserContext().getRoles().contains("Admin")) {
+            resultData.setMemberData(sysCustomerTodoService.queryMemberData());
+        } else {
+            dto.setUserId(UserContextHolder.getUserContext().getUserId());
+        }
+        String dateStr;
+        if (dto.getDatetime() == null) {
+            dateStr = DateUtil.format(LocalDateTime.now(), "yyyy-MM-dd");
+        } else {
+            dateStr = dto.getDatetime().trim() + "-01";//当月第一天时间
+        }
+        //每天的待办数据
+        List<SysCustomerFollowTodoDetailBO> dataList = Lists.newArrayList();
+        //当月开始时间
+        DateTime startMonthDay = DateUtil.beginOfMonth(DateUtil.parse(dateStr));
+        //当月结束时间
+        DateTime endMonthDay = DateUtil.endOfMonth(DateUtil.parse(dateStr));
+        List<SysCustomerFollowListBO> listData =
+                sysCustomerTodoService.queryList(DateUtil.toLocalDateTime(startMonthDay), DateUtil.toLocalDateTime(endMonthDay), dto.getUserId());
+        List<DateTime> dateTimes = DateUtil.rangeToList(startMonthDay, endMonthDay, DateField.DAY_OF_MONTH);
+        dateTimes.forEach(e -> {
+            SysCustomerFollowTodoDetailBO detailBO = SysCustomerFollowTodoDetailBO.builder()
+                    .day(DateUtil.format(e, "yyyy-MM-dd"))
+                    .dataList(CollUtil.newArrayList())
+                    .count(0)
+                    .build();
+            int day = DateUtil.dayOfMonth(e);
+            if (day < 10) {
+                detailBO.setDayOfMonth("0" + day);
+            } else {
+                detailBO.setDayOfMonth(String.valueOf(day));
+            }
+            if (CollUtil.isNotEmpty(listData)) {
+                //当天开始时间
+                DateTime startDateTime = DateUtil.beginOfDay(e);
+                //当天结束时间
+                DateTime endDateTime = DateUtil.endOfDay(e);
+                listData.stream()
+                        .filter(x -> !x.getClaimDatetime().isBefore(DateUtil.toLocalDateTime(startDateTime))
+                                && !x.getClaimDatetime().isAfter(DateUtil.toLocalDateTime(endDateTime)))
+                        .sorted(Comparator.comparing(SysCustomerFollowListBO::getClaimDatetime))
+                        .forEach(detailBO.getDataList()::add);
+                detailBO.setCount(detailBO.getDataList().size());
+            }
+            dataList.add(detailBO);
+        });
+        resultData.setDataList(dataList);
+        return resultData;
+    }
+
+    public static void main(String[] args) {
+
+        DateTime startMonthDay = DateUtil.beginOfMonth(DateUtil.parse("2026-08-01"));
+        //当月结束时间
+        DateTime endMonthDay = DateUtil.endOfMonth(DateUtil.parse("2026-08-01"));
+
+        List<DateTime> dateTimes = DateUtil.rangeToList(startMonthDay, endMonthDay, DateField.DAY_OF_MONTH);
+        dateTimes.forEach(e -> {
+            System.out.println(DateUtil.format(e, "yyyy-MM-dd"));
+            System.out.println(DateUtil.dayOfMonth(e));
+        });
+    }
+
+}

+ 4 - 2
src/main/java/com/jtzx/crm/module/sys/service/SysCustomerFollowService.java

@@ -94,8 +94,10 @@ public class SysCustomerFollowService {
     /**
      * 我的客户页面,预约待办列表去消预约操作
      */
-    public void cancelOrder(CannelOrderDTO dto) {
-        permissionService.publicPrivateCustomerPermission();
+    public void cancelOrder(CannelOrderDTO dto,Boolean privateStatus) {
+        if (privateStatus) {
+            permissionService.publicPrivateCustomerPermission();
+        }
         SysCustomerFollowEntity sysCustomerFollowEntity = sysCustomerFollowMapper.selectById(dto.getId());
         if (sysCustomerFollowEntity == null) {
             throw new RuntimeException("预约数据不存在");

+ 95 - 100
src/main/java/com/jtzx/crm/module/sys/service/SysCustomerTodoService.java

@@ -1,25 +1,29 @@
 package com.jtzx.crm.module.sys.service;
 
-import cc.uncarbon.framework.core.constant.HelioConstant;
+import cc.uncarbon.framework.core.context.UserContextHolder;
 import cc.uncarbon.framework.core.exception.BusinessException;
-import cc.uncarbon.framework.core.page.PageParam;
-import cc.uncarbon.framework.core.page.PageResult;
+import cc.uncarbon.framework.crud.entity.HelioBaseEntity;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.google.common.collect.Lists;
 import com.jtzx.crm.module.sys.entity.SysCustomerTodoEntity;
+import com.jtzx.crm.module.sys.mapper.SysCustomerFollowMapper;
 import com.jtzx.crm.module.sys.mapper.SysCustomerTodoMapper;
 import com.jtzx.crm.module.sys.model.request.AdminSysCustomerTodoInsertOrUpdateDTO;
-import com.jtzx.crm.module.sys.model.request.AdminSysCustomerTodoListDTO;
+import com.jtzx.crm.module.sys.model.response.BindUserBO;
+import com.jtzx.crm.module.sys.model.response.SysCustomerFollowHistorySelectBO;
+import com.jtzx.crm.module.sys.model.response.SysCustomerFollowListBO;
 import com.jtzx.crm.module.sys.model.response.SysCustomerTodoBO;
-import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.text.CharSequenceUtil;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.*;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
 
 
 /**
@@ -32,74 +36,96 @@ public class SysCustomerTodoService {
 
     private final SysCustomerTodoMapper sysCustomerTodoMapper;
 
+    private final SysCustomerFollowMapper sysCustomerFollowMapper;
 
-    /**
-     * 后台管理-分页列表
-     */
-    public PageResult<SysCustomerTodoBO> adminList(PageParam pageParam, AdminSysCustomerTodoListDTO dto) {
-        Page<SysCustomerTodoEntity> entityPage = sysCustomerTodoMapper.selectPage(
-                new Page<>(pageParam.getPageNum(), pageParam.getPageSize()),
-                new QueryWrapper<SysCustomerTodoEntity>()
-                        .lambda()
-                        // 认领人(跟进)id
-                        .eq(Objects.nonNull(dto.getClaimUserId()), SysCustomerTodoEntity::getClaimUserId, dto.getClaimUserId())
-                        // 认领人(跟进)名称
-                        .like(CharSequenceUtil.isNotBlank(dto.getClaimUserName()), SysCustomerTodoEntity::getClaimUserName, CharSequenceUtil.cleanBlank(dto.getClaimUserName()))
-                        // 认领人员所在的项目组id
-                        .eq(Objects.nonNull(dto.getClaimUserGroupId()), SysCustomerTodoEntity::getClaimUserGroupId, dto.getClaimUserGroupId())
-                        // 跟进(待办)内容
-                        .like(CharSequenceUtil.isNotBlank(dto.getFollowContent()), SysCustomerTodoEntity::getFollowContent, CharSequenceUtil.cleanBlank(dto.getFollowContent()))
-                        // 待办时间
-                        .eq(Objects.nonNull(dto.getOrderDatetime()), SysCustomerTodoEntity::getOrderDatetime, dto.getOrderDatetime())
-                        // 时间区间
-                        .between(Objects.nonNull(dto.getBeginAt()) && Objects.nonNull(dto.getEndAt()), SysCustomerTodoEntity::getCreatedAt, dto.getBeginAt(), dto.getEndAt())
-                        // 排序
-                        .orderByDesc(SysCustomerTodoEntity::getCreatedAt)
-        );
+    private final SysCustomerDataFollowService sysCustomerDataFollowService;
 
-        return this.entityPage2BOPage(entityPage);
-    }
 
     /**
-     * 根据 ID 取详情
+     * 待办页面查询顶部筛选条件数据
      *
-     * @param id 主键ID
-     * @return null or BO
+     * @return
      */
-    public SysCustomerTodoBO getOneById(Long id) {
-        return this.getOneById(id, false);
+    public List<BindUserBO> queryMemberData() {
+        List<SysCustomerTodoEntity> todoEntityList =
+                sysCustomerTodoMapper.selectList(
+                        new LambdaQueryWrapper<>(SysCustomerTodoEntity.class)
+                                .select(
+                                        SysCustomerTodoEntity::getClaimUserId,
+                                        SysCustomerTodoEntity::getClaimUserName
+                                )
+                                .eq(SysCustomerTodoEntity::getOrderStatus, 0)
+                                .orderByDesc(HelioBaseEntity::getCreatedAt)
+                );
+        List<BindUserBO> ret = Lists.newArrayList();
+        SysCustomerFollowHistorySelectBO sysCustomerFollowHistorySelectBO = sysCustomerDataFollowService.queryCustomerOrderSelectData(1, false);
+        if (sysCustomerFollowHistorySelectBO != null && CollUtil.isNotEmpty(sysCustomerFollowHistorySelectBO.getMemberData())) {
+            ret.addAll(sysCustomerFollowHistorySelectBO.getMemberData());
+            if (CollUtil.isNotEmpty(todoEntityList)) {
+                todoEntityList.forEach(
+                        entity -> {
+                            if (CollUtil.isEmpty(ret) || ret.stream().noneMatch(bo -> bo.getId().equals(entity.getClaimUserId()))) {
+                                BindUserBO bo = new BindUserBO();
+                                bo.setId(entity.getClaimUserId());
+                                bo.setUsername(entity.getClaimUserName());
+                                ret.add(bo);
+                            }
+                        }
+                );
+            }
+        }
+        return ret;
     }
 
     /**
-     * 根据 ID 取详情
+     * 根据条件查询待办列表
      *
-     * @param id 主键ID
-     * @param throwIfInvalidId 是否在 ID 无效时抛出异常
-     * @return null or BO
+     * @param startDateTime
+     * @param endDateTime
+     * @param userId
+     * @return
      */
-    public SysCustomerTodoBO getOneById(Long id, boolean throwIfInvalidId) throws BusinessException {
-        SysCustomerTodoEntity entity = sysCustomerTodoMapper.selectById(id);
-        if (throwIfInvalidId && entity == null) {
-            throw new BusinessException(400, "无效自定义待办信息数据ID");
+    public List<SysCustomerFollowListBO> queryList(LocalDateTime startDateTime, LocalDateTime endDateTime,
+                                                   Long userId) {
+        List<SysCustomerTodoEntity> todoEntityList =
+                sysCustomerTodoMapper.selectList(
+                        new LambdaQueryWrapper<>(SysCustomerTodoEntity.class)
+                                .eq(userId != null, SysCustomerTodoEntity::getClaimUserId, userId)
+                                .eq(SysCustomerTodoEntity::getOrderStatus, 0)//关闭的自定义待办不查询
+                                .ge(startDateTime != null, SysCustomerTodoEntity::getOrderDatetime, startDateTime)
+                                .le(endDateTime != null, SysCustomerTodoEntity::getOrderDatetime, endDateTime)
+                );
+
+        List<SysCustomerFollowListBO> sysCustomerFollowListBOS = sysCustomerDataFollowService.queryCustomerFollowOrderData(startDateTime, endDateTime, userId, null, null, 1);
+        if (CollUtil.isNotEmpty(todoEntityList)) {
+            todoEntityList.forEach(
+                    entity -> {
+                        SysCustomerFollowListBO bo = new SysCustomerFollowListBO();
+                        bo.setId(entity.getId());
+                        bo.setClaimUserName(entity.getClaimUserName());
+                        bo.setFollowContent(entity.getFollowContent());
+                        bo.setClaimDatetime(entity.getCreatedAt());
+                        bo.setOrderDatetime(entity.getOrderDatetime());
+                        bo.setOrderStatus(entity.getOrderStatus());
+                        bo.setOrderType(1);
+                        bo.setType(1);
+                        sysCustomerFollowListBOS.add(bo);
+                    }
+            );
         }
-
-        return this.entity2BO(entity);
+        return sysCustomerFollowListBOS;
     }
-
     /**
      * 后台管理-新增
      */
     @Transactional(rollbackFor = Exception.class)
     public Long adminInsert(AdminSysCustomerTodoInsertOrUpdateDTO dto) {
         log.info("[后台管理-自定义待办信息数据-新增] >> DTO={}", dto);
-        this.checkExistence(dto);
-
-        dto.setId(null);
         SysCustomerTodoEntity entity = new SysCustomerTodoEntity();
         BeanUtil.copyProperties(dto, entity);
-
+        entity.setClaimUserId(UserContextHolder.getUserId());
+        entity.setClaimUserName(UserContextHolder.getUserName());
         sysCustomerTodoMapper.insert(entity);
-
         return entity.getId();
     }
 
@@ -109,11 +135,8 @@ public class SysCustomerTodoService {
     @Transactional(rollbackFor = Exception.class)
     public void adminUpdate(AdminSysCustomerTodoInsertOrUpdateDTO dto) {
         log.info("[后台管理-自定义待办信息数据-编辑] >> DTO={}", dto);
-        this.checkExistence(dto);
-
         SysCustomerTodoEntity entity = new SysCustomerTodoEntity();
         BeanUtil.copyProperties(dto, entity);
-
         sysCustomerTodoMapper.updateById(entity);
     }
 
@@ -121,9 +144,18 @@ public class SysCustomerTodoService {
      * 后台管理-删除
      */
     @Transactional(rollbackFor = Exception.class)
-    public void adminDelete(Collection<Long> ids) {
-        log.info("[后台管理-自定义待办信息数据-删除] >> ids={}", ids);
-        sysCustomerTodoMapper.deleteByIds(ids);
+    public void adminDelete(Long id) {
+        log.info("[后台管理-自定义待办信息数据-删除] >> id={}", id);
+        sysCustomerTodoMapper.deleteById(id);
+    }
+
+    /**
+     * 关闭待办信息数据
+     * @param id
+     */
+    public void cancelTodoStatus(Long id) {
+        sysCustomerTodoMapper.deleteById(id);
+        sysCustomerFollowMapper.cancelTodoStatus(id);
     }
 
 
@@ -166,47 +198,10 @@ public class SysCustomerTodoService {
         // 深拷贝
         List<SysCustomerTodoBO> ret = new ArrayList<>(entityList.size());
         entityList.forEach(
-            entity -> ret.add(this.entity2BO(entity))
+                entity -> ret.add(this.entity2BO(entity))
         );
 
         return ret;
     }
 
-    /**
-     * 实体分页转 BO 分页
-     *
-     * @param entityPage 实体分页
-     * @return BO 分页
-     */
-    private PageResult<SysCustomerTodoBO> entityPage2BOPage(Page<SysCustomerTodoEntity> entityPage) {
-        return new PageResult<SysCustomerTodoBO>()
-            .setCurrent(entityPage.getCurrent())
-            .setSize(entityPage.getSize())
-            .setTotal(entityPage.getTotal())
-            .setRecords(this.entityList2BOs(entityPage.getRecords()));
-    }
-
-    /**
-     * 检查是否已存在同名数据
-     *
-     * @param dto DTO
-     */
-    private void checkExistence(AdminSysCustomerTodoInsertOrUpdateDTO dto) {
-        /*
-        可以根据自己业务需要,解禁这段代码,修改判断条件和文案
-
-        SysCustomerTodoEntity existingEntity = sysCustomerTodoMapper.selectOne(
-                new QueryWrapper<SysCustomerTodoEntity>()
-                        .lambda()
-                        .select(SysCustomerTodoEntity::getId)
-                        .eq(SysCustomerTodoEntity::getTitle, dto.getTitle())
-                        .last(HelioConstant.CRUD.SQL_LIMIT_1)
-        );
-
-        if (existingEntity != null && !existingEntity.getId().equals(dto.getId())) {
-            throw new BusinessException(400, "已存在相同自定义待办信息数据,请重新输入");
-        }
-        */
-    }
-
 }