wlzboy
2 天以前 8cb5d3440208a3be3e772e65f1bd0ec63031ba62
feat: 增加服务单派发通知
5个文件已添加
19个文件已修改
602 ■■■■■ 已修改文件
ruoyi-admin/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/BigDecimalUtil.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/DeptUtil.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/LongUtil.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/NotifyTask.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/event/TaskOnlyServerOrderSyncEvent.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/event/TaskServiceOrderSyncEvent.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/listener/TaskMessageListener.java 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/LegacyTransferSyncMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ILegacyTransferSyncService.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysEmergencyTaskService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTaskService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LegacySystemSyncServiceImpl.java 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LegacyTransferSyncServiceImpl.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysEmergencyTaskServiceImpl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/views/system/notify/channelConfig.vue 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/views/system/notify/log/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/sys_notify_send_log.sql 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/update_sys_notify_send_log.sql 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application.yml
@@ -58,7 +58,7 @@
    basename: i18n/messages
  profiles:
    # 环境 dev|test|prod
    active: prod
    active: dev
  # 文件上传
  servlet:
    multipart:
ruoyi-common/src/main/java/com/ruoyi/common/utils/BigDecimalUtil.java
New file
@@ -0,0 +1,9 @@
package com.ruoyi.common.utils;
import java.math.BigDecimal;
public class BigDecimalUtil {
    public static Boolean isZero(BigDecimal bigDecimal) {
        return bigDecimal.compareTo(BigDecimal.ZERO) == 0;
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/utils/DeptUtil.java
New file
@@ -0,0 +1,13 @@
package com.ruoyi.common.utils;
public class DeptUtil {
    /**
     * 总公司部门ID
     */
    public static Long ROOT_DEPT_ID=100L;
    /**
     * 广州总部部门ID
     */
    public static Long GUANGZHOU_DEPT_ID=101L;
}
ruoyi-common/src/main/java/com/ruoyi/common/utils/LongUtil.java
New file
@@ -0,0 +1,17 @@
package com.ruoyi.common.utils;
/**
 * Long工具类
 */
public class LongUtil {
    public static Boolean isEmpty(Long value) {
        if(value==null || value<=0)return true;
        return false;
    }
    public static Boolean isNotEmpty(Long value) {
        return !isEmpty(value);
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/domain/NotifyTask.java
@@ -19,6 +19,10 @@
    // ==================== 通知类型常量 ====================
    /** 通知类型:任务分配 */
    public static final String NOTIFY_TYPE_TASK_ASSIGN = "TASK_ASSIGN";
    /**
     * 通知类型:服务单通知,没有生成调度的服务单,咨询单
     */
    public static final String NOTIFY_TASK_UNASSIGN = "TASK_UNASSIGN";
    /** 通知类型:状态变更 */
    public static final String NOTIFY_TYPE_STATUS_CHANGE = "STATUS_CHANGE";
    /** 通知类型:任务创建 */
ruoyi-system/src/main/java/com/ruoyi/system/event/TaskOnlyServerOrderSyncEvent.java
New file
@@ -0,0 +1,12 @@
package com.ruoyi.system.event;
/**
 * 广州总部之外的服务单事件派发 旧系统同步到新系统过来的服务单,咨询单
 */
public class TaskOnlyServerOrderSyncEvent  extends TaskEvent{
    public TaskOnlyServerOrderSyncEvent(Object source, Long taskId, String taskCode) {
        super(source, taskId, taskCode);
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/event/TaskServiceOrderSyncEvent.java
@@ -9,6 +9,14 @@
    public Long getServiceOrderId(){
        return this.serviceOrderId;
    }
    /**
     * 服务单同步到旧系统成功后触发事件
     * @param source
     * @param taskId
     * @param taskCode
     * @param serviceOrderId
     */
    public TaskServiceOrderSyncEvent(Object source, Long taskId, String taskCode,Long serviceOrderId) {
        super(source, taskId, taskCode);
        this.serviceOrderId=serviceOrderId;
ruoyi-system/src/main/java/com/ruoyi/system/listener/TaskMessageListener.java
@@ -1,7 +1,10 @@
package com.ruoyi.system.listener;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.utils.DeptUtil;
import com.ruoyi.system.domain.*;
import com.ruoyi.system.event.TaskDispatchSyncEvent;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysTaskAssigneeService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -78,7 +81,8 @@
               List<SysTaskAssignee> assignees=taskAssigneeService.getAssigneesByTaskId(emergency.getTaskId());
               if(assignees!=null && !assignees.isEmpty()){
                   List<Long> assigneeIds=assignees.stream().map(SysTaskAssignee::getUserId).collect(Collectors.toList());
                   sendDispatchNotify(assigneeIds, task.getCreatorId(), event.getTaskId(), task.getTaskCode(), buildNotifyContent(task, emergency));
                   task.setEmergencyInfo( emergency);
                   sendDispatchNotify(assigneeIds, task.getCreatorId(), event.getTaskId(),task.getShowTaskCode(), buildNotifyContent(task, emergency));
               }
            }
@@ -129,6 +133,93 @@
    }
    @Autowired
    private ISysDeptService sysDeptService;
    /**
     * 只有服务单,且只在广州外的服务单,没有调度单
     * @param event
     */
    @Async
    @EventListener
    public void handleTaskOnlyServiceSync(TaskDispatchSyncEvent event){
        //给负责人发送消息
       Long taskId= event.getTaskId();
       SysTask task=sysTaskMapper.selectSysTaskByTaskId(taskId);
       SysTaskEmergency emergency = sysTaskEmergencyMapper.selectSysTaskEmergencyByTaskId(taskId);
       if(emergency != null){
           task.setEmergencyInfo( emergency);
           Long deptId=task.getDeptId();
           if(!deptId.equals(DeptUtil.GUANGZHOU_DEPT_ID)){
               //找到该部门的负责人
               SysDept dept= sysDeptService.selectDeptById(deptId);
               if(dept!=null){
                  String serviceOrdClass= dept.getServiceOrderClass();
                  String dispatchOrdClass= dept.getDispatchOrderClass();
                  List<SysUser> user=sysUserMapper.selectUsersByOrderClassAndCanViewAllConsult(serviceOrdClass);
                  if(user!=null && !user.isEmpty()){
                      List<NotifyTask> tasks=new ArrayList<>();
                      String buildNotifyContent = buildUnAssignNotifyContent(task, emergency);
                      for(SysUser u:user){
                       NotifyTask notifyTask= this.sendTaskUnAssignNotify(u.getUserId(),u.getNickName(),u.getPhonenumber(),taskId,task.getShowTaskCode(),"服务单派发",buildNotifyContent);
                       tasks.add(notifyTask);
                      }
                      if(!tasks.isEmpty()){
                          int successCount = notifyDispatchService.dispatchNotifies(tasks);
                          log.info("任务未分配消息已发送,发送成功数量:{}", successCount);
                      }
                  }
               }
           }
       }
    }
    private  String buildUnAssignNotifyContent(SysTask task, SysTaskEmergency emergency){
        //派发单号
        String dispatchCode=emergency.getDispatchCode();
        String taskCode=task.getTaskCode();
        String orderCode=dispatchCode;
        if(dispatchCode==null){
            orderCode=taskCode;
        }
        Date dispatchTime=task.getPlanedStartTime();
        StringBuilder content = new StringBuilder();
        content.append("您有新的服务单,任务单号:"+orderCode);
        // 添加出发地信息
        String departure = null;
        if (emergency != null && StringUtils.isNotEmpty(emergency.getHospitalOutName())) {
            departure = emergency.getHospitalOutName();
        } else if (StringUtils.isNotEmpty(task.getDepartureAddress())) {
            departure = task.getDepartureAddress();
        }
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        content.append(",出发时间:").append(df.format(dispatchTime));
        // 添加目的地信息
        String destination = null;
        if (emergency != null && StringUtils.isNotEmpty(emergency.getHospitalInName())) {
            destination = emergency.getHospitalInName();
        } else if (StringUtils.isNotEmpty(task.getDestinationAddress())) {
            destination = task.getDestinationAddress();
        }
        if (departure != null || destination != null) {
            if (departure != null) {
                content.append("出发地:").append(departure);
            }
            if (destination != null) {
                if (content.length() > 0) content.append(",");
                content.append("目的地:").append(destination);
            }
            content.append(",请及时处理。");
        }
        return content.toString();
    }
    /**
     * 监听任务分配事件
@@ -161,7 +252,7 @@
            Long creatorId = task.getCreatorId();
            String taskStatus = task.getTaskStatus();
            task.setEmergencyInfo(emergency);
            // 仅在待准备状态下发送通知
            if (!TASK_STATUS_PENDING.equals(taskStatus) && !TASK_STATUS_PREPARING.equals(taskStatus)) {
                log.info("任务状态({})非待准备状态,跳过通知,taskId={}", taskStatus, event.getTaskId());
@@ -170,7 +261,7 @@
            // 构建通知内容
            String notifyContent = buildNotifyContent(task, emergency);
            this.sendDispatchNotify(event.getAssigneeIds(), creatorId, event.getTaskId(), event.getTaskCode(), notifyContent);
            this.sendDispatchNotify(event.getAssigneeIds(), creatorId, event.getTaskId(),task.getShowTaskCode(), notifyContent);
            
        } catch (Exception e) {
@@ -237,6 +328,23 @@
                    taskId, createdTasks.size(), successCount);
        }
    }
    private NotifyTask  sendTaskUnAssignNotify(Long userId,String nickName,String phone,
                            Long taskId,String taskCode,String title,String notifyContent) {
        NotifyTask notifyTask = new NotifyTask();
        notifyTask.setTaskId(taskId);
        notifyTask.setTaskCode(taskCode);
        notifyTask.setNotifyType(NotifyTask.NOTIFY_TASK_UNASSIGN);
        notifyTask.setUserId(userId);
        notifyTask.setUserName(nickName);
        notifyTask.setUserPhone(phone);
        notifyTask.setTitle(title);
        notifyTask.setContent(notifyContent);
        notifyTask.setCreateBy( "系统");
        NotifyTask created = notifyTaskService.createNotifyTask(notifyTask);
        return created;
    }
    /**
     * 构建通知内容
     */
ruoyi-system/src/main/java/com/ruoyi/system/mapper/LegacyTransferSyncMapper.java
@@ -53,7 +53,7 @@
     * @param serviceOrdID 服务单ID
     * @return 病情ID列表
     */
    List<String> selectDiseaseIdsByServiceOrdID(@Param("serviceOrdID") String serviceOrdID);
    List<String> selectDiseaseIdsByServiceOrdID(@Param("serviceOrdID") Long serviceOrdID);
    
    /**
     * 根据调度单ID查询执行人信息
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
@@ -167,4 +167,12 @@
     * @return 用户列表
     */
    public List<SysUser> selectUsersByBranchDeptIds(@Param("branchDeptIds") List<Long> branchDeptIds);
    /**
     * 根据serviceOrderClass或dispatchOrderClass查询具有canViewAllConsult权限的用户
     *
     * @param orderClass serviceOrderClass或dispatchOrderClass
     * @return 用户列表
     */
    public List<SysUser> selectUsersByOrderClassAndCanViewAllConsult(@Param("orderClass") String orderClass);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/ILegacyTransferSyncService.java
@@ -30,7 +30,7 @@
     * @param dispatchOrdID 调度单ID
     * @return 是否同步成功
     */
    boolean syncSingleTransferOrder(String serviceOrdID, String dispatchOrdID);
    boolean syncSingleTransferOrder(Long serviceOrdID, Long dispatchOrdID);
    
    /**
     * 检查转运单是否已同步
@@ -39,7 +39,7 @@
     * @param dispatchOrdID 调度单ID
     * @return 是否已同步
     */
    boolean isTransferOrderSynced(String serviceOrdID, String dispatchOrdID);
    boolean isTransferOrderSynced(Long serviceOrdID, Long dispatchOrdID);
    
    /**
     * 构造TaskCreateVO对象用于创建任务
@@ -49,5 +49,5 @@
     * @param order 转运单详细信息
     * @return TaskCreateVO对象
     */
    TaskCreateVO buildCreateTaskVo(String serviceOrdID, String dispatchOrdID, Map<String, Object> order);
    TaskCreateVO buildCreateTaskVo(Long serviceOrdID, Long dispatchOrdID, Map<String, Object> order);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysEmergencyTaskService.java
@@ -8,7 +8,7 @@
public interface ISysEmergencyTaskService {
    void saveEmergencyInfo(Long taskId, String createUserName, TaskCreateVO createVO,
                           String serviceOrderId, String dispatchOrderId, String serviceOrdNo);
                           Long serviceOrderId, Long dispatchOrderId, String serviceOrdNo);
    void updateEmergencyInfoFromUpdateVO(SysTaskEmergency oldEmergency, TaskUpdateVO updateVO, String userName);
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTaskService.java
@@ -63,7 +63,7 @@
     * @param updateTime 更新时间
     * @return 结果
     */
    public int insertTask(TaskCreateVO createVO,String serviceOrderId,String dispatchOrderId, String serviceOrdNo, Long userId,String userName, Long deptId, Date createTime, Date updateTime);
    public int insertTask(TaskCreateVO createVO,Long serviceOrderId,Long dispatchOrderId, String serviceOrdNo, Long userId,String userName, Long deptId, Date createTime, Date updateTime);
    /**
     * 修改任务管理
@@ -86,7 +86,7 @@
     * @param updateTime
     * @return
     */
    public int updateTask(TaskUpdateVO updateVO, String serviceOrderId, String dispatchOrderId, String serviceOrdNo, Long userId, String userName, Long deptId, Date createTime, Date updateTime);
    public int updateTask(TaskUpdateVO updateVO, Long serviceOrderId, Long dispatchOrderId, String serviceOrdNo, Long userId, String userName, Long deptId, Date createTime, Date updateTime);
    /**
     * 批量删除任务管理
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
@@ -104,7 +104,7 @@
     * @param user 用户信息
     * @return 结果
     */
    public boolean checkUserNameUnique(SysUser user);
    public Boolean checkUserNameUnique(SysUser user);
    /**
     * 校验手机号码是否唯一
@@ -112,7 +112,7 @@
     * @param user 用户信息
     * @return 结果
     */
    public boolean checkPhoneUnique(SysUser user);
    public Boolean checkPhoneUnique(SysUser user);
    /**
     * 校验email是否唯一
@@ -120,7 +120,7 @@
     * @param user 用户信息
     * @return 结果
     */
    public boolean checkEmailUnique(SysUser user);
    public Boolean checkEmailUnique(SysUser user);
    /**
     * 校验用户是否允许操作
@@ -243,4 +243,12 @@
     * @return 用户列表
     */
    public List<SysUser> selectUsersByBranchDeptIds(List<Long> branchDeptIds);
    /**
     * 根据serviceOrderClass或dispatchOrderClass查询具有canViewAllConsult权限的用户
     *
     * @param orderClass serviceOrderClass或dispatchOrderClass
     * @return 用户列表
     */
    public List<SysUser> selectUsersByOrderClassAndCanViewAllConsult(String orderClass);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LegacySystemSyncServiceImpl.java
@@ -149,7 +149,7 @@
            
            // 如果已经同步过,不再重复同步
            if (emergency.getLegacyServiceOrdId() != null && emergency.getLegacyServiceOrdId() > 0) {
                log.info("任务已同步过,任务ID: {}, ServiceOrdID: {}", taskId, emergency.getLegacyServiceOrdId());
//                log.info("任务已同步过,任务ID: {}, ServiceOrdID: {}", taskId, emergency.getLegacyServiceOrdId());
                return emergency.getLegacyServiceOrdId();
            }
            
@@ -192,7 +192,7 @@
                sysTaskMapper.updateSysTask(task);
                eventPublisher.publishEvent(new TaskServiceOrderSyncEvent(this, taskId, task.getTaskCode(), serviceOrdId));
                log.info("任务同步成功,任务ID: {}, ServiceOrdID: {}", taskId, serviceOrdId);
//                log.info("任务同步成功,任务ID: {}, ServiceOrdID: {}", taskId, serviceOrdId);
                return serviceOrdId;
            } else {
                // 同步失败
@@ -228,7 +228,7 @@
    //在这里监听派发的事件
    @EventListener
    public void handleTaskServiceOrderSyncEvent(TaskServiceOrderSyncEvent event) {
        log.info("收到任务服务单同步事件,任务ID:{},任务编号:{},服务单ID:{}", event.getTaskId(), event.getTaskCode(), event.getServiceOrderId());
//        log.info("收到任务服务单同步事件,任务ID:{},任务编号:{},服务单ID:{}", event.getTaskId(), event.getTaskCode(), event.getServiceOrderId());
        syncDispatchOrderToLegacy(event.getTaskId());
    }
    /**
@@ -256,7 +256,7 @@
                    break; // 没有更多数据,退出循环
                }
                
                log.info("开始同步第 {} 页,任务数量: {}", (offset / pageSize) + 1, pendingTasks.size());
//                log.info("开始同步第 {} 页,任务数量: {}", (offset / pageSize) + 1, pendingTasks.size());
                
                int pageSuccessCount = 0;
                for (SysTaskEmergency emergency : pendingTasks) {
@@ -276,19 +276,19 @@
                }
                
                totalSuccessCount += pageSuccessCount;
                log.info("第 {} 页同步完成,总数: {}, 成功: {}",
                    (offset / pageSize) + 1, pendingTasks.size(), pageSuccessCount);
//                log.info("第 {} 页同步完成,总数: {}, 成功: {}",
//                    (offset / pageSize) + 1, pendingTasks.size(), pageSuccessCount);
                
                // 如果本页数据少于每页大小,说明已经是最后一页
                if (pendingTasks.size() < pageSize) {
                    log.info("已到达最后一页,同步结束");
//                    log.info("已到达最后一页,同步结束");
                    break;
                }
                
                offset += pageSize; // 下一页
            }
            
            log.info("批量同步完成,总成功数: {}", totalSuccessCount);
//            log.info("批量同步完成,总成功数: {}", totalSuccessCount);
            return totalSuccessCount;
            
        } catch (Exception e) {
@@ -375,7 +375,7 @@
            
            // 如果已经同步过,不再重复同步
            if (emergency.getLegacyDispatchOrdId() != null && emergency.getLegacyDispatchOrdId() > 0) {
                log.info("调度单已同步过,任务ID: {}, DispatchOrdID: {}", taskId, emergency.getLegacyDispatchOrdId());
//                log.info("调度单已同步过,任务ID: {}, DispatchOrdID: {}", taskId, emergency.getLegacyDispatchOrdId());
                return emergency.getLegacyDispatchOrdId();
            }
@@ -487,7 +487,7 @@
                eventPublisher.publishEvent(new TaskDispatchSyncEvent(this, taskId, task.getTaskCode(),serviceOrdId, dispatchOrdId, oaUserID));
                log.info("调度单同步成功,任务ID: {}, DispatchOrdID: {}", taskId, dispatchOrdId);
//                log.info("调度单同步成功,任务ID: {}, DispatchOrdID: {}", taskId, dispatchOrdId);
                return dispatchOrdId;
            } else {
                // 同步失败
@@ -579,19 +579,19 @@
                }
                
                totalSuccessCount += pageSuccessCount;
                log.info("调度单第 {} 页同步完成,总数: {}, 成功: {}",
                    (offset / pageSize) + 1, pendingTasks.size(), pageSuccessCount);
//                log.info("调度单第 {} 页同步完成,总数: {}, 成功: {}",
//                    (offset / pageSize) + 1, pendingTasks.size(), pageSuccessCount);
                
                // 如果本页数据少于每页大小,说明已经是最后一页
                if (pendingTasks.size() < pageSize) {
                    log.info("已到达最后一页,调度单同步结束");
//                    log.info("已到达最后一页,调度单同步结束");
                    break;
                }
                
                offset += pageSize; // 下一页
            }
            
            log.info("批量同步调度单完成,总成功数: {}", totalSuccessCount);
//            log.info("批量同步调度单完成,总成功数: {}", totalSuccessCount);
            return totalSuccessCount;
            
        } catch (Exception e) {
@@ -617,7 +617,7 @@
                SysDept dept = sysDeptMapper.selectDeptById(task.getDeptId());
                if (dept != null && StringUtils.isNotEmpty(dept.getDispatchOrderClass())) {
                    dispatchOrdClass = dept.getDispatchOrderClass();
                    log.info("获取任务所属部门的调度单编码成功,部门ID: {}, 调度单编码: {}", task.getDeptId(), dispatchOrdClass);
//                    log.info("获取任务所属部门的调度单编码成功,部门ID: {}, 调度单编码: {}", task.getDeptId(), dispatchOrdClass);
                }
            } catch (Exception e) {
                log.error("查询任务所属部门信息异常,部门ID: {}", task.getDeptId(), e);
@@ -865,8 +865,8 @@
//            params.put("Entourage_3", doctorOaId);  // 医生
//            params.put("Entourage_4", nurseOaId);   // 护士
            
            log.info("任务执行人员同步成功,任务ID: {}, 领队ID: {}, 司机: {}, 医生: {}, 护士: {}",
                task.getTaskId(), leadEntourageId, driverOaId, doctorOaId, nurseOaId);
//            log.info("任务执行人员同步成功,任务ID: {}, 领队ID: {}, 司机: {}, 医生: {}, 护士: {}",
//                task.getTaskId(), leadEntourageId, driverOaId, doctorOaId, nurseOaId);
            
        } catch (Exception e) {
            log.error("同步任务执行人员异常,任务ID: {}", task.getTaskId(), e);
@@ -906,7 +906,7 @@
            }
            
            // 如果数据库中没有执行人员信息,尝试从任务的主要执行人获取
            log.warn("数据库中未找到执行人员信息,尝试从任务主要执行人获取,任务ID: {}", taskId);
//            log.warn("数据库中未找到执行人员信息,尝试从任务主要执行人获取,任务ID: {}", taskId);
            SysTask task = sysTaskMapper.selectSysTaskByTaskId(taskId);
            if (task != null && task.getAssigneeId() != null) {
                SysUser user = sysUserMapper.selectUserById(task.getAssigneeId());
@@ -1033,8 +1033,8 @@
                if (dept != null && StringUtils.isNotEmpty(dept.getServiceOrderClass())) {
                    // 使用部门的服务单编码作为ServiceOrdClass
                    serviceOrdClass = dept.getServiceOrderClass();
                    log.info("获取任务所属部门的服务单编码成功,部门ID: {}, 部门名称: {}, 服务单编码: {}",
                        task.getDeptId(), dept.getDeptName(), serviceOrdClass);
//                    log.info("获取任务所属部门的服务单编码成功,部门ID: {}, 部门名称: {}, 服务单编码: {}",
//                        task.getDeptId(), dept.getDeptName(), serviceOrdClass);
                } else {
                    log.warn("任务所属部门未配置服务单编码,部门ID: {}、部门名称: {},使用默认值", 
                        task.getDeptId(), dept != null ? dept.getDeptName() : "null");
@@ -1050,7 +1050,7 @@
        String serviceOrdAreaType = "1"; // 默认值
        if (StringUtils.isNotEmpty(emergency.getDocumentTypeId())) {
            serviceOrdAreaType = emergency.getDocumentTypeId();
            log.info("获取单据类型ID成功,任务ID: {}, 单据类型ID: {}", task.getTaskId(), serviceOrdAreaType);
//            log.info("获取单据类型ID成功,任务ID: {}, 单据类型ID: {}", task.getTaskId(), serviceOrdAreaType);
        } else {
            log.warn("任务未配置单据类型ID,任务ID: {},使用默认值", task.getTaskId());
        }
@@ -1063,7 +1063,7 @@
        String serviceOrdType = "1"; // 默认值
        if (StringUtils.isNotEmpty(emergency.getTaskTypeId())) {
            serviceOrdType = emergency.getTaskTypeId();
            log.info("获取任务类型ID成功,任务ID: {}, 任务类型ID: {}", taskId, serviceOrdType);
//            log.info("获取任务类型ID成功,任务ID: {}, 任务类型ID: {}", taskId, serviceOrdType);
        } else {
            log.warn("任务未配置任务类型ID,任务ID: {},使用默认值", taskId);
        }
@@ -1169,7 +1169,7 @@
            HttpsURLConnection httpsConn = (HttpsURLConnection) conn;
            httpsConn.setSSLSocketFactory(createTrustAllSSLContext().getSocketFactory());
            httpsConn.setHostnameVerifier((hostname, session) -> true); // 信任所有主机名
            log.debug("配置HTTPS连接,信任所有SSL证书,URL: {}", urlString);
//            log.debug("配置HTTPS连接,信任所有SSL证书,URL: {}", urlString);
        }
        
        try {
@@ -1468,7 +1468,7 @@
            log.info("重新同步调度单到旧系统请求参数: {}", params);
            // 发送HTTP请求到旧系统(使用admin_save_25.asp接口)
            String response = sendHttpPost(legacyConfig.getDispatchUpdateUrl(), params);
            log.info("重新同步调度单到旧系统响应: ServiceOrdID:{},DispatchOrdId:{},Result: {}",emergency.getLegacyServiceOrdId(),emergency.getLegacyDispatchOrdId(), response);
//            log.info("重新同步调度单到旧系统响应: ServiceOrdID:{},DispatchOrdId:{},Result: {}",emergency.getLegacyServiceOrdId(),emergency.getLegacyDispatchOrdId(), response);
            // 解析响应
//            Long dispatchOrdId = parseResponse(response);
            
@@ -1479,7 +1479,7 @@
                emergency.setDispatchSyncErrorMsg(null);
                sysTaskEmergencyService.updateSysTaskEmergency(emergency);
                
                log.info("调度单重新同步成功,任务ID: {}, DispatchOrdID: {}", taskId, emergency.getLegacyDispatchOrdId());
//                log.info("调度单重新同步成功,任务ID: {}, DispatchOrdID: {}", taskId, emergency.getLegacyDispatchOrdId());
                return true;
            } else {
                // 重新同步失败
@@ -1527,17 +1527,17 @@
                // 分页查询需要重新同步的任务
                List<SysTaskEmergency> needResyncTasks = sysTaskEmergencyMapper.selectNeedResyncTasks(offset, pageSize);
                
                log.info("查询到需要重新同步的任务数量: {}", needResyncTasks.size());
//                log.info("查询到需要重新同步的任务数量: {}", needResyncTasks.size());
                if (needResyncTasks == null || needResyncTasks.isEmpty()) {
                    log.info("没有更多需要重新同步的任务,offset: {}", offset);
                    break; // 没有更多数据,退出循环
                }
                
                log.info("开始重新同步调度单第 {} 页,任务数量: {}", (offset / pageSize) + 1, needResyncTasks.size());
//                log.info("开始重新同步调度单第 {} 页,任务数量: {}", (offset / pageSize) + 1, needResyncTasks.size());
                
                int pageSuccessCount = 0;
                for (SysTaskEmergency emergency : needResyncTasks) {
                    log.info("开始重新同步调度单,任务ID: {}", emergency.getTaskId());
//                    log.info("开始重新同步调度单,任务ID: {}", emergency.getTaskId());
                    boolean success = resyncDispatchOrderToLegacy(emergency.getTaskId());
                    
                    if (success) {
@@ -1555,19 +1555,19 @@
                }
                
                totalSuccessCount += pageSuccessCount;
                log.info("调度单重新同步第 {} 页完成,总数: {}, 成功: {}",
                    (offset / pageSize) + 1, needResyncTasks.size(), pageSuccessCount);
//                log.info("调度单重新同步第 {} 页完成,总数: {}, 成功: {}",
//                    (offset / pageSize) + 1, needResyncTasks.size(), pageSuccessCount);
                
                // 如果本页数据少于每页大小,说明已经是最后一页
                if (needResyncTasks.size() < pageSize) {
                    log.info("已到达最后一页,调度单重新同步结束");
//                    log.info("已到达最后一页,调度单重新同步结束");
                    break;
                }
                
                offset += pageSize; // 下一页
            }
            
            log.info("批量重新同步调度单完成,总成功数: {}", totalSuccessCount);
//            log.info("批量重新同步调度单完成,总成功数: {}", totalSuccessCount);
            return totalSuccessCount;
            
        } catch (Exception e) {
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LegacyTransferSyncServiceImpl.java
@@ -108,11 +108,11 @@
            for (Map<String, Object> order : transferOrders) {
                processedCount++;
                try {
                    String serviceOrdID = MapValueUtils.getStringValue(order, "ServiceOrdID");
                    String dispatchOrdID = MapValueUtils.getStringValue(order, "DispatchOrdID");
                    Long serviceOrdID = MapValueUtils.getLongValue(order, "ServiceOrdID");
                    Long dispatchOrdID = MapValueUtils.getLongValue(order, "DispatchOrdID");
                    
                    // 检查参数有效性
                    if (StringUtils.isEmpty(serviceOrdID)) {
                    if (serviceOrdID==null || serviceOrdID<=0) {
                        log.warn("第{}条数据服务单ID为空,跳过处理", processedCount);
                        continue;
                    }
@@ -164,41 +164,25 @@
     * @return 是否同步成功
     */
    @Override
    public boolean syncSingleTransferOrder(String serviceOrdID, String dispatchOrdID) {
        log.info("开始同步单个转运单: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
    public boolean syncSingleTransferOrder(Long serviceOrdID, Long dispatchOrdID) {
//        log.info("开始同步单个转运单: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
        
        try {
            // 检查参数有效性
            if (StringUtils.isEmpty(serviceOrdID)) {
            if (serviceOrdID == null || serviceOrdID <= 0) {
                log.error("服务单ID不能为空");
                return false;
            }
            // 直接查询指定的转运单信息
            Long serviceOrdIdLong = null;
            Long dispatchOrdIdLong = null;
            
            try {
                serviceOrdIdLong = Long.valueOf(serviceOrdID);
            } catch (NumberFormatException e) {
                log.error("服务单ID不是有效数字: {}", serviceOrdID);
                return false;
            }
            
            if (StringUtils.isNotEmpty(dispatchOrdID)) {
                try {
                    dispatchOrdIdLong = Long.valueOf(dispatchOrdID);
                } catch (NumberFormatException e) {
                    log.warn("调度单ID不是有效数字: {}", dispatchOrdID);
                }
            }
            
            List<Map<String, Object>> transferOrders = legacyTransferSyncMapper.selectTransferOrdersByIDs(serviceOrdIdLong, dispatchOrdIdLong);
            List<Map<String, Object>> transferOrders = legacyTransferSyncMapper.selectTransferOrdersByIDs(serviceOrdID, dispatchOrdID);
            Map<String, Object> order = transferOrders.get(0);
            // 检查是否已同步
            if (isTransferOrderSynced(serviceOrdID, dispatchOrdID)) {
                log.info("转运单已同步,跳过: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
//                log.info("转运单已同步,跳过: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
                updateTransferOrder(serviceOrdID, dispatchOrdID, order);
                return true;
            }
@@ -226,11 +210,11 @@
     * @param order
     * @return
     */
    private boolean updateTransferOrder(String serviceOrdID, String dispatchOrdID, Map<String, Object> order){
        log.info("开始同步单个转运单: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
    private boolean updateTransferOrder(Long serviceOrdID, Long dispatchOrdID, Map<String, Object> order){
//        log.info("开始同步单个转运单: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
        String sysTaskCode="";
        try {
            SysTaskEmergency emergency=sysTaskEmergencyMapper.selectByLegacyServiceOrdId(Long.parseLong(serviceOrdID));
            SysTaskEmergency emergency=sysTaskEmergencyMapper.selectByLegacyServiceOrdId(serviceOrdID);
            if(emergency.getNeedResync().equals(1)){
                log.info("新系统需要同步到旧系统那里,所以不要同步旧数据到新系统,serviceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
                return false;
@@ -275,12 +259,12 @@
            Long deptId=dept==null?null:dept.getDeptId();
            TaskUpdateVO updateTaskVo = new TaskUpdateVO();
            BeanUtils.copyProperties(createTaskVo, updateTaskVo);
            log.info("开始保存转运任务,serviceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
//            log.info("开始保存转运任务,serviceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
            int result = sysTaskService.updateTask(updateTaskVo,serviceOrdID,dispatchOrdID, serviceOrdNo, taskCreatorId,createUserName, deptId, ServiceOrd_CC_Time, ServiceOrd_CC_Time);
            if (result > 0) {
                log.info("转运单同步成功: ServiceOrdID={}, DispatchOrdID={}, 创建的任务ID={}", serviceOrdID, dispatchOrdID, result);
//                log.info("转运单同步成功: ServiceOrdID={}, DispatchOrdID={}, 创建的任务ID={}", serviceOrdID, dispatchOrdID, result);
                try {
                    notifyTransferOrderByWechat((long) result, serviceOrdID, dispatchOrdID, serviceOrdNo, ServiceOrd_CC_Time, dept, order);
@@ -307,8 +291,8 @@
     * @param order 转运单详细信息
     * @return 是否同步成功
     */
    private boolean syncSingleTransferOrder(String serviceOrdID, String dispatchOrdID, Map<String, Object> order) {
        log.info("开始同步单个转运单: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
    private boolean syncSingleTransferOrder(Long serviceOrdID, Long dispatchOrdID, Map<String, Object> order) {
//        log.info("开始同步单个转运单: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
        String sysTaskCode="";
        try {
            // 构造TaskCreateVO对象
@@ -355,7 +339,7 @@
            int result = sysTaskService.insertTask(createTaskVo,serviceOrdID,dispatchOrdID, serviceOrdNo, taskCreatorId,createUserName, deptId, ServiceOrd_CC_Time, ServiceOrd_CC_Time);
            if (result > 0) {
                log.info("转运单同步成功: ServiceOrdID={}, DispatchOrdID={}, 创建的任务ID={}", serviceOrdID, dispatchOrdID, result);
//                log.info("转运单同步成功: ServiceOrdID={}, DispatchOrdID={}, 创建的任务ID={}", serviceOrdID, dispatchOrdID, result);
                try {
                    notifyTransferOrderByWechat((long) result, serviceOrdID, dispatchOrdID, serviceOrdNo, ServiceOrd_CC_Time, dept, order);
@@ -383,10 +367,10 @@
     * @return 是否已同步
     */
    @Override
    public boolean isTransferOrderSynced(String serviceOrdID, String dispatchOrdID) {
    public boolean isTransferOrderSynced(Long serviceOrdID, Long dispatchOrdID) {
        try {
            // 检查参数有效性
            if (StringUtils.isEmpty(serviceOrdID)) {
            if (serviceOrdID == null || serviceOrdID<=0) {
                log.warn("服务单ID不能为空");
                return false;
            }
@@ -395,7 +379,7 @@
            // 条件:legacy_service_ord_id = serviceOrdID 或 legacy_dispatch_ord_id = dispatchOrdID
            
            try {
                SysTaskEmergency emergency = sysTaskEmergencyMapper.selectByLegacyServiceOrdId(Long.valueOf(serviceOrdID));
                SysTaskEmergency emergency = sysTaskEmergencyMapper.selectByLegacyServiceOrdId(serviceOrdID);
                if (emergency != null) {
                    return true;
                }
@@ -403,9 +387,9 @@
                log.warn("服务单ID不是有效数字: {}", serviceOrdID);
            }
            
            if (StringUtils.isNotEmpty(dispatchOrdID)) {
            if (dispatchOrdID>0) {
                try {
                    SysTaskEmergency emergency = sysTaskEmergencyMapper.selectByLegacyDispatchOrdId(Long.valueOf(dispatchOrdID));
                    SysTaskEmergency emergency = sysTaskEmergencyMapper.selectByLegacyDispatchOrdId(dispatchOrdID);
                    if (emergency != null) {
                        return true;
                    }
@@ -441,7 +425,7 @@
     * @return TaskCreateVO对象
     */
    @Override
    public TaskCreateVO buildCreateTaskVo(String serviceOrdID, String dispatchOrdID, Map<String, Object> order) {
    public TaskCreateVO buildCreateTaskVo(Long serviceOrdID, Long dispatchOrdID, Map<String, Object> order) {
//        log.info("构造TaskCreateVO: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
        try {
@@ -451,7 +435,7 @@
                return null;
            }
            
            if (StringUtils.isEmpty(serviceOrdID)) {
            if (serviceOrdID==null || serviceOrdID<=0) {
                log.error("服务单ID不能为空");
                return null;
            }
@@ -730,11 +714,11 @@
     * @param dispatchOrdID 调度单ID
     * @return 执行人信息列表
     */
    private List<TaskCreateVO.AssigneeInfo> queryAssignees(String dispatchOrdID) {
    private List<TaskCreateVO.AssigneeInfo> queryAssignees(Long dispatchOrdID) {
        long startTime = System.currentTimeMillis();
        try {
            // 检查参数有效性
            if (StringUtils.isEmpty(dispatchOrdID)) {
            if (dispatchOrdID==null || dispatchOrdID <= 0) {
                log.warn("调度单ID不能为空");
                return new ArrayList<>();
            }
@@ -813,10 +797,10 @@
     * @param serviceOrdID 服务单ID
     * @return 病情ID列表
     */
    private String queryDiseaseIds(String serviceOrdID) {
    private String queryDiseaseIds(Long serviceOrdID) {
        try {
            // 检查参数有效性
            if (StringUtils.isEmpty(serviceOrdID)) {
            if (serviceOrdID==null || serviceOrdID <= 0) {
                log.warn("服务单ID不能为空");
                return null;
            }
@@ -840,8 +824,8 @@
    private void notifyTransferOrderByWechat(Long taskId,
                                             String serviceOrdID,
                                             String dispatchOrdID,
                                             Long serviceOrdID,
                                             Long dispatchOrdID,
                                             String serviceOrdNo,
                                             Date serviceOrdCcTime,
                                             SysDept dept,
@@ -850,7 +834,7 @@
            // 获取通知接收人列表
            List<SysUser> receivers = getWechatNotifyUsers(dispatchOrdID, dept);
            if (receivers == null || receivers.isEmpty()) {
                log.info("旧系统同步转运单无可用微信接收人,taskId={}", taskId);
//                log.info("旧系统同步转运单无可用微信接收人,taskId={}", taskId);
                return;
            }
@@ -864,13 +848,13 @@
            // 调用统一的微信通知服务
            int successCount = wechatTaskNotifyService.sendTaskNotifyMessage(taskId, userIds);
            log.info("旧系统同步转运单微信通知发送完成,taskId={}, 成功={}", taskId, successCount);
//            log.info("旧系统同步转运单微信通知发送完成,taskId={}, 成功={}", taskId, successCount);
        } catch (Exception e) {
            log.error("notifyTransferOrderByWechat发生异常, serviceOrdID={}, dispatchOrdID={}", serviceOrdID, dispatchOrdID, e);
        }
    }
    private List<SysUser> getWechatNotifyUsers(String dispatchOrdID, SysDept dept) {
    private List<SysUser> getWechatNotifyUsers(Long dispatchOrdID, SysDept dept) {
        try {
            List<SysUser> result = new ArrayList<>();
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysEmergencyTaskServiceImpl.java
@@ -41,7 +41,7 @@
    @Override
    public void saveEmergencyInfo(Long taskId, String createUserName, TaskCreateVO createVO,
                                  String serviceOrderId, String dispatchOrderId, String serviceOrdNo) {
                                  Long serviceOrderId, Long dispatchOrderId, String serviceOrdNo) {
        SysTaskEmergency emergencyInfo = new SysTaskEmergency();
        emergencyInfo.setTaskId(taskId);
@@ -123,13 +123,13 @@
        }
        if (serviceOrderId != null) {
            emergencyInfo.setLegacyServiceOrdId(Long.parseLong(serviceOrderId));
            emergencyInfo.setLegacyServiceOrdId(serviceOrderId);
            emergencyInfo.setSyncStatus(2);
            emergencyInfo.setSyncTime(DateUtils.getNowDate());
            emergencyInfo.setSyncErrorMsg("旧系统同步过来");
        }
        if (dispatchOrderId != null) {
            emergencyInfo.setLegacyDispatchOrdId(Long.parseLong(dispatchOrderId));
            emergencyInfo.setLegacyDispatchOrdId(dispatchOrderId);
            emergencyInfo.setDispatchSyncStatus(2);
            emergencyInfo.setDispatchSyncTime(DateUtils.getNowDate());
            emergencyInfo.setDispatchSyncErrorMsg("旧系统同步过来");
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java
@@ -9,8 +9,9 @@
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.*;
import com.ruoyi.system.domain.vo.*;
import com.ruoyi.system.event.TaskDispatchSyncEvent;
import com.ruoyi.system.event.*;
import com.ruoyi.system.mapper.*;
import com.ruoyi.system.service.*;
import com.ruoyi.system.utils.TaskCodeGenerator;
@@ -19,10 +20,6 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.GpsDistanceUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.system.domain.SysTask;
@@ -34,9 +31,6 @@
import com.ruoyi.system.domain.SysTaskAssignee;
import com.ruoyi.system.domain.enums.TaskStatus;
import com.ruoyi.system.domain.VehicleInfo;
import com.ruoyi.system.event.TaskCreatedEvent;
import com.ruoyi.system.event.TaskAssignedEvent;
import com.ruoyi.system.event.TaskStatusChangedEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -317,7 +311,7 @@
     */
    @Override
    @Transactional
    public int insertTask(TaskCreateVO createVO,String serviceOrderId,String dispatchOrderId, String serviceOrdNo, Long userId,String userName, Long deptId, Date createTime, Date updateTime) {
    public int insertTask(TaskCreateVO createVO,Long serviceOrderId,Long dispatchOrderId, String serviceOrdNo, Long userId,String userName, Long deptId, Date createTime, Date updateTime) {
        SysTask task = new SysTask();
        if(createVO.getTaskCode()!=null){
            task.setTaskCode(createVO.getTaskCode());
@@ -411,8 +405,9 @@
        }
        
        if(result>0) {
            this.sendEmeryTaskProcess(task, dispatchOrderId);
        }
        
        return result;
    }
@@ -613,11 +608,11 @@
     * @return 结果
     */
    @Override
    public int updateTask(TaskUpdateVO updateVO, String serviceOrderId, String dispatchOrderId, String serviceOrdNo,
    public int updateTask(TaskUpdateVO updateVO, Long serviceOrderId, Long dispatchOrderId, String serviceOrdNo,
                         Long userId, String userName, Long deptId, Date createTime, Date updateTime) {
//        log.info("开始更新任务 ServiceOrdID: {} , dispatchOrdId:{}", serviceOrderId,dispatchOrderId);
        // 通过旧系统服务单ID查找任务
        SysTaskEmergency taskEmergency = sysTaskEmergencyMapper.selectByLegacyServiceOrdId(Long.parseLong(serviceOrderId));
        SysTaskEmergency taskEmergency = sysTaskEmergencyMapper.selectByLegacyServiceOrdId(serviceOrderId);
        Long taskId = taskEmergency.getTaskId();
        updateVO.setTaskId(taskId);
        SysTask task = new SysTask();
@@ -722,14 +717,14 @@
//            log.info("更新执行人员 ServiceOrdID:{},dispatchOrderId:{}",serviceOrderId,dispatchOrderId);
            sysTaskAssigneeService.updateTaskAssignees(taskId, updateVO.getAssignees(), userName);
        }
        Long dispatchOrderIdLong = 0L;
        // 更新急救转运扩展信息
        if (result > 0) {
            // 更新旧系统ID
            taskEmergency.setLegacyServiceOrdId(Long.parseLong(serviceOrderId));
            if (dispatchOrderId != null) {
                dispatchOrderIdLong = Long.parseLong(dispatchOrderId);
                taskEmergency.setLegacyDispatchOrdId(dispatchOrderIdLong);
            taskEmergency.setLegacyServiceOrdId(serviceOrderId);
            if (LongUtil.isNotEmpty(dispatchOrderId)) {
                taskEmergency.setLegacyDispatchOrdId(dispatchOrderId);
                taskEmergency.setDispatchSyncStatus(2);
                taskEmergency.setDispatchSyncTime(new Date());
                taskEmergency.setDispatchSyncErrorMsg("旧系统同步过来");
@@ -747,16 +742,30 @@
                sysEmergencyTaskService.updateEmergencyInfoFromCreateVO(taskEmergency, updateVO, userName);
            }
           SysTaskEmergency emergency= sysEmergencyTaskService.selectSysTaskEmergencyByTaskId(taskId);
            dispatchOrderIdLong = emergency.getLegacyDispatchOrdId();
            dispatchOrderId = emergency.getLegacyDispatchOrdId();
        }
        if(updateVO.getTaskStatus()!=null && updateVO.getTaskStatus().equals(TaskStatus.PENDING.getCode()) && updateVO.getAssignees()!=null && !updateVO.getAssignees().isEmpty() && dispatchOrderIdLong>0L){
        if(updateVO.getTaskStatus()!=null && updateVO.getTaskStatus().equals(TaskStatus.PENDING.getCode()) && updateVO.getAssignees()!=null && !updateVO.getAssignees().isEmpty() && dispatchOrderId>0L){
            this.sendTaskAssigneeEvent(updateVO,task,userId,userName);
        }
        
        return result;
    }
    private void sendEmeryTaskProcess(SysTask task,Long dispatchOrderId){
        Long taskId = task.getTaskId();
        String taskCode = task.getShowTaskCode();
        if(task.getTaskStatus()!=null && task.getTaskStatus().equals(TaskStatus.PENDING.getCode())){
            //如果没有分配人员,且没有调度单,不是广州总公司的就需要发送通知跟进
            if(LongUtil.isEmpty(dispatchOrderId)){
                if(!task.getDeptId().equals(DeptUtil.GUANGZHOU_DEPT_ID) && task.getAssignees().isEmpty()){
                    //发送通知
                    eventPublisher.publishEvent(new TaskOnlyServerOrderSyncEvent(this, taskId, taskCode));
                }
            }
        }
    }
    /**
     * 批量删除任务管理
     * 
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -28,7 +28,6 @@
import com.ruoyi.system.mapper.SysUserPostMapper;
import com.ruoyi.system.mapper.SysUserRoleMapper;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysUserService;
/**
@@ -58,9 +57,6 @@
    @Autowired
    private ISysConfigService configService;
    @Autowired
    private ISysDeptService deptService;
    @Autowired
    protected Validator validator;
@@ -129,18 +125,6 @@
    }
    /**
     * 通过用户ID查询用户
     *
     * @param userId 用户ID
     * @return 用户对象信息
     */
    @Override
    public SysUser selectUserById(Long userId)
    {
        return userMapper.selectUserById(userId);
    }
    /**
     * 通过微信OpenID查询用户
     * 
     * @param openId 微信OpenID
@@ -177,6 +161,18 @@
    }
    /**
     * 通过用户ID查询用户
     *
     * @param userId 用户ID
     * @return 用户对象信息
     */
    @Override
    public SysUser selectUserById(Long userId)
    {
        return userMapper.selectUserById(userId);
    }
    /**
     * 查询用户所属角色组
     * 
     * @param userName 用户名
@@ -190,7 +186,7 @@
        {
            return StringUtils.EMPTY;
        }
        return list.stream().map(SysRole::getRoleName).collect(Collectors.joining(","));
        return list.stream().map(SysRole::getRoleName).reduce((x, y) -> x + "," + y).orElse(StringUtils.EMPTY);
    }
    /**
@@ -217,7 +213,7 @@
     * @return 结果
     */
    @Override
    public boolean checkUserNameUnique(SysUser user)
    public Boolean checkUserNameUnique(SysUser user)
    {
        Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
        SysUser info = userMapper.checkUserNameUnique(user.getUserName());
@@ -235,7 +231,7 @@
     * @return
     */
    @Override
    public boolean checkPhoneUnique(SysUser user)
    public Boolean checkPhoneUnique(SysUser user)
    {
        Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
        SysUser info = userMapper.checkPhoneUnique(user.getPhonenumber());
@@ -253,7 +249,7 @@
     * @return
     */
    @Override
    public boolean checkEmailUnique(SysUser user)
    public Boolean checkEmailUnique(SysUser user)
    {
        Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
        SysUser info = userMapper.checkEmailUnique(user.getEmail());
@@ -445,10 +441,10 @@
    public void insertUserPost(SysUser user)
    {
        Long[] posts = user.getPostIds();
        if (StringUtils.isNotEmpty(posts))
        if (StringUtils.isNotNull(posts))
        {
            // 新增用户与岗位管理
            List<SysUserPost> list = new ArrayList<SysUserPost>(posts.length);
            List<SysUserPost> list = new ArrayList<SysUserPost>();
            for (Long postId : posts)
            {
                SysUserPost up = new SysUserPost();
@@ -456,7 +452,10 @@
                up.setPostId(postId);
                list.add(up);
            }
            if (list.size() > 0)
            {
            userPostMapper.batchUserPost(list);
            }
        }
    }
@@ -468,10 +467,10 @@
     */
    public void insertUserRole(Long userId, Long[] roleIds)
    {
        if (StringUtils.isNotEmpty(roleIds))
        if (StringUtils.isNotNull(roleIds))
        {
            // 新增用户与角色管理
            List<SysUserRole> list = new ArrayList<SysUserRole>(roleIds.length);
            List<SysUserRole> list = new ArrayList<SysUserRole>();
            for (Long roleId : roleIds)
            {
                SysUserRole ur = new SysUserRole();
@@ -479,7 +478,10 @@
                ur.setRoleId(roleId);
                list.add(ur);
            }
            if (list.size() > 0)
            {
            userRoleMapper.batchUserRole(list);
            }
        }
    }
@@ -513,7 +515,6 @@
        for (Long userId : userIds)
        {
            checkUserAllowed(new SysUser(userId));
            checkUserDataScope(userId);
        }
        // 删除用户与角色关联
        userRoleMapper.deleteUserRole(userIds);
@@ -541,6 +542,7 @@
        int failureNum = 0;
        StringBuilder successMsg = new StringBuilder();
        StringBuilder failureMsg = new StringBuilder();
        String password = configService.selectConfigByKey("sys.user.initPassword");
        for (SysUser user : userList)
        {
            try
@@ -550,73 +552,18 @@
                if (StringUtils.isNull(u))
                {
                    BeanValidators.validateWithException(validator, user);
                    deptService.checkDeptDataScope(user.getDeptId());
                    // 校验手机号唯一性
                    if (StringUtils.isNotEmpty(user.getPhonenumber()))
                    {
                        SysUser phoneCheck = userMapper.checkPhoneUnique(user.getPhonenumber());
                        if (StringUtils.isNotNull(phoneCheck))
                        {
                            failureNum++;
                            failureMsg.append("<br/>" + failureNum + "、账号 " + user.getUserName() + " 导入失败:手机号码 " + user.getPhonenumber() + " 已被用户 " + phoneCheck.getUserName() + " 使用");
                            continue;
                        }
                    }
                    // 校验邮箱唯一性
                    if (StringUtils.isNotEmpty(user.getEmail()))
                    {
                        SysUser emailCheck = userMapper.checkEmailUnique(user.getEmail());
                        if (StringUtils.isNotNull(emailCheck))
                        {
                            failureNum++;
                            failureMsg.append("<br/>" + failureNum + "、账号 " + user.getUserName() + " 导入失败:邮箱 " + user.getEmail() + " 已被用户 " + emailCheck.getUserName() + " 使用");
                            continue;
                        }
                    }
                    String password = configService.selectConfigByKey("sys.user.initPassword");
                    user.setPassword(SecurityUtils.encryptPassword(password));
                    user.setCreateBy(operName);
                    userMapper.insertUser(user);
                    this.insertUser(user);
                    successNum++;
                    successMsg.append("<br/>" + successNum + "、账号 " + user.getUserName() + " 导入成功");
                }
                else if (isUpdateSupport)
                {
                    BeanValidators.validateWithException(validator, user);
                    checkUserAllowed(u);
                    checkUserDataScope(u.getUserId());
                    deptService.checkDeptDataScope(user.getDeptId());
                    // 校验手机号唯一性(排除自己)
                    if (StringUtils.isNotEmpty(user.getPhonenumber()))
                    {
                        SysUser phoneCheck = userMapper.checkPhoneUnique(user.getPhonenumber());
                        if (StringUtils.isNotNull(phoneCheck) && !phoneCheck.getUserId().equals(u.getUserId()))
                        {
                            failureNum++;
                            failureMsg.append("<br/>" + failureNum + "、账号 " + user.getUserName() + " 更新失败:手机号码 " + user.getPhonenumber() + " 已被用户 " + phoneCheck.getUserName() + " 使用");
                            continue;
                        }
                    }
                    // 校验邮箱唯一性(排除自己)
                    if (StringUtils.isNotEmpty(user.getEmail()))
                    {
                        SysUser emailCheck = userMapper.checkEmailUnique(user.getEmail());
                        if (StringUtils.isNotNull(emailCheck) && !emailCheck.getUserId().equals(u.getUserId()))
                        {
                            failureNum++;
                            failureMsg.append("<br/>" + failureNum + "、账号 " + user.getUserName() + " 更新失败:邮箱 " + user.getEmail() + " 已被用户 " + emailCheck.getUserName() + " 使用");
                            continue;
                        }
                    }
                    user.setUserId(u.getUserId());
                    user.setUpdateBy(operName);
                    userMapper.updateUser(user);
                    this.updateUser(user);
                    successNum++;
                    successMsg.append("<br/>" + successNum + "、账号 " + user.getUserName() + " 更新成功");
                }
@@ -655,10 +602,18 @@
    @Override
    public List<SysUser> selectUsersByBranchDeptIds(List<Long> branchDeptIds)
    {
        if (branchDeptIds == null || branchDeptIds.isEmpty()) {
            return new ArrayList<>();
        return userMapper.selectUsersByBranchDeptIds(branchDeptIds);
        }
        
        return userMapper.selectUsersByBranchDeptIds(branchDeptIds);
    /**
     * 根据serviceOrderClass或dispatchOrderClass查询具有canViewAllConsult权限的用户
     *
     * @param orderClass serviceOrderClass或dispatchOrderClass
     * @return 用户列表
     */
    @Override
    public List<SysUser> selectUsersByOrderClassAndCanViewAllConsult(String orderClass)
    {
        return userMapper.selectUsersByOrderClassAndCanViewAllConsult(orderClass);
    }
}
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -300,4 +300,19 @@
        ORDER BY u.create_time DESC
    </select>
    
    <!-- 根据serviceOrderClass或dispatchOrderClass查询具有canViewAllConsult权限的用户 -->
    <select id="selectUsersByOrderClassAndCanViewAllConsult" resultMap="SysUserResult">
        SELECT DISTINCT
            u.user_id, u.dept_id, u.user_name, u.nick_name, u.email,
            u.avatar, u.phonenumber, u.sex, u.status, u.del_flag, u.create_time,
            u.can_view_all_consult,u.oa_order_class
        FROM sys_user u
        WHERE u.del_flag = '0'
            AND u.status = '0'
            AND u.can_view_all_consult = '1'
            AND u.oa_order_class like concat('%', #{orderClass}, '%')
        ORDER BY u.create_time DESC
    </select>
</mapper> 
ruoyi-ui/src/views/system/notify/channelConfig.vue
@@ -3,17 +3,14 @@
    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
      <el-form-item label="通知类型" prop="notifyType">
        <el-select v-model="queryParams.notifyType" placeholder="请选择通知类型" clearable>
          <el-option label="任务分配" value="TASK_ASSIGN" />
          <el-option label="状态变更" value="STATUS_CHANGE" />
          <el-option label="任务创建" value="TASK_CREATE" />
         <el-option v-for="dict in dict.type.sys_notify_type" :key="dict.value" :label="dict.label" :value="dict.value" />
        </el-select>
      </el-form-item>
      <el-form-item label="渠道" prop="channel">
        <el-select v-model="queryParams.channel" placeholder="请选择渠道" clearable>
          <el-option label="微信订阅消息" value="WECHAT" />
          <el-option label="短信" value="SMS" />
          <el-option label="站内消息" value="SITE_MSG" />
          <el-option label="APP推送" value="APP_PUSH" />
          <el-option v-for="dict in dict.type.sys_notify_channel" :key="dict.value" :label="dict.label" :value="dict.value" />
        </el-select>
      </el-form-item>
      <el-form-item label="是否启用" prop="enabled">
@@ -121,18 +118,12 @@
      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
        <el-form-item label="通知类型" prop="notifyType">
          <el-select v-model="form.notifyType" placeholder="请选择通知类型" style="width: 100%">
            <el-option label="任务分配" value="TASK_ASSIGN" />
            <el-option label="状态变更" value="STATUS_CHANGE" />
            <el-option label="任务创建" value="TASK_CREATE" />
            <el-option v-for="dict in dict.type.sys_notify_type" :key="dict.value" :label="dict.label" :value="dict.value" />
          </el-select>
        </el-form-item>
        <el-form-item label="渠道" prop="channel">
          <el-select v-model="form.channel" placeholder="请选择渠道" style="width: 100%">
            <el-option label="微信订阅消息" value="WECHAT" />
            <el-option label="短信" value="SMS" />
            <el-option label="站内消息" value="SITE_MSG" />
            <el-option label="APP推送" value="APP_PUSH" />
            <el-option label="企业微信" value="QY_WECHAT" />
            <el-option v-for="dict in dict.type.sys_notify_channel" :key="dict.value" :label="dict.label" :value="dict.value" />
          </el-select>
        </el-form-item>
        <el-form-item label="是否启用" prop="enabled">
ruoyi-ui/src/views/system/notify/log/index.vue
@@ -88,7 +88,7 @@
    <el-table v-loading="loading" :data="notifySendLogList" @selection-change="handleSelectionChange">
      <el-table-column type="selection" width="55" align="center" />
      <el-table-column label="ID" align="center" prop="id" />
      <el-table-column label="通知任务ID" align="center" prop="notifyTaskId" />
      <el-table-column label="任务ID" align="center" prop="taskId" />
      <el-table-column label="用户ID" align="center" prop="userId" />
sql/sys_notify_send_log.sql
@@ -3,34 +3,36 @@
-- 用于记录各类通知消息的发送记录,实现防重机制
-- 确保同一任务同一人同一通知类型只发送一次
-- ===========================================
DROP TABLE IF EXISTS `sys_notify_send_log`;
CREATE TABLE `sys_notify_send_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `task_id` bigint(20) NOT NULL COMMENT '任务ID',
  `user_id` bigint(20) NOT NULL COMMENT '接收用户ID',
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `notify_task_id` bigint DEFAULT NULL COMMENT '关联的通知任务ID',
  `task_id` bigint NOT NULL COMMENT '任务ID',
  `user_id` bigint NOT NULL COMMENT '接收用户ID',
  `user_name` varchar(64) DEFAULT NULL COMMENT '接收用户姓名',
  `notify_type` varchar(32) NOT NULL COMMENT '通知类型:TASK_ASSIGN-任务分配, STATUS_CHANGE-状态变更, TASK_CREATE-任务创建',
  `channel` varchar(32) NOT NULL COMMENT '通知渠道:WECHAT-微信订阅消息, SMS-短信, APP_PUSH-APP推送, SITE_MSG-站内消息',
  `send_content` text,
  `send_status` char(1) DEFAULT '0' COMMENT '发送状态:0-待发送, 1-发送成功, 2-发送失败',
  `send_content` text COMMENT '发送的内容',
  `send_time` datetime DEFAULT NULL COMMENT '发送时间',
  `send_result` text DEFAULT NULL COMMENT '发送结果/错误信息',
  `retry_count` int(11) DEFAULT 0 COMMENT '重试次数',
  `send_result` varchar(500) DEFAULT NULL COMMENT '发送结果/错误信息',
  `retry_count` int DEFAULT '0' COMMENT '重试次数',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `response_msg` text COMMENT '响应消息',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_task_user_type_channel` (`task_id`, `user_id`, `notify_type`, `channel`) COMMENT '同一任务同一用户同一类型同一渠道只能有一条记录',
  KEY `idx_task_id` (`task_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_notify_type` (`notify_type`),
  KEY `idx_send_status` (`send_status`),
  KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='通知发送记录表';
  KEY `idx_create_time` (`create_time`),
  KEY `idx_notify_task_id` (`notify_task_id`)
) ENGINE=InnoDB AUTO_INCREMENT=64 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='通知发送记录表';
-- ===========================================
-- 使用说明:
sql/update_sys_notify_send_log.sql
New file
@@ -0,0 +1,5 @@
-- 为 sys_notify_send_log 表添加 response_msg 字段
-- 该脚本用于修复因字段缺失导致的 SQL 语法错误
ALTER TABLE `sys_notify_send_log`
ADD COLUMN `response_msg` text DEFAULT NULL COMMENT '响应消息';