Browse Source

优化销售端+医生端跟进会员接口+已处理任务+待处理任务

cgp 1 week ago
parent
commit
d30c5ce7e6
21 changed files with 486 additions and 81 deletions
  1. 3 2
      fs-admin/src/main/java/com/fs/company/controller/SopStatsOverviewController.java
  2. 17 5
      fs-admin/src/main/java/com/fs/his/task/Task.java
  3. 7 4
      fs-company/src/main/java/com/fs/company/controller/qw/FsDoctorMemberSalesController.java
  4. 1 1
      fs-doctor-app/src/main/java/com/fs/app/controller/FsDoctorMemberSalesController.java
  5. 1 1
      fs-doctor-app/src/main/java/com/fs/app/controller/FsSopDoctorTaskController.java
  6. 3 4
      fs-service/src/main/java/com/fs/his/domain/FsSopDoctorTask.java
  7. 3 0
      fs-service/src/main/java/com/fs/his/dto/SopDoctorTaskDto.java
  8. 15 2
      fs-service/src/main/java/com/fs/his/mapper/FsSopDoctorTaskMapper.java
  9. 2 0
      fs-service/src/main/java/com/fs/his/param/DoctorTaskStatsParam.java
  10. 11 1
      fs-service/src/main/java/com/fs/his/service/IFsSopDoctorTaskService.java
  11. 116 22
      fs-service/src/main/java/com/fs/his/service/impl/FsSopDoctorTaskServiceImpl.java
  12. 1 0
      fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderServiceImpl.java
  13. 3 0
      fs-service/src/main/java/com/fs/his/vo/SopDoctorTaskVo.java
  14. 15 0
      fs-service/src/main/java/com/fs/qw/domain/FsSopCompanyUserTask.java
  15. 1 1
      fs-service/src/main/java/com/fs/qw/service/IFsDoctorMemberSalesService.java
  16. 37 5
      fs-service/src/main/java/com/fs/qw/service/impl/FsDoctorMemberSalesServiceImpl.java
  17. 3 0
      fs-service/src/main/java/com/fs/sop/domain/SopOrderLog.java
  18. 123 13
      fs-service/src/main/resources/mapper/his/FsSopDoctorTaskMapper.xml
  19. 6 4
      fs-service/src/main/resources/mapper/qw/FsDoctorMemberSalesMapper.xml
  20. 111 14
      fs-service/src/main/resources/mapper/qw/FsSopCompanyUserTaskMapper.xml
  21. 7 2
      fs-service/src/main/resources/mapper/sop/SopOrderLogMapper.xml

+ 3 - 2
fs-admin/src/main/java/com/fs/company/controller/SopStatsOverviewController.java

@@ -221,6 +221,7 @@ public class SopStatsOverviewController extends BaseController {
     @PreAuthorize("@ss.hasPermi('sop:statistics:doctorFollowUpStats')")
     @PostMapping("/doctor/followUp/stats")
     public TableDataInfo doctorFollowUpStats(@RequestBody DoctorTaskStatsParam param){
+        param.setHandlePersonType(1);
         PageHelper.startPage(param.getPageNum(),param.getPageSize());
         List<DoctorTaskStatsVO> list =doctorMemberSalesService.selectDoctorTaskStats(param);
         return getDataTable(list);
@@ -230,7 +231,7 @@ public class SopStatsOverviewController extends BaseController {
     @GetMapping("/doctor/followUp/selectPendingTaskList")
     public TableDataInfo doctorFollowUpStats(FsDoctorMemberSalesQueryParam param){
         startPage();
-        List<FsDoctorMemberSalesVO> list =doctorMemberSalesService.selectFsDoctorMemberSalesVOList(param);
+        List<FsDoctorMemberSalesVO> list =doctorMemberSalesService.selectFsDoctorMemberSalesVOList(param,1);
         return getDataTable(list);
     }
 
@@ -243,7 +244,7 @@ public class SopStatsOverviewController extends BaseController {
     public TableDataInfo selectFsSopDoctorTaskVoListHandleRecords(SopDoctorTaskDto queryDto)
     {
         startPage();
-        List<SopDoctorTaskVo> list = doctorMemberSalesService.selectCompletedTasksList(queryDto);
+        List<SopDoctorTaskVo> list = fsSopDoctorTaskService.selectSopDoctorTaskVoProcessRecordList(queryDto);
         return getDataTable(list);
 
     }

+ 17 - 5
fs-admin/src/main/java/com/fs/his/task/Task.java

@@ -790,7 +790,7 @@ public class Task {
     }
     public void addPrescribeImg() throws Exception
     {
-       List<Long> ids= fsPrescribeService.selectFsPrescribeByPrescribeIdByOrderType();
+        List<Long> ids= fsPrescribeService.selectFsPrescribeByPrescribeIdByOrderType();
         for (Long id : ids) {
             System.out.println(id);
             fsPrescribeService.PrescribeStoreImg(id);
@@ -1401,8 +1401,8 @@ public class Task {
 
 
     public void addSend(){
-       String userId="4048905872";
-       String doctorId="147";
+        String userId="4048905872";
+        String doctorId="147";
         String storeOrderId="470920";
         String followId="1062986";
         //发送给用户
@@ -2288,6 +2288,9 @@ public class Task {
 //        }
     }
 
+    /**
+     * "跟进会员"提醒时间任务
+     * */
     public void obtainSopInfoData() {
         List<SopOrderLog> sopOrderLogs = sopOrderLogMapper.queryUnsentSOPData();
         if (CollectionUtils.isEmpty(sopOrderLogs)) {
@@ -2305,9 +2308,18 @@ public class Task {
             fsSopDoctorTask.setCompanyUserId(log.getCompanyUserId());
             fsSopDoctorTask.setQwExternalContactId(log.getExId());
             fsSopDoctorTask.setStatus(0);//默认未处理状态
+            fsSopDoctorTask.setTaskType(1); // 初始任务
             fsSopDoctorTask.setCreateTime(DateUtils.getNowDate());
-            int result = sopDoctorTaskMapper.insertFsSopDoctorTask(fsSopDoctorTask);;
-            if (result>0) {
+            // 设置处理人类型(医生或销售)
+            if (log.getHandlePersonType() != null) {
+                fsSopDoctorTask.setHandlePersonType(log.getHandlePersonType());
+            } else {
+                // 兼容旧数据,默认设为医生
+                fsSopDoctorTask.setHandlePersonType(1);
+            }
+
+            int result = sopDoctorTaskMapper.insertFsSopDoctorTask(fsSopDoctorTask);
+            if (result > 0) {
                 ids.add(log.getId());
             }
         }

+ 7 - 4
fs-company/src/main/java/com/fs/company/controller/qw/FsDoctorMemberSalesController.java

@@ -86,7 +86,7 @@ public class FsDoctorMemberSalesController extends BaseController {
             param.setCompanyUserId(null);
         }
         PageHelper.startPage(param.getPageNum(), param.getPageSize());
-        List<FsDoctorMemberSalesVO> voList = doctorMemberSalesService.selectFsDoctorMemberSalesVOList(param);
+        List<FsDoctorMemberSalesVO> voList = doctorMemberSalesService.selectFsDoctorMemberSalesVOList(param,2);
         PageInfo<FsDoctorMemberSalesVO> listPageInfo=new PageInfo<>(voList);
         return R.ok().put("data", listPageInfo);
     }
@@ -97,10 +97,10 @@ public class FsDoctorMemberSalesController extends BaseController {
      * @return 医生处理sop任务集合
      * */
     @GetMapping("/selectCompanyUserTaskVoListHandleRecords")
-    public TableDataInfo selectCompanyUserTaskVoListHandleRecords(SopDoctorTaskDto queryDto)
+    public TableDataInfo selectSopDoctorTaskVoProcessRecordList(SopDoctorTaskDto queryDto)
     {
         startPage();
-        List<SopDoctorTaskVo> list = fsSopDoctorTaskService.selectFsSopDoctorTaskVoListHandleRecords(queryDto);
+        List<SopDoctorTaskVo> list = fsSopDoctorTaskService.selectSopDoctorTaskVoProcessRecordList(queryDto);
         return getDataTable(list);
 
     }
@@ -121,8 +121,11 @@ public class FsDoctorMemberSalesController extends BaseController {
     }
     @GetMapping("/taskList")
     public R selectFsDoctorMemberSalesVOList(FsSopDoctorTask param){
+        //当前登录销售id
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        param.setCompanyUserId(loginUser.getUser().getUserId());
         startPage();
-        List<FsSopDoctorTask> taskList = fsSopDoctorTaskService.selectFsSopDoctorTaskList(param);
+        List<FsSopDoctorTask> taskList = fsSopDoctorTaskService.getSalesTaskList(param);
         PageInfo<FsSopDoctorTask> listPageInfo=new PageInfo<>(taskList);
         return R.ok().put("data", listPageInfo);
     }

+ 1 - 1
fs-doctor-app/src/main/java/com/fs/app/controller/FsDoctorMemberSalesController.java

@@ -25,7 +25,7 @@ public class FsDoctorMemberSalesController extends AppBaseController {
         PageHelper.startPage(param.getPageNum(), param.getPageSize());
         Long doctorId = Long.parseLong(getDoctorId());
         param.setDoctorId(doctorId);
-        List<FsDoctorMemberSalesVO> voList = doctorMemberSalesService.selectFsDoctorMemberSalesVOList(param);
+        List<FsDoctorMemberSalesVO> voList = doctorMemberSalesService.selectFsDoctorMemberSalesVOList(param,1);
         PageInfo<FsDoctorMemberSalesVO> listPageInfo=new PageInfo<>(voList);
         return R.ok().put("data", listPageInfo);
     }

+ 1 - 1
fs-doctor-app/src/main/java/com/fs/app/controller/FsSopDoctorTaskController.java

@@ -295,7 +295,7 @@ public class FsSopDoctorTaskController extends BaseController
     public TableDataInfo selectFsSopDoctorTaskVoListHandleRecords(SopDoctorTaskDto queryDto)
     {
         startPage();
-        List<SopDoctorTaskVo> list = fsSopDoctorTaskService.selectFsSopDoctorTaskVoListHandleRecords(queryDto);
+        List<SopDoctorTaskVo> list = fsSopDoctorTaskService.selectSopDoctorTaskVoProcessRecordList(queryDto);
         return getDataTable(list);
 
     }

+ 3 - 4
fs-service/src/main/java/com/fs/his/domain/FsSopDoctorTask.java

@@ -43,10 +43,6 @@ public class FsSopDoctorTask extends BaseEntity{
     /** 处理类型 1:签收,2:选择下次提醒时间 */
     private Integer handleType;
 
-    /** 备用id */
-    @Excel(name = "备用id")
-    private Long standbyId;
-
     /** 1:小品未购 主品未购 2:小品已购 主品未购 3:小品未购 主品已购 4:小品已购 主品已购 */
     private Integer type;
 
@@ -64,4 +60,7 @@ public class FsSopDoctorTask extends BaseEntity{
 
     /** 版本 */
     private Integer version;
+
+    /** 任务类型 1:初始任务 2:签收任务 3:提醒任务 */
+    private Integer taskType;
 }

+ 3 - 0
fs-service/src/main/java/com/fs/his/dto/SopDoctorTaskDto.java

@@ -52,4 +52,7 @@ public class SopDoctorTaskDto  extends BaseEntity {
 
     /** 处理人类型 暂定2是销售*/
     private Integer handlePersonType;
+
+    /** 任务类型 1:初始任务 2:签收任务 3:提醒任务 */
+    private Integer taskType;
 }

+ 15 - 2
fs-service/src/main/java/com/fs/his/mapper/FsSopDoctorTaskMapper.java

@@ -34,6 +34,14 @@ public interface FsSopDoctorTaskMapper extends BaseMapper<FsSopDoctorTask>{
      */
     List<SopDoctorTaskVo> selectFsSopDoctorTaskVoList(SopDoctorTaskDto queryDto);
 
+    /**
+     * 查询任务处理记录列表
+     *
+     * @param queryDto sop任务
+     * @return sop任务处理记录集合
+     */
+    List<SopDoctorTaskVo> selectSopDoctorTaskVoProcessRecordList(SopDoctorTaskDto queryDto);
+
     /**
      * 新增医生处理sop任务
      * 
@@ -72,10 +80,15 @@ public interface FsSopDoctorTaskMapper extends BaseMapper<FsSopDoctorTask>{
     List<FsSopDoctorTask> selectFsSopDoctorTaskList(FsSopDoctorTask task);
 
     /**
-     * 获取跟进会员待处理的总数
+     * 获取医生待处理的任务总数
      */
-    @Select("SELECT count(*) FROM fs_sop_doctor_task WHERE doctor_member_sales_id = #{memberSalesId} and status=0")
+    //@Select("SELECT count(*) FROM fs_sop_doctor_task WHERE doctor_member_sales_id = #{memberSalesId} and status=0")
+
     Long selectUnprocessedDoctorTaskCount(@Param("memberSalesId") Long memberSalesId);
+    /**
+     * 获取销售待处理的任务总数
+     * */
+    Long selectUnprocessedSalesTaskCount(@Param("memberSalesId") Long memberSalesId);
 
     //根据订单号查询签收处理的医生任务
     @Select("SELECT count(*) FROM fs_sop_doctor_task WHERE order_code = #{orderCode} AND handle_type = 1 AND `status` = 1")

+ 2 - 0
fs-service/src/main/java/com/fs/his/param/DoctorTaskStatsParam.java

@@ -10,6 +10,8 @@ public class DoctorTaskStatsParam {
     private String sort;//asc.升序 desc.降序
     //排序字段
     private String sortField;
+    //处理人类型
+    private Integer handlePersonType;
     //分页参数
     private Integer pageNum;
     private Integer pageSize;

+ 11 - 1
fs-service/src/main/java/com/fs/his/service/IFsSopDoctorTaskService.java

@@ -77,5 +77,15 @@ public interface IFsSopDoctorTaskService extends IService<FsSopDoctorTask>{
      * @param queryDto 医生处理任务
      * @return 医生处理sop任务集合
      * */
-    List<SopDoctorTaskVo> selectFsSopDoctorTaskVoListHandleRecords(SopDoctorTaskDto queryDto);
+    List<SopDoctorTaskVo> selectSopDoctorTaskVoProcessRecordList(SopDoctorTaskDto queryDto);
+
+    /**
+     * 销售查询任务列表
+     */
+    List<FsSopDoctorTask> getSalesSignOffTasks(FsSopDoctorTask param);
+
+    /**
+     * 销售查询签收任务(已处理的)
+     */
+    List<FsSopDoctorTask> getSalesTaskList(FsSopDoctorTask param);
 }

+ 116 - 22
fs-service/src/main/java/com/fs/his/service/impl/FsSopDoctorTaskServiceImpl.java

@@ -4,6 +4,7 @@ import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
@@ -144,8 +145,20 @@ public class FsSopDoctorTaskServiceImpl extends ServiceImpl<FsSopDoctorTaskMappe
     }
 
     @Override
-    public List<FsSopDoctorTask> selectFsSopDoctorTaskList(FsSopDoctorTask task) {
-        return fsSopDoctorTaskMapper.selectFsSopDoctorTaskList(task);
+    public List<FsSopDoctorTask> selectFsSopDoctorTaskList(FsSopDoctorTask param) {
+        param.setHandlePersonType(1); // 医生所属任务
+        // 医生只能看到自己的初始任务(1)和提醒任务(2)
+        param.setTaskType(1); // 先查初始任务
+        param.setStatus(0);
+        List<FsSopDoctorTask> result = new ArrayList<>();
+        List<FsSopDoctorTask> initialTasks = fsSopDoctorTaskMapper.selectFsSopDoctorTaskList(param);
+        result.addAll(initialTasks);
+
+        // 再查提醒任务
+        param.setTaskType(3);
+        List<FsSopDoctorTask> reminderTasks = fsSopDoctorTaskMapper.selectFsSopDoctorTaskList(param);
+        result.addAll(reminderTasks);
+        return result;
     }
 
     @Override
@@ -168,7 +181,7 @@ public class FsSopDoctorTaskServiceImpl extends ServiceImpl<FsSopDoctorTaskMappe
                 && (addTaskDto.getSendDays() == null || addTaskDto.getSendDays() <= 0)) {
             throw new CustomException("提醒类型必须提供大于0的天数");
         }
-
+        // 获取会员搭销数据
         FsDoctorMemberSales fsDoctorMemberSales = doctorMemberSalesMapper.selectFsDoctorMemberSalesById(addTaskDto.getDoctorMemberSalesId());
         if (fsDoctorMemberSales == null) {
             log.error("会员搭销数据不存在,doctorMemberSalesId:{}", addTaskDto.getDoctorMemberSalesId());
@@ -180,10 +193,35 @@ public class FsSopDoctorTaskServiceImpl extends ServiceImpl<FsSopDoctorTaskMappe
         }
         if (existingTask.getStatus() != null && existingTask.getStatus() == 1) {
             // 如果任务已经是已处理状态,直接抛出异常
-            throw new CustomException("该任务已被处理,无法重复提交");
+            throw new CustomException("该任务已被处理,请返回跟'进会员面页'面后重试");
+        }
+        // 检查任务类型,必须是初始任务才能处理
+        if (existingTask.getTaskType() != null && existingTask.getTaskType() != 1) {
+            throw new CustomException("非初始任务不能处理");
         }
         Integer currentVersion = existingTask.getVersion();
-        // --- 2. 更新主任务表 ---
+        // --- 2. 签收任务处理:需要找到另一个人的初始任务并标记为已处理 ---
+        if (addTaskDto.getHandleType() == 1) {
+            // 查找另一个人的初始任务(医生找销售的,销售找医生的)
+            FsSopDoctorTask otherPersonTask = findOtherPersonTask(
+                    existingTask.getDoctorMemberSalesId(),
+                    existingTask.getHandlePersonType(),
+                    existingTask.getCompanyUserId(),
+                    existingTask.getDoctorId()
+            );
+
+            if (otherPersonTask != null && otherPersonTask.getStatus() == 0) {
+                // 标记另一个人的初始任务为已处理
+                FsSopDoctorTask updateOther = new FsSopDoctorTask();
+                updateOther.setId(otherPersonTask.getId());
+                updateOther.setStatus(1);
+                updateOther.setUpdateTime(DateUtils.getNowDate());
+                updateOther.setRemark("此任务已被其他人签收处理");
+                updateOther.setVersion(otherPersonTask.getVersion());
+                fsSopDoctorTaskMapper.updateFsSopDoctorTask(updateOther);
+            }
+        }
+        // --- 3. 更新当前任务 ---
         FsSopDoctorTask doctorTask = new FsSopDoctorTask();
         doctorTask.setId(addTaskDto.getId());
         doctorTask.setVersion(currentVersion); //设置旧版本号,用于乐观锁 WHERE 条件
@@ -194,13 +232,15 @@ public class FsSopDoctorTaskServiceImpl extends ServiceImpl<FsSopDoctorTaskMappe
         doctorTask.setRemark(addTaskDto.getRemark());
         doctorTask.setUpdateTime(DateUtils.getNowDate());
         doctorTask.setSendDays(addTaskDto.getSendDays());
-        doctorTask.setHandlePersonType(addTaskDto.getHandlePersonType());//操作人员类型2:销售
-
-        //如果是"签收"类型 额外处理
-        if (addTaskDto.getHandleType() != null && addTaskDto.getHandleType() == 1) {
-            if (addTaskDto.getOrderCode() == null || addTaskDto.getOrderCode().isEmpty()) {
-                throw new CustomException("签收订单号不能为空");
-            }
+        doctorTask.setHandlePersonType(existingTask.getHandlePersonType());// 保持原处理人类型
+        // 设置任务类型
+        if (addTaskDto.getHandleType() == 1) {
+            doctorTask.setTaskType(2); // 签收任务
+        } else if (addTaskDto.getHandleType() == 2) {
+            doctorTask.setTaskType(3); // 提醒任务
+        }
+        //"签收"类型 额外处理
+        if (addTaskDto.getHandleType() == 1) {
             doctorTask.setOrderCode(addTaskDto.getOrderCode());
             //缓存签收的doctorTask
             String signOffOrderCacheKey = "doctorMemberSaLes:"+ addTaskDto.getOrderCode();
@@ -211,20 +251,20 @@ public class FsSopDoctorTaskServiceImpl extends ServiceImpl<FsSopDoctorTaskMappe
             fsStoreOrder.setOrderCode(addTaskDto.getOrderCode());
             fsStoreOrderMapper.updateFsStoreOrderByOrderCode(fsStoreOrder);
         }
-        //更新task状态
+        // 更新当前任务
         int updateResult = fsSopDoctorTaskMapper.updateFsSopDoctorTask(doctorTask);
         if (updateResult == 0) {
             // 更新影响行数为0,说明乐观锁生效,数据已被其他线程修改
             log.warn("提交任务时发生冲突,任务ID: {}, 原始版本号: {}", addTaskDto.getId(), currentVersion);
             throw new CustomException("该任务已被他人处理,请刷新后重试");
         }
-        // --- 3. "提醒时间"类型执行后续操作 ---
-        if (addTaskDto.getHandleType() != null && addTaskDto.getHandleType() == 2) {
-            // --- 3.1 计算提醒时间 ---
+        // --- 4. 提醒任务:创建定时提醒日志 ---
+        if (addTaskDto.getHandleType() == 2) {
+            // --- 4.1 计算提醒时间 ---
             Date now = DateUtils.getNowDate();
             Date futureDate = calculateFutureDate(now, addTaskDto.getSendDays());
 
-            // --- 3.2 插入sop_order_log表 ---
+            // --- 4.2 插入sop_order_log表 ---
             SopOrderLog sopOrderLog = new SopOrderLog();
             sopOrderLog.setDoctorId(addTaskDto.getDoctorId());// 医生ID
             sopOrderLog.setStatus(0); // 0:未发送,1:已发送
@@ -235,6 +275,7 @@ public class FsSopDoctorTaskServiceImpl extends ServiceImpl<FsSopDoctorTaskMappe
             sopOrderLog.setCreateTime(now);
             sopOrderLog.setSendTime(futureDate);
             sopOrderLog.setDoctorMemberSalesId(addTaskDto.getDoctorMemberSalesId());
+            sopOrderLog.setHandlePersonType(existingTask.getHandlePersonType()); // 记录处理人类型
             sopOrderLogMapper.insertSopOrderLog(sopOrderLog);
         }
 
@@ -245,15 +286,68 @@ public class FsSopDoctorTaskServiceImpl extends ServiceImpl<FsSopDoctorTaskMappe
      * 查询跟进会员任务处理记录
      * */
     @Override
-    public List<SopDoctorTaskVo> selectFsSopDoctorTaskVoListHandleRecords(SopDoctorTaskDto queryDto) {
+    public List<SopDoctorTaskVo> selectSopDoctorTaskVoProcessRecordList(SopDoctorTaskDto queryDto) {
         // ---验证输入参数 ---
-        if (queryDto == null || queryDto.getDoctorMemberSalesId() == null) {
-            throw new CustomException("医生会员搭销ID不能为空");
-        }
+        //if (queryDto == null || queryDto.getDoctorMemberSalesId() == null) {
+            //throw new CustomException("医生会员搭销ID不能为空");
+        //}
         queryDto.setStatus(1);//1:已处理
-        return fsSopDoctorTaskMapper.selectFsSopDoctorTaskVoList(queryDto);
+        return fsSopDoctorTaskMapper.selectSopDoctorTaskVoProcessRecordList(queryDto);
+    }
+
+    /**
+     * 销售查询任务列表
+     */
+    public List<FsSopDoctorTask> getSalesTaskList(FsSopDoctorTask param) {
+        param.setHandlePersonType(2); // 销售人员所属任务
+        // 销售只能看到自己的初始任务(1)和提醒任务(3)
+        param.setTaskType(1); // 先查初始任务
+        param.setStatus(0);
+        List<FsSopDoctorTask> result = new ArrayList<>();
+        List<FsSopDoctorTask> initialTasks = fsSopDoctorTaskMapper.selectFsSopDoctorTaskList(param);
+        result.addAll(initialTasks);
+
+        // 再查提醒任务
+        param.setTaskType(3);
+        List<FsSopDoctorTask> reminderTasks = fsSopDoctorTaskMapper.selectFsSopDoctorTaskList(param);
+        result.addAll(reminderTasks);
+
+        return result;
+    }
+
+    /**
+     * 销售查询签收任务(已处理的)
+     */
+    public List<FsSopDoctorTask> getSalesSignOffTasks(FsSopDoctorTask param) {
+        param.setHandlePersonType(2); // 销售人员的任务
+        param.setTaskType(2); // 签收任务
+        param.setStatus(1);   // 已处理
+
+        return fsSopDoctorTaskMapper.selectFsSopDoctorTaskList(param);
     }
 
+    /**
+     * 查找另一个人的初始任务
+     */
+    private FsSopDoctorTask findOtherPersonTask(Long memberSalesId, Integer currentHandlePersonType,
+                                                Long companyUserId, Long doctorId) {
+
+        FsSopDoctorTask query = new FsSopDoctorTask();
+        query.setDoctorMemberSalesId(memberSalesId);
+        query.setTaskType(1); // 只查找初始任务
+        query.setStatus(0);   // 只查找未处理的任务
+
+        if (currentHandlePersonType == 1) { // 当前是医生,找销售的
+            query.setHandlePersonType(2); // 销售的任务
+            query.setCompanyUserId(companyUserId);
+        } else { // 当前是销售,找医生的
+            query.setHandlePersonType(1); // 医生的任务
+            query.setDoctorId(doctorId);
+        }
+
+        List<FsSopDoctorTask> tasks = fsSopDoctorTaskMapper.selectFsSopDoctorTaskList(query);
+        return tasks != null && !tasks.isEmpty() ? tasks.get(0) : null;
+    }
     /**
      * 计算未来日期
      * @param baseDate 基准日期

+ 1 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderServiceImpl.java

@@ -718,6 +718,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
                     FsSopDoctorTask doctorTask = new FsSopDoctorTask();
                     doctorTask.setRemark(order.getOrderCode()+":已签收,随访客户指导用药");
                     doctorTask.setDoctorId(task.getDoctorId());
+                    doctorTask.setHandlePersonType(task.getHandlePersonType());
                     doctorTask.setDoctorMemberSalesId(task.getDoctorMemberSalesId());
                     doctorTask.setQwExternalContactId(task.getQwExternalContactId());
                     doctorTask.setStatus(0);

+ 3 - 0
fs-service/src/main/java/com/fs/his/vo/SopDoctorTaskVo.java

@@ -82,4 +82,7 @@ public class SopDoctorTaskVo {
 
     //医生会员搭销id
     private Long doctorMemberSalesId;
+
+    /** 任务类型 1:初始任务 2:签收任务 3:提醒任务 */
+    private Integer taskType;
 }

+ 15 - 0
fs-service/src/main/java/com/fs/qw/domain/FsSopCompanyUserTask.java

@@ -45,4 +45,19 @@ public class FsSopCompanyUserTask extends BaseEntity{
     /** qw_external_contact表主键 */
     private Long qwExternalContactId;
 
+    /** 处理类型 1:签收,2:选择下次提醒时间 */
+    private Integer handleType;
+
+    //医生会员搭销id
+    private Long doctorMemberSalesId;
+
+    /** 提醒天数 */
+    private Integer sendDays;
+
+    /** 处理人类型 2:销售 */
+    private Integer handlePersonType;
+
+    /** 版本 */
+    private Integer version;
+
 }

+ 1 - 1
fs-service/src/main/java/com/fs/qw/service/IFsDoctorMemberSalesService.java

@@ -29,7 +29,7 @@ public interface IFsDoctorMemberSalesService extends IService<FsDoctorMemberSale
     /**
      * 获取医生销售推送的会员列表
      */
-    List<FsDoctorMemberSalesVO> selectFsDoctorMemberSalesVOList(FsDoctorMemberSalesQueryParam param);
+    List<FsDoctorMemberSalesVO> selectFsDoctorMemberSalesVOList(FsDoctorMemberSalesQueryParam param,Integer handelPersonType);
 
     /**
      * 查询医生会员搭销

+ 37 - 5
fs-service/src/main/java/com/fs/qw/service/impl/FsDoctorMemberSalesServiceImpl.java

@@ -1,6 +1,7 @@
 package com.fs.qw.service.impl;
 
 import java.util.Collections;
+import java.util.Date;
 import java.util.List;
 
 import com.fs.common.core.domain.R;
@@ -11,6 +12,7 @@ import com.fs.his.domain.FsSopDoctorTask;
 import com.fs.his.dto.SopDoctorTaskDto;
 import com.fs.his.mapper.FsSopDoctorTaskMapper;
 import com.fs.his.param.DoctorTaskStatsParam;
+import com.fs.his.service.IFsSopDoctorTaskService;
 import com.fs.his.utils.PhoneUtil;
 import com.fs.his.vo.SopDoctorTaskVo;
 import com.fs.hisStore.service.IFsUserInformationCollectionService;
@@ -53,6 +55,9 @@ public class FsDoctorMemberSalesServiceImpl extends ServiceImpl<FsDoctorMemberSa
     @Autowired
     private FsSopDoctorTaskMapper fsSopDoctorTaskMapper;
 
+    @Autowired
+    private IFsSopDoctorTaskService fsSopDoctorTaskService;
+
     @Transactional
     @Override
     public R push(MemberSalesParam param) {
@@ -71,17 +76,34 @@ public class FsDoctorMemberSalesServiceImpl extends ServiceImpl<FsDoctorMemberSa
 
         if(memberSalesMapper.insertFsDoctorMemberSales(memberSales) > 0){
             //插入第一次推送时随访待处理
+            Date nowDate = DateUtils.getNowDate();
+            // 为医生创建初始任务
             FsSopDoctorTask doctorTask = new FsSopDoctorTask();
             doctorTask.setDoctorId(memberSales.getDoctorId());
-            doctorTask.setStatus(0);
-            doctorTask.setCreateTime(DateUtils.getNowDate());
+            doctorTask.setStatus(0);//0:待处理
+            doctorTask.setCreateTime(nowDate);
             doctorTask.setQwExternalContactId(memberSales.getExId());
             doctorTask.setCompanyUserId(memberSales.getCompanyUserId());
             doctorTask.setRemark("新推送会员");
             doctorTask.setUserId(memberSales.getFsUserId());
             doctorTask.setDoctorMemberSalesId(memberSales.getId());
+            doctorTask.setTaskType(1); // 初始任务
+            doctorTask.setHandlePersonType(1); // 1:医生
             sopDoctorTaskMapper.insertFsSopDoctorTask(doctorTask);
 
+            // 为销售创建初始任务
+            FsSopDoctorTask salesTask = new FsSopDoctorTask();
+            salesTask.setDoctorId(memberSales.getDoctorId());
+            salesTask.setStatus(0);//0:待处理
+            salesTask.setCreateTime(nowDate);
+            salesTask.setQwExternalContactId(memberSales.getExId());
+            salesTask.setCompanyUserId(memberSales.getCompanyUserId());
+            salesTask.setRemark("新推送会员");
+            salesTask.setUserId(memberSales.getFsUserId());
+            salesTask.setDoctorMemberSalesId(memberSales.getId());
+            salesTask.setTaskType(1); // 初始任务
+            salesTask.setHandlePersonType(2); // 2:销售
+            sopDoctorTaskMapper.insertFsSopDoctorTask(salesTask);
             //更新企业外部联系人推送状态
             QwExternalContact map = new QwExternalContact();
             map.setId(param.getExId());
@@ -94,7 +116,7 @@ public class FsDoctorMemberSalesServiceImpl extends ServiceImpl<FsDoctorMemberSa
     }
 
     @Override
-    public List<FsDoctorMemberSalesVO> selectFsDoctorMemberSalesVOList(FsDoctorMemberSalesQueryParam param) {
+    public List<FsDoctorMemberSalesVO> selectFsDoctorMemberSalesVOList(FsDoctorMemberSalesQueryParam param,Integer handelPersonType) {
         //1.跟进会员信息
         List<FsDoctorMemberSalesVO> voList = memberSalesMapper.selectFsDoctorMemberSalesVOList(param);
         if (!CollectionUtils.isEmpty(voList)) {
@@ -108,8 +130,18 @@ public class FsDoctorMemberSalesServiceImpl extends ServiceImpl<FsDoctorMemberSa
                     }
                 }
                 //2.获取跟进会员待处理的总数
-                Long unprocessedDoctorTaskCount = sopDoctorTaskMapper.selectUnprocessedDoctorTaskCount(vo.getId());
-                vo.setUnprocessed(unprocessedDoctorTaskCount);
+                FsSopDoctorTask doctorTask = new FsSopDoctorTask();
+                doctorTask.setDoctorMemberSalesId(vo.getId());
+                if (handelPersonType==1){
+                    doctorTask.setDoctorId(vo.getDoctorId());
+                    Long unprocessedDoctorTaskCount = (long) fsSopDoctorTaskService.selectFsSopDoctorTaskList(doctorTask).size();
+                    vo.setUnprocessed(unprocessedDoctorTaskCount);
+                } else if (handelPersonType==2) {
+                    doctorTask.setCompanyUserId(vo.getCompanyUserId());
+                    Long unprocessedDoctorTaskCount = (long) fsSopDoctorTaskService.getSalesTaskList(doctorTask).size();
+                    vo.setUnprocessed(unprocessedDoctorTaskCount);
+                }
+
             }
         }
         return voList;

+ 3 - 0
fs-service/src/main/java/com/fs/sop/domain/SopOrderLog.java

@@ -49,6 +49,9 @@ public class SopOrderLog extends BaseEntity{
     /* 0:未推送 1:已推送 **/
     private Integer status;
 
+    /* 处理人类型 1:医生 2:销售 **/
+    private Integer handlePersonType;
+
     //销售id
     private Long companyUserId;
 

+ 123 - 13
fs-service/src/main/resources/mapper/his/FsSopDoctorTaskMapper.xml

@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper
-PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.fs.his.mapper.FsSopDoctorTaskMapper">
-    
+
     <resultMap type="FsSopDoctorTask" id="FsSopDoctorTaskResult">
         <result property="id"    column="id"    />
         <result property="companyUserId"    column="company_user_id"    />
@@ -21,6 +21,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="doctorMemberSalesId"    column="doctor_member_sales_id"    />
         <result property="handlePersonType"    column="handle_person_type"    />
         <result property="version"    column="version"    />
+        <result property="taskType"    column="task_type"    />
     </resultMap>
 
     <resultMap type="com.fs.his.vo.SopDoctorTaskVo" id="SopDoctorTaskVoResult">
@@ -42,6 +43,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="sendDays"    column="send_days"    />
         <result property="handlePersonType"    column="handle_person_type"    />
         <result property="version"    column="version"    />
+        <result property="taskType"    column="task_type"    />
         <!-- 关联表字段 -->
         <result property="name"     column="name" />          <!-- qwec.name -->
         <result property="companyUserName"   column="company_user_name" />   <!-- cp.nick_name -->
@@ -52,7 +54,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 
     <sql id="selectFsSopDoctorTaskVo">
-        select id, company_user_id,doctor_id, user_id, status, create_time, update_time, remark, package_id, order_code, type,qw_external_contact_id,handle_type,doctor_member_sales_id,send_days,handle_person_type,version from fs_sop_doctor_task
+        select id, company_user_id, doctor_id, user_id, status, create_time, update_time, remark, package_id, order_code, type, qw_external_contact_id, handle_type, doctor_member_sales_id, send_days, handle_person_type, version, task_type from fs_sop_doctor_task
     </sql>
 
     <select id="selectFsSopDoctorTaskVoList" parameterType="com.fs.his.dto.SopDoctorTaskDto" resultMap="SopDoctorTaskVoResult">
@@ -75,7 +77,64 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         sdt.handle_type,
         sdt.send_days,
         sdt.version,
-        sdt.handle_person_type
+        sdt.handle_person_type,
+        sdt.task_type
+        FROM
+        fs_sop_doctor_task sdt
+        LEFT JOIN company_user cp ON sdt.company_user_id = cp.user_id
+        LEFT JOIN qw_external_contact qwec ON sdt.qw_external_contact_id = qwec.id
+        LEFT JOIN fs_user fu ON qwec.fs_user_id = fu.user_id
+        LEFT JOIN fs_doctor fd ON sdt.doctor_id = fd.doctor_id
+        <where>
+            <if test="id != null "> and sdt.id = #{id}</if>
+            <if test="doctorId != null "> and sdt.doctor_id = #{doctorId}</if>
+            <if test="userId != null "> and sdt.user_id = #{userId}</if>
+            <if test="packageId != null "> and sdt.package_id = #{packageId}</if>
+            <if test="orderCode != null "> and sdt.order_code = #{orderCode}</if>
+            <if test="companyUserId != null "> and sdt.company_user_id = #{companyUserId}</if>
+            <if test="status != null "> and sdt.status = #{status}</if>
+            <if test="handleType != null "> and sdt.handle_type = #{handleType}</if>
+            <if test="doctorMemberSalesId != null "> and sdt.doctor_member_sales_id = #{doctorMemberSalesId}</if>
+            <if test="type != null "> and sdt.type = #{type}</if>
+            <if test="version != null "> and sdt.version = #{version}</if>
+            <if test="handlePersonType != null "> and sdt.handle_person_type = #{handlePersonType}</if>
+            <if test="taskType != null "> and sdt.task_type = #{taskType}</if>
+            <if test="qwUserId != null "> and qwec.qw_user_id = #{qwUserId}</if>
+            <if test="name != null "> and qwec.name like concat('%', #{name}, '%')</if>
+            <if test="companyUserName != null and companyUserName !='' "> and cp.nick_name like concat('%', #{companyUserName}, '%')</if>
+            <if test="doctorName != null and doctorName !='' "> and fd.doctor_name like concat('%', #{doctorName}, '%')</if>
+            <if test="beginTime != null and beginTime != ''">
+                and sdt.create_time &gt;= str_to_date(#{beginTime}, '%Y-%m-%d %H:%i:%s')
+            </if>
+            <if test="endTime != null and endTime != ''">
+                and sdt.create_time &lt;= str_to_date(#{endTime}, '%Y-%m-%d %H:%i:%s')
+            </if>
+        </where>
+        ORDER BY sdt.id DESC
+    </select>
+
+    <select id="selectSopDoctorTaskVoProcessRecordList" parameterType="com.fs.his.dto.SopDoctorTaskDto" resultMap="SopDoctorTaskVoResult">
+        SELECT
+        sdt.id,
+        sdt.user_id,
+        qwec.name,
+        qwec.avatar,
+        fu.phone,
+        cp.nick_name as company_user_name,
+        cp.user_id as company_user_id,
+        sdt.status,
+        sdt.order_code,
+        sdt.create_time,
+        sdt.update_time,
+        sdt.remark,
+        sdt.type,
+        fd.doctor_name,
+        sdt.qw_external_contact_id,
+        sdt.handle_type,
+        sdt.send_days,
+        sdt.version,
+        sdt.handle_person_type,
+        sdt.task_type
         FROM
         fs_sop_doctor_task sdt
         LEFT JOIN company_user cp ON sdt.company_user_id = cp.user_id
@@ -83,6 +142,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         LEFT JOIN fs_user fu ON qwec.fs_user_id = fu.user_id
         LEFT JOIN fs_doctor fd ON sdt.doctor_id = fd.doctor_id
         <where>
+            sdt.handle_type IN (1,2,3)
             <if test="id != null "> and sdt.id = #{id}</if>
             <if test="doctorId != null "> and sdt.doctor_id = #{doctorId}</if>
             <if test="userId != null "> and sdt.user_id = #{userId}</if>
@@ -95,6 +155,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="type != null "> and sdt.type = #{type}</if>
             <if test="version != null "> and sdt.version = #{version}</if>
             <if test="handlePersonType != null "> and sdt.handle_person_type = #{handlePersonType}</if>
+            <if test="taskType != null "> and sdt.task_type = #{taskType}</if>
             <if test="qwUserId != null "> and qwec.qw_user_id = #{qwUserId}</if>
             <if test="name != null "> and qwec.name like concat('%', #{name}, '%')</if>
             <if test="companyUserName != null and companyUserName !='' "> and cp.nick_name like concat('%', #{companyUserName}, '%')</if>
@@ -108,7 +169,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </where>
         ORDER BY sdt.id DESC
     </select>
-    
+
     <select id="selectFsSopDoctorTaskVoById" parameterType="Long" resultMap="SopDoctorTaskVoResult">
         SELECT
             sdt.id,
@@ -129,7 +190,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             sdt.doctor_member_sales_id,
             sdt.send_days,
             sdt.version,
-            sdt.handle_person_type
+            sdt.handle_person_type,
+            sdt.task_type
         FROM
             fs_sop_doctor_task sdt
                 LEFT JOIN company_user cp ON sdt.company_user_id = cp.user_id
@@ -137,7 +199,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 LEFT JOIN fs_user fu ON qwec.fs_user_id = fu.user_id
         where sdt.id = #{id}
     </select>
-        
+
     <insert id="insertFsSopDoctorTask" parameterType="FsSopDoctorTask" useGeneratedKeys="true" keyProperty="id">
         insert into fs_sop_doctor_task
         <trim prefix="(" suffix=")" suffixOverrides=",">
@@ -157,7 +219,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="sendDays != null">send_days,</if>
             <if test="handlePersonType != null">handle_person_type,</if>
             <if test="version != null">version,</if>
-         </trim>
+            <if test="taskType != null">task_type,</if>
+        </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="companyUserId != null">#{companyUserId},</if>
             <if test="doctorId != null">#{doctorId},</if>
@@ -175,7 +238,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="sendDays != null">#{sendDays},</if>
             <if test="handlePersonType != null">#{handlePersonType},</if>
             <if test="version != null">#{version},</if>
-         </trim>
+            <if test="taskType != null">#{taskType},</if>
+        </trim>
     </insert>
 
     <update id="updateFsSopDoctorTask" parameterType="FsSopDoctorTask">
@@ -195,6 +259,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="qwExternalContactId != null">qw_external_contact_id=#{qwExternalContactId},</if>
             <if test="sendDays != null">send_days=#{sendDays},</if>
             <if test="handlePersonType != null">handle_person_type=#{handlePersonType},</if>
+            <if test="taskType != null">task_type = #{taskType},</if>
             version = version + 1,
         </trim>
         where id = #{id} AND version = #{version}
@@ -205,7 +270,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </delete>
 
     <delete id="deleteFsSopDoctorTaskByIds" parameterType="String">
-        delete from fs_sop_doctor_task where id in 
+        delete from fs_sop_doctor_task where id in
         <foreach item="id" collection="array" open="(" separator="," close=")">
             #{id}
         </foreach>
@@ -213,11 +278,56 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <select id="selectFsSopDoctorTaskList" parameterType="FsSopDoctorTask" resultType="FsSopDoctorTask">
         SELECT * FROM fs_sop_doctor_task
-        WHERE doctor_member_sales_id = #{doctorMemberSalesId} 
-        <if test="status != null "> and status = #{status} </if>
+          <where>
+              <if test="doctorId != null">
+                  AND doctor_id = #{doctorId}
+              </if>
+              <if test="companyUserId != null">
+                  AND company_user_id = #{companyUserId}
+              </if>
+              <if test="doctorMemberSalesId != null">
+                  AND doctor_member_sales_id = #{doctorMemberSalesId}
+              </if>
+              <if test="handlePersonType != null">
+                  AND handle_person_type = #{handlePersonType}
+              </if>
+              <if test="status != null">
+                  AND status = #{status}
+              </if>
+              <if test="taskType != null">
+                  AND task_type = #{taskType}
+              </if>
+          </where>
+
         ORDER BY id DESC
     </select>
     <select id="selectFsSopDoctorTaskById" resultType="com.fs.his.domain.FsSopDoctorTask">
         SELECT * FROM fs_sop_doctor_task WHERE id = #{id}
     </select>
+
+    <!-- 获取医生待处理的任务总数 -->
+    <select id="selectUnprocessedDoctorTaskCount" parameterType="Long" resultType="Long">
+        SELECT COUNT(*)
+        FROM fs_sop_doctor_task
+        WHERE doctor_member_sales_id = #{memberSalesId}
+          AND status = 0
+          AND handle_person_type = 1
+          AND (
+            task_type = 1
+                OR (task_type = 3 AND handle_person_type = 1)
+            )
+    </select>
+
+    <!-- 获取销售待处理的任务总数 -->
+    <select id="selectUnprocessedSalesTaskCount" parameterType="Long" resultType="Long">
+        SELECT COUNT(*)
+        FROM fs_sop_doctor_task
+        WHERE doctor_member_sales_id = #{memberSalesId}
+          AND status = 0
+          AND handle_person_type = 2
+          AND (
+            task_type = 1
+                OR (task_type = 3 AND handle_person_type = 2)
+            )
+    </select>
 </mapper>

+ 6 - 4
fs-service/src/main/resources/mapper/qw/FsDoctorMemberSalesMapper.xml

@@ -107,7 +107,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         SELECT
         fd.doctor_id AS doctorId,
         fd.doctor_name AS doctorName,
-        -- 使用子查询分别统计任务数
         COALESCE(task_stats.pendingTaskNum, 0) AS pendingTaskNum,
         COALESCE(task_stats.completedTaskNum, 0) AS completedTaskNum,
         COALESCE(task_stats.totalTaskNum, 0) AS totalTaskNum
@@ -119,22 +118,25 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         COUNT(CASE WHEN status = 1 THEN 1 END) AS completedTaskNum,
         COUNT(*) AS totalTaskNum
         FROM fs_sop_doctor_task
+        <where>
+            <if test="handlePersonType != null and handlePersonType != ''">
+                AND handle_person_type = #{handlePersonType}
+            </if>
+        </where>
         GROUP BY doctor_id
         ) task_stats ON fd.doctor_id = task_stats.doctor_id
         WHERE 1=1
-        <if test="doctorName != null and doctorName != '' ">
+        <if test="doctorName != null and doctorName != ''">
             AND fd.doctor_name LIKE CONCAT('%', #{doctorName}, '%')
         </if>
         ORDER BY
         <choose>
             <when test="sortField != null and sortField != ''">
                 <choose>
-                    <!-- 根据 sortField 的值选择排序字段 -->
                     <when test="sortField == 'doctorName'">fd.doctor_name</when>
                     <when test="sortField == 'pendingTaskNum'">pendingTaskNum</when>
                     <when test="sortField == 'completedTaskNum'">completedTaskNum</when>
                     <when test="sortField == 'doctorId'">fd.doctor_id</when>
-                    <!-- 默认按 doctor_id 排序 -->
                     <otherwise>fd.doctor_id</otherwise>
                 </choose>
                 <choose>

+ 111 - 14
fs-service/src/main/resources/mapper/qw/FsSopCompanyUserTaskMapper.xml

@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper
-PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.fs.qw.mapper.FsSopCompanyUserTaskMapper">
-    
+
     <resultMap type="FsSopCompanyUserTask" id="FsSopCompanyUserTaskResult">
         <result property="id"    column="id"    />
         <result property="packageId"    column="package_id"    />
@@ -17,6 +17,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="remark"    column="remark"    />
         <result property="type"    column="type"    />
         <result property="qwExternalContactId"    column="qw_external_contact_id"    />
+        <!-- 新增字段 -->
+        <result property="sopId"    column="sop_id"    />
+        <result property="doctorMemberSalesId"    column="doctor_member_sales_id"    />
+        <result property="handleType"    column="handle_type"    />
+        <result property="sendDays"    column="send_days"    />
+        <result property="handlePersonType"    column="handle_person_type"    />
+        <result property="version"    column="version"    />
     </resultMap>
 
     <resultMap type="com.fs.qw.vo.SopCompanyUserTaskVo" id="SopCompanyUserTaskVoResult">
@@ -34,6 +41,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="updateTime"   column="update_time" />
         <result property="type"    column="type"    />
         <result property="qwExternalContactId"    column="qw_external_contact_id"    />
+        <!-- 新增字段 -->
+        <result property="sopId"    column="sop_id"    />
+        <result property="doctorMemberSalesId"    column="doctor_member_sales_id"    />
+        <result property="handleType"    column="handle_type"    />
+        <result property="sendDays"    column="send_days"    />
+        <result property="handlePersonType"    column="handle_person_type"    />
+        <result property="version"    column="version"    />
 
         <!-- 关联表字段 -->
         <result property="name"     column="name" />          <!-- qwec.name -->
@@ -45,7 +59,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 
     <sql id="selectFsSopCompanyUserTaskVo">
-        select id, package_id,order_code,company_user_id, doctor_id, user_id, status, create_time, update_time, remark,type,qw_external_contact_id from fs_sop_company_user_task
+        select id, package_id, order_code, company_user_id, doctor_id, user_id, status, create_time, update_time, remark, type, qw_external_contact_id, sop_id, doctor_member_sales_id, handle_type, send_days, handle_person_type, version from fs_sop_company_user_task
     </sql>
 
     <select id="selectFsSopCompanyUserTaskVoList" parameterType="com.fs.qw.dto.SopCompanyUserTaskDto" resultMap="SopCompanyUserTaskVoResult">
@@ -66,7 +80,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         sct.remark,
         sct.type,
         cu.nick_name,
-        sct.qw_external_contact_id
+        sct.qw_external_contact_id,
+        sct.sop_id,
+        sct.doctor_member_sales_id,
+        sct.handle_type,
+        sct.send_days,
+        sct.handle_person_type,
+        sct.version
         FROM
         fs_sop_company_user_task sct
         LEFT JOIN fs_doctor fd ON sct.doctor_id = fd.doctor_id
@@ -82,6 +102,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="type != null "> and sct.type = #{type}</if>
             <if test="companyUserId != null "> and sct.company_user_id = #{companyUserId}</if>
             <if test="status != null "> and sct.status = #{status}</if>
+            <!-- 新增字段查询条件 -->
+            <if test="handleType != null "> and sct.handle_type = #{handleType}</if>
+            <if test="doctorMemberSalesId != null "> and sct.doctor_member_sales_id = #{doctorMemberSalesId}</if>
+            <if test="handlePersonType != null "> and sct.handle_person_type = #{handlePersonType}</if>
+            <if test="sopId != null and sopId != ''"> and sct.sop_id = #{sopId}</if>
+            <if test="version != null "> and sct.version = #{version}</if>
+
             <if test="qwUserId != null "> and qwec.qw_user_id = #{qwUserId}</if>
             <if test="name != null and name !='' "> and qwec.name like concat('%', #{name}, '%')</if>
             <if test="doctorName != null and  doctorName != ''"> and fd.doctor_name like concat('%', #{doctorName}, '%')</if>
@@ -95,7 +122,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </where>
         ORDER BY sct.id DESC
     </select>
-    
+
     <select id="selectFsSopCompanyUserTaskVoById" parameterType="Long" resultMap="SopCompanyUserTaskVoResult">
         SELECT
             sct.id,
@@ -113,7 +140,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             sct.update_time,
             sct.remark,
             sct.type,
-            sct.qw_external_contact_id
+            sct.qw_external_contact_id,
+            sct.sop_id,
+            sct.doctor_member_sales_id,
+            sct.handle_type,
+            sct.send_days,
+            sct.handle_person_type,
+            sct.version
         FROM
             fs_sop_company_user_task sct
                 LEFT JOIN fs_doctor fd ON sct.doctor_id = fd.doctor_id
@@ -158,11 +191,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <!-- 最近7天每日任务量(含今天) -->
     <select id="getTaskCountLast7Days" resultType="map">
         SELECT
-        DATE_FORMAT(create_time, '%m-%d') AS date,
-        COUNT(*) AS total
+            DATE_FORMAT(create_time, '%m-%d') AS date,
+            COUNT(*) AS total
         FROM fs_sop_company_user_task
         WHERE create_time &gt;= DATE_SUB(CURDATE(), INTERVAL 6 DAY)
-        AND create_time &lt; CURDATE() + INTERVAL 1 DAY
+          AND create_time &lt; CURDATE() + INTERVAL 1 DAY
         GROUP BY DATE(create_time)
         ORDER BY DATE(create_time) ASC
     </select>
@@ -181,7 +214,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="remark != null">remark,</if>
             <if test="type != null">type,</if>
             <if test="qwExternalContactId != null">qw_external_contact_id,</if>
-         </trim>
+            <if test="sopId != null">sop_id,</if>
+            <if test="doctorMemberSalesId != null">doctor_member_sales_id,</if>
+            <if test="handleType != null">handle_type,</if>
+            <if test="sendDays != null">send_days,</if>
+            <if test="handlePersonType != null">handle_person_type,</if>
+            <if test="version != null">version,</if>
+        </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="packageId != null">#{packageId},</if>
             <if test="orderCode != null">#{orderCode},</if>
@@ -194,7 +233,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="remark != null">#{remark},</if>
             <if test="type != null">#{type},</if>
             <if test="qwExternalContactId != null">#{qwExternalContactId},</if>
-         </trim>
+            <if test="sopId != null">#{sopId},</if>
+            <if test="doctorMemberSalesId != null">#{doctorMemberSalesId},</if>
+            <if test="handleType != null">#{handleType},</if>
+            <if test="sendDays != null">#{sendDays},</if>
+            <if test="handlePersonType != null">#{handlePersonType},</if>
+            <if test="version != null">#{version},</if>
+        </trim>
     </insert>
 
     <update id="updateFsSopCompanyUserTask" parameterType="FsSopCompanyUserTask">
@@ -211,8 +256,60 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="remark != null">remark = #{remark},</if>
             <if test="type != null">type = #{type},</if>
             <if test="qwExternalContactId != null">qw_external_contact_id=#{qwExternalContactId},</if>
+            <!-- 新增字段更新 -->
+            <if test="sopId != null">sop_id = #{sopId},</if>
+            <if test="doctorMemberSalesId != null">doctor_member_sales_id = #{doctorMemberSalesId},</if>
+            <if test="handleType != null">handle_type = #{handleType},</if>
+            <if test="sendDays != null">send_days = #{sendDays},</if>
+            <if test="handlePersonType != null">handle_person_type = #{handlePersonType},</if>
+            <!-- 乐观锁版本号更新 -->
+            version = version + 1,
         </trim>
-        where id = #{id}
+        <!-- 添加乐观锁条件 -->
+        where id = #{id} AND version = #{version}
+    </update>
+
+    <!-- 基础查询方法 -->
+    <select id="selectFsSopCompanyUserTaskList" parameterType="FsSopCompanyUserTask" resultType="FsSopCompanyUserTask">
+        SELECT * FROM fs_sop_company_user_task
+        WHERE 1=1
+        <if test="doctorMemberSalesId != null"> and doctor_member_sales_id = #{doctorMemberSalesId} </if>
+        <if test="status != null "> and status = #{status} </if>
+        <if test="companyUserId != null "> and company_user_id = #{companyUserId} </if>
+        ORDER BY id DESC
+    </select>
+
+    <select id="selectFsSopCompanyUserTaskById" parameterType="Long" resultType="com.fs.qw.domain.FsSopCompanyUserTask">
+        SELECT * FROM fs_sop_company_user_task WHERE id = #{id}
+    </select>
+
+    <!-- 根据医生会员搭销ID查询 -->
+    <select id="selectByDoctorMemberSalesId" parameterType="Long" resultMap="FsSopCompanyUserTaskResult">
+        <include refid="selectFsSopCompanyUserTaskVo"/>
+        WHERE doctor_member_sales_id = #{doctorMemberSalesId}
+        ORDER BY id DESC
+    </select>
+
+    <!-- 更新状态(带乐观锁) -->
+    <update id="updateStatusWithLock" parameterType="map">
+        update fs_sop_company_user_task
+        set status = #{status},
+            update_time = now(),
+            version = version + 1
+        where id = #{id} AND version = #{version}
+    </update>
+
+    <!-- 批量更新处理状态 -->
+    <update id="batchUpdateStatus" parameterType="map">
+        update fs_sop_company_user_task
+        set status = #{status},
+        update_time = now(),
+        version = version + 1
+        where id in
+        <foreach item="id" collection="ids" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+        AND status = 0 <!-- 只更新待处理状态的任务 -->
     </update>
 
     <delete id="deleteFsSopCompanyUserTaskById" parameterType="Long">
@@ -220,7 +317,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </delete>
 
     <delete id="deleteFsSopCompanyUserTaskByIds" parameterType="String">
-        delete from fs_sop_company_user_task where id in 
+        delete from fs_sop_company_user_task where id in
         <foreach item="id" collection="array" open="(" separator="," close=")">
             #{id}
         </foreach>

+ 7 - 2
fs-service/src/main/resources/mapper/sop/SopOrderLogMapper.xml

@@ -18,10 +18,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="doctorMemberSalesId"    column="doctor_member_sales_id"    />
         <result property="remark"    column="remark"    />
         <result property="orderCode"    column="order_code"    />
+        <result property="handlePersonType"    column="handle_person_type"    />
     </resultMap>
 
     <sql id="selectSopOrderLogVo">
-        select id, sop_id, fs_user_id, is_buy, order_send_type, crate_time, update_time, send_time,status,doctor_id,doctor_member_sales_id,remark,order_code from sop_order_log
+        select id, sop_id, fs_user_id, is_buy, order_send_type, crate_time, update_time, send_time,status,doctor_id,doctor_member_sales_id,remark,order_code,handle_person_type from sop_order_log
     </sql>
 
     <select id="selectSopOrderLogList" parameterType="SopOrderLog" resultMap="SopOrderLogResult">
@@ -37,6 +38,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="doctorId != null "> and doctor_id = #{doctorId}</if>
             <if test="doctorMemberSalesId != null "> and doctor_member_sales_id = #{doctorMemberSalesId}</if>
             <if test="orderCode != null "> and order_code = #{orderCode}</if>
+            <if test="handlePersonType != null "> and handle_person_type = #{handlePersonType}</if>
         </where>
     </select>
     
@@ -45,7 +47,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where id = #{id}
     </select>
     <select id="queryUnsentSOPData" resultType="com.fs.sop.domain.SopOrderLog">
-        SELECT sol.id,sol.sop_id,sol.is_buy,sol.order_send_type,sol.status,sol.ex_id,sol.company_user_id,sol.doctor_id,sol.fs_user_id,sol.doctor_member_sales_id,sol.remark,sol.order_code FROM sop_order_log sol WHERE sol.send_time &lt;=NOW() and sol.status=0
+        SELECT sol.id,sol.sop_id,sol.is_buy,sol.order_send_type,sol.status,sol.ex_id,sol.company_user_id,sol.doctor_id,sol.fs_user_id,sol.doctor_member_sales_id,sol.remark,sol.order_code,sol.handle_person_type FROM sop_order_log sol WHERE sol.send_time &lt;=NOW() and sol.status=0
     </select>
 
     <insert id="insertSopOrderLog" parameterType="SopOrderLog" useGeneratedKeys="true" keyProperty="id">
@@ -65,6 +67,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="doctorMemberSalesId != null">doctor_member_sales_id,</if>
             <if test="remark != null">remark,</if>
             <if test="orderCode != null">order_code,</if>
+            <if test="handlePersonType != null">handle_person_type,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="sopId != null">#{sopId},</if>
@@ -81,6 +84,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="doctorMemberSalesId != null">#{doctorMemberSalesId},</if>
             <if test="remark != null">#{remark},</if>
             <if test="orderCode != null">#{orderCode},</if>
+            <if test="handlePersonType != null">#{handlePersonType},</if>
          </trim>
     </insert>
 
@@ -99,6 +103,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="doctorMemberSalesId != null">doctor_member_sales_id = #{doctorMemberSalesId},</if>
             <if test="remark != null">remark = #{remark},</if>
             <if test="orderCode != null">order_code = #{orderCode},</if>
+            <if test="handlePersonType != null">handle_person_type = #{handlePersonType},</if>
         </trim>
         where id = #{id}
     </update>