From 6b29bd596f8b48485d3506bfba4a1e0ea6c7df99 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期二, 14 四月 2026 22:45:40 +0800
Subject: [PATCH] feat: 优化统计及告急处理
---
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LegacyTransferSyncServiceImpl.java | 227 ++++++++++++++++++++++++++++++++++++++++++++++----------
1 files changed, 187 insertions(+), 40 deletions(-)
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LegacyTransferSyncServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LegacyTransferSyncServiceImpl.java
index 997cc28..6c11568 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LegacyTransferSyncServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LegacyTransferSyncServiceImpl.java
@@ -3,6 +3,7 @@
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.*;
+import com.ruoyi.system.domain.SysTask;
import com.ruoyi.system.domain.SysTaskEmergency;
import com.ruoyi.system.domain.VehicleInfo;
import com.ruoyi.system.domain.enums.TaskStatus;
@@ -17,6 +18,9 @@
import com.ruoyi.system.mapper.VehicleInfoMapper;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.system.service.IWechatTaskNotifyService;
+import com.ruoyi.system.service.INotifyTaskService;
+import com.ruoyi.system.service.INotifyDispatchService;
+import com.ruoyi.system.domain.NotifyTask;
import com.ruoyi.system.utils.TaskStatusConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -28,8 +32,10 @@
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
/**
* 鏃х郴缁熻浆杩愬崟鍚屾Service涓氬姟灞傚鐞�
@@ -66,35 +72,71 @@
@Autowired
private IWechatTaskNotifyService wechatTaskNotifyService;
+ @Autowired
+ private INotifyTaskService notifyTaskService;
+
+ @Autowired
+ private INotifyDispatchService notifyDispatchService;
+
/**
* 鍚屾鎸囧畾鏃ユ湡鑼冨洿鐨勬棫绯荤粺杞繍鍗曞埌鏂扮郴缁�
- *
- * @param daysAgo 澶氬皯澶╁墠鐨勬暟鎹紙濡�7琛ㄧず7澶╁墠鐨勬暟鎹級
+ * 浼樺寲锛氬皢澶氬ぉ鑼冨洿鎷嗗垎涓洪�愬ぉ寰幆锛屾瘡娆′粎鏌ヨ1澶╂暟鎹紝閬垮厤澶ф暟鎹噺瀵艰嚧SQL Server瓒呮椂
+ *
+ * @param daysAgo 澶氬皯澶╁墠鐨勬暟鎹紙濡�7琛ㄧず鍚屾鏈�杩�7澶╃殑鏁版嵁锛�
* @return 鎴愬姛鍚屾鐨勮浆杩愬崟鏁伴噺
*/
@Override
public int syncLegacyTransferOrders(int daysAgo) {
-// log.info("寮�濮嬪悓姝}澶╁墠鐨勬棫绯荤粺杞繍鍗曟暟鎹�", daysAgo);
-
try {
// 鍙傛暟楠岃瘉
if (daysAgo <= 0) {
log.error("澶╂暟鍙傛暟蹇呴』澶т簬0");
return 0;
}
-
- // 璁$畻鏃ユ湡鑼冨洿
- Date startDate = DateUtils.addDays(new Date(), -daysAgo);
- String startDateStr = DateUtils.parseDateToStr("yyyy-MM-dd", startDate);
- String endDateStr = DateUtils.parseDateToStr("yyyy-MM-dd", new Date());
-
- // Keyset娓告爣鍒嗛〉浠� SQL Server 鎷夊彇杞繍鍗曟暟鎹紝姣忛〉 10 鏉★紝璧颁富閿储寮曞交搴曡閬胯秴鏃�
- final int PAGE_SIZE = 5;
- long lastId = 0L; // 娓告爣锛氳褰曚笂涓�椤垫渶鍚庝竴鏉$殑 ServiceOrdID锛岄娆′紶 0
- int successCount = 0;
+// log.info("[杞繍鍗曞悓姝 寮�濮嬪悓姝ワ紝鑼冨洿: 鏈�杩憑}澶�", daysAgo);
+ int totalSuccessCount = 0;
+ int totalDays = daysAgo + 1;
+
+ // 鎸夊ぉ鎷嗗垎锛屾瘡娆″彧鍚屾1澶╃殑鏁版嵁锛岄伩鍏嶅ぇ鑼冨洿鏌ヨ瓒呮椂
+ for (int i = daysAgo; i >= 0; i--) {
+ Date dayStart = DateUtils.addDays(new Date(), -i);
+ String dayStartStr = DateUtils.parseDateToStr("yyyy-MM-dd", dayStart) + " 00:00:00";
+ String dayEndStr = DateUtils.parseDateToStr("yyyy-MM-dd", dayStart) + " 23:59:59";
+
+ int dayIndex = totalDays - i;
+// log.info("[杞繍鍗曞悓姝 澶勭悊澶� {}/{}: {}", dayIndex, totalDays, dayStartStr);
+ int daySuccessCount = syncSingleDayOrders(dayStartStr, dayEndStr);
+ totalSuccessCount += daySuccessCount;
+// log.info("[杞繍鍗曞悓姝 {} 瀹屾垚锛屾柊澧炲悓姝�: {}鏉★紝绱: {}鏉�", dayStartStr, daySuccessCount, totalSuccessCount);
+ }
+
+// log.info("[杞繍鍗曞悓姝 鍏ㄩ儴瀹屾垚锛屽叡鏂板鍚屾 {}鏉�", totalSuccessCount);
+ return totalSuccessCount;
+
+ } catch (Exception e) {
+ log.error("鍚屾{}澶╁墠鐨勬棫绯荤粺杞繍鍗曟暟鎹紓甯�", daysAgo, e);
+ return 0;
+ }
+ }
+
+ /**
+ * 鍚屾鍗曞ぉ鐨勮浆杩愬崟鏁版嵁锛圞eyset娓告爣鍒嗛〉锛�
+ *
+ * @param startDateStr 寮�濮嬫棩鏈熷瓧绗︿覆锛坹yyy-MM-dd锛�
+ * @param endDateStr 缁撴潫鏃ユ湡瀛楃涓诧紙yyyy-MM-dd锛�
+ * @return 鎴愬姛鍚屾鐨勮浆杩愬崟鏁伴噺
+ */
+ private int syncSingleDayOrders(String startDateStr, String endDateStr) {
+ final int PAGE_SIZE = 5;
+ long lastId = 0L;
+ int successCount = 0;
+ int pageNum = 0;
+ int totalProcessed = 0;
+
+ try {
while (true) {
List<Map<String, Object>> transferOrders = legacyTransferSyncMapper.selectTransferOrders(startDateStr, endDateStr, lastId, PAGE_SIZE);
@@ -102,36 +144,39 @@
break;
}
+ pageNum++;
int totalCount = transferOrders.size();
int processedCount = 0;
+// log.info("[杞繍鍗曞悓姝 {} 绗瑊}椤碉紝鑾峰彇{}.鏉℃暟鎹紝lastId={}", startDateStr, pageNum, totalCount, lastId);
+
for (Map<String, Object> order : transferOrders) {
processedCount++;
+ totalProcessed++;
try {
Long serviceOrdID = MapValueUtils.getLongValue(order, "ServiceOrdID");
Long dispatchOrdID = MapValueUtils.getLongValue(order, "DispatchOrdID");
- // 妫�鏌ュ弬鏁版湁鏁堟��
if (serviceOrdID == null || serviceOrdID <= 0) {
log.warn("绗瑊}鏉℃暟鎹湇鍔″崟ID涓虹┖锛岃烦杩囧鐞�", processedCount);
continue;
}
-// log.debug("姝e湪澶勭悊绗瑊}/{}鏉¤浆杩愬崟: ServiceOrdID={}, DispatchOrdID={}",
-// processedCount, totalCount, serviceOrdID, dispatchOrdID);
-
// 妫�鏌ユ槸鍚﹀凡鍚屾
if (isTransferOrderSynced(serviceOrdID, dispatchOrdID)) {
-// log.debug("杞繍鍗曞凡鍚屾锛岃烦杩�: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
- //杩涜鏇存柊鎿嶄綔
+ log.debug("[杞繍鍗曞悓姝 宸插瓨鍦紝鎵ц鏇存柊: ServiceOrdID={}", serviceOrdID);
updateTransferOrder(serviceOrdID, dispatchOrdID, order);
continue;
}
// 鍚屾鍗曚釜杞繍鍗�
+ log.info("[杞繍鍗曞悓姝 鏂板鍚屾: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
boolean success = syncSingleTransferOrder(serviceOrdID, dispatchOrdID, order);
if (success) {
successCount++;
+ log.info("[杞繍鍗曞悓姝 鍚屾鎴愬姛: ServiceOrdID={}, 褰撳ぉ鏂板绱: {}", serviceOrdID, successCount);
+ } else {
+ log.warn("[杞繍鍗曞悓姝 鍚屾澶辫触: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
}
// 鎺у埗鍚屾棰戠巼锛岄伩鍏嶈姹傝繃蹇�
@@ -139,7 +184,7 @@
} catch (InterruptedException ie) {
log.warn("鍚屾浠诲姟琚腑鏂�");
Thread.currentThread().interrupt();
- break;
+ return successCount;
} catch (Exception e) {
log.error("鍚屾鍗曚釜杞繍鍗曞け璐�: ServiceOrdID={}, DispatchOrdID={}",
MapValueUtils.getStringValue(order, "ServiceOrdID"),
@@ -162,13 +207,12 @@
}
}
-// log.info("鍚屾瀹屾垚锛屾垚鍔熷悓姝}鏉¤浆杩愬崟鏁版嵁", successCount);
- return successCount;
-
+// log.info("[杞繍鍗曞悓姝 {} 鍒嗛〉瀹屾垚锛屽叡澶勭悊: {}鏉★紝鏂板鍚屾: {}鏉�", startDateStr, totalProcessed, successCount);
} catch (Exception e) {
- log.error("鍚屾{}澶╁墠鐨勬棫绯荤粺杞繍鍗曟暟鎹紓甯�", daysAgo, e);
- return 0;
+ log.error("鍚屾鍗曞ぉ杞繍鍗曟暟鎹紓甯�: date={}", startDateStr, e);
}
+
+ return successCount;
}
/**
@@ -288,7 +332,13 @@
// log.info("杞繍鍗曞悓姝ユ垚鍔�: ServiceOrdID={}, DispatchOrdID={}, 鍒涘缓鐨勪换鍔D={}", serviceOrdID, dispatchOrdID, result);
try {
- notifyTransferOrderByWechat((long) result, serviceOrdID, dispatchOrdID, serviceOrdNo, ServiceOrd_CC_Time, dept, order);
+ // 鐩存帴浣跨敤鏂规硶澶撮儴宸叉煡璇㈢殑 emergency 鑾峰彇 taskId
+ Long taskId = emergency.getTaskId();
+ if (taskId != null) {
+ notifyTransferOrderByWechat(taskId, serviceOrdID, dispatchOrdID, serviceOrdNo, ServiceOrd_CC_Time, dept, order);
+ } else {
+ log.warn("鏇存柊鍚庢壘涓嶅埌taskId锛岃烦杩囬�氱煡: ServiceOrdID={}", serviceOrdID);
+ }
} catch (Exception e) {
log.error("杞繍鍗曞悓姝ユ垚鍔熷悗鍙戦�佸井淇¢�氱煡澶辫触: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID, e);
}
@@ -873,27 +923,124 @@
SysDept dept,
Map<String, Object> order) {
try {
- // 鑾峰彇閫氱煡鎺ユ敹浜哄垪琛�
- List<SysUser> receivers = getWechatNotifyUsers(dispatchOrdID, dept);
- if (receivers == null || receivers.isEmpty()) {
-// log.info("鏃х郴缁熷悓姝ヨ浆杩愬崟鏃犲彲鐢ㄥ井淇℃帴鏀朵汉锛宼askId={}", taskId);
+ // 1. 鑾峰彇鎵ц浜哄垪琛�
+ List<TaskCreateVO.AssigneeInfo> assignees = queryAssignees(dispatchOrdID);
+ if (assignees.isEmpty()) {
+// log.info("鏃х郴缁熷悓姝ヨ浆杩愬崟鏃犳墽琛屼汉锛宼askId={}", taskId);
return;
}
- // 鎻愬彇鎺ユ敹浜� ID 鍒楄〃
- List<Long> userIds = new ArrayList<>();
- for (SysUser user : receivers) {
- if (user != null && user.getUserId() != null) {
- userIds.add(user.getUserId());
+ // 2. 鏌ヨ浠诲姟鑾峰彇showTaskCode
+ SysTask sysTask = sysTaskService.getTaskDetail(taskId);
+ String showTaskCode = sysTask != null ? sysTask.getShowTaskCode() : serviceOrdNo;
+
+ // 3. 鏋勫缓閫氱煡鍐呭
+ String notifyContent = buildLegacyNotifyContent(showTaskCode, serviceOrdCcTime, order);
+
+ // 4. 鏌ヨ璇askId宸叉湁鐨勯�氱煡璁板綍锛屾敹闆嗗凡瀛樺湪鐨剈serId闆嗗悎
+ List<NotifyTask> existingTasks = notifyTaskService.selectByTaskIdAndType(taskId, NotifyTask.NOTIFY_TYPE_TASK_ASSIGN);
+ Set<Long> existingUserIds = new HashSet<>();
+ List<NotifyTask> pendingTasks = new ArrayList<>();
+ if (existingTasks != null && !existingTasks.isEmpty()) {
+ for (NotifyTask t : existingTasks) {
+ existingUserIds.add(t.getUserId());
+ // 灏嗘湭瀹屾垚鐨勮褰曟敹闆嗙粰寰呭垎鍙戝垪琛�
+ if (!NotifyTask.STATUS_COMPLETED.equals(t.getStatus())) {
+ pendingTasks.add(t);
+ }
}
}
- // 璋冪敤缁熶竴鐨勫井淇¢�氱煡鏈嶅姟
- int successCount = wechatTaskNotifyService.sendTaskNotifyMessage(taskId, userIds);
-// log.info("鏃х郴缁熷悓姝ヨ浆杩愬崟寰俊閫氱煡鍙戦�佸畬鎴愶紝taskId={}, 鎴愬姛={}", taskId, successCount);
+ // 5. 鍙鏂版墽琛屼汉鍒涘缓閫氱煡浠诲姟
+ List<NotifyTask> notifyTasks = new ArrayList<>(pendingTasks);
+ for (TaskCreateVO.AssigneeInfo assignee : assignees) {
+ if (assignee == null || assignee.getUserId() == null) {
+ continue;
+ }
+ // 璇ョ敤鎴峰凡鏈夐�氱煡璁板綍锛岃烦杩�
+ if (existingUserIds.contains(assignee.getUserId())) {
+// log.info("鐢ㄦ埛宸叉湁閫氱煡璁板綍锛岃烦杩囧垱寤猴紝taskId={}, userId={}", taskId, assignee.getUserId());
+ continue;
+ }
+
+ SysUser user = sysUserService.selectUserById(assignee.getUserId());
+ if (user == null) {
+ log.warn("鎵句笉鍒版墽琛屼汉鐢ㄦ埛淇℃伅锛寀serId={}", assignee.getUserId());
+ continue;
+ }
+
+ NotifyTask notifyTask = new NotifyTask();
+ notifyTask.setTaskId(taskId);
+ notifyTask.setTaskCode(showTaskCode);
+ notifyTask.setNotifyType(NotifyTask.NOTIFY_TYPE_TASK_ASSIGN);
+ notifyTask.setUserId(user.getUserId());
+ notifyTask.setUserName(user.getNickName());
+ notifyTask.setUserPhone(user.getPhonenumber());
+ notifyTask.setTitle("杞繍鍗曚换鍔℃淳鍗曢�氱煡");
+ notifyTask.setContent(notifyContent);
+ notifyTask.setCreateBy("绯荤粺鍚屾");
+
+ NotifyTask created = notifyTaskService.createNotifyTask(notifyTask);
+ if (created != null) {
+ notifyTasks.add(created);
+// log.info("鍒涘缓閫氱煡浠诲姟鎴愬姛锛宨d={}, userId={}", created.getId(), user.getUserId());
+ }
+ }
+
+ // 6. 鍒嗗彂閫氱煡浠诲姟
+ if (!notifyTasks.isEmpty()) {
+ int successCount = notifyDispatchService.dispatchNotifies(notifyTasks);
+// log.info("鏃х郴缁熷悓姝ヨ浆杩愬崟閫氱煡鍒嗗彂瀹屾垚锛宼askId={}, 鍒嗗彂鏁伴噺={}, 鎴愬姛鏁伴噺={}",
+// taskId, notifyTasks.size(), successCount);
+ }
+// else {
+// log.info("鏃х郴缁熷悓姝ヨ浆杩愬崟鏃犻渶鏂板閫氱煡锛宼askId={}", taskId);
+// }
+
+ // 5. 鍚屾椂淇濈暀鍘熸湁鐨勫井淇¢�氱煡鏈嶅姟锛堝吋瀹癸級
+ // List<Long> userIds = new ArrayList<>();
+ // for (TaskCreateVO.AssigneeInfo assignee : assignees) {
+ // if (assignee != null && assignee.getUserId() != null) {
+ // userIds.add(assignee.getUserId());
+ // }
+ // }
+ // if (!userIds.isEmpty()) {
+ // int wxCount = wechatTaskNotifyService.sendTaskNotifyMessage(taskId, userIds);
+ // log.info("鏃х郴缁熷悓姝ヨ浆杩愬崟寰俊閫氱煡鍙戦�佸畬鎴愶紝taskId={}, 鎴愬姛={}", taskId, wxCount);
+ // }
+
} catch (Exception e) {
log.error("notifyTransferOrderByWechat鍙戠敓寮傚父, serviceOrdID={}, dispatchOrdID={}", serviceOrdID, dispatchOrdID, e);
}
+ }
+
+ /**
+ * 鏋勫缓鏃х郴缁熷悓姝ヨ浆杩愬崟鐨勯�氱煡鍐呭
+ */
+ private String buildLegacyNotifyContent(String serviceOrdNo, Date serviceOrdCcTime, Map<String, Object> order) {
+ StringBuilder content = new StringBuilder();
+ content.append("鎮ㄦ湁鏂扮殑杞繍浠诲姟锛屼换鍔″崟鍙�:").append(serviceOrdNo);
+
+ // 鍑哄彂鏃堕棿
+ if (serviceOrdCcTime != null) {
+ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+ content.append("锛屽嚭鍙戞椂闂�:").append(df.format(serviceOrdCcTime));
+ }
+
+ // 鍑哄彂鍦�
+ String departure = MapValueUtils.getStringValue(order, "ServiceOrdTraVia");
+ if (StringUtils.isNotEmpty(departure)) {
+ content.append("锛屽嚭鍙戝湴:").append(departure);
+ }
+
+ // 鐩殑鍦�
+ String destination = MapValueUtils.getStringValue(order, "ServiceOrdTraEnd");
+ if (StringUtils.isNotEmpty(destination)) {
+ content.append("锛岀洰鐨勫湴:").append(destination);
+ }
+
+ content.append("锛岃鍙婃椂澶勭悊銆�");
+ return content.toString();
}
private List<SysUser> getWechatNotifyUsers(Long dispatchOrdID, SysDept dept) {
@@ -901,7 +1048,7 @@
List<SysUser> result = new ArrayList<>();
List<TaskCreateVO.AssigneeInfo> assignees = queryAssignees(dispatchOrdID);
- if (assignees != null && !assignees.isEmpty()) {
+ if (!assignees.isEmpty()) {
for (TaskCreateVO.AssigneeInfo assigneeInfo : assignees) {
if (assigneeInfo == null || assigneeInfo.getUserId() == null) {
continue;
--
Gitblit v1.9.1