From 8cb5d3440208a3be3e772e65f1bd0ec63031ba62 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期三, 17 十二月 2025 08:37:14 +0800
Subject: [PATCH] feat: 增加服务单派发通知
---
ruoyi-system/src/main/java/com/ruoyi/system/listener/TaskMessageListener.java | 323 ++++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 280 insertions(+), 43 deletions(-)
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/listener/TaskMessageListener.java b/ruoyi-system/src/main/java/com/ruoyi/system/listener/TaskMessageListener.java
index 87a04f4..8cc98ed 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/listener/TaskMessageListener.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/listener/TaskMessageListener.java
@@ -1,5 +1,11 @@
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;
import org.springframework.beans.factory.annotation.Autowired;
@@ -8,9 +14,6 @@
import org.springframework.stereotype.Component;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.system.domain.SysMessage;
-import com.ruoyi.system.domain.SysTask;
-import com.ruoyi.system.domain.SysTaskEmergency;
import com.ruoyi.system.event.TaskCreatedEvent;
import com.ruoyi.system.event.TaskAssignedEvent;
import com.ruoyi.system.event.TaskStatusChangedEvent;
@@ -19,9 +22,15 @@
import com.ruoyi.system.mapper.SysTaskMapper;
import com.ruoyi.system.mapper.SysTaskEmergencyMapper;
import com.ruoyi.common.core.domain.entity.SysUser;
-import com.ruoyi.system.service.IWechatTaskNotifyService;
+import com.ruoyi.system.service.INotifyTaskService;
+import com.ruoyi.system.service.INotifyDispatchService;
-import java.util.HashMap;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
/**
* 浠诲姟娑堟伅鐩戝惉鍣�
@@ -48,8 +57,39 @@
private SysTaskEmergencyMapper sysTaskEmergencyMapper;
@Autowired
- private IWechatTaskNotifyService wechatTaskNotifyService;
+ private INotifyTaskService notifyTaskService;
+ @Autowired
+ private INotifyDispatchService notifyDispatchService;
+
+ /** 寰呭噯澶囩姸鎬� - 鍙互鍙戦�佺煭淇¢�氱煡 */
+ private static final String TASK_STATUS_PENDING = "PENDING";
+ /** 寰呭噯澶囩姸鎬� - 鍙互鍙戦�佺煭淇¢�氱煡 */
+ private static final String TASK_STATUS_PREPARING = "PREPARING";
+
+ @Autowired
+ private ISysTaskAssigneeService taskAssigneeService;
+
+ @Async
+ @EventListener
+ public void handleTaskDispatchEvent(TaskDispatchSyncEvent event) {
+ try{
+ log.info("鏀跺埌浠诲姟娲惧彂鍚屾浜嬩欢锛屼换鍔D锛歿}锛屼换鍔$紪鍙凤細{}锛屾淳鍙戝崟ID锛歿}", event.getTaskId(), event.getTaskCode(), event.getDispatchOrderId());
+ SysTask task=sysTaskMapper.selectSysTaskByTaskId(event.getTaskId());
+ SysTaskEmergency emergency = sysTaskEmergencyMapper.selectSysTaskEmergencyByTaskId(event.getTaskId());
+ if(emergency != null){
+ List<SysTaskAssignee> assignees=taskAssigneeService.getAssigneesByTaskId(emergency.getTaskId());
+ if(assignees!=null && !assignees.isEmpty()){
+ List<Long> assigneeIds=assignees.stream().map(SysTaskAssignee::getUserId).collect(Collectors.toList());
+ task.setEmergencyInfo( emergency);
+ sendDispatchNotify(assigneeIds, task.getCreatorId(), event.getTaskId(),task.getShowTaskCode(), buildNotifyContent(task, emergency));
+ }
+ }
+
+ }catch (Exception ex){
+ log.error("澶勭悊浠诲姟娲惧彂鍚屾浜嬩欢澶辫触", ex);
+ }
+ }
/**
* 鐩戝惉浠诲姟鍒涘缓浜嬩欢
*
@@ -92,8 +132,98 @@
}
}
+
+ @Autowired
+ private ISysDeptService sysDeptService;
+ /**
+ * 鍙湁鏈嶅姟鍗曪紝涓斿彧鍦ㄥ箍宸炲鐨勬湇鍔″崟锛屾病鏈夎皟搴﹀崟
+ * @param event
+ */
+ @Async
+ @EventListener
+ public void handleTaskOnlyServiceSync(TaskDispatchSyncEvent event){
+ //缁欒礋璐d汉鍙戦�佹秷鎭�
+ 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();
+ }
+
+
/**
* 鐩戝惉浠诲姟鍒嗛厤浜嬩欢
+ * 鍒涘缓閫氱煡浠诲姟锛岀敱閫氱煡鍒嗗彂鏈嶅姟鍐冲畾鍙戦�佹笭閬�
*
* @param event 浠诲姟鍒嗛厤浜嬩欢
*/
@@ -109,46 +239,30 @@
log.warn("鎵ц浜篒D鍒楄〃涓虹┖锛屾棤娉曟帹閫佹秷鎭�");
return;
}
-
- // 缁欐瘡涓墽琛屼汉鍙戦�佺珯鍐呮秷鎭�
- for (int i = 0; i < event.getAssigneeIds().size(); i++) {
- Long assigneeId = event.getAssigneeIds().get(i);
-
- // 鑾峰彇鎵ц浜轰俊鎭�
- SysUser assignee = sysUserMapper.selectUserById(assigneeId);
- if (assignee == null) {
- log.warn("鎵句笉鍒版墽琛屼汉淇℃伅锛岀敤鎴稩D锛歿}", assigneeId);
- continue;
- }
-
- // 鍒涘缓绔欏唴娑堟伅
- SysMessage message = new SysMessage();
- message.setMessageType("PUSH");
- message.setMessageTitle("浠诲姟鎺ㄩ��");
- message.setMessageContent("鎮ㄦ湁鏂扮殑浠诲姟锛岃鍙婃椂澶勭悊");
- message.setTaskId(event.getTaskId());
- message.setTaskCode(event.getTaskCode());
- message.setReceiverId(assigneeId);
- message.setReceiverName(assignee.getNickName());
- message.setSenderId(event.getAssignerId());
- message.setSenderName(event.getAssignerName() != null ? event.getAssignerName() : "绯荤粺");
- message.setIsRead("0");
- message.setCreateTime(DateUtils.getNowDate());
- message.setDelFlag("0");
-
- // 淇濆瓨娑堟伅
- sysMessageMapper.insertSysMessage(message);
- log.info("浠诲姟鍒嗛厤娑堟伅宸蹭繚瀛橈紝娑堟伅ID锛歿}锛屾帴鏀朵汉锛歿}", message.getMessageId(), assignee.getNickName());
+
+ // 鏌ヨ浠诲姟淇℃伅
+ SysTask task = sysTaskMapper.selectSysTaskByTaskId(event.getTaskId());
+ if (task == null) {
+ log.warn("浠诲姟涓嶅瓨鍦紝taskId={}", event.getTaskId());
+ return;
}
- // 鍙戦�佸井淇¤闃呮秷鎭紙鎺掗櫎鍒涘缓浜猴級
- try {
- SysTask task = sysTaskMapper.selectSysTaskByTaskId(event.getTaskId());
- Long creatorId = task != null ? task.getCreatorId() : null;
- wechatTaskNotifyService.sendTaskNotifyMessage(event.getTaskId(), event.getAssigneeIds(), creatorId);
- } catch (Exception e) {
- log.error("澶勭悊浠诲姟鍒嗛厤浜嬩欢鏃跺彂閫佸井淇¤闃呮秷鎭け璐�", e);
+ // 鏌ヨ鎬ユ晳鎵╁睍淇℃伅锛堢敤浜庢瀯寤洪�氱煡鍐呭锛�
+ SysTaskEmergency emergency = sysTaskEmergencyMapper.selectSysTaskEmergencyByTaskId(event.getTaskId());
+
+ Long creatorId = task.getCreatorId();
+ String taskStatus = task.getTaskStatus();
+ task.setEmergencyInfo(emergency);
+ // 浠呭湪寰呭噯澶囩姸鎬佷笅鍙戦�侀�氱煡
+ if (!TASK_STATUS_PENDING.equals(taskStatus) && !TASK_STATUS_PREPARING.equals(taskStatus)) {
+ log.info("浠诲姟鐘舵��({})闈炲緟鍑嗗鐘舵�侊紝璺宠繃閫氱煡锛宼askId={}", taskStatus, event.getTaskId());
+ return;
}
+
+ // 鏋勫缓閫氱煡鍐呭
+ String notifyContent = buildNotifyContent(task, emergency);
+ this.sendDispatchNotify(event.getAssigneeIds(), creatorId, event.getTaskId(),task.getShowTaskCode(), notifyContent);
+
} catch (Exception e) {
log.error("澶勭悊浠诲姟鍒嗛厤浜嬩欢澶辫触", e);
@@ -156,6 +270,129 @@
}
/**
+ * 鍚戞墽琛屼汉鍙戦�佷换鍔″垎閰嶉�氱煡
+ * @param assigneeIds
+ * @param creatorId
+ * @param taskId
+ * @param taskCode
+ *
+ * @param notifyContent
+ */
+
+ private void sendDispatchNotify(List<Long> assigneeIds, Long creatorId,
+ Long taskId,String taskCode,String notifyContent) {
+ // 鏀堕泦鍒涘缓鐨勯�氱煡浠诲姟
+
+ List<NotifyTask> createdTasks = new ArrayList<>();
+
+ // 涓烘瘡涓墽琛屼汉鍒涘缓閫氱煡浠诲姟
+ for (Long assigneeId : assigneeIds) {
+ // 鎺掗櫎鍒涘缓浜�
+ if (creatorId != null && creatorId.equals(assigneeId)) {
+ log.debug("璺宠繃鍒涘缓浜猴紝涓嶅彂閫佷换鍔″垎閰嶉�氱煡锛寀serId={}", assigneeId);
+ continue;
+ }
+
+ // 鑾峰彇鎵ц浜轰俊鎭�
+ SysUser assignee = sysUserMapper.selectUserById(assigneeId);
+ if (assignee == null) {
+ log.warn("鎵句笉鍒版墽琛屼汉淇℃伅锛岀敤鎴稩D锛歿}", assigneeId);
+ continue;
+ }
+
+ // 鍒涘缓閫氱煡浠诲姟锛堝甫闃查噸锛�
+ NotifyTask notifyTask = new NotifyTask();
+ notifyTask.setTaskId(taskId);
+ notifyTask.setTaskCode(taskCode);
+ notifyTask.setNotifyType(NotifyTask.NOTIFY_TYPE_TASK_ASSIGN);
+ notifyTask.setUserId(assigneeId);
+ notifyTask.setUserName(assignee.getNickName());
+ notifyTask.setUserPhone(assignee.getPhonenumber());
+ notifyTask.setTitle("杞繍鍗曚换鍔℃淳鍗曢�氱煡");
+ notifyTask.setContent(notifyContent);
+ notifyTask.setCreateBy( "绯荤粺");
+
+ NotifyTask created = notifyTaskService.createNotifyTask(notifyTask);
+ if (created != null) {
+ createdTasks.add(created);
+ log.info("鍒涘缓閫氱煡浠诲姟鎴愬姛锛宨d={}, userId={}", created.getId(), assigneeId);
+ } else {
+ log.info("閫氱煡浠诲姟宸插瓨鍦紝璺宠繃锛宼askId={}, userId={}", taskId, assigneeId);
+ }
+ }
+
+ // 鍒嗗彂閫氱煡浠诲姟
+ if (!createdTasks.isEmpty()) {
+ int successCount = notifyDispatchService.dispatchNotifies(createdTasks);
+ log.info("閫氱煡鍒嗗彂瀹屾垚锛宼askId={}锛屽垱寤烘暟閲�={}锛屾垚鍔熸暟閲�={}",
+ 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;
+ }
+ /**
+ * 鏋勫缓閫氱煡鍐呭
+ */
+ private String buildNotifyContent(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();
+ }
+
+ /**
* 鐩戝惉浠诲姟鐘舵�佸彉鏇翠簨浠�
*
* @param event 浠诲姟鐘舵�佸彉鏇翠簨浠�
--
Gitblit v1.9.1