From 364adbc9a93a396b74e154f910c2a0a72bfb1a0f Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期六, 29 十一月 2025 22:10:41 +0800
Subject: [PATCH] feat: 更新车辆里程统计
---
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java | 754 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 730 insertions(+), 24 deletions(-)
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java
index 796b509..ccff010 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java
@@ -2,10 +2,7 @@
import java.io.*;
import java.math.BigDecimal;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.ArrayList;
+import java.util.*;
import java.util.stream.Collectors;
import java.net.HttpURLConnection;
import java.net.URL;
@@ -39,7 +36,9 @@
import com.ruoyi.system.domain.VehicleInfo;
import com.ruoyi.system.service.ISysTaskService;
import com.ruoyi.system.service.ILegacySystemSyncService;
+import com.ruoyi.system.service.ISysTaskEmergencyService;
import com.ruoyi.system.service.ITaskAttachmentSyncService;
+import com.ruoyi.system.service.IMapService;
import com.ruoyi.system.event.TaskCreatedEvent;
import com.ruoyi.system.event.TaskAssignedEvent;
import com.ruoyi.system.event.TaskStatusChangedEvent;
@@ -87,6 +86,9 @@
private ILegacySystemSyncService legacySystemSyncService;
@Autowired
+ private ISysTaskEmergencyService sysTaskEmergencyService;
+
+ @Autowired
private ApplicationEventPublisher eventPublisher;
@Autowired
@@ -97,6 +99,9 @@
@Autowired
private SysUserMapper sysUserMapper;
+
+ @Autowired(required = false)
+ private IMapService mapService;
/**
* 鏌ヨ浠诲姟绠$悊
@@ -142,6 +147,7 @@
@Override
@Transactional
public int insertSysTask(TaskCreateVO createVO) {
+ String username = SecurityUtils.getUsername();
SysTask task = new SysTask();
task.setTaskCode(generateTaskCode());
task.setTaskType(createVO.getTaskType());
@@ -153,9 +159,9 @@
task.setCreatorId(SecurityUtils.getUserId());
// 浼樺厛浣跨敤鍓嶇浼犲叆鐨勯儴闂↖D锛屽鏋滄病鏈夊垯浣跨敤褰撳墠鐢ㄦ埛鐨勯儴闂↖D
task.setDeptId(createVO.getDeptId() != null ? createVO.getDeptId() : SecurityUtils.getDeptId());
- task.setCreateBy(SecurityUtils.getUsername());
+ task.setCreateBy(username);
task.setCreateTime(DateUtils.getNowDate());
- task.setUpdateBy(SecurityUtils.getUsername());
+ task.setUpdateBy(username);
task.setUpdateTime(DateUtils.getNowDate());
task.setRemark(createVO.getRemark());
task.setDelFlag("0");
@@ -206,6 +212,44 @@
task.setEstimatedDistance(createVO.getDistance());
}
+ // 鑷姩鑾峰彇鍑哄彂鍦癎PS鍧愭爣锛堝鏋滅己澶憋級
+ if (task.getDepartureAddress() != null &&
+ (task.getDepartureLongitude() == null || task.getDepartureLatitude() == null) &&
+ mapService != null) {
+ try {
+ Map<String, Double> coords = mapService.geocoding(
+ task.getDepartureAddress(),
+ extractCityFromAddress(task.getDepartureAddress())
+ );
+ if (coords != null) {
+ task.setDepartureLongitude(BigDecimal.valueOf(coords.get("lng")));
+ task.setDepartureLatitude(BigDecimal.valueOf(coords.get("lat")));
+ log.info("鍑哄彂鍦癎PS鍧愭爣鑷姩鑾峰彇鎴愬姛: {}, {}", coords.get("lng"), coords.get("lat"));
+ }
+ } catch (Exception e) {
+ log.error("鑷姩鑾峰彇鍑哄彂鍦癎PS鍧愭爣澶辫触", e);
+ }
+ }
+
+ // 鑷姩鑾峰彇鐩殑鍦癎PS鍧愭爣锛堝鏋滅己澶憋級
+ if (task.getDestinationAddress() != null &&
+ (task.getDestinationLongitude() == null || task.getDestinationLatitude() == null) &&
+ mapService != null) {
+ try {
+ Map<String, Double> coords = mapService.geocoding(
+ task.getDestinationAddress(),
+ extractCityFromAddress(task.getDestinationAddress())
+ );
+ if (coords != null) {
+ task.setDestinationLongitude(BigDecimal.valueOf(coords.get("lng")));
+ task.setDestinationLatitude(BigDecimal.valueOf(coords.get("lat")));
+ log.info("鐩殑鍦癎PS鍧愭爣鑷姩鑾峰彇鎴愬姛: {}, {}", coords.get("lng"), coords.get("lat"));
+ }
+ } catch (Exception e) {
+ log.error("鑷姩鑾峰彇鐩殑鍦癎PS鍧愭爣澶辫触", e);
+ }
+ }
+
int result = sysTaskMapper.insertSysTask(task);
// 淇濆瓨杞﹁締鍏宠仈淇℃伅
@@ -228,17 +272,17 @@
// 淇濆瓨鎵ц浜哄憳淇℃伅锛堝寘鍚鑹茬被鍨嬶級
if (result > 0 && createVO.getAssignees() != null && !createVO.getAssignees().isEmpty()) {
- saveTaskAssignees(task.getTaskId(), createVO.getAssignees());
+ saveTaskAssignees(task.getTaskId(), createVO.getAssignees(),username);
}
// 淇濆瓨鎬ユ晳杞繍鎵╁睍淇℃伅
if (result > 0 && "EMERGENCY_TRANSFER".equals(createVO.getTaskType())) {
- saveEmergencyInfo(task.getTaskId(), createVO);
+ saveEmergencyInfo(task.getTaskId(),username, createVO,null,null);
}
// 淇濆瓨绂忕杞︽墿灞曚俊鎭�
if (result > 0 && "WELFARE".equals(createVO.getTaskType())) {
- saveWelfareInfo(task.getTaskId(), createVO);
+ saveWelfareInfo(task.getTaskId(),SecurityUtils.getUsername(), createVO);
}
// 璁板綍鎿嶄綔鏃ュ織
@@ -296,6 +340,208 @@
}
/**
+ * 鏂板浠诲姟绠$悊锛堝厑璁镐粠澶栭儴浼犲叆鐢ㄦ埛淇℃伅銆侀儴闂ㄤ俊鎭拰鏃堕棿淇℃伅锛�
+ *
+ * @param createVO 浠诲姟鍒涘缓瀵硅薄
+ * @param userId 鐢ㄦ埛ID
+ * @param deptId 閮ㄩ棬ID
+ * @param createTime 鍒涘缓鏃堕棿
+ * @param updateTime 鏇存柊鏃堕棿
+ * @return 缁撴灉
+ */
+ @Override
+ @Transactional
+ public int insertTask(TaskCreateVO createVO,String serviceOrderId,String dispatchOrderId, Long userId,String userName, Long deptId, Date createTime, Date updateTime) {
+ SysTask task = new SysTask();
+ if(createVO.getTaskCode()!=null){
+ task.setTaskCode(createVO.getTaskCode());
+ }else{
+ task.setTaskCode(generateTaskCode());
+ }
+ task.setTaskType(createVO.getTaskType());
+ task.setTaskStatus(TaskStatus.PENDING.getCode());
+ task.setTaskDescription(createVO.getTaskDescription());
+ task.setPlannedStartTime(createVO.getPlannedStartTime());
+ task.setPlannedEndTime(createVO.getPlannedEndTime());
+ task.setActualStartTime(createVO.getActualStartTime());
+ task.setActualEndTime(createVO.getActualEndTime());
+ task.setAssigneeId(createVO.getAssigneeId());
+ // 浣跨敤澶栭儴浼犲叆鐨勭敤鎴稩D鍜岄儴闂↖D
+ task.setCreatorId(userId);
+ task.setDeptId(deptId);
+ task.setCreateBy(userName);
+ // 浣跨敤澶栭儴浼犲叆鐨勫垱寤烘椂闂村拰鏇存柊鏃堕棿
+ task.setCreateTime(createTime);
+ task.setUpdateTime(updateTime);
+ task.setUpdateBy(userName);
+ task.setRemark(createVO.getRemark());
+ task.setDelFlag("0");
+
+
+
+ // 璁剧疆閫氱敤鍦板潃鍜屽潗鏍囦俊鎭�
+ if (createVO.getDepartureAddress() != null) {
+ task.setDepartureAddress(createVO.getDepartureAddress());
+ }
+ if (createVO.getDestinationAddress() != null) {
+ task.setDestinationAddress(createVO.getDestinationAddress());
+ }
+ if (createVO.getDepartureLongitude() != null) {
+ task.setDepartureLongitude(createVO.getDepartureLongitude());
+ }
+ if (createVO.getDepartureLatitude() != null) {
+ task.setDepartureLatitude(createVO.getDepartureLatitude());
+ }
+ if (createVO.getDestinationLongitude() != null) {
+ task.setDestinationLongitude(createVO.getDestinationLongitude());
+ }
+ if (createVO.getDestinationLatitude() != null) {
+ task.setDestinationLatitude(createVO.getDestinationLatitude());
+ }
+ if (createVO.getEstimatedDistance() != null) {
+ task.setEstimatedDistance(createVO.getEstimatedDistance());
+ }
+
+ // 璁剧疆鎬ユ晳杞繍鐗瑰畾淇℃伅
+ if (createVO.getTransferTime() != null) {
+ task.setPlannedStartTime(createVO.getTransferTime());
+ }
+ if (createVO.getTransferDistance() != null) {
+ task.setEstimatedDistance(createVO.getTransferDistance());
+ }
+
+ // 璁剧疆绂忕杞︾壒瀹氫俊鎭�
+ if (createVO.getPlannedStartTime() != null) {
+ task.setPlannedStartTime(createVO.getPlannedStartTime());
+ }
+ if (createVO.getStartAddress() != null) {
+ task.setDepartureAddress(createVO.getStartAddress());
+ }
+ if (createVO.getEndAddress() != null) {
+ task.setDestinationAddress(createVO.getEndAddress());
+ }
+ // 璁剧疆绂忕杞﹀叕閲屾暟
+ if (createVO.getDistance() != null) {
+ task.setEstimatedDistance(createVO.getDistance());
+ }
+
+ // 鑷姩鑾峰彇鍑哄彂鍦癎PS鍧愭爣锛堝鏋滅己澶憋級
+ if (task.getDepartureAddress() != null &&
+ (task.getDepartureLongitude() == null || task.getDepartureLatitude() == null) &&
+ mapService != null) {
+ try {
+ Map<String, Double> coords = mapService.geocoding(
+ task.getDepartureAddress(),
+ extractCityFromAddress(task.getDepartureAddress())
+ );
+ if (coords != null) {
+ task.setDepartureLongitude(BigDecimal.valueOf(coords.get("lng")));
+ task.setDepartureLatitude(BigDecimal.valueOf(coords.get("lat")));
+ log.info("鍑哄彂鍦癎PS鍧愭爣鑷姩鑾峰彇鎴愬姛: {}, {}", coords.get("lng"), coords.get("lat"));
+ }
+ } catch (Exception e) {
+ log.error("鑷姩鑾峰彇鍑哄彂鍦癎PS鍧愭爣澶辫触", e);
+ }
+ }
+
+ // 鑷姩鑾峰彇鐩殑鍦癎PS鍧愭爣锛堝鏋滅己澶憋級
+ if (task.getDestinationAddress() != null &&
+ (task.getDestinationLongitude() == null || task.getDestinationLatitude() == null) &&
+ mapService != null) {
+ try {
+ Map<String, Double> coords = mapService.geocoding(
+ task.getDestinationAddress(),
+ extractCityFromAddress(task.getDestinationAddress())
+ );
+ if (coords != null) {
+ task.setDestinationLongitude(BigDecimal.valueOf(coords.get("lng")));
+ task.setDestinationLatitude(BigDecimal.valueOf(coords.get("lat")));
+ log.info("鐩殑鍦癎PS鍧愭爣鑷姩鑾峰彇鎴愬姛: {}, {}", coords.get("lng"), coords.get("lat"));
+ }
+ } catch (Exception e) {
+ log.error("鑷姩鑾峰彇鐩殑鍦癎PS鍧愭爣澶辫触", e);
+ }
+ }
+
+ int result = sysTaskMapper.insertSysTask(task);
+
+ // 淇濆瓨杞﹁締鍏宠仈淇℃伅
+ if (result > 0 && createVO.getVehicleIds() != null && !createVO.getVehicleIds().isEmpty()) {
+ for (Long vehicleId : createVO.getVehicleIds()) {
+ SysTaskVehicle taskVehicle = new SysTaskVehicle();
+ taskVehicle.setTaskId(task.getTaskId());
+ taskVehicle.setVehicleId(vehicleId);
+ taskVehicle.setAssignTime(updateTime);
+ taskVehicle.setAssignBy(userName);
+ taskVehicle.setStatus("ASSIGNED");
+ taskVehicle.setCreateBy(userName);
+ taskVehicle.setCreateTime(createTime);
+ taskVehicle.setUpdateBy(userName);
+ taskVehicle.setUpdateTime(updateTime);
+
+ sysTaskVehicleMapper.insertSysTaskVehicle(taskVehicle);
+ }
+ }
+
+ // 淇濆瓨鎵ц浜哄憳淇℃伅锛堝寘鍚鑹茬被鍨嬶級
+ if (result > 0 && createVO.getAssignees() != null && !createVO.getAssignees().isEmpty()) {
+ saveTaskAssignees(task.getTaskId(), createVO.getAssignees(),userName);
+ }
+
+ // 淇濆瓨鎬ユ晳杞繍鎵╁睍淇℃伅
+ if (result > 0 && "EMERGENCY_TRANSFER".equals(createVO.getTaskType())) {
+ saveEmergencyInfo(task.getTaskId(),userName, createVO, serviceOrderId, dispatchOrderId);
+ }
+
+ // 淇濆瓨绂忕杞︽墿灞曚俊鎭�
+ if (result > 0 && "WELFARE".equals(createVO.getTaskType())) {
+ saveWelfareInfo(task.getTaskId(),userName, createVO);
+ }
+
+ // 璁板綍鎿嶄綔鏃ュ織
+ if (result > 0) {
+ recordTaskLog(task.getTaskId(), "CREATE", "鍒涘缓浠诲姟", null,
+ "浠诲姟绫诲瀷锛�" + createVO.getTaskType(), userId, userName);
+ }
+
+ // 鍙戝竷浠诲姟鍒涘缓浜嬩欢
+ if (result > 0) {
+ eventPublisher.publishEvent(new TaskCreatedEvent(
+ this,
+ task.getTaskId(),
+ task.getTaskCode(),
+ task.getTaskType(),
+ userId,
+ userName
+ ));
+ }
+
+ // 鍙戝竷浠诲姟鍒嗛厤浜嬩欢
+ if (result > 0 && createVO.getAssignees() != null && !createVO.getAssignees().isEmpty()) {
+ List<Long> assigneeIds = createVO.getAssignees().stream()
+ .map(assignee -> assignee.getUserId())
+ .collect(Collectors.toList());
+ List<String> assigneeNames = createVO.getAssignees().stream()
+ .map(assignee -> assignee.getUserName())
+ .collect(Collectors.toList());
+
+ eventPublisher.publishEvent(new TaskAssignedEvent(
+ this,
+ task.getTaskId(),
+ task.getTaskCode(),
+ assigneeIds,
+ assigneeNames,
+ userId,
+ userName
+ ));
+ }
+
+
+
+ return result;
+ }
+
+ /**
* 淇敼浠诲姟绠$悊
*
* @param updateVO 浠诲姟鏇存柊瀵硅薄
@@ -325,10 +571,178 @@
task.setUpdateTime(DateUtils.getNowDate());
task.setRemark(updateVO.getRemark());
+ // 濡傛灉鏇存柊浜嗛儴闂↖D
+ if (updateVO.getDeptId() != null) {
+ task.setDeptId(updateVO.getDeptId());
+ }
+
+ // 鑷姩鑾峰彇鍑哄彂鍦癎PS鍧愭爣锛堝鏋滄洿鏂颁簡鍦板潃浣嗙己澶卞潗鏍囷級
+ if (updateVO.getDepartureAddress() != null &&
+ (updateVO.getDepartureLongitude() == null || updateVO.getDepartureLatitude() == null) &&
+ mapService != null) {
+ try {
+ Map<String, Double> coords = mapService.geocoding(
+ updateVO.getDepartureAddress(),
+ extractCityFromAddress(updateVO.getDepartureAddress())
+ );
+ if (coords != null) {
+ task.setDepartureLongitude(BigDecimal.valueOf(coords.get("lng")));
+ task.setDepartureLatitude(BigDecimal.valueOf(coords.get("lat")));
+ log.info("鍑哄彂鍦癎PS鍧愭爣鑷姩鑾峰彇鎴愬姛: {}, {}", coords.get("lng"), coords.get("lat"));
+ }
+ } catch (Exception e) {
+ log.error("鑷姩鑾峰彇鍑哄彂鍦癎PS鍧愭爣澶辫触", e);
+ }
+ }
+
+ // 鑷姩鑾峰彇鐩殑鍦癎PS鍧愭爣锛堝鏋滄洿鏂颁簡鍦板潃浣嗙己澶卞潗鏍囷級
+ if (updateVO.getDestinationAddress() != null &&
+ (updateVO.getDestinationLongitude() == null || updateVO.getDestinationLatitude() == null) &&
+ mapService != null) {
+ try {
+ Map<String, Double> coords = mapService.geocoding(
+ updateVO.getDestinationAddress(),
+ extractCityFromAddress(updateVO.getDestinationAddress())
+ );
+ if (coords != null) {
+ task.setDestinationLongitude(BigDecimal.valueOf(coords.get("lng")));
+ task.setDestinationLatitude(BigDecimal.valueOf(coords.get("lat")));
+ log.info("鐩殑鍦癎PS鍧愭爣鑷姩鑾峰彇鎴愬姛: {}, {}", coords.get("lng"), coords.get("lat"));
+ }
+ } catch (Exception e) {
+ log.error("鑷姩鑾峰彇鐩殑鍦癎PS鍧愭爣澶辫触", e);
+ }
+ }
+
// 閲嶆柊璁$畻棰勮鍏噷鏁�
calculateEstimatedDistance(task);
int result = sysTaskMapper.updateSysTask(task);
+
+ // 鐢ㄤ簬璺熻釜鏄惁闇�瑕侀噸鏂板悓姝ワ紙杞﹁締銆佷汉鍛樸�佸湴鍧�銆佹垚浜や环鍙樻洿锛�
+ boolean needResync = false;
+
+ // 鏇存柊杞﹁締鍏宠仈
+ if (result > 0 && updateVO.getVehicleIds() != null && !updateVO.getVehicleIds().isEmpty()) {
+ // 鏌ヨ鐜版湁鐨勮溅杈嗗叧鑱�
+ List<SysTaskVehicle> existingVehicles = sysTaskVehicleMapper.selectSysTaskVehicleByTaskId(updateVO.getTaskId());
+ List<Long> existingVehicleIds = existingVehicles.stream()
+ .map(SysTaskVehicle::getVehicleId)
+ .collect(Collectors.toList());
+
+ // 姣旇緝鏂版棫杞﹁締ID鍒楄〃锛屽垽鏂槸鍚︽湁鍙樺寲
+ boolean vehiclesChanged = !new HashSet<>(existingVehicleIds).equals(new HashSet<>(updateVO.getVehicleIds()));
+
+ // 鍙湁杞﹁締鍙戠敓鍙樺寲鏃舵墠鏇存柊
+ if (vehiclesChanged) {
+ // 鍒犻櫎鏃х殑杞﹁締鍏宠仈
+ sysTaskVehicleMapper.deleteSysTaskVehicleByTaskId(updateVO.getTaskId());
+
+ // 娣诲姞鏂扮殑杞﹁締鍏宠仈
+ Date now = DateUtils.getNowDate();
+ String currentUser = SecurityUtils.getUsername();
+ for (Long vehicleId : updateVO.getVehicleIds()) {
+ SysTaskVehicle taskVehicle = new SysTaskVehicle();
+ taskVehicle.setTaskId(updateVO.getTaskId());
+ taskVehicle.setVehicleId(vehicleId);
+ taskVehicle.setAssignTime(now);
+ taskVehicle.setAssignBy(currentUser);
+ taskVehicle.setCreateTime(now);
+ sysTaskVehicleMapper.insertSysTaskVehicle(taskVehicle);
+ }
+
+ // 鏍囪闇�瑕侀噸鏂板悓姝ワ紙杞﹁締鍙樻洿锛�
+ needResync = true;
+ }
+ }
+
+ // 鏇存柊鎵ц浜哄憳锛堟娴嬩汉鍛樺彉鏇达級
+ if (result > 0 && updateVO.getAssignees() != null) {
+ // 鏌ヨ鐜版湁鐨勬墽琛屼汉鍛�
+ List<SysTaskAssignee> existingAssignees = sysTaskAssigneeMapper.selectSysTaskAssigneeByTaskId(updateVO.getTaskId());
+ List<Long> existingAssigneeIds = existingAssignees.stream()
+ .map(SysTaskAssignee::getUserId)
+ .collect(Collectors.toList());
+
+ List<Long> newAssigneeIds = updateVO.getAssignees().stream()
+ .map(TaskUpdateVO.AssigneeInfo::getUserId)
+ .collect(Collectors.toList());
+
+ // 姣旇緝鏂版棫鎵ц浜哄憳ID鍒楄〃锛屽垽鏂槸鍚︽湁鍙樺寲
+ boolean assigneesChanged = !new HashSet<>(existingAssigneeIds).equals(new HashSet<>(newAssigneeIds));
+
+ // 鍙湁鎵ц浜哄憳鍙戠敓鍙樺寲鏃舵墠鏇存柊
+ if (assigneesChanged) {
+ // 鍒犻櫎鏃х殑鎵ц浜哄憳鍏宠仈
+ sysTaskAssigneeMapper.deleteSysTaskAssigneeByTaskId(updateVO.getTaskId());
+
+ // 娣诲姞鏂扮殑鎵ц浜哄憳鍏宠仈
+ if (!updateVO.getAssignees().isEmpty()) {
+ // 灏� TaskUpdateVO.AssigneeInfo 杞崲涓� TaskCreateVO.AssigneeInfo
+ List<TaskCreateVO.AssigneeInfo> createAssignees = updateVO.getAssignees().stream()
+ .map(assignee -> {
+ TaskCreateVO.AssigneeInfo createAssignee = new TaskCreateVO.AssigneeInfo();
+ createAssignee.setUserId(assignee.getUserId());
+ createAssignee.setUserName(assignee.getUserName());
+ createAssignee.setUserType(assignee.getUserType());
+ return createAssignee;
+ })
+ .collect(Collectors.toList());
+ saveTaskAssignees(updateVO.getTaskId(), createAssignees, SecurityUtils.getUsername());
+ }
+
+ // 鏍囪闇�瑕侀噸鏂板悓姝ワ紙浜哄憳鍙樻洿锛�
+ needResync = true;
+ }
+ }
+
+ // 鏇存柊鎬ユ晳杞繍鎵╁睍淇℃伅锛堟娴嬪湴鍧�鍜屾垚浜や环鍙樻洿锛�
+ if (result > 0 && "EMERGENCY_TRANSFER".equals(oldTask.getTaskType()) && updateVO.getEmergencyInfo() != null) {
+ // 鑾峰彇鏃х殑鎬ユ晳杞繍淇℃伅
+ SysTaskEmergency oldEmergency = sysTaskEmergencyMapper.selectSysTaskEmergencyByTaskId(updateVO.getTaskId());
+
+ // 妫�娴嬭浆鍑哄尰闄㈠湴鍧�鍙樻洿
+ boolean hospitalOutAddressChanged = false;
+ if (updateVO.getEmergencyInfo().getHospitalOutAddress() != null
+ && oldEmergency != null
+ && !updateVO.getEmergencyInfo().getHospitalOutAddress().equals(oldEmergency.getHospitalOutAddress())) {
+ hospitalOutAddressChanged = true;
+ }
+
+ // 妫�娴嬭浆鍏ュ尰闄㈠湴鍧�鍙樻洿
+ boolean hospitalInAddressChanged = false;
+ if (updateVO.getEmergencyInfo().getHospitalInAddress() != null
+ && oldEmergency != null
+ && !updateVO.getEmergencyInfo().getHospitalInAddress().equals(oldEmergency.getHospitalInAddress())) {
+ hospitalInAddressChanged = true;
+ }
+
+ // 妫�娴嬫垚浜や环鍙樻洿
+ boolean transferPriceChanged = false;
+ if (updateVO.getEmergencyInfo().getTransferPrice() != null
+ && oldEmergency != null
+ && oldEmergency.getTransferPrice() != null
+ && updateVO.getEmergencyInfo().getTransferPrice().compareTo(oldEmergency.getTransferPrice()) != 0) {
+ transferPriceChanged = true;
+ }
+
+ // 鏇存柊鎬ユ晳杞繍淇℃伅
+ updateEmergencyInfo(updateVO.getTaskId(), updateVO);
+
+ // 濡傛灉鍦板潃鎴栨垚浜や环鍙戠敓鍙樻洿锛屾爣璁伴渶瑕侀噸鏂板悓姝�
+ if (hospitalOutAddressChanged || hospitalInAddressChanged || transferPriceChanged) {
+ needResync = true;
+ }
+ }
+
+ // 濡傛灉鏄�ユ晳杞繍浠诲姟涓旀湁鍙樻洿锛屾爣璁伴渶瑕侀噸鏂板悓姝�
+ if (result > 0 && "EMERGENCY_TRANSFER".equals(oldTask.getTaskType()) && needResync) {
+ try {
+ sysTaskEmergencyService.markNeedResync(updateVO.getTaskId());
+ } catch (Exception e) {
+ // 鏍囪澶辫触涓嶅奖鍝嶄富娴佺▼
+ }
+ }
// 璁板綍鎿嶄綔鏃ュ織
if (result > 0) {
@@ -538,7 +952,7 @@
recordTaskLog(taskId, "UPDATE", "涓婁紶闄勪欢", null,
"涓婁紶鏂囦欢锛�" + file.getOriginalFilename() + "(鍒嗙被锛�" + categoryDesc + ")",
SecurityUtils.getUserId(), SecurityUtils.getUsername());
-
+
}
@@ -598,7 +1012,7 @@
recordTaskLog(taskId, "UPDATE", "涓婁紶闄勪欢", null,
"閫氳繃寰俊涓婁紶鏂囦欢锛�" + fileName + "(鍒嗙被锛�" + categoryDesc + ")",
SecurityUtils.getUserId(), SecurityUtils.getUsername());
-
+
}
@@ -947,6 +1361,8 @@
task.setAttachments(attachments);
// 鏌ヨ鎿嶄綔鏃ュ織
task.setOperationLogs(sysTaskLogMapper.selectSysTaskLogByTaskId(taskId));
+ // 鏌ヨ鎵ц浜哄憳鍒楄〃
+ task.setAssignees(sysTaskAssigneeMapper.selectSysTaskAssigneeByTaskId(taskId));
// 鍔犺浇鎬ユ晳杞繍鎵╁睍淇℃伅
if ("EMERGENCY_TRANSFER".equals(task.getTaskType())) {
SysTaskEmergency emergencyInfo = sysTaskEmergencyMapper.selectSysTaskEmergencyByTaskId(taskId);
@@ -973,6 +1389,70 @@
return sysTaskMapper.selectActiveTasksByVehicleId(vehicleId);
}
+ /**
+ * 妫�鏌ヤ换鍔℃槸鍚﹀凡鍏宠仈鏃х郴缁熸湇鍔″崟ID
+ *
+ * @param taskId 浠诲姟ID
+ * @return true-宸插叧鑱旓紝false-鏈叧鑱�
+ */
+ @Override
+ public boolean hasLegacyServiceOrdId(Long taskId) {
+ // 鍙湁鎬ユ晳杞繍浠诲姟鎵嶆湁鏃х郴缁烮D
+ SysTask task = sysTaskMapper.selectSysTaskByTaskId(taskId);
+ if (task != null && "EMERGENCY_TRANSFER".equals(task.getTaskType())) {
+ SysTaskEmergency emergencyInfo = sysTaskEmergencyMapper.selectSysTaskEmergencyByTaskId(taskId);
+ return emergencyInfo != null && emergencyInfo.getLegacyServiceOrdId() != null;
+ }
+ return false;
+ }
+
+ /**
+ * 妫�鏌ヤ换鍔℃槸鍚﹀凡鍏宠仈鏃х郴缁熻皟搴﹀崟ID
+ *
+ * @param taskId 浠诲姟ID
+ * @return true-宸插叧鑱旓紝false-鏈叧鑱�
+ */
+ @Override
+ public boolean hasLegacyDispatchOrdId(Long taskId) {
+ // 鍙湁鎬ユ晳杞繍浠诲姟鎵嶆湁鏃х郴缁烮D
+ SysTask task = sysTaskMapper.selectSysTaskByTaskId(taskId);
+ if (task != null && "EMERGENCY_TRANSFER".equals(task.getTaskType())) {
+ SysTaskEmergency emergencyInfo = sysTaskEmergencyMapper.selectSysTaskEmergencyByTaskId(taskId);
+ return emergencyInfo != null && emergencyInfo.getLegacyDispatchOrdId() != null;
+ }
+ return false;
+ }
+
+ /**
+ * 鏍规嵁鏃х郴缁熸湇鍔″崟ID妫�鏌ユ槸鍚﹀瓨鍦ㄤ换鍔�
+ *
+ * @param legacyServiceOrdId 鏃х郴缁熸湇鍔″崟ID
+ * @return true-瀛樺湪锛宖alse-涓嶅瓨鍦�
+ */
+ @Override
+ public boolean existsByLegacyServiceOrdId(Long legacyServiceOrdId) {
+ if (legacyServiceOrdId == null) {
+ return false;
+ }
+ SysTaskEmergency emergencyInfo = sysTaskEmergencyMapper.selectByLegacyServiceOrdId(legacyServiceOrdId);
+ return emergencyInfo != null;
+ }
+
+ /**
+ * 鏍规嵁鏃х郴缁熻皟搴﹀崟ID妫�鏌ユ槸鍚﹀瓨鍦ㄤ换鍔�
+ *
+ * @param legacyDispatchOrdId 鏃х郴缁熻皟搴﹀崟ID
+ * @return true-瀛樺湪锛宖alse-涓嶅瓨鍦�
+ */
+ @Override
+ public boolean existsByLegacyDispatchOrdId(Long legacyDispatchOrdId) {
+ if (legacyDispatchOrdId == null) {
+ return false;
+ }
+ SysTaskEmergency emergencyInfo = sysTaskEmergencyMapper.selectByLegacyDispatchOrdId(legacyDispatchOrdId);
+ return emergencyInfo != null;
+ }
+
@Autowired
private TaskCodeGenerator taskCodeGenerator;
@@ -983,6 +1463,30 @@
*/
private String generateTaskCode() {
return taskCodeGenerator.generateTaskCode();
+ }
+
+ /**
+ * 浠庡湴鍧�涓彁鍙栧煄甯傚悕绉帮紙鐢ㄤ簬鍦板浘鍦扮悊缂栫爜锛�
+ *
+ * @param address 鍦板潃
+ * @return 鍩庡競鍚嶇О
+ */
+ private String extractCityFromAddress(String address) {
+ if (address == null || address.trim().isEmpty()) {
+ return null;
+ }
+
+ // 甯歌鍩庡競鍚嶅垪琛�
+ String[] cities = {"骞垮窞", "娣卞湷", "涓滆帪", "浣涘北", "鐝犳捣", "鎯犲窞", "涓北", "姹熼棬", "婀涙睙", "鑲囧簡", "娓呰繙", "闊跺叧", "姊呭窞", "娌虫簮", "娼窞", "鎻槼", "姹曞ご", "姹曞熬", "浜戞诞", "闃虫睙","鍖椾含","涓婃捣","澶╂触"};
+
+
+ for (String city : cities) {
+ if (address.contains(city)) {
+ return city;
+ }
+ }
+
+ return null;
}
/**
@@ -1105,14 +1609,14 @@
* @param taskId 浠诲姟ID
* @param assignees 鎵ц浜哄憳淇℃伅鍒楄〃
*/
- private void saveTaskAssignees(Long taskId, java.util.List<TaskCreateVO.AssigneeInfo> assignees) {
+ private void saveTaskAssignees(Long taskId, java.util.List<TaskCreateVO.AssigneeInfo> assignees,String userName) {
if (assignees == null || assignees.isEmpty()) {
return;
}
java.util.List<SysTaskAssignee> taskAssignees = new java.util.ArrayList<>();
Date now = DateUtils.getNowDate();
- String currentUser = SecurityUtils.getUsername();
+ String currentUser = userName;
for (int i = 0; i < assignees.size(); i++) {
TaskCreateVO.AssigneeInfo assigneeInfo = assignees.get(i);
@@ -1145,7 +1649,7 @@
* @param taskId 浠诲姟ID
* @param createVO 浠诲姟鍒涘缓瀵硅薄
*/
- private void saveEmergencyInfo(Long taskId, TaskCreateVO createVO) {
+ private void saveEmergencyInfo(Long taskId,String createUserName, TaskCreateVO createVO,String serviceOrderId,String dispatchOrderId) {
SysTaskEmergency emergencyInfo = new SysTaskEmergency();
emergencyInfo.setTaskId(taskId);
@@ -1167,8 +1671,27 @@
emergencyInfo.setHospitalOutDepartmentId(createVO.getHospitalOut().getDepartmentId());
emergencyInfo.setHospitalOutBedNumber(createVO.getHospitalOut().getBedNumber());
emergencyInfo.setHospitalOutAddress(createVO.getHospitalOut().getAddress());
- emergencyInfo.setHospitalOutLongitude(createVO.getHospitalOut().getLongitude());
- emergencyInfo.setHospitalOutLatitude(createVO.getHospitalOut().getLatitude());
+
+ // GPS鍧愭爣锛氫紭鍏堜娇鐢ㄥ墠绔紶鍏ョ殑锛屽惁鍒欏悗绔嚜鍔ㄨ幏鍙�
+ if (createVO.getHospitalOut().getLongitude() != null && createVO.getHospitalOut().getLatitude() != null) {
+ emergencyInfo.setHospitalOutLongitude(createVO.getHospitalOut().getLongitude());
+ emergencyInfo.setHospitalOutLatitude(createVO.getHospitalOut().getLatitude());
+ } else if (mapService != null && createVO.getHospitalOut().getAddress() != null) {
+ // 鍚庣鑷姩鑾峰彇GPS鍧愭爣
+ try {
+ Map<String, Double> coords = mapService.geocoding(
+ createVO.getHospitalOut().getAddress(),
+ extractCityFromAddress(createVO.getHospitalOut().getAddress())
+ );
+ if (coords != null) {
+ emergencyInfo.setHospitalOutLongitude(BigDecimal.valueOf(coords.get("lng")));
+ emergencyInfo.setHospitalOutLatitude(BigDecimal.valueOf(coords.get("lat")));
+ log.info("杞嚭鍖婚櫌GPS鍧愭爣鑷姩鑾峰彇鎴愬姛: {}, {}", coords.get("lng"), coords.get("lat"));
+ }
+ } catch (Exception e) {
+ log.error("鑷姩鑾峰彇杞嚭鍖婚櫌GPS鍧愭爣澶辫触", e);
+ }
+ }
}
// 璁剧疆杞叆鍖婚櫌淇℃伅
@@ -1179,8 +1702,27 @@
emergencyInfo.setHospitalInDepartmentId(createVO.getHospitalIn().getDepartmentId());
emergencyInfo.setHospitalInBedNumber(createVO.getHospitalIn().getBedNumber());
emergencyInfo.setHospitalInAddress(createVO.getHospitalIn().getAddress());
- emergencyInfo.setHospitalInLongitude(createVO.getHospitalIn().getLongitude());
- emergencyInfo.setHospitalInLatitude(createVO.getHospitalIn().getLatitude());
+
+ // GPS鍧愭爣锛氫紭鍏堜娇鐢ㄥ墠绔紶鍏ョ殑锛屽惁鍒欏悗绔嚜鍔ㄨ幏鍙�
+ if (createVO.getHospitalIn().getLongitude() != null && createVO.getHospitalIn().getLatitude() != null) {
+ emergencyInfo.setHospitalInLongitude(createVO.getHospitalIn().getLongitude());
+ emergencyInfo.setHospitalInLatitude(createVO.getHospitalIn().getLatitude());
+ } else if (mapService != null && createVO.getHospitalIn().getAddress() != null) {
+ // 鍚庣鑷姩鑾峰彇GPS鍧愭爣
+ try {
+ Map<String, Double> coords = mapService.geocoding(
+ createVO.getHospitalIn().getAddress(),
+ extractCityFromAddress(createVO.getHospitalIn().getAddress())
+ );
+ if (coords != null) {
+ emergencyInfo.setHospitalInLongitude(BigDecimal.valueOf(coords.get("lng")));
+ emergencyInfo.setHospitalInLatitude(BigDecimal.valueOf(coords.get("lat")));
+ log.info("杞叆鍖婚櫌GPS鍧愭爣鑷姩鑾峰彇鎴愬姛: {}, {}", coords.get("lng"), coords.get("lat"));
+ }
+ } catch (Exception e) {
+ log.error("鑷姩鑾峰彇杞叆鍖婚櫌GPS鍧愭爣澶辫触", e);
+ }
+ }
}
// 璁剧疆璐圭敤淇℃伅
@@ -1200,14 +1742,178 @@
.collect(Collectors.joining(","));
emergencyInfo.setDiseaseIds(diseaseIdsStr);
}
-
+
+ if(serviceOrderId!=null){
+ emergencyInfo.setLegacyServiceOrdId(Long.parseLong(serviceOrderId));
+ emergencyInfo.setSyncStatus(2);
+ emergencyInfo.setSyncTime(new Date());
+ emergencyInfo.setSyncErrorMsg("鏃х郴缁熷悓姝ヨ繃鏉�");
+ }
+ if(dispatchOrderId!=null){
+ emergencyInfo.setLegacyDispatchOrdId(Long.parseLong(dispatchOrderId));
+ emergencyInfo.setDispatchSyncStatus(2);
+ emergencyInfo.setDispatchSyncTime(new Date());
+ emergencyInfo.setDispatchSyncErrorMsg("鏃х郴缁熷悓姝ヨ繃鏉�");
+ }
// 绯荤粺瀛楁
emergencyInfo.setCreateTime(DateUtils.getNowDate());
emergencyInfo.setUpdateTime(DateUtils.getNowDate());
- emergencyInfo.setCreateBy(SecurityUtils.getUsername());
- emergencyInfo.setUpdateBy(SecurityUtils.getUsername());
+ emergencyInfo.setCreateBy(createUserName);
+ emergencyInfo.setUpdateBy(createUserName);
sysTaskEmergencyMapper.insertSysTaskEmergency(emergencyInfo);
+ }
+
+ /**
+ * 鏇存柊鎬ユ晳杞繍浠诲姟鎵╁睍淇℃伅
+ *
+ * @param taskId 浠诲姟ID
+ * @param updateVO 浠诲姟鏇存柊瀵硅薄
+ */
+ private void updateEmergencyInfo(Long taskId, TaskUpdateVO updateVO) {
+ // 鏌ヨ鐜版湁鐨勬墿灞曚俊鎭�
+ SysTaskEmergency existingInfo = sysTaskEmergencyMapper.selectSysTaskEmergencyByTaskId(taskId);
+ if (existingInfo == null) {
+ // 濡傛灉涓嶅瓨鍦紝鍒欏垱寤烘柊鐨�
+ existingInfo = new SysTaskEmergency();
+ existingInfo.setTaskId(taskId);
+ existingInfo.setCreateTime(DateUtils.getNowDate());
+ existingInfo.setCreateBy(SecurityUtils.getUsername());
+ }
+
+ TaskUpdateVO.EmergencyInfoVO emergencyInfo = updateVO.getEmergencyInfo();
+
+ // 鏇存柊鎮h�呬俊鎭�
+ if (emergencyInfo.getPatientContact() != null) {
+ existingInfo.setPatientContact(emergencyInfo.getPatientContact());
+ }
+ if (emergencyInfo.getPatientPhone() != null) {
+ existingInfo.setPatientPhone(emergencyInfo.getPatientPhone());
+ }
+ if (emergencyInfo.getPatientName() != null) {
+ existingInfo.setPatientName(emergencyInfo.getPatientName());
+ }
+ if (emergencyInfo.getPatientGender() != null) {
+ existingInfo.setPatientGender(emergencyInfo.getPatientGender());
+ }
+ if (emergencyInfo.getPatientIdCard() != null) {
+ existingInfo.setPatientIdCard(emergencyInfo.getPatientIdCard());
+ }
+ if (emergencyInfo.getPatientCondition() != null) {
+ existingInfo.setPatientCondition(emergencyInfo.getPatientCondition());
+ }
+
+ // 鏇存柊杞嚭鍖婚櫌淇℃伅
+ if (emergencyInfo.getHospitalOutId() != null) {
+ existingInfo.setHospitalOutId(emergencyInfo.getHospitalOutId());
+ }
+ if (emergencyInfo.getHospitalOutName() != null) {
+ existingInfo.setHospitalOutName(emergencyInfo.getHospitalOutName());
+ }
+ if (emergencyInfo.getHospitalOutDepartment() != null) {
+ existingInfo.setHospitalOutDepartment(emergencyInfo.getHospitalOutDepartment());
+ }
+ if (emergencyInfo.getHospitalOutDepartmentId() != null) {
+ existingInfo.setHospitalOutDepartmentId(emergencyInfo.getHospitalOutDepartmentId());
+ }
+ if (emergencyInfo.getHospitalOutBedNumber() != null) {
+ existingInfo.setHospitalOutBedNumber(emergencyInfo.getHospitalOutBedNumber());
+ }
+ if (emergencyInfo.getHospitalOutAddress() != null) {
+ existingInfo.setHospitalOutAddress(emergencyInfo.getHospitalOutAddress());
+
+ // 濡傛灉鏇存柊浜嗗湴鍧�浣嗘病鏈塆PS鍧愭爣锛屽悗绔嚜鍔ㄨ幏鍙�
+ if (emergencyInfo.getHospitalOutLongitude() == null && emergencyInfo.getHospitalOutLatitude() == null && mapService != null) {
+ try {
+ Map<String, Double> coords = mapService.geocoding(
+ emergencyInfo.getHospitalOutAddress(),
+ extractCityFromAddress(emergencyInfo.getHospitalOutAddress())
+ );
+ if (coords != null) {
+ existingInfo.setHospitalOutLongitude(BigDecimal.valueOf(coords.get("lng")));
+ existingInfo.setHospitalOutLatitude(BigDecimal.valueOf(coords.get("lat")));
+ log.info("杞嚭鍖婚櫌GPS鍧愭爣鑷姩鑾峰彇鎴愬姛: {}, {}", coords.get("lng"), coords.get("lat"));
+ }
+ } catch (Exception e) {
+ log.error("鑷姩鑾峰彇杞嚭鍖婚櫌GPS鍧愭爣澶辫触", e);
+ }
+ }
+ }
+ if (emergencyInfo.getHospitalOutLongitude() != null) {
+ existingInfo.setHospitalOutLongitude(emergencyInfo.getHospitalOutLongitude());
+ }
+ if (emergencyInfo.getHospitalOutLatitude() != null) {
+ existingInfo.setHospitalOutLatitude(emergencyInfo.getHospitalOutLatitude());
+ }
+
+ // 鏇存柊杞叆鍖婚櫌淇℃伅
+ if (emergencyInfo.getHospitalInId() != null) {
+ existingInfo.setHospitalInId(emergencyInfo.getHospitalInId());
+ }
+ if (emergencyInfo.getHospitalInName() != null) {
+ existingInfo.setHospitalInName(emergencyInfo.getHospitalInName());
+ }
+ if (emergencyInfo.getHospitalInDepartment() != null) {
+ existingInfo.setHospitalInDepartment(emergencyInfo.getHospitalInDepartment());
+ }
+ if (emergencyInfo.getHospitalInDepartmentId() != null) {
+ existingInfo.setHospitalInDepartmentId(emergencyInfo.getHospitalInDepartmentId());
+ }
+ if (emergencyInfo.getHospitalInBedNumber() != null) {
+ existingInfo.setHospitalInBedNumber(emergencyInfo.getHospitalInBedNumber());
+ }
+ if (emergencyInfo.getHospitalInAddress() != null) {
+ existingInfo.setHospitalInAddress(emergencyInfo.getHospitalInAddress());
+
+ // 濡傛灉鏇存柊浜嗗湴鍧�浣嗘病鏈塆PS鍧愭爣锛屽悗绔嚜鍔ㄨ幏鍙�
+ if (emergencyInfo.getHospitalInLongitude() == null && emergencyInfo.getHospitalInLatitude() == null && mapService != null) {
+ try {
+ Map<String, Double> coords = mapService.geocoding(
+ emergencyInfo.getHospitalInAddress(),
+ extractCityFromAddress(emergencyInfo.getHospitalInAddress())
+ );
+ if (coords != null) {
+ existingInfo.setHospitalInLongitude(BigDecimal.valueOf(coords.get("lng")));
+ existingInfo.setHospitalInLatitude(BigDecimal.valueOf(coords.get("lat")));
+ log.info("杞叆鍖婚櫌GPS鍧愭爣鑷姩鑾峰彇鎴愬姛: {}, {}", coords.get("lng"), coords.get("lat"));
+ }
+ } catch (Exception e) {
+ log.error("鑷姩鑾峰彇杞叆鍖婚櫌GPS鍧愭爣澶辫触", e);
+ }
+ }
+ }
+ if (emergencyInfo.getHospitalInLongitude() != null) {
+ existingInfo.setHospitalInLongitude(emergencyInfo.getHospitalInLongitude());
+ }
+ if (emergencyInfo.getHospitalInLatitude() != null) {
+ existingInfo.setHospitalInLatitude(emergencyInfo.getHospitalInLatitude());
+ }
+
+ // 鏇存柊璐圭敤淇℃伅
+ if (emergencyInfo.getTransferDistance() != null) {
+ existingInfo.setTransferDistance(emergencyInfo.getTransferDistance());
+ }
+ if (emergencyInfo.getTransferPrice() != null) {
+ existingInfo.setTransferPrice(emergencyInfo.getTransferPrice());
+ }
+
+ // 鏇存柊鐥呮儏ID鍒楄〃
+ if (updateVO.getDiseaseIds() != null && !updateVO.getDiseaseIds().isEmpty()) {
+ String diseaseIdsStr = updateVO.getDiseaseIds().stream()
+ .map(String::valueOf)
+ .collect(Collectors.joining(","));
+ existingInfo.setDiseaseIds(diseaseIdsStr);
+ } else {
+ // 濡傛灉鐥呮儏ID鍒楄〃涓虹┖锛屾竻绌鸿瀛楁
+ existingInfo.setDiseaseIds(null);
+ }
+
+ // 绯荤粺瀛楁
+ existingInfo.setUpdateTime(DateUtils.getNowDate());
+ existingInfo.setUpdateBy(SecurityUtils.getUsername());
+
+ // 鎵ц鏇存柊
+ sysTaskEmergencyMapper.updateSysTaskEmergency(existingInfo);
}
/**
@@ -1216,7 +1922,7 @@
* @param taskId 浠诲姟ID
* @param createVO 浠诲姟鍒涘缓瀵硅薄
*/
- private void saveWelfareInfo(Long taskId, TaskCreateVO createVO) {
+ private void saveWelfareInfo(Long taskId,String userName, TaskCreateVO createVO) {
SysTaskWelfare welfareInfo = new SysTaskWelfare();
welfareInfo.setTaskId(taskId);
@@ -1245,8 +1951,8 @@
// 绯荤粺瀛楁
welfareInfo.setCreateTime(DateUtils.getNowDate());
welfareInfo.setUpdateTime(DateUtils.getNowDate());
- welfareInfo.setCreateBy(SecurityUtils.getUsername());
- welfareInfo.setUpdateBy(SecurityUtils.getUsername());
+ welfareInfo.setCreateBy(userName);
+ welfareInfo.setUpdateBy(userName);
sysTaskWelfareMapper.insertSysTaskWelfare(welfareInfo);
}
--
Gitblit v1.9.1