| | |
| | | basename: i18n/messages |
| | | profiles: |
| | | # 环境 dev|test|prod |
| | | active: prod |
| | | active: dev |
| | | # 文件上传 |
| | | servlet: |
| | | multipart: |
| New file |
| | |
| | | package com.ruoyi.common.utils; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | public class BigDecimalUtil { |
| | | public static Boolean isZero(BigDecimal bigDecimal) { |
| | | return bigDecimal.compareTo(BigDecimal.ZERO) == 0; |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.common.utils; |
| | | |
| | | public class DeptUtil { |
| | | |
| | | /** |
| | | * 总公司部门ID |
| | | */ |
| | | public static Long ROOT_DEPT_ID=100L; |
| | | /** |
| | | * 广州总部部门ID |
| | | */ |
| | | public static Long GUANGZHOU_DEPT_ID=101L; |
| | | } |
| New file |
| | |
| | | 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); |
| | | } |
| | | } |
| | | |
| | | |
| | |
| | | // ==================== 通知类型常量 ==================== |
| | | /** 通知类型:任务分配 */ |
| | | 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"; |
| | | /** 通知类型:任务创建 */ |
| New file |
| | |
| | | package com.ruoyi.system.event; |
| | | |
| | | /** |
| | | * 广州总部之外的服务单事件派发 旧系统同步到新系统过来的服务单,咨询单 |
| | | */ |
| | | public class TaskOnlyServerOrderSyncEvent extends TaskEvent{ |
| | | |
| | | |
| | | public TaskOnlyServerOrderSyncEvent(Object source, Long taskId, String taskCode) { |
| | | super(source, taskId, taskCode); |
| | | } |
| | | } |
| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | 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)); |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | |
| | | @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(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 监听任务分配事件 |
| | |
| | | |
| | | 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()); |
| | |
| | | |
| | | // 构建通知内容 |
| | | 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) { |
| | |
| | | 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; |
| | | } |
| | | /** |
| | | * 构建通知内容 |
| | | */ |
| | |
| | | * @param serviceOrdID 服务单ID |
| | | * @return 病情ID列表 |
| | | */ |
| | | List<String> selectDiseaseIdsByServiceOrdID(@Param("serviceOrdID") String serviceOrdID); |
| | | List<String> selectDiseaseIdsByServiceOrdID(@Param("serviceOrdID") Long serviceOrdID); |
| | | |
| | | /** |
| | | * 根据调度单ID查询执行人信息 |
| | |
| | | * @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); |
| | | } |
| | |
| | | * @param dispatchOrdID 调度单ID |
| | | * @return 是否同步成功 |
| | | */ |
| | | boolean syncSingleTransferOrder(String serviceOrdID, String dispatchOrdID); |
| | | boolean syncSingleTransferOrder(Long serviceOrdID, Long dispatchOrdID); |
| | | |
| | | /** |
| | | * 检查转运单是否已同步 |
| | |
| | | * @param dispatchOrdID 调度单ID |
| | | * @return 是否已同步 |
| | | */ |
| | | boolean isTransferOrderSynced(String serviceOrdID, String dispatchOrdID); |
| | | boolean isTransferOrderSynced(Long serviceOrdID, Long dispatchOrdID); |
| | | |
| | | /** |
| | | * 构造TaskCreateVO对象用于创建任务 |
| | |
| | | * @param order 转运单详细信息 |
| | | * @return TaskCreateVO对象 |
| | | */ |
| | | TaskCreateVO buildCreateTaskVo(String serviceOrdID, String dispatchOrdID, Map<String, Object> order); |
| | | TaskCreateVO buildCreateTaskVo(Long serviceOrdID, Long dispatchOrdID, Map<String, Object> order); |
| | | } |
| | |
| | | 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); |
| | | |
| | |
| | | * @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); |
| | | |
| | | /** |
| | | * 修改任务管理 |
| | |
| | | * @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); |
| | | |
| | | /** |
| | | * 批量删除任务管理 |
| | |
| | | * @param user 用户信息 |
| | | * @return 结果 |
| | | */ |
| | | public boolean checkUserNameUnique(SysUser user); |
| | | public Boolean checkUserNameUnique(SysUser user); |
| | | |
| | | /** |
| | | * 校验手机号码是否唯一 |
| | |
| | | * @param user 用户信息 |
| | | * @return 结果 |
| | | */ |
| | | public boolean checkPhoneUnique(SysUser user); |
| | | public Boolean checkPhoneUnique(SysUser user); |
| | | |
| | | /** |
| | | * 校验email是否唯一 |
| | |
| | | * @param user 用户信息 |
| | | * @return 结果 |
| | | */ |
| | | public boolean checkEmailUnique(SysUser user); |
| | | public Boolean checkEmailUnique(SysUser user); |
| | | |
| | | /** |
| | | * 校验用户是否允许操作 |
| | |
| | | * @return 用户列表 |
| | | */ |
| | | public List<SysUser> selectUsersByBranchDeptIds(List<Long> branchDeptIds); |
| | | |
| | | /** |
| | | * 根据serviceOrderClass或dispatchOrderClass查询具有canViewAllConsult权限的用户 |
| | | * |
| | | * @param orderClass serviceOrderClass或dispatchOrderClass |
| | | * @return 用户列表 |
| | | */ |
| | | public List<SysUser> selectUsersByOrderClassAndCanViewAllConsult(String orderClass); |
| | | } |
| | |
| | | |
| | | // 如果已经同步过,不再重复同步 |
| | | if (emergency.getLegacyServiceOrdId() != null && emergency.getLegacyServiceOrdId() > 0) { |
| | | log.info("任务已同步过,任务ID: {}, ServiceOrdID: {}", taskId, emergency.getLegacyServiceOrdId()); |
| | | // log.info("任务已同步过,任务ID: {}, ServiceOrdID: {}", taskId, emergency.getLegacyServiceOrdId()); |
| | | return emergency.getLegacyServiceOrdId(); |
| | | } |
| | | |
| | |
| | | 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 { |
| | | // 同步失败 |
| | |
| | | //在这里监听派发的事件 |
| | | @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()); |
| | | } |
| | | /** |
| | |
| | | break; // 没有更多数据,退出循环 |
| | | } |
| | | |
| | | log.info("开始同步第 {} 页,任务数量: {}", (offset / pageSize) + 1, pendingTasks.size()); |
| | | // log.info("开始同步第 {} 页,任务数量: {}", (offset / pageSize) + 1, pendingTasks.size()); |
| | | |
| | | int pageSuccessCount = 0; |
| | | for (SysTaskEmergency emergency : pendingTasks) { |
| | |
| | | } |
| | | |
| | | 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) { |
| | |
| | | |
| | | // 如果已经同步过,不再重复同步 |
| | | if (emergency.getLegacyDispatchOrdId() != null && emergency.getLegacyDispatchOrdId() > 0) { |
| | | log.info("调度单已同步过,任务ID: {}, DispatchOrdID: {}", taskId, emergency.getLegacyDispatchOrdId()); |
| | | // log.info("调度单已同步过,任务ID: {}, DispatchOrdID: {}", taskId, emergency.getLegacyDispatchOrdId()); |
| | | return emergency.getLegacyDispatchOrdId(); |
| | | } |
| | | |
| | |
| | | |
| | | 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 { |
| | | // 同步失败 |
| | |
| | | } |
| | | |
| | | 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) { |
| | |
| | | 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); |
| | |
| | | // 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); |
| | |
| | | } |
| | | |
| | | // 如果数据库中没有执行人员信息,尝试从任务的主要执行人获取 |
| | | 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()); |
| | |
| | | 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"); |
| | |
| | | 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()); |
| | | } |
| | |
| | | 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); |
| | | } |
| | |
| | | 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 { |
| | |
| | | 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); |
| | | |
| | |
| | | emergency.setDispatchSyncErrorMsg(null); |
| | | sysTaskEmergencyService.updateSysTaskEmergency(emergency); |
| | | |
| | | log.info("调度单重新同步成功,任务ID: {}, DispatchOrdID: {}", taskId, emergency.getLegacyDispatchOrdId()); |
| | | // log.info("调度单重新同步成功,任务ID: {}, DispatchOrdID: {}", taskId, emergency.getLegacyDispatchOrdId()); |
| | | return true; |
| | | } else { |
| | | // 重新同步失败 |
| | |
| | | // 分页查询需要重新同步的任务 |
| | | 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) { |
| | |
| | | } |
| | | |
| | | 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) { |
| | |
| | | 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; |
| | | } |
| | |
| | | * @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; |
| | | } |
| | |
| | | * @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; |
| | |
| | | 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); |
| | |
| | | * @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对象 |
| | |
| | | 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); |
| | |
| | | * @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; |
| | | } |
| | |
| | | // 条件: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; |
| | | } |
| | |
| | | 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; |
| | | } |
| | |
| | | * @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 { |
| | |
| | | return null; |
| | | } |
| | | |
| | | if (StringUtils.isEmpty(serviceOrdID)) { |
| | | if (serviceOrdID==null || serviceOrdID<=0) { |
| | | log.error("服务单ID不能为空"); |
| | | return null; |
| | | } |
| | |
| | | * @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<>(); |
| | | } |
| | |
| | | * @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; |
| | | } |
| | |
| | | |
| | | |
| | | private void notifyTransferOrderByWechat(Long taskId, |
| | | String serviceOrdID, |
| | | String dispatchOrdID, |
| | | Long serviceOrdID, |
| | | Long dispatchOrdID, |
| | | String serviceOrdNo, |
| | | Date serviceOrdCcTime, |
| | | SysDept dept, |
| | |
| | | // 获取通知接收人列表 |
| | | List<SysUser> receivers = getWechatNotifyUsers(dispatchOrdID, dept); |
| | | if (receivers == null || receivers.isEmpty()) { |
| | | log.info("旧系统同步转运单无可用微信接收人,taskId={}", taskId); |
| | | // log.info("旧系统同步转运单无可用微信接收人,taskId={}", taskId); |
| | | return; |
| | | } |
| | | |
| | |
| | | |
| | | // 调用统一的微信通知服务 |
| | | 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<>(); |
| | | |
| | |
| | | |
| | | @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); |
| | | |
| | |
| | | } |
| | | |
| | | 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("旧系统同步过来"); |
| | |
| | | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | */ |
| | | @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()); |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | if(result>0) { |
| | | this.sendEmeryTaskProcess(task, dispatchOrderId); |
| | | } |
| | | |
| | | return result; |
| | | } |
| | |
| | | * @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(); |
| | |
| | | // 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("旧系统同步过来"); |
| | |
| | | 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)); |
| | | |
| | | } |
| | | } |
| | | } |
| | | } |
| | | /** |
| | | * 批量删除任务管理 |
| | | * |
| | |
| | | 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; |
| | | |
| | | /** |
| | |
| | | |
| | | @Autowired |
| | | private ISysConfigService configService; |
| | | |
| | | @Autowired |
| | | private ISysDeptService deptService; |
| | | |
| | | @Autowired |
| | | protected Validator validator; |
| | |
| | | } |
| | | |
| | | /** |
| | | * 通过用户ID查询用户 |
| | | * |
| | | * @param userId 用户ID |
| | | * @return 用户对象信息 |
| | | */ |
| | | @Override |
| | | public SysUser selectUserById(Long userId) |
| | | { |
| | | return userMapper.selectUserById(userId); |
| | | } |
| | | |
| | | /** |
| | | * 通过微信OpenID查询用户 |
| | | * |
| | | * @param openId 微信OpenID |
| | |
| | | } |
| | | |
| | | /** |
| | | * 通过用户ID查询用户 |
| | | * |
| | | * @param userId 用户ID |
| | | * @return 用户对象信息 |
| | | */ |
| | | @Override |
| | | public SysUser selectUserById(Long userId) |
| | | { |
| | | return userMapper.selectUserById(userId); |
| | | } |
| | | |
| | | /** |
| | | * 查询用户所属角色组 |
| | | * |
| | | * @param userName 用户名 |
| | |
| | | { |
| | | 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); |
| | | } |
| | | |
| | | /** |
| | |
| | | * @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()); |
| | |
| | | * @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()); |
| | |
| | | * @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()); |
| | |
| | | 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(); |
| | |
| | | up.setPostId(postId); |
| | | list.add(up); |
| | | } |
| | | if (list.size() > 0) |
| | | { |
| | | userPostMapper.batchUserPost(list); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | */ |
| | | 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(); |
| | |
| | | ur.setRoleId(roleId); |
| | | list.add(ur); |
| | | } |
| | | if (list.size() > 0) |
| | | { |
| | | userRoleMapper.batchUserRole(list); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | for (Long userId : userIds) |
| | | { |
| | | checkUserAllowed(new SysUser(userId)); |
| | | checkUserDataScope(userId); |
| | | } |
| | | // 删除用户与角色关联 |
| | | userRoleMapper.deleteUserRole(userIds); |
| | |
| | | int failureNum = 0; |
| | | StringBuilder successMsg = new StringBuilder(); |
| | | StringBuilder failureMsg = new StringBuilder(); |
| | | String password = configService.selectConfigByKey("sys.user.initPassword"); |
| | | for (SysUser user : userList) |
| | | { |
| | | try |
| | |
| | | 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() + " 更新成功"); |
| | | } |
| | |
| | | @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); |
| | | } |
| | | } |
| | |
| | | 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> |
| | |
| | | <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"> |
| | |
| | | <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"> |
| | |
| | | |
| | | <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" /> |
| | |
| | | -- 用于记录各类通知消息的发送记录,实现防重机制 |
| | | -- 确保同一任务同一人同一通知类型只发送一次 |
| | | -- =========================================== |
| | | |
| | | 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='通知发送记录表'; |
| | | |
| | | -- =========================================== |
| | | -- 使用说明: |
| New file |
| | |
| | | -- 为 sys_notify_send_log 表添加 response_msg 字段 |
| | | -- 该脚本用于修复因字段缺失导致的 SQL 语法错误 |
| | | |
| | | ALTER TABLE `sys_notify_send_log` |
| | | ADD COLUMN `response_msg` text DEFAULT NULL COMMENT '响应消息'; |