prd/¾ÉϵͳתÔ˵¥Í¬²½¹¦ÄܸüÐÂÈÕÖ¾.md
New file @@ -0,0 +1,57 @@ # æ§ç³»ç»è½¬è¿å忥åè½æ´æ°æ¥å¿ ## v1.1 (2025-11-19) ### æ°å¢åè½ 1. å®ç°äºå®æ´çæ§ç³»ç»è½¬è¿å忥åè½ 2. æ¯æå®æ¶ä»»å¡èªå¨åæ¥åæå¨åæ¥ä¸¤ç§æ¹å¼ 3. æä¾äºè¯¦ç»çæ°æ®æ å°å ³ç³»å转æ¢é»è¾ 4. æ·»å äºå®åçé误å¤ç忥å¿è®°å½æºå¶ ### ä¼åæ¹è¿ 1. ä¼åäºsyncSingleTransferOrderæ¹æ³ï¼ç´æ¥éè¿IDæ¥è¯¢æå®è½¬è¿åï¼æé«æ¥è¯¢æç 2. å¢å¼ºäºisTransferOrderSyncedæ¹æ³çå¼å¸¸å¤çï¼æ¯æéæ°åIDçå¤ç 3. å®åäºbuildCreateTaskVoæ¹æ³çæ°æ®éªè¯åé误å¤ç 4. ä¼åäºsyncLegacyTransferOrdersæ¹æ³ï¼æ·»å äºè¿åº¦è·è¸ªå䏿å¤ç 5. å¢å äºæ´å¤çæ°æ®éªè¯åè¾¹çæ¡ä»¶æ£æ¥ ### 代ç è´¨é 1. æ·»å äºå®æ´çåå æµè¯è¦çæ ¸å¿åè½ 2. æä¾äºè¯¦ç»çä½¿ç¨ææ¡£åæ°æ®æ å°è¯´æ 3. å¢å äºSQLèæ¬ç¨äºé ç½®å®æ¶ä»»å¡ 4. ä¼åäºæ¥å¿è®°å½ï¼æä¾æ´è¯¦ç»çè°è¯ä¿¡æ¯ ### æ§è½ä¼å 1. åå°äºä¸å¿ è¦çæ°æ®æ¥è¯¢ï¼æé«åæ¥æç 2. æ·»å äºçº¿ç¨ä¼ç æ§å¶ï¼é¿å 请æ±è¿å¿«å¯¼è´ç³»ç»åå 3. ä¼åäºå¼å¸¸å¤çæµç¨ï¼é¿å å åä¸ªæ°æ®å¼å¸¸å½±åæ´ä½åæ¥ ### å®å ¨æ§ 1. å¢å äºåæ°æææ§éªè¯ï¼é²æ¢ç©ºæéå¼å¸¸ 2. å®åäºæ°åç±»å转æ¢çå¼å¸¸å¤ç 3. æ·»å äºæ¥ææ ¼å¼éªè¯ï¼ç¡®ä¿æ°æ®æ£ç¡®æ§ ## 使ç¨è¯´æ ### é¨ç½²æ¥éª¤ 1. æ§è¡SQLèæ¬åå»ºå®æ¶ä»»å¡é ç½® 2. ç¡®ä¿SQL Serveræ°æ®æºé ç½®æ£ç¡® 3. å¯å¨åºç¨å¹¶éªè¯åè½ ### éªè¯æ¹æ³ 1. è¿è¡åå æµè¯éªè¯æ ¸å¿åè½ 2. æå¨è§¦å忥任å¡éªè¯æ°æ®è½¬æ¢ 3. æ£æ¥æ¥å¿ç¡®è®¤åæ¥è¿ç¨æ£å¸¸ ## åç»è®¡å ### v1.2 计ååè½ 1. æ·»å 车è¾ä¿¡æ¯åæ¥åè½ 2. å¢å æ´è¯¦ç»çåæ¥ç¶æè·è¸ª 3. æä¾åæ¥æ°æ®çç»è®¡æ¥è¡¨åè½ 4. å¢å æå¨éè¯å¤±è´¥ä»»å¡çåè½ ### æ§è½ä¼åæ¹å 1. èèæ¹éå¤çæé«åæ¥æç 2. ä¼åæ°æ®åºæ¥è¯¢åå°ååºæ¶é´ 3. å¢å ç¼åæºå¶åå°é夿¥è¯¢ prd/¾ÉϵͳתÔ˵¥Í¬²½¹¦ÄÜ˵Ã÷.md
New file @@ -0,0 +1,171 @@ # æ§ç³»ç»è½¬è¿å忥åè½è¯´æ ## ä¸ãåè½æ¦è¿° æ¬åè½å®ç°äºä»æ§ç³»ç»ï¼SQL Serverï¼åæ¥è½¬è¿åä¿¡æ¯å°æ°ç³»ç»ï¼MySQLï¼çåè½ãéè¿å®æ¶ä»»å¡ææå¨è§¦åçæ¹å¼ï¼å°æ§ç³»ç»ä¸ç转è¿åæ°æ®è½¬æ¢ä¸ºæ°ç³»ç»ç任塿°æ®ã ## äºãæ ¸å¿ç»ä»¶ ### 1. ILegacyTransferSyncService æ¥å£ å®ä¹äºè½¬è¿ååæ¥çæ ¸å¿æ¹æ³ï¼ - `syncLegacyTransferOrders(int daysAgo)` - 忥æå®å¤©æ°åç转è¿åæ°æ® - `syncSingleTransferOrder(String serviceOrdID, String dispatchOrdID)` - 忥å个转è¿å - `isTransferOrderSynced(String serviceOrdID, String dispatchOrdID)` - æ£æ¥è½¬è¿åæ¯å¦å·²åæ¥ - `buildCreateTaskVo(String serviceOrdID, String dispatchOrdID, Map<String, Object> order)` - æé ä»»å¡å建对象 ### 2. LegacyTransferSyncServiceImpl å®ç°ç±» å®ç°äºè½¬è¿å忥çå ·ä½é»è¾ï¼ - ä»SQL Serveræ¥è¯¢è½¬è¿åæ°æ® - è½¬æ¢æ°æ®æ ¼å¼ä¸ºTaskCreateVO对象 - è°ç¨sysTaskServiceå建æ°ä»»å¡ - è®°å½åæ¥ç¶æåæ¥å¿ ### 3. LegacyTransferSyncMapper æ°æ®è®¿é®å± æä¾äºè®¿é®SQL Serveræ°æ®åºçMapperæ¥å£ï¼ - `selectTransferOrders(String startDate)` - æ¥è¯¢æå®æ¥æèå´ç转è¿å - `selectTransferOrdersByIDs(String serviceOrdID, String dispatchOrdID)` - æ ¹æ®IDæ¥è¯¢è½¬è¿å - `selectDiseaseIdsByServiceOrdID(String serviceOrdID)` - æ¥è¯¢ç æ ä¿¡æ¯ - `selectAssigneesByDispatchOrdID(String dispatchOrdID)` - æ¥è¯¢æ§è¡äººä¿¡æ¯ - `selectCarLicenseByCarID(String carID)` - æ¥è¯¢è½¦è¾è½¦çå· - `selectHospitalNameByHospID(String hospID)` - æ¥è¯¢å»é¢åç§° - `selectDepartmentNameByDeptID(String deptID)` - æ¥è¯¢ç§å®¤åç§° ### 4. LegacyTransferSyncTask 宿¶ä»»å¡ æä¾äºå®æ¶æ§è¡è½¬è¿å忥çè°åº¦ä»»å¡ï¼ - `syncTransferOrders7Days()` - 忥7天åç转è¿åæ°æ® - `syncTransferOrders(String daysAgo)` - 忥æå®å¤©æ°åç转è¿åæ°æ® ## ä¸ãæ°æ®æ å°å ³ç³» ### 1. åºæ¬ä¿¡æ¯æ å° | æ§ç³»ç»å段 | æ°ç³»ç»å段 | 说æ | |------------|------------|------| | ServiceOrdID | legacy_service_ord_id | æå¡åID | | DispatchOrdID | legacy_dispatch_ord_id | è°åº¦åID | | ServiceOrdClass | documentTypeId | åæ®ç±»åID | | ServiceOrdType | taskTypeId | ä»»å¡ç±»åID | ### 2. æ£è ä¿¡æ¯æ å° | æ§ç³»ç»å段 | æ°ç³»ç»å段 | 说æ | |------------|------------|------| | ServiceOrdPtName | patient.name | æ£è å§å | | ServiceOrdCoPhone | patient.phone | è系人çµè¯ | | ServiceOrdPtIDCard | patient.idCard | æ£è 身份è¯å· | | ServiceOrdPtCondition | patient.condition | æ£è ç æ æè¿° | | ServiceOrdCoName | patient.contact | è系人å§å | ### 3. å»é¢ä¿¡æ¯æ å° | æ§ç³»ç»å段 | æ°ç³»ç»å段 | 说æ | |------------|------------|------| | ServiceOrdPtOutHospID | hospitalOut.id | 转åºå»é¢ID | | ServiceOrdPtServicesID | hospitalOut.departmentId | 转åºå»é¢ç§å®¤ID | | ServiceOrdPtInHospID | hospitalIn.id | è½¬å ¥å»é¢ID | | ServiceOrdPtInServicesID | hospitalIn.departmentId | è½¬å ¥å»é¢ç§å®¤ID | ### 4. å°åä¿¡æ¯æ å° | æ§ç³»ç»å段 | æ°ç³»ç»å段 | 说æ | |------------|------------|------| | ServiceOrdTraStreet | departureAddress | åºåå°å | | ServiceOrdTraEnd | destinationAddress | ç®çå°å | ### 5. æ¶é´ä¿¡æ¯æ å° | æ§ç³»ç»å段 | æ°ç³»ç»å段 | 说æ | |------------|------------|------| | DispatchOrdStartDate | plannedStartTime | 计åå¼å§æ¶é´ | | DispatchOrd_NS_Time | createTime | å建æ¶é´ | ### 6. å ¶ä»ä¿¡æ¯æ å° | æ§ç³»ç»å段 | æ°ç³»ç»å段 | 说æ | |------------|------------|------| | ServiceOrdTraTxnPrice | price | æäº¤ä»· | | ServiceOrdCoTies | remark | èç³»äººå ³ç³»ï¼å¤æ³¨ä¸ï¼ | ## åãæ§è¡äººä¿¡æ¯æ å° æ§è¡äººè§è²æ ¹æ®EntourageStateåæ®µæ å°ï¼ - 1,2 â driverï¼å¸æºï¼ - 3,5 â doctorï¼å»çï¼ - 4,6 â nurseï¼æ¤å£«ï¼ - å ¶ä» â otherï¼å ¶ä»ï¼ ## äºã使ç¨è¯´æ ### 1. èªå¨åæ¥ é ç½®å®æ¶ä»»å¡èªå¨æ§è¡è½¬è¿ååæ¥ï¼ 1. è¿å ¥ãç³»ç»çæ§ãâã宿¶ä»»å¡ã 2. æ·»å æ°ä»»å¡ï¼ - ä»»å¡åç§°ï¼æ§ç³»ç»è½¬è¿å忥 - ä»»å¡ç»åï¼DEFAULT - è°ç¨ç®æ ï¼`legacyTransferSyncTask.syncTransferOrders7Days()` - cron表达å¼ï¼`0 0 2 * * ?`ï¼æ¯å¤©åæ¨2ç¹æ§è¡ï¼ - å¹¶åæ§å¶ï¼ç¦æ¢å¹¶å - éè¿çç¥ï¼æ¾å¼æ§è¡ ### 2. æå¨åæ¥ #### 忥æå®å¤©æ°åçæ°æ® ```java @Autowired private ILegacyTransferSyncService legacyTransferSyncService; // 忥7天åç转è¿åæ°æ® int successCount = legacyTransferSyncService.syncLegacyTransferOrders(7); ``` #### 忥å个转è¿å ```java // 忥æå®çæå¡ååè°åº¦å boolean success = legacyTransferSyncService.syncSingleTransferOrder("12345", "67890"); ``` ### 3. æ¥çåæ¥ç»æ ```sql -- æ¥è¯¢è½¬è¿ååæ¥ç»æ SELECT task_id, task_code, task_description, create_time, e.legacy_service_ord_id, e.legacy_dispatch_ord_id FROM sys_task t LEFT JOIN sys_task_emergency e ON t.task_id = e.task_id WHERE t.task_description LIKE '%仿§ç³»ç»åæ¥ç转è¿å%' ORDER BY t.create_time DESC; -- ç»è®¡åæ¥æ åµ SELECT COUNT(*) as total_count, SUM(CASE WHEN e.legacy_service_ord_id IS NOT NULL THEN 1 ELSE 0 END) as sync_success_count FROM sys_task t LEFT JOIN sys_task_emergency e ON t.task_id = e.task_id WHERE t.task_description LIKE '%仿§ç³»ç»åæ¥ç转è¿å%'; ``` ## å ãçæ§åç»´æ¤ ### 1. çæ§ææ - 忥æåçï¼æåæ° / æ»æ° * 100% - åæ¥å¤±è´¥çï¼å¤±è´¥æ° / æ»æ° * 100% - å¹³ååæ¥èæ¶ï¼ä»å建å°åæ¥æåçæ¶é´ ### 2. æ¥å¿æ¥ç ```bash # æ¥çåºç¨æ¥å¿ tail -f logs/sys-info.log | grep "转è¿å忥" ``` ### 3. é误å¤ç å¦æåæ¥å¤±è´¥ï¼éè¦æ£æ¥ï¼ 1. SQL Serverè¿æ¥æ¯å¦æ£å¸¸ 2. æ°æ®æ ¼å¼æ¯å¦æ£ç¡® 3. æ°ç³»ç»å段æ¯å¦å¹é 4. 宿¶ä»»å¡æ¥å¿ä¸ç详ç»éè¯¯ä¿¡æ¯ ## ä¸ã注æäºé¡¹ 1. 建议å¨ä¸å¡ä½å³°ææ§è¡åæ¥ä»»å¡ï¼å¦åæ¨2ç¹ï¼ 2. 坿 ¹æ®å®é éæ±è°æ´åæ¥å¤©æ°ï¼å¦æ¹ä¸º3天æ14å¤©ï¼ 3. å®ææ£æ¥åæ¥å¤±è´¥çä»»å¡å¹¶å¤ç 4. å¯éè¿ä¿®æ¹å®æ¶ä»»å¡ç¶æä¸´æ¶ç¦ç¨åæ¥ä»»å¡ ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java
@@ -155,4 +155,18 @@ deptService.checkDeptDataScope(deptId); return toAjax(deptService.deleteDeptById(deptId)); } /** * æ ¹æ®service_classæ¥è¯¢é¨é¨ä¿¡æ¯ */ @GetMapping("/service-class/{serviceClass}") public AjaxResult getDeptByServiceClass(@PathVariable String serviceClass) { SysDept dept = deptService.selectDeptByServiceClass(serviceClass); if (dept != null) { return success(dept); } else { return error("æªæ¾å°å¯¹åºçé¨é¨ä¿¡æ¯"); } } } ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
@@ -317,4 +317,18 @@ return success(users); } /** * æ ¹æ®oaUserIdæ¥è¯¢ç¨æ·ä¿¡æ¯ */ @GetMapping("/oa-user/{oaUserId}") public AjaxResult getUserByOaUserId(@PathVariable Integer oaUserId) { SysUser user = userService.selectUserByOaUserId(oaUserId); if (user != null) { return success(user); } else { return error("æªæ¾å°å¯¹åºçç¨æ·ä¿¡æ¯"); } } } ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/LegacySystemSyncTask.java
@@ -15,6 +15,13 @@ * * @author ruoyi * @date 2024-01-20 * * ç¸å ³ä»»å¡: * 1. LegacySystemSyncTask - æ§ç³»ç»ä»»å¡åæ¥ï¼æ¥æè½¬è¿ä»»å¡åæå¡åï¼ * 2. LegacyTransferSyncTask - æ§ç³»ç»è½¬è¿å忥ï¼ä»SQL Serverå°æ°ç³»ç»ï¼ * 3. TaskStatusSyncService - ä»»å¡ç¶æåæ¥ï¼ä»æ§ç³»ç»å°æ°ç³»ç»ï¼ * 4. TaskStatusPushService - ä»»å¡ç¶ææ¨éï¼ä»æ°ç³»ç»å°æ§ç³»ç»ï¼ * 5. TaskAttachmentSyncService - ä»»å¡é件忥ï¼ä»æ°ç³»ç»å°æ§ç³»ç»ï¼ */ @Component("legacySystemSyncTask") public class LegacySystemSyncTask { ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/LegacyTransferSyncTask.java
New file @@ -0,0 +1,51 @@ package com.ruoyi.quartz.task; import com.ruoyi.system.service.ILegacyTransferSyncService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * æ§ç³»ç»è½¬è¿å忥宿¶ä»»å¡ * * @author ruoyi * @date 2025-11-19 */ @Component("legacyTransferSyncTask") public class LegacyTransferSyncTask { private static final Logger log = LoggerFactory.getLogger(LegacyTransferSyncTask.class); @Autowired private ILegacyTransferSyncService legacyTransferSyncService; /** * 忥7天åçæ§ç³»ç»è½¬è¿åæ°æ® */ public void syncTransferOrders7Days() { log.info("å¼å§æ§è¡7å¤©åæ§ç³»ç»è½¬è¿å忥任å¡"); try { int count = legacyTransferSyncService.syncLegacyTransferOrders(7); log.info("7å¤©åæ§ç³»ç»è½¬è¿å忥任塿§è¡å®æï¼åæ¥æ°é: {}", count); } catch (Exception e) { log.error("7å¤©åæ§ç³»ç»è½¬è¿å忥任塿§è¡å¼å¸¸", e); } } /** * 忥æå®å¤©æ°åçæ§ç³»ç»è½¬è¿åæ°æ® * * @param daysAgo å¤©æ° */ public void syncTransferOrders(String daysAgo) { log.info("å¼å§æ§è¡{}å¤©åæ§ç³»ç»è½¬è¿å忥任å¡", daysAgo); try { int days = Integer.parseInt(daysAgo); int count = legacyTransferSyncService.syncLegacyTransferOrders(days); log.info("{}å¤©åæ§ç³»ç»è½¬è¿å忥任塿§è¡å®æï¼åæ¥æ°é: {}", daysAgo, count); } catch (Exception e) { log.error("{}å¤©åæ§ç³»ç»è½¬è¿å忥任塿§è¡å¼å¸¸", daysAgo, e); } } } ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTask.java
@@ -396,6 +396,13 @@ } } public void setPlanedStartTime(Date plannedStartTime) { this.plannedStartTime = plannedStartTime; } public Date getPlanedStartTime() { return plannedStartTime; } /** * 夿æ¯å¦è¶ æ¶ */ ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/TaskCreateVO.java
@@ -1,9 +1,11 @@ package com.ruoyi.system.domain.vo; import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; import java.util.List; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; /** * ä»»å¡å建对象 @@ -11,8 +13,10 @@ * @author ruoyi * @date 2024-01-15 */ public class TaskCreateVO { @Data public class TaskCreateVO implements Serializable { private String taskCode; /** ä»»å¡ç±»å */ private String taskType; @@ -32,6 +36,13 @@ /** 计åç»ææ¶é´ */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date plannedEndTime; /** å®é å¼å§æ¶é´ */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date actualStartTime; /** å®é ç»ææ¶é´ */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date actualEndTime; /** æ§è¡äººID */ private Long assigneeId; @@ -110,6 +121,8 @@ /** ç æ IDå表ï¼ICD-10ç¾ç IDå表ï¼ç¨äºåæ¥è°åº¦åçOrdICD_IDåæ°ï¼ */ private List<Long> diseaseIds; private Date createTime; // æ§è¡äººåä¿¡æ¯å é¨ç±» public static class AssigneeInfo { /** ç¨æ·ID */ ruoyi-system/src/main/java/com/ruoyi/system/mapper/LegacyTransferSyncMapper.java
New file @@ -0,0 +1,76 @@ package com.ruoyi.system.mapper; import com.ruoyi.common.annotation.DataSource; import com.ruoyi.common.enums.DataSourceType; import com.ruoyi.system.domain.OrderClassDTO; import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Map; /** * æ§ç³»ç»è½¬è¿å忥Mapperæ¥å£ * * @author ruoyi * @date 2025-11-19 */ @DataSource(DataSourceType.SQLSERVER) public interface LegacyTransferSyncMapper { /** * æ¥è¯¢æå®æ¥æèå´ç转è¿åæ°æ® * * @param startDate å¼å§æ¥æ * @return 转è¿åæ°æ®å表 */ List<Map<String, Object>> selectTransferOrders(@Param("startDate") String startDate); /** * æ ¹æ®æå¡åIDåè°åº¦åIDæ¥è¯¢è½¬è¿åæ°æ® * * @param serviceOrdID æå¡åID * @param dispatchOrdID è°åº¦åID * @return 转è¿åæ°æ®å表 */ List<Map<String, Object>> selectTransferOrdersByIDs(@Param("serviceOrdID") String serviceOrdID, @Param("dispatchOrdID") String dispatchOrdID); /** * æ ¹æ®æå¡åIDæ¥è¯¢ç æ ä¿¡æ¯ * * @param serviceOrdID æå¡åID * @return ç æ IDå表 */ List<String> selectDiseaseIdsByServiceOrdID(@Param("serviceOrdID") String serviceOrdID); /** * æ ¹æ®è°åº¦åIDæ¥è¯¢æ§è¡äººä¿¡æ¯ * * @param dispatchOrdID è°åº¦åID * @return æ§è¡äººä¿¡æ¯å表 */ List<Map<String, Object>> selectAssigneesByDispatchOrdID(@Param("dispatchOrdID") String dispatchOrdID); /** * æ ¹æ®è½¦è¾IDæ¥è¯¢è½¦çå· * * @param carID 车è¾ID * @return 车çå· */ String selectCarLicenseByCarID(@Param("carID") String carID); /** * æ ¹æ®å»é¢IDæ¥è¯¢å»é¢åç§° * * @param hospID å»é¢ID * @return å»é¢åç§° */ String selectHospitalNameByHospID(@Param("hospID") String hospID); /** * æ ¹æ®ç§å®¤IDæ¥è¯¢ç§å®¤åç§° * * @param deptID ç§å®¤ID * @return ç§å®¤åç§° */ String selectDepartmentNameByDeptID(@Param("deptID") String deptID); } ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java
@@ -150,4 +150,12 @@ * @return åå ¬å¸å表 */ public List<SysDept> selectBranchCompaniesByOrderCodes(@Param("orderCodes") List<String> orderCodes); /** * æ ¹æ®service_classæ¥è¯¢é¨é¨ä¿¡æ¯ * * @param serviceClass æå¡ç±»å«ç¼ç * @return é¨é¨ä¿¡æ¯ */ public SysDept selectDeptByServiceClass(@Param("serviceClass") String serviceClass); } ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTaskEmergencyMapper.java
@@ -89,4 +89,20 @@ * @return æ¥æè½¬è¿ä»»å¡å表 */ public List<SysTaskEmergency> selectSyncedTasksForStatusUpdate(@Param("offset") Integer offset, @Param("limit") Integer limit); /** * æ ¹æ®æ§ç³»ç»æå¡åIDæ¥è¯¢æ¥æè½¬è¿ä»»å¡æ©å±ä¿¡æ¯ * * @param legacyServiceOrdId æ§ç³»ç»æå¡åID * @return æ¥æè½¬è¿ä»»å¡æ©å±ä¿¡æ¯ */ public SysTaskEmergency selectByLegacyServiceOrdId(@Param("legacyServiceOrdId") Long legacyServiceOrdId); /** * æ ¹æ®æ§ç³»ç»è°åº¦åIDæ¥è¯¢æ¥æè½¬è¿ä»»å¡æ©å±ä¿¡æ¯ * * @param legacyDispatchOrdId æ§ç³»ç»è°åº¦åID * @return æ¥æè½¬è¿ä»»å¡æ©å±ä¿¡æ¯ */ public SysTaskEmergency selectByLegacyDispatchOrdId(@Param("legacyDispatchOrdId") Long legacyDispatchOrdId); } ruoyi-system/src/main/java/com/ruoyi/system/mapper/VehicleInfoMapper.java
@@ -1,6 +1,8 @@ package com.ruoyi.system.mapper; import java.util.List; import java.util.Map; import org.apache.ibatis.annotations.Param; import com.ruoyi.system.domain.VehicleInfo; import com.ruoyi.system.domain.VehicleDept; @@ -48,6 +50,22 @@ * @return 车è¾ä¿¡æ¯ */ public VehicleInfo selectVehicleInfoByVehicleNo(String vehicleNo); /** * æ ¹æ®æ§ç³»ç»è½¦è¾ID(CarID)æ¥è¯¢è½¦è¾ä¿¡æ¯ * * @param carId æ§ç³»ç»è½¦è¾ID * @return 车è¾ä¿¡æ¯ */ public VehicleInfo selectVehicleInfoByCarId(@Param("carId") Integer carId); /** * æ ¹æ®æ§ç³»ç»è½¦è¾IDæ¥è¯¢è½¦è¾ä¿¡æ¯ * * @param carID æ§ç³»ç»è½¦è¾ID * @return 车è¾ä¿¡æ¯ï¼vehicle_id, car_id, vehicle_noï¼ */ public Map<String, Object> selectVehicleInfoByCarID(@Param("carID") String carID); /** * æ¥è¯¢è½¦è¾ä¿¡æ¯å表 ruoyi-system/src/main/java/com/ruoyi/system/service/ILegacyTransferSyncService.java
New file @@ -0,0 +1,53 @@ package com.ruoyi.system.service; import com.ruoyi.system.domain.SysTask; import com.ruoyi.system.domain.SysTaskEmergency; import com.ruoyi.system.domain.vo.TaskCreateVO; import java.util.List; import java.util.Map; /** * æ§ç³»ç»è½¬è¿å忥Serviceæ¥å£ * * @author ruoyi * @date 2025-11-19 */ public interface ILegacyTransferSyncService { /** * 忥æå®æ¥æèå´çæ§ç³»ç»è½¬è¿åå°æ°ç³»ç» * * @param daysAgo å¤å°å¤©åçæ°æ®ï¼å¦7表示7天åçæ°æ®ï¼ * @return æå忥ç转è¿åæ°é */ int syncLegacyTransferOrders(int daysAgo); /** * 忥å个æ§ç³»ç»è½¬è¿åå°æ°ç³»ç» * * @param serviceOrdID æå¡åID * @param dispatchOrdID è°åº¦åID * @return æ¯å¦åæ¥æå */ boolean syncSingleTransferOrder(String serviceOrdID, String dispatchOrdID); /** * æ£æ¥è½¬è¿åæ¯å¦å·²åæ¥ * * @param serviceOrdID æå¡åID * @param dispatchOrdID è°åº¦åID * @return æ¯å¦å·²åæ¥ */ boolean isTransferOrderSynced(String serviceOrdID, String dispatchOrdID); /** * æé TaskCreateVO对象ç¨äºåå»ºä»»å¡ * * @param serviceOrdID æå¡åID * @param dispatchOrdID è°åº¦åID * @param order 转è¿å详ç»ä¿¡æ¯ * @return TaskCreateVO对象 */ TaskCreateVO buildCreateTaskVo(String serviceOrdID, String dispatchOrdID, Map<String, Object> order); } ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java
@@ -134,4 +134,12 @@ * @return åå ¬å¸å表 */ public List<SysDept> computeBranchCompaniesForUser(SysUser user); /** * æ ¹æ®service_classæ¥è¯¢é¨é¨ä¿¡æ¯ * * @param serviceClass æå¡ç±»å«ç¼ç * @return é¨é¨ä¿¡æ¯ */ public SysDept selectDeptByServiceClass(String serviceClass); } ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTaskService.java
@@ -1,5 +1,6 @@ package com.ruoyi.system.service; import java.util.Date; import java.util.List; import org.springframework.web.multipart.MultipartFile; import com.ruoyi.system.domain.SysTask; @@ -43,6 +44,18 @@ * @return ç»æ */ public int insertSysTask(TaskCreateVO createVO); /** * æ°å¢ä»»å¡ç®¡çï¼å 许ä»å¤é¨ä¼ å ¥ç¨æ·ä¿¡æ¯ãé¨é¨ä¿¡æ¯åæ¶é´ä¿¡æ¯ï¼ * * @param createVO ä»»å¡å建对象 * @param userId ç¨æ·ID * @param deptId é¨é¨ID * @param createTime å建æ¶é´ * @param updateTime æ´æ°æ¶é´ * @return ç»æ */ public int insertTask(TaskCreateVO createVO,String serviceOrderId,String dispatchOrderId, Long userId,String userName, Long deptId, Date createTime, Date updateTime); /** * ä¿®æ¹ä»»å¡ç®¡ç @@ -214,4 +227,37 @@ * @return æ£å¨è¿è¡ä¸çä»»å¡å表 */ public List<SysTask> checkVehicleActiveTasks(Long vehicleId); /** * æ£æ¥ä»»å¡æ¯å¦å·²å ³èæ§ç³»ç»æå¡åID * * @param taskId ä»»å¡ID * @return true-å·²å ³èï¼false-æªå ³è */ public boolean hasLegacyServiceOrdId(Long taskId); /** * æ£æ¥ä»»å¡æ¯å¦å·²å ³èæ§ç³»ç»è°åº¦åID * * @param taskId ä»»å¡ID * @return true-å·²å ³èï¼false-æªå ³è */ public boolean hasLegacyDispatchOrdId(Long taskId); /** * æ ¹æ®æ§ç³»ç»æå¡åIDæ£æ¥æ¯å¦åå¨ä»»å¡ * * @param legacyServiceOrdId æ§ç³»ç»æå¡åID * @return true-åå¨ï¼false-ä¸åå¨ */ public boolean existsByLegacyServiceOrdId(Long legacyServiceOrdId); /** * æ ¹æ®æ§ç³»ç»è°åº¦åIDæ£æ¥æ¯å¦åå¨ä»»å¡ * * @param legacyDispatchOrdId æ§ç³»ç»è°åº¦åID * @return true-åå¨ï¼false-ä¸åå¨ */ public boolean existsByLegacyDispatchOrdId(Long legacyDispatchOrdId); } ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
@@ -57,6 +57,14 @@ * @return ç¨æ·å¯¹è±¡ä¿¡æ¯ */ public SysUser selectUserByOpenId(String openId); /** * æ ¹æ®oaUserIdæ¥è¯¢ç¨æ· * * @param oaUserId SQL Serverä¸çOAç¨æ·ID * @return ç¨æ·ä¿¡æ¯ */ public SysUser selectUserByOaUserId(Integer oaUserId); /** * éè¿ç¨æ·IDæ¥è¯¢ç¨æ· ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LegacyTransferSyncServiceImpl.java
New file @@ -0,0 +1,770 @@ package com.ruoyi.system.service.impl; import com.ruoyi.common.annotation.DataSource; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.enums.DataSourceType; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.domain.SysTask; import com.ruoyi.system.domain.SysTaskEmergency; import com.ruoyi.system.domain.VehicleInfo; import com.ruoyi.system.domain.vo.TaskCreateVO; import com.ruoyi.system.mapper.SysTaskEmergencyMapper; import com.ruoyi.system.mapper.SysTaskMapper; import com.ruoyi.system.service.ILegacyTransferSyncService; import com.ruoyi.system.service.ISysDeptService; import com.ruoyi.system.service.ISysTaskService; import com.ruoyi.system.mapper.LegacyTransferSyncMapper; import com.ruoyi.system.mapper.VehicleInfoMapper; import com.ruoyi.system.service.ISysUserService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.text.SimpleDateFormat; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; /** * æ§ç³»ç»è½¬è¿å忥Serviceä¸å¡å±å¤ç * * @author ruoyi * @date 2025-11-19 */ @Service public class LegacyTransferSyncServiceImpl implements ILegacyTransferSyncService { private static final Logger log = LoggerFactory.getLogger(LegacyTransferSyncServiceImpl.class); @Autowired private SysTaskMapper sysTaskMapper; @Autowired private SysTaskEmergencyMapper sysTaskEmergencyMapper; @Autowired private ISysTaskService sysTaskService; @Autowired private LegacyTransferSyncMapper legacyTransferSyncMapper; @Autowired private VehicleInfoMapper vehicleInfoMapper; @Autowired private ISysDeptService sysDeptService; @Autowired private ISysUserService sysUserService; /** * 忥æå®æ¥æèå´çæ§ç³»ç»è½¬è¿åå°æ°ç³»ç» * * @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); // ä»SQL Serveræ¥è¯¢è½¬è¿åæ°æ® List<Map<String, Object>> transferOrders = legacyTransferSyncMapper.selectTransferOrders(startDateStr); if (transferOrders == null || transferOrders.isEmpty()) { log.info("æªæ¥è¯¢å°{}天åç转è¿åæ°æ®", daysAgo); return 0; } log.info("æ¥è¯¢å°{}æ¡è½¬è¿åæ°æ®ï¼å¼å§åæ¥...", transferOrders.size()); int successCount = 0; int totalCount = transferOrders.size(); int processedCount = 0; for (Map<String, Object> order : transferOrders) { processedCount++; try { String serviceOrdID = getStringValue(order, "ServiceOrdID"); String dispatchOrdID = getStringValue(order, "DispatchOrdID"); // æ£æ¥åæ°æææ§ if (StringUtils.isEmpty(serviceOrdID)) { log.warn("第{}æ¡æ°æ®æå¡åID为空ï¼è·³è¿å¤ç", processedCount); continue; } log.debug("æ£å¨å¤ç第{}/{}æ¡è½¬è¿å: ServiceOrdID={}, DispatchOrdID={}", processedCount, totalCount, serviceOrdID, dispatchOrdID); // æ£æ¥æ¯å¦å·²åæ¥ if (isTransferOrderSynced(serviceOrdID, dispatchOrdID)) { log.debug("转è¿å已忥ï¼è·³è¿: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID); continue; } // 忥å个转è¿å boolean success = syncSingleTransferOrder(serviceOrdID, dispatchOrdID, order); if (success) { successCount++; } // æ§å¶åæ¥é¢çï¼é¿å 请æ±è¿å¿« Thread.sleep(100); } catch (InterruptedException ie) { log.warn("忥任å¡è¢«ä¸æ"); Thread.currentThread().interrupt(); break; } catch (Exception e) { log.error("忥å个转è¿å失败: ServiceOrdID={}, DispatchOrdID={}", getStringValue(order, "ServiceOrdID"), getStringValue(order, "DispatchOrdID"), e); } } log.info("忥宿ï¼å ±å¤ç{}æ¡è½¬è¿åï¼æå忥{}æ¡è½¬è¿åæ°æ®", totalCount, successCount); return successCount; } catch (Exception e) { log.error("忥{}天åçæ§ç³»ç»è½¬è¿åæ°æ®å¼å¸¸", daysAgo, e); return 0; } } /** * 忥å个æ§ç³»ç»è½¬è¿åå°æ°ç³»ç» * * @param serviceOrdID æå¡åID * @param dispatchOrdID è°åº¦åID * @return æ¯å¦åæ¥æå */ @Override public boolean syncSingleTransferOrder(String serviceOrdID, String dispatchOrdID) { log.info("å¼å§åæ¥å个转è¿å: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID); try { // æ£æ¥åæ°æææ§ if (StringUtils.isEmpty(serviceOrdID)) { log.error("æå¡åIDä¸è½ä¸ºç©º"); return false; } // æ£æ¥æ¯å¦å·²åæ¥ if (isTransferOrderSynced(serviceOrdID, dispatchOrdID)) { log.info("转è¿å已忥ï¼è·³è¿: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID); return true; } // ç´æ¥æ¥è¯¢æå®ç转è¿åä¿¡æ¯ List<Map<String, Object>> transferOrders = legacyTransferSyncMapper.selectTransferOrdersByIDs(serviceOrdID, dispatchOrdID); if (transferOrders == null || transferOrders.isEmpty()) { log.error("æªæ¥è¯¢å°å¯¹åºç转è¿åä¿¡æ¯: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID); return false; } Map<String, Object> order = transferOrders.get(0); // 忥å个转è¿å return syncSingleTransferOrder(serviceOrdID, dispatchOrdID, order); } catch (Exception e) { log.error("忥å个转è¿åå¼å¸¸: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID, e); return false; } } /** * 忥å个æ§ç³»ç»è½¬è¿åå°æ°ç³»ç»ï¼å¸¦è¯¦ç»ä¿¡æ¯ï¼ * * @param serviceOrdID æå¡åID * @param dispatchOrdID è°åº¦åID * @param order 转è¿å详ç»ä¿¡æ¯ * @return æ¯å¦åæ¥æå */ private boolean syncSingleTransferOrder(String serviceOrdID, String dispatchOrdID, Map<String, Object> order) { log.info("å¼å§åæ¥å个转è¿å: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID); try { // æé TaskCreateVO对象 TaskCreateVO createTaskVo = buildCreateTaskVo(serviceOrdID, dispatchOrdID, order); if (createTaskVo == null) { log.error("æé TaskCreateVO失败: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID); return false; } // è®°å½å建çä»»å¡ä¿¡æ¯ log.debug("åå¤å建任å¡: ServiceOrdID={}, DispatchOrdID={}, æ£è å§å={}, 转åºå»é¢={}, è½¬å ¥å»é¢={}", serviceOrdID, dispatchOrdID, createTaskVo.getPatient() != null ? createTaskVo.getPatient().getName() : "æªç¥", createTaskVo.getHospitalOut() != null ? createTaskVo.getHospitalOut().getName() : "æªç¥", createTaskVo.getHospitalIn() != null ? createTaskVo.getHospitalIn().getName() : "æªç¥"); Date ServiceOrd_CC_Time= getDateValue(order, "ServiceOrd_CC_Time"); // è°ç¨sysTaskServiceåå»ºä»»å¡ String serviceOrdClass = getStringValue(order,"ServiceOrdClass"); Integer oauserId=getIntegerValue(order,"ServiceOrd_NS_ID"); SysUser sysUser=sysUserService.selectUserByOaUserId(oauserId); Long taskCreatorId=sysUser==null?null:sysUser.getUserId(); String createUserName=sysUser==null?"system":sysUser.getUserName(); SysDept dept=sysDeptService.selectDeptByServiceClass(serviceOrdClass); Long deptId=dept==null?null:dept.getDeptId(); int result = sysTaskService.insertTask(createTaskVo,serviceOrdID,dispatchOrdID, taskCreatorId,createUserName, deptId, ServiceOrd_CC_Time, ServiceOrd_CC_Time); if (result > 0) { log.info("转è¿å忥æå: ServiceOrdID={}, DispatchOrdID={}, å建çä»»å¡ID={}", serviceOrdID, dispatchOrdID, result); return true; } else { log.error("转è¿ååæ¥å¤±è´¥: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID); return false; } } catch (Exception e) { log.error("忥å个转è¿åå¼å¸¸: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID, e); return false; } } /** * æ£æ¥è½¬è¿åæ¯å¦å·²åæ¥ * * @param serviceOrdID æå¡åID * @param dispatchOrdID è°åº¦åID * @return æ¯å¦å·²åæ¥ */ @Override public boolean isTransferOrderSynced(String serviceOrdID, String dispatchOrdID) { try { // æ£æ¥åæ°æææ§ if (StringUtils.isEmpty(serviceOrdID)) { log.warn("æå¡åIDä¸è½ä¸ºç©º"); return false; } // æ£æ¥sys_task_emergencyè¡¨ä¸æ¯å¦å·²åå¨å¯¹åºçè®°å½ // æ¡ä»¶ï¼legacy_service_ord_id = serviceOrdID æ legacy_dispatch_ord_id = dispatchOrdID try { SysTaskEmergency emergency = sysTaskEmergencyMapper.selectByLegacyServiceOrdId(Long.valueOf(serviceOrdID)); if (emergency != null) { return true; } } catch (NumberFormatException e) { log.warn("æå¡åID䏿¯æææ°å: {}", serviceOrdID); } if (StringUtils.isNotEmpty(dispatchOrdID)) { try { SysTaskEmergency emergency = sysTaskEmergencyMapper.selectByLegacyDispatchOrdId(Long.valueOf(dispatchOrdID)); if (emergency != null) { return true; } } catch (NumberFormatException e) { log.warn("è°åº¦åID䏿¯æææ°å: {}", dispatchOrdID); } } return false; } catch (Exception e) { log.error("æ£æ¥è½¬è¿åæ¯å¦å·²åæ¥å¼å¸¸: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID, e); return false; } } /** * æé TaskCreateVO对象ç¨äºåå»ºä»»å¡ * * @param serviceOrdID æå¡åID * @param dispatchOrdID è°åº¦åID * @param order 转è¿å详ç»ä¿¡æ¯ * @return TaskCreateVO对象 */ @Override public TaskCreateVO buildCreateTaskVo(String serviceOrdID, String dispatchOrdID, Map<String, Object> order) { log.info("æé TaskCreateVO: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID); try { // æ£æ¥åæ°æææ§ if (order == null || order.isEmpty()) { log.error("转è¿å详ç»ä¿¡æ¯ä¸è½ä¸ºç©º"); return null; } if (StringUtils.isEmpty(serviceOrdID)) { log.error("æå¡åIDä¸è½ä¸ºç©º"); return null; } TaskCreateVO createTaskVo = new TaskCreateVO(); String Old_ServiceOrdID_TXT=getStringValue(order,"Old_ServiceOrdID_TXT"); if(Old_ServiceOrdID_TXT!=null){ createTaskVo.setTaskCode(Old_ServiceOrdID_TXT); } // è®¾ç½®åºæ¬ä¿¡æ¯ createTaskVo.setTaskType("EMERGENCY_TRANSFER"); // æ¥æè½¬è¿ä»»å¡ // è®¾ç½®åæ®ç±»ååä»»å¡ç±»åIDï¼ä»æ§ç³»ç»å段æ å°ï¼ String serviceOrdClass = getStringValue(order, "ServiceOrdClass"); if (StringUtils.isNotEmpty(serviceOrdClass)) { createTaskVo.setDocumentTypeId(serviceOrdClass); } String serviceOrdType = getStringValue(order, "ServiceOrdType"); if (StringUtils.isNotEmpty(serviceOrdType)) { createTaskVo.setTaskTypeId(serviceOrdType); } // 设置åºåç±»å String serviceOrdAreaType = getStringValue(order, "ServiceOrdAreaType"); if (StringUtils.isNotEmpty(serviceOrdAreaType)) { // å¯ä»¥æ ¹æ®éè¦å°åºåç±»åæ å°å°TaskCreateVOçå ¶ä»å段 log.debug("åºåç±»å: {}", serviceOrdAreaType); } // è®¾ç½®ç¨æ·ID Long serviceOrdUserID = getLongValue(order, "ServiceOrdUserID"); if (serviceOrdUserID != null) { // å¯ä»¥æ ¹æ®éè¦å°ç¨æ·IDæ å°å°TaskCreateVOçå ¶ä»å段 log.debug("ç¨æ·ID: {}", serviceOrdUserID); } // 设置æ£è ä¿¡æ¯ TaskCreateVO.PatientInfo patientInfo = new TaskCreateVO.PatientInfo(); patientInfo.setName(getStringValue(order, "ServiceOrdPtName")); patientInfo.setPhone(getStringValue(order, "ServiceOrdCoPhone")); patientInfo.setIdCard(getStringValue(order, "ServiceOrdPtIDCard")); patientInfo.setCondition(getStringValue(order, "ServiceOrdPtCondition")); patientInfo.setContact(getStringValue(order, "ServiceOrdCoName")); String serviceOrdPtSex = getStringValue(order, "ServiceOrdPtSex"); if(serviceOrdPtSex!=null){ if(serviceOrdPtSex.equals("ç·")){ patientInfo.setGender("male"); }else if(serviceOrdPtSex.equals("女")){ patientInfo.setGender("female"); } } createTaskVo.setPatient(patientInfo); //1000å ¬éï¼æåæ°å String ServiceOrdTraDistance=getStringValue(order, "ServiceOrdTraDistance"); if(ServiceOrdTraDistance!=null){ ServiceOrdTraDistance=ServiceOrdTraDistance.replaceAll("[^0-9]", ""); createTaskVo.setDistance(new BigDecimal(ServiceOrdTraDistance)); } // 设置转åºå»é¢ä¿¡æ¯ TaskCreateVO.HospitalInfo hospitalOutInfo = new TaskCreateVO.HospitalInfo(); Long hospitalOutId = getLongValue(order, "ServiceOrdPtOutHospID"); hospitalOutInfo.setId(hospitalOutId); if (hospitalOutId != null) { String hospitalOutName = legacyTransferSyncMapper.selectHospitalNameByHospID(hospitalOutId.toString()); if (StringUtils.isNotEmpty(hospitalOutName)) { hospitalOutInfo.setName(hospitalOutName); } } String ServiceOrdTraVia=getStringValue(order, "ServiceOrdTraVia"); if(ServiceOrdTraVia!=null){ hospitalOutInfo.setAddress(ServiceOrdTraVia); } String hospitalOutDeptId = getStringValue(order, "ServiceOrdPtServicesID"); //转åºåºä½ String serviceOrdPtServices=getStringValue(order, "ServiceOrdPtServices"); hospitalOutInfo.setDepartmentId(hospitalOutDeptId); if (StringUtils.isNotEmpty(hospitalOutDeptId)) { String hospitalOutDeptName = legacyTransferSyncMapper.selectDepartmentNameByDeptID(hospitalOutDeptId); if (StringUtils.isNotEmpty(hospitalOutDeptName)) { hospitalOutInfo.setDepartment(hospitalOutDeptName); } } if(serviceOrdPtServices!= null){ hospitalOutInfo.setBedNumber(serviceOrdPtServices); } createTaskVo.setHospitalOut(hospitalOutInfo); // è®¾ç½®è½¬å ¥å»é¢ä¿¡æ¯ TaskCreateVO.HospitalInfo hospitalInInfo = new TaskCreateVO.HospitalInfo(); Long hospitalInId = getLongValue(order, "ServiceOrdPtInHospID"); hospitalInInfo.setId(hospitalInId); if (hospitalInId != null) { String hospitalInName = legacyTransferSyncMapper.selectHospitalNameByHospID(hospitalInId.toString()); if (StringUtils.isNotEmpty(hospitalInName)) { hospitalInInfo.setName(hospitalInName); } } String DispatchOrdTraEnd = getStringValue(order, "DispatchOrdTraEnd"); if(DispatchOrdTraEnd!= null){ hospitalInInfo.setAddress(DispatchOrdTraEnd); } //è½¬å ¥åºä½ String serviceOrdPtInServices =getStringValue(order, "ServiceOrdPtInServices"); if(serviceOrdPtInServices!= null){ hospitalInInfo.setBedNumber(serviceOrdPtInServices); } String hospitalInDeptId = getStringValue(order, "ServiceOrdPtInServicesID"); hospitalInInfo.setDepartmentId(hospitalInDeptId); if (StringUtils.isNotEmpty(hospitalInDeptId)) { String hospitalInDeptName = legacyTransferSyncMapper.selectDepartmentNameByDeptID(hospitalInDeptId); if (StringUtils.isNotEmpty(hospitalInDeptName)) { hospitalInInfo.setDepartment(hospitalInDeptName); } } createTaskVo.setHospitalIn(hospitalInInfo); // 设置å°åä¿¡æ¯ createTaskVo.setDepartureAddress(getStringValue(order, "ServiceOrdTraVia")); createTaskVo.setDestinationAddress(getStringValue(order, "ServiceOrdTraEnd")); // è®¾ç½®ä»·æ ¼åè·ç¦»ä¿¡æ¯ createTaskVo.setPrice(getBigDecimalValue(order, "ServiceOrdTraTxnPrice")); // è·ç¦»ä¿¡æ¯éè¦ä»å ¶ä»åæ®µè®¡ç®æè·å // 设置æ§è¡äººä¿¡æ¯ List<TaskCreateVO.AssigneeInfo> assignees = queryAssignees(dispatchOrdID); createTaskVo.setAssignees(assignees); // 设置车è¾ä¿¡æ¯ // 车è¾IDéè¦æ ¹æ®DispatchOrdCarIDæ¥è¯¢è·å String carID = getStringValue(order, "DispatchOrdCarID"); if (StringUtils.isNotEmpty(carID)) { String carLicense = legacyTransferSyncMapper.selectCarLicenseByCarID(carID); if (StringUtils.isNotEmpty(carLicense)) { // æ ¹æ®è½¦çå·æ¥è¯¢æ°ç³»ç»ä¸ç车è¾ID log.debug("车è¾è½¦çå·: {}", carLicense); // é¦å å°è¯éè¿VehicleInfoMapperæ¥è¯¢è½¦è¾ä¿¡æ¯ try { // å å°è¯éè¿car_idæ¥è¯¢è½¦è¾ä¿¡æ¯ Integer carIdInt = Integer.valueOf(carID); VehicleInfo vehicleInfo = vehicleInfoMapper.selectVehicleInfoByCarId(carIdInt); if (vehicleInfo != null && vehicleInfo.getVehicleId() != null) { // 设置车è¾IDå表 List<Long> vehicleIds = new ArrayList<>(); vehicleIds.add(vehicleInfo.getVehicleId()); createTaskVo.setVehicleIds(vehicleIds); log.debug("éè¿car_idæ¾å°è½¦è¾ä¿¡æ¯: vehicle_id={}, vehicle_no={}", vehicleInfo.getVehicleId(), vehicleInfo.getVehicleNo()); } else { // 妿éè¿car_idæ¾ä¸å°ï¼å°è¯éè¿è½¦çå·æ¥è¯¢ vehicleInfo = vehicleInfoMapper.selectVehicleInfoByVehicleNo(carLicense); if (vehicleInfo != null && vehicleInfo.getVehicleId() != null) { List<Long> vehicleIds = new ArrayList<>(); vehicleIds.add(vehicleInfo.getVehicleId()); createTaskVo.setVehicleIds(vehicleIds); log.debug("éè¿è½¦çå·æ¾å°è½¦è¾ä¿¡æ¯: vehicle_id={}, vehicle_no={}", vehicleInfo.getVehicleId(), vehicleInfo.getVehicleNo()); } else { log.warn("æªæ¾å°å¯¹åºç车è¾ä¿¡æ¯: car_id={}, vehicle_no={}", carID, carLicense); } } } catch (NumberFormatException e) { log.warn("carID䏿¯æææ°å: {}", carID); // 妿carID䏿¯æ°åï¼ç´æ¥éè¿è½¦çå·æ¥è¯¢ VehicleInfo vehicleInfo = vehicleInfoMapper.selectVehicleInfoByVehicleNo(carLicense); if (vehicleInfo != null && vehicleInfo.getVehicleId() != null) { List<Long> vehicleIds = new ArrayList<>(); vehicleIds.add(vehicleInfo.getVehicleId()); createTaskVo.setVehicleIds(vehicleIds); log.debug("éè¿è½¦çå·æ¾å°è½¦è¾ä¿¡æ¯: vehicle_id={}, vehicle_no={}", vehicleInfo.getVehicleId(), vehicleInfo.getVehicleNo()); } else { log.warn("æªæ¾å°å¯¹åºç车è¾ä¿¡æ¯: vehicle_no={}", carLicense); } } } } // è®¾ç½®å ¶ä»ä¿¡æ¯ createTaskVo.setTaskDescription("仿§ç³»ç»åæ¥ç转è¿å"); // è®¾ç½®å¤æ³¨ä¿¡æ¯ String remark = "æå¡åID: " + serviceOrdID + ", è°åº¦åID: " + dispatchOrdID; String serviceOrdCoTies = getStringValue(order, "ServiceOrdCoTies"); if (StringUtils.isNotEmpty(serviceOrdCoTies)) { remark += ", èç³»äººå ³ç³»: " + serviceOrdCoTies; } createTaskVo.setRemark(remark); // 设置计åå¼å§æ¶é´ Date plannedStartTime = getDateValue(order, "ServiceOrdApptDate"); if (plannedStartTime != null) { createTaskVo.setPlannedStartTime(plannedStartTime); } Date actualStartTime = getDateValue(order, "DispatchOrdActualDate"); if (actualStartTime != null) { createTaskVo.setActualStartTime(actualStartTime); } Date actualEndTime = getDateValue(order, "DispatchOrdReturnDate"); if (actualEndTime != null) { createTaskVo.setActualEndTime(actualEndTime); } // 设置å建æ¶é´ Date createTime = getDateValue(order, "ServiceOrd_CC_Time"); if (createTime != null) { createTaskVo.setCreateTime(createTime); } // æ¥è¯¢å¹¶è®¾ç½®ç æ ä¿¡æ¯ String diseaseIdsStr = queryDiseaseIds(serviceOrdID); if (StringUtils.isNotEmpty(diseaseIdsStr)) { String[] diseaseIdArray = diseaseIdsStr.split(","); List<Long> diseaseIds = new ArrayList<>(); for (String diseaseId : diseaseIdArray) { try { diseaseIds.add(Long.valueOf(diseaseId.trim())); } catch (NumberFormatException e) { log.warn("æ æçç¾ç ID: {}", diseaseId); } } createTaskVo.setDiseaseIds(diseaseIds); } log.info("TaskCreateVOæé 宿: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID); return createTaskVo; } catch (Exception e) { log.error("æé TaskCreateVOå¼å¸¸: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID, e); return null; } } /** * æ¥è¯¢æ§è¡äººä¿¡æ¯ * * @param dispatchOrdID è°åº¦åID * @return æ§è¡äººä¿¡æ¯å表 */ private List<TaskCreateVO.AssigneeInfo> queryAssignees(String dispatchOrdID) { try { // æ£æ¥åæ°æææ§ if (StringUtils.isEmpty(dispatchOrdID)) { log.warn("è°åº¦åIDä¸è½ä¸ºç©º"); return new ArrayList<>(); } // ä»SQL Serveræ¥è¯¢æ§è¡äººä¿¡æ¯ List<Map<String, Object>> assigneeList = legacyTransferSyncMapper.selectAssigneesByDispatchOrdID(dispatchOrdID); // 转æ¢ä¸ºTaskCreateVO.AssigneeInfo对象 List<TaskCreateVO.AssigneeInfo> assignees = new ArrayList<>(); if (assigneeList != null && !assigneeList.isEmpty()) { for (Map<String, Object> assigneeMap : assigneeList) { String entourageOAId = getStringValue(assigneeMap, "EntourageOAId"); String entourageState = getStringValue(assigneeMap, "EntourageState"); if (StringUtils.isNotEmpty(entourageOAId)) { try { // å°OAç¨æ·ID转æ¢ä¸ºç³»ç»ç¨æ·ID Integer oaUserId = Integer.valueOf(entourageOAId); SysUser sysUser = sysUserService.selectUserByOaUserId(oaUserId); if (sysUser != null) { TaskCreateVO.AssigneeInfo assigneeInfo = new TaskCreateVO.AssigneeInfo(); assigneeInfo.setUserId(sysUser.getUserId()); // 使ç¨ç³»ç»ç¨æ·ID assigneeInfo.setUserName(sysUser.getUserName()); // æ ¹æ®EntourageStateç¡®å®è§è²ç±»å // 1,2 叿ºï¼3,5 å»çï¼4,6 æ¤å£« if ("1".equals(entourageState) || "2".equals(entourageState)) { assigneeInfo.setUserType("driver"); } else if ("3".equals(entourageState) || "5".equals(entourageState)) { assigneeInfo.setUserType("doctor"); } else if ("4".equals(entourageState) || "6".equals(entourageState)) { assigneeInfo.setUserType("nurse"); } else { assigneeInfo.setUserType("other"); } assignees.add(assigneeInfo); } else { log.warn("æªæ¾å°å¯¹åºçç³»ç»ç¨æ·: OAç¨æ·ID={}", oaUserId); } } catch (NumberFormatException e) { log.warn("æ§è¡äººOA ID䏿¯æææ°å: {}", entourageOAId); } } } } log.info("æ¥è¯¢å°{}个æ§è¡äººï¼è°åº¦åID: {}", assignees.size(), dispatchOrdID); return assignees; } catch (Exception e) { log.error("æ¥è¯¢æ§è¡äººä¿¡æ¯å¼å¸¸ï¼è°åº¦åID: {}", dispatchOrdID, e); return new ArrayList<>(); // è¿å空å表è䏿¯null } } /** * æ¥è¯¢ç æ ä¿¡æ¯ * * @param serviceOrdID æå¡åID * @return ç æ IDå表 */ private String queryDiseaseIds(String serviceOrdID) { try { // æ£æ¥åæ°æææ§ if (StringUtils.isEmpty(serviceOrdID)) { log.warn("æå¡åIDä¸è½ä¸ºç©º"); return null; } // ä»SQL Serveræ¥è¯¢ç æ ä¿¡æ¯ List<String> diseaseIds = legacyTransferSyncMapper.selectDiseaseIdsByServiceOrdID(serviceOrdID); // 转æ¢ä¸ºéå·åéçå符串 if (diseaseIds != null && !diseaseIds.isEmpty()) { return String.join(",", diseaseIds); } log.info("æ¥è¯¢å°ç æ ä¿¡æ¯ï¼æå¡åID: {}, ç æ æ°é: {}", serviceOrdID, diseaseIds != null ? diseaseIds.size() : 0); return null; } catch (Exception e) { log.error("æ¥è¯¢ç æ ä¿¡æ¯å¼å¸¸ï¼æå¡åID: {}", serviceOrdID, e); return null; } } /** * ä»Mapä¸è·ååç¬¦ä¸²å¼ * * @param map Map对象 * @param key é® * @return åç¬¦ä¸²å¼ */ private String getStringValue(Map<String, Object> map, String key) { Object value = map.get(key); return value != null ? value.toString() : null; } /** * ä»Mapä¸è·åBigDecimalå¼ * * @param map Map对象 * @param key é® * @return BigDecimalå¼ */ private BigDecimal getBigDecimalValue(Map<String, Object> map, String key) { Object value = map.get(key); if (value == null) { return null; } if (value instanceof BigDecimal) { return (BigDecimal) value; } try { return new BigDecimal(value.toString()); } catch (NumberFormatException e) { return null; } } /** * ä»Mapä¸è·åLongå¼ * * @param map Map对象 * @param key é® * @return Longå¼ */ private Long getLongValue(Map<String, Object> map, String key) { Object value = map.get(key); if (value == null) { return null; } if (value instanceof Long) { return (Long) value; } try { return Long.valueOf(value.toString()); } catch (NumberFormatException e) { return null; } } private Integer getIntegerValue(Map<String, Object> map, String key) { Object value = map.get(key); if (value == null) { return null; } if (value instanceof Integer) { return (Integer) value; } try { return Integer.valueOf(value.toString()); } catch (NumberFormatException e) { return null; } } /** * ä»Mapä¸è·åDateå¼ * * @param map Map对象 * @param key é® * @return Dateå¼ */ private Date getDateValue(Map<String, Object> map, String key) { Object value = map.get(key); if (value == null) { return null; } if (value instanceof Date) { return (Date) value; } // 妿æ¯å符串ï¼å°è¯è§£æ if (value instanceof String) { try { return DateUtils.parseDate(value.toString()); } catch (Exception e) { return null; } } return null; } /** * éªè¯æ¥æåç¬¦ä¸²æ ¼å¼æ¯å¦ææ * * @param dateStr æ¥æå符串 * @param format æ¥ææ ¼å¼ * @return æ¯å¦ææ */ private boolean isValidDateFormat(String dateStr, String format) { if (StringUtils.isEmpty(dateStr)) { return false; } try { SimpleDateFormat sdf = new SimpleDateFormat(format); sdf.setLenient(false); sdf.parse(dateStr); return true; } catch (Exception e) { return false; } } } ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java
@@ -428,4 +428,16 @@ return result; } /** * æ ¹æ®service_classæ¥è¯¢é¨é¨ä¿¡æ¯ * * @param serviceClass æå¡ç±»å«ç¼ç * @return é¨é¨ä¿¡æ¯ */ @Override public SysDept selectDeptByServiceClass(String serviceClass) { return deptMapper.selectDeptByServiceClass(serviceClass); } } ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java
@@ -142,6 +142,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 +154,9 @@ task.setCreatorId(SecurityUtils.getUserId()); // ä¼å 使ç¨åç«¯ä¼ å ¥çé¨é¨IDï¼å¦ææ²¡æå使ç¨å½åç¨æ·çé¨é¨ID 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"); @@ -228,17 +229,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); } // è®°å½æä½æ¥å¿ @@ -291,6 +292,170 @@ } }).start(); } return result; } /** * æ°å¢ä»»å¡ç®¡çï¼å 许ä»å¤é¨ä¼ å ¥ç¨æ·ä¿¡æ¯ãé¨é¨ä¿¡æ¯åæ¶é´ä¿¡æ¯ï¼ * * @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()); // 使ç¨å¤é¨ä¼ å ¥çç¨æ·IDåé¨é¨ID 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()); } 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; } @@ -973,6 +1138,70 @@ return sysTaskMapper.selectActiveTasksByVehicleId(vehicleId); } /** * æ£æ¥ä»»å¡æ¯å¦å·²å ³èæ§ç³»ç»æå¡åID * * @param taskId ä»»å¡ID * @return true-å·²å ³èï¼false-æªå ³è */ @Override public boolean hasLegacyServiceOrdId(Long taskId) { // åªææ¥æè½¬è¿ä»»å¡æææ§ç³»ç»ID 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) { // åªææ¥æè½¬è¿ä»»å¡æææ§ç³»ç»ID 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-åå¨ï¼false-ä¸åå¨ */ @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-åå¨ï¼false-ä¸åå¨ */ @Override public boolean existsByLegacyDispatchOrdId(Long legacyDispatchOrdId) { if (legacyDispatchOrdId == null) { return false; } SysTaskEmergency emergencyInfo = sysTaskEmergencyMapper.selectByLegacyDispatchOrdId(legacyDispatchOrdId); return emergencyInfo != null; } @Autowired private TaskCodeGenerator taskCodeGenerator; @@ -1105,14 +1334,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 +1374,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); @@ -1200,12 +1429,26 @@ .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); } @@ -1216,7 +1459,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 +1488,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); } ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -151,6 +151,18 @@ { return userMapper.selectUserByOpenId(openId); } /** * æ ¹æ®oaUserIdæ¥è¯¢ç¨æ· * * @param oaUserId SQL Serverä¸çOAç¨æ·ID * @return ç¨æ·ä¿¡æ¯ */ @Override public SysUser selectUserByOaUserId(Integer oaUserId) { return userMapper.selectUserByOaUserId(oaUserId); } /** * æ¥è¯¢ç¨æ·æå±è§è²ç» ruoyi-system/src/main/resources/mapper/system/LegacyTransferSyncMapper.xml
New file @@ -0,0 +1,182 @@ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.system.mapper.LegacyTransferSyncMapper"> <!-- 转è¿åç»ææ å° --> <resultMap type="java.util.HashMap" id="TransferOrderResult"> <result property="ServiceOrdID" column="ServiceOrdID" /> <result property="ServiceOrdUserID" column="ServiceOrdUserID" /> <result property="ServiceOrdAreaType" column="ServiceOrdAreaType" /> <result property="ServiceOrdType" column="ServiceOrdType" /> <result property="ServiceOrdTraTxnPrice" column="ServiceOrdTraTxnPrice" /> <result property="ServiceOrdPtOutHospID" column="ServiceOrdPtOutHospID" /> <result property="ServiceOrdPtServicesID" column="ServiceOrdPtServicesID" /> <result property="ServiceOrdPtInHospID" column="ServiceOrdPtInHospID" /> <result property="ServiceOrdPtInServicesID" column="ServiceOrdPtInServicesID" /> <result property="ServiceOrdCoTies" column="ServiceOrdCoTies" /> <result property="ServiceOrdCoName" column="ServiceOrdCoName" /> <result property="ServiceOrdCoPhone" column="ServiceOrdCoPhone" /> <result property="ServiceOrdClass" column="ServiceOrdClass" /> <result property="ServiceOrdTraStreet" column="ServiceOrdTraStreet" /> <result property="ServiceOrdTraEnd" column="ServiceOrdTraEnd" /> <result property="ServiceOrdPtCondition" column="ServiceOrdPtCondition" /> <result property="DispatchOrd_NS_Time" column="DispatchOrd_NS_Time" /> <result property="ServiceOrdState" column="ServiceOrdState" /> <result property="ServiceOrdPtIDCard" column="ServiceOrdPtIDCard" /> <result property="ServiceOrd_NS_ID" column="ServiceOrd_NS_ID" /> <result property="ServiceOrd_CC_ID" column="ServiceOrd_CC_ID" /> <result property="DispatchOrdTraStreet" column="DispatchOrdTraStreet" /> <result property="DispatchOrdStartDate" column="DispatchOrdStartDate" /> <result property="DispatchOrdActualDate" column="DispatchOrdActualDate" /> <result property="DispatchOrdReturnDate" column="DispatchOrdReturnDate" /> <result property="DispatchOrdTraEnd" column="DispatchOrdTraEnd" /> <result property="DispatchOrdID" column="DispatchOrdID" /> <result property="DispatchOrdCarID" column="DispatchOrdCarID" /> <result property="ServiceOrdPtName" column="ServiceOrdPtName" /> <result property="ServiceOrdPtServices" column="ServiceOrdPtServices" /> <result property="ServiceOrdPtInServices" column="ServiceOrdPtInServices" /> <result property="ServiceOrdPtSex" column="ServiceOrdPtSex" /> <result property="ServiceOrdTraVia" column="ServiceOrdTraVia" /> <result property="Old_ServiceOrdID_TXT" column="Old_ServiceOrdID_TXT" /> <result property="ServiceOrdTraDistance" column="ServiceOrdTraDistance" /> <result property="ServiceOrdApptDate" column="ServiceOrdApptDate" /> </resultMap> <!-- æ§è¡äººç»ææ å° --> <resultMap type="java.util.HashMap" id="AssigneeResult"> <result property="EntourageOAId" column="EntourageOAId" /> <result property="EntourageState" column="EntourageState" /> </resultMap> <!-- æ¥è¯¢æå®æ¥æèå´ç转è¿åæ°æ® --> <select id="selectTransferOrders" resultMap="TransferOrderResult"> SELECT a.ServiceOrdID, a.Old_ServiceOrdID_TXT, a.ServiceOrdTraVia, a.ServiceOrdApptDate, a.ServiceOrd_NS_ID, a.ServiceOrd_CC_ID, a.ServiceOrd_CC_Time, a.ServiceOrdPtSex, a.ServiceOrdAreaType, a.ServiceOrdType, a.ServiceOrdTraTxnPrice, a.ServiceOrdPtOutHospID, a.ServiceOrdPtServicesID, a.ServiceOrdPtInHospID, a.ServiceOrdPtInServicesID, a.ServiceOrdCoTies, a.ServiceOrdCoName, a.ServiceOrdTraDistance, a.ServiceOrdCoPhone, a.ServiceOrdClass, a.ServiceOrdTraStreet, a.ServiceOrdTraEnd, a.ServiceOrdPtCondition, b.DispatchOrd_NS_Time, a.ServiceOrdState, a.ServiceOrdPtIDCard, b.DispatchOrdTraStreet, b.DispatchOrdStartDate, b.DispatchOrdActualDate, b.DispatchOrdReturnDate, b.DispatchOrdTraEnd, b.DispatchOrdID, b.DispatchOrdCarID, a.ServiceOrdPtServices, a.ServiceOrdPtInServices, a.ServiceOrdPtName FROM ServiceOrder as a INNER JOIN DispatchOrd b on a.ServiceOrdID = b.ServiceOrdIDDt WHERE a.ServiceOrdState = 3 AND a.ServiceOrd_CC_Time > #{startDate} AND b.DispatchOrdState != 0 </select> <!-- æ ¹æ®æå¡åIDåè°åº¦åIDæ¥è¯¢è½¬è¿åæ°æ® --> <select id="selectTransferOrdersByIDs" resultMap="TransferOrderResult"> SELECT a.ServiceOrdID, a.Old_ServiceOrdID_TXT, a.ServiceOrdTraVia, a.ServiceOrdApptDate, a.ServiceOrdUserID, a.ServiceOrd_NS_ID, a.ServiceOrd_CC_ID, a.ServiceOrd_CC_Time, a.ServiceOrdAreaType, a.ServiceOrdType, a.ServiceOrdPtSex, a.ServiceOrdTraTxnPrice, a.ServiceOrdPtOutHospID, a.ServiceOrdPtServicesID, a.ServiceOrdPtInHospID, a.ServiceOrdPtInServicesID, a.ServiceOrdCoTies, a.ServiceOrdCoName, a.ServiceOrdTraDistance, a.ServiceOrdCoPhone, a.ServiceOrdClass, a.ServiceOrdTraStreet, a.ServiceOrdTraEnd, a.ServiceOrdPtCondition, b.DispatchOrd_NS_Time, a.ServiceOrdState, a.ServiceOrdPtIDCard, b.DispatchOrdTraStreet, b.DispatchOrdStartDate, b.DispatchOrdTraEnd, b.DispatchOrdID, b.DispatchOrdCarID, a.ServiceOrdPtServices, a.ServiceOrdPtInServices, a.ServiceOrdPtName FROM ServiceOrder as a INNER JOIN DispatchOrd b on a.ServiceOrdID = b.ServiceOrdIDDt WHERE a.ServiceOrdID = #{serviceOrdID} AND b.DispatchOrdID = #{dispatchOrdID} AND a.ServiceOrdState = 3 AND b.DispatchOrdState != 0 </select> <!-- æ ¹æ®æå¡åIDæ¥è¯¢ç æ ä¿¡æ¯ --> <select id="selectDiseaseIdsByServiceOrdID" resultType="String"> SELECT icd_id FROM ServiceOrder_ICD WHERE ServiceOrdIDDt = #{serviceOrdID} </select> <!-- æ ¹æ®è°åº¦åIDæ¥è¯¢æ§è¡äººä¿¡æ¯ --> <select id="selectAssigneesByDispatchOrdID" resultMap="AssigneeResult"> SELECT EntourageOAId, EntourageState FROM DispatchOrd_Entourage WHERE DispatchOrdIDDt = #{dispatchOrdID} </select> <!-- æ ¹æ®è½¦è¾IDæ¥è¯¢è½¦çå· --> <select id="selectCarLicenseByCarID" resultType="String"> SELECT CarLicense FROM CarData WHERE CarID = #{carID} </select> <!-- æ ¹æ®å»é¢IDæ¥è¯¢å»é¢åç§° --> <select id="selectHospitalNameByHospID" resultType="String"> SELECT HospName FROM HospData WHERE HospID = #{hospID} </select> <!-- æ ¹æ®ç§å®¤IDæ¥è¯¢ç§å®¤åç§° --> <select id="selectDepartmentNameByDeptID" resultType="String"> SELECT vtext FROM dictionary WHERE vID = #{deptID} AND vtitle = 'HospitalDepartment' </select> </mapper> ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml
@@ -221,5 +221,12 @@ </foreach> ) </select> <!-- æ ¹æ®service_classæ¥è¯¢é¨é¨ä¿¡æ¯ --> <select id="selectDeptByServiceClass" parameterType="String" resultMap="SysDeptResult"> <include refid="selectDeptVo"/> where d.service_order_class = #{serviceClass} and d.del_flag = '0' limit 1 </select> </mapper> ruoyi-system/src/main/resources/mapper/system/SysTaskEmergencyMapper.xml
@@ -285,5 +285,17 @@ limit 200 </if> </select> <!-- æ ¹æ®æ§ç³»ç»æå¡åIDæ¥è¯¢æ¥æè½¬è¿ä»»å¡æ©å±ä¿¡æ¯ --> <select id="selectByLegacyServiceOrdId" parameterType="Long" resultMap="SysTaskEmergencyResult"> <include refid="selectSysTaskEmergencyVo"/> where legacy_service_ord_id = #{legacyServiceOrdId} </select> <!-- æ ¹æ®æ§ç³»ç»è°åº¦åIDæ¥è¯¢æ¥æè½¬è¿ä»»å¡æ©å±ä¿¡æ¯ --> <select id="selectByLegacyDispatchOrdId" parameterType="Long" resultMap="SysTaskEmergencyResult"> <include refid="selectSysTaskEmergencyVo"/> where legacy_dispatch_ord_id = #{legacyDispatchOrdId} </select> </mapper> ruoyi-system/src/main/resources/mapper/system/SysTaskMapper.xml
@@ -186,6 +186,10 @@ <if test="creatorId != null">creator_id,</if> <if test="assigneeId != null">assignee_id,</if> <if test="deptId != null">dept_id,</if> <if test="plannedStartTime!=null">planned_start_time,</if> <if test="plannedEndTime!=null">planned_end_time,</if> <if test="plannedStartTime!=null">planned_start_time,</if> <if test="plannedEndTime!=null">planned_end_time,</if> <if test="createTime != null">create_time,</if> update_time, <if test="createBy != null">create_by,</if> @@ -212,6 +216,10 @@ <if test="creatorId != null">#{creatorId},</if> <if test="assigneeId != null">#{assigneeId},</if> <if test="deptId != null">#{deptId},</if> <if test="plannedStartTime!=null">#{plannedStartTime},</if> <if test="plannedEndTime!=null">#{plannedEndTime},</if> <if test="actualStartTime!=null">#{actualStartTime},</if> <if test="actualEndTime!=null">#{actualEndTime},</if> <if test="createTime != null">#{createTime},</if> now(), <if test="createBy != null">#{createBy},</if> ruoyi-system/src/main/resources/mapper/system/SysTaskVehicleMapper.xml
@@ -27,7 +27,8 @@ t.task_code, t.task_type from sys_task_vehicle tv left join tb_vehicle_info v on tv.vehicle_id = v.vehicle_id left join sys_dept d on v.dept_id = d.dept_id left join tb_vehicle_dept vd on v.vehicle_id = vd.vehicle_id left join sys_dept d on vd.dept_id = d.dept_id left join sys_task t on tv.task_id = t.task_id </sql> @@ -117,4 +118,4 @@ <delete id="deleteSysTaskVehicleByTaskIdAndVehicleId"> delete from sys_task_vehicle where task_id = #{taskId} and vehicle_id = #{vehicleId} </delete> </mapper> </mapper> ruoyi-system/src/main/resources/mapper/system/VehicleInfoMapper.xml
@@ -137,6 +137,22 @@ <include refid="selectVehicleInfoVo"/> where v.vehicle_no LIKE concat('%', #{vehicleNo}, '%') </select> <!-- æ ¹æ®æ§ç³»ç»è½¦è¾ID(CarID)æ¥è¯¢è½¦è¾ä¿¡æ¯ --> <select id="selectVehicleInfoByCarId" parameterType="Integer" resultMap="VehicleInfoResult"> <include refid="selectVehicleInfoVo"/> where v.car_id = #{carId} </select> <!-- æ ¹æ®æ§ç³»ç»è½¦è¾IDæ¥è¯¢è½¦è¾ä¿¡æ¯ --> <select id="selectVehicleInfoByCarID" resultType="java.util.HashMap"> SELECT vehicle_id, car_id, vehicle_no FROM tb_vehicle_info WHERE car_id = #{carID} </select> <insert id="insertVehicleInfo" parameterType="VehicleInfo" useGeneratedKeys="true" keyProperty="vehicleId"> insert into tb_vehicle_info ruoyi-system/src/test/java/com/ruoyi/system/mapper/SysDeptMapperTest.java
ruoyi-system/src/test/java/com/ruoyi/system/service/SysDeptServiceTest.java
ruoyi-system/src/test/java/com/ruoyi/system/service/impl/LegacyTransferSyncServiceImplTest.java
New file @@ -0,0 +1,113 @@ package com.ruoyi.system.service.impl; import com.ruoyi.system.domain.vo.TaskCreateVO; import com.ruoyi.system.service.ILegacyTransferSyncService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.HashMap; import java.util.Map; import static org.junit.jupiter.api.Assertions.*; @SpringBootTest public class LegacyTransferSyncServiceImplTest { @Autowired private ILegacyTransferSyncService legacyTransferSyncService; @Test public void testBuildCreateTaskVo() { // å夿µè¯æ°æ® String serviceOrdID = "12345"; String dispatchOrdID = "67890"; Map<String, Object> order = new HashMap<>(); order.put("ServiceOrdID", serviceOrdID); order.put("DispatchOrdID", dispatchOrdID); order.put("ServiceOrdPtName", "å¼ ä¸"); order.put("ServiceOrdCoPhone", "13800138000"); order.put("ServiceOrdPtIDCard", "110101199001011234"); order.put("ServiceOrdPtCondition", "ç æ 稳å®"); order.put("ServiceOrdCoName", "æå"); order.put("ServiceOrdPtOutHospID", 1001L); order.put("ServiceOrdPtServicesID", "2001"); order.put("ServiceOrdPtInHospID", 1002L); order.put("ServiceOrdPtInServicesID", "2002"); order.put("ServiceOrdTraStreet", "åäº¬å¸æé³åºææè¡é123å·"); order.put("ServiceOrdTraEnd", "åäº¬å¸æµ·æ·åºææå»é¢"); order.put("ServiceOrdTraTxnPrice", "500.00"); order.put("ServiceOrdClass", "A001"); order.put("ServiceOrdType", "T001"); order.put("DispatchOrdStartDate", "2025-11-20 09:00:00"); order.put("DispatchOrd_NS_Time", "2025-11-19 14:30:00"); // è°ç¨æ¹æ³ TaskCreateVO taskCreateVO = legacyTransferSyncService.buildCreateTaskVo(serviceOrdID, dispatchOrdID, order); // éªè¯ç»æ assertNotNull(taskCreateVO); assertEquals("EMERGENCY_TRANSFER", taskCreateVO.getTaskType()); assertEquals("仿§ç³»ç»åæ¥ç转è¿å", taskCreateVO.getTaskDescription()); // éªè¯æ£è ä¿¡æ¯ assertNotNull(taskCreateVO.getPatient()); assertEquals("å¼ ä¸", taskCreateVO.getPatient().getName()); assertEquals("13800138000", taskCreateVO.getPatient().getPhone()); assertEquals("110101199001011234", taskCreateVO.getPatient().getIdCard()); assertEquals("ç æ 稳å®", taskCreateVO.getPatient().getCondition()); assertEquals("æå", taskCreateVO.getPatient().getContact()); // éªè¯è½¬åºå»é¢ä¿¡æ¯ assertNotNull(taskCreateVO.getHospitalOut()); assertEquals(Long.valueOf(1001), taskCreateVO.getHospitalOut().getId()); assertEquals("2001", taskCreateVO.getHospitalOut().getDepartmentId()); // éªè¯è½¬å ¥å»é¢ä¿¡æ¯ assertNotNull(taskCreateVO.getHospitalIn()); assertEquals(Long.valueOf(1002), taskCreateVO.getHospitalIn().getId()); assertEquals("2002", taskCreateVO.getHospitalIn().getDepartmentId()); // éªè¯å°åä¿¡æ¯ assertEquals("åäº¬å¸æé³åºææè¡é123å·", taskCreateVO.getDepartureAddress()); assertEquals("åäº¬å¸æµ·æ·åºææå»é¢", taskCreateVO.getDestinationAddress()); // éªè¯ä»·æ ¼ä¿¡æ¯ assertEquals("500.00", taskCreateVO.getPrice().toString()); // éªè¯åæ®ç±»ååä»»å¡ç±»å assertEquals("A001", taskCreateVO.getDocumentTypeId()); assertEquals("T001", taskCreateVO.getTaskTypeId()); // éªè¯å¤æ³¨ä¿¡æ¯ assertTrue(taskCreateVO.getRemark().contains("æå¡åID: " + serviceOrdID)); assertTrue(taskCreateVO.getRemark().contains("è°åº¦åID: " + dispatchOrdID)); } @Test public void testIsTransferOrderSyncedWithInvalidParams() { // æµè¯æå¡åIDä¸ºç©ºçæ åµ boolean result1 = legacyTransferSyncService.isTransferOrderSynced(null, "12345"); assertFalse(result1); // æµè¯æå¡åID为空åç¬¦ä¸²çæ åµ boolean result2 = legacyTransferSyncService.isTransferOrderSynced("", "12345"); assertFalse(result2); // æµè¯æå¡åIDä¸ºéæ°ååç¬¦ä¸²çæ åµ boolean result3 = legacyTransferSyncService.isTransferOrderSynced("abc", "12345"); assertFalse(result3); } @Test public void testSyncSingleTransferOrderWithInvalidParams() { // æµè¯æå¡åIDä¸ºç©ºçæ åµ boolean result1 = legacyTransferSyncService.syncSingleTransferOrder(null, "12345"); assertFalse(result1); // æµè¯æå¡åID为空åç¬¦ä¸²çæ åµ boolean result2 = legacyTransferSyncService.syncSingleTransferOrder("", "12345"); assertFalse(result2); } } sql/legacy_transfer_sync_job.sql
New file @@ -0,0 +1,88 @@ -- æ§ç³»ç»è½¬è¿å忥宿¶ä»»å¡é ç½®SQL -- å¨sys_jobè¡¨ä¸æ·»å 宿¶ä»»å¡ -- 转è¿åèªå¨åæ¥ï¼ä»æ§ç³»ç»å°æ°ç³»ç»ï¼ INSERT INTO sys_job (job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_by, create_time, remark) VALUES ('æ§ç³»ç»è½¬è¿å忥', 'DEFAULT', 'legacyTransferSyncTask.syncTransferOrders7Days', '0 0 2 * * ?', '3', '1', '0', 'admin', sysdate(), 'æ¯å¤©åæ¨2ç¹èªå¨åæ¥7天åçæ§ç³»ç»è½¬è¿åæ°æ®ã'); -- 说æï¼ -- job_name: ä»»å¡åç§° - æ§ç³»ç»è½¬è¿å忥 -- job_group: ä»»å¡ç»åï¼DEFAULT为é»è®¤ç»ï¼ -- invoke_target: è°ç¨ç®æ å符串ï¼Beanåç§°.æ¹æ³åï¼ -- - legacyTransferSyncTask.syncTransferOrders7Days() 忥7天åç转è¿åæ°æ® -- - legacyTransferSyncTask.syncTransferOrders('7') ä¹å¯ä»¥ä½¿ç¨å¸¦åæ°çæ¹æ³ -- cron_expression: cronè¡¨è¾¾å¼ -- - '0 0 2 * * ?' = æ¯å¤©åæ¨2ç¹æ§è¡ -- - '0 0 2 * * ?' = æ¯å¤©åæ¨2ç¹æ§è¡ -- - '0 0 3 * * ?' = æ¯å¤©åæ¨3ç¹æ§è¡ -- - '0 0 2 1 * ?' = æ¯æ1æ¥åæ¨2ç¹æ§è¡ -- misfire_policy: éè¿æ§è¡çç¥ -- - 1=ç«å³æ§è¡ -- - 2=æ§è¡ä¸æ¬¡ -- - 3=æ¾å¼æ§è¡ï¼æ¨èï¼ -- concurrent: æ¯å¦å¹¶å -- - 0=å 许并å -- - 1=ç¦æ¢å¹¶åï¼æ¨èï¼é¿å éå¤åæ¥ï¼ -- status: ç¶æ -- - 0=æ£å¸¸ï¼å¯ç¨ï¼ -- - 1=æåï¼åç¨ï¼ -- create_by: å建è -- create_time: å建æ¶é´ -- remark: 夿³¨è¯´æ -- 忥é»è¾ï¼ -- 1. æ¯å¤©åæ¨èªå¨æ§è¡åæ¥ä»»å¡ -- 2. æ¥è¯¢7天åç转è¿åæ°æ® -- 3. æ£æ¥æ¯å¦å·²åæ¥è¿ -- 4. æªåæ¥ç转è¿åæ°æ®å建æ°ä»»å¡ -- 5. è®°å½åæ¥æ¥å¿ -- çæ§æ¥è¯¢ï¼ -- æ¥ç仿¥è½¬è¿å忥ç»è®¡ï¼ SELECT COUNT(*) AS total_sync_count, SUM(CASE WHEN task_type = 'EMERGENCY_TRANSFER' THEN 1 ELSE 0 END) AS emergency_transfer_count FROM sys_task WHERE DATE(create_time) = CURDATE() AND task_description LIKE '%仿§ç³»ç»åæ¥ç转è¿å%'; -- æ¥çåæ¥å¤±è´¥çä»»å¡ï¼ SELECT task_id, task_code, task_description, create_time FROM sys_task WHERE task_description LIKE '%仿§ç³»ç»åæ¥ç转è¿å%' AND task_status = 'ERROR' ORDER BY create_time DESC; -- æ¥çæè¿åæ¥çä»»å¡ï¼ SELECT t.task_id, t.task_code, t.task_description, t.create_time, e.legacy_service_ord_id, e.legacy_dispatch_ord_id FROM sys_task t LEFT JOIN sys_task_emergency e ON t.task_id = e.task_id WHERE t.task_description LIKE '%仿§ç³»ç»åæ¥ç转è¿å%' ORDER BY t.create_time DESC LIMIT 20; -- 使ç¨å»ºè®®ï¼ -- 1. 建议å¨ä¸å¡ä½å³°ææ§è¡åæ¥ä»»å¡ï¼å¦åæ¨2ç¹ï¼ -- 2. 坿 ¹æ®å®é éæ±è°æ´åæ¥å¤©æ°ï¼å¦æ¹ä¸º3天æ14å¤©ï¼ -- 3. å®ææ£æ¥åæ¥å¤±è´¥çä»»å¡å¹¶å¤ç -- 4. å¯éè¿ä¿®æ¹ status=1 临æ¶ç¦ç¨åæ¥ä»»å¡ -- é误å¤çï¼ -- 1. å¦æåæ¥å¤±è´¥ï¼æ£æ¥ï¼ -- - SQL Serverè¿æ¥æ¯å¦æ£å¸¸ -- - æ°æ®æ ¼å¼æ¯å¦æ£ç¡® -- - æ°ç³»ç»å段æ¯å¦å¹é -- 2. å¯éè¿å®æ¶ä»»å¡æ¥å¿æ¥ç详ç»éè¯¯ï¼ -- ç³»ç»çæ§ -> 宿¶ä»»å¡ -> è°åº¦æ¥å¿