wlzboy
4 小时以前 5f2ee03958a1a16dc27195c76ea7cffb422c95d1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
package com.ruoyi.system.service.impl;
 
import java.util.Date;
import java.util.List;
 
import com.ruoyi.common.utils.LongUtil;
import com.ruoyi.system.domain.*;
import com.ruoyi.system.mapper.*;
import com.ruoyi.system.service.*;
import com.ruoyi.system.task.ITaskAttachmentService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
 
import com.ruoyi.common.config.LegacySystemConfig;
 
/**
 * 旧系统同步Service业务层处理
 * 
 * @author ruoyi
 * @date 2024-01-20
 */
@Service
public class LegacySystemSyncServiceImpl implements ILegacySystemSyncService {
    
    private static final Logger log = LoggerFactory.getLogger(LegacySystemSyncServiceImpl.class);
    
    @Autowired
    private LegacySystemConfig legacyConfig;
    
    @Autowired
    private SysTaskMapper sysTaskMapper;
    
    @Autowired
    private SysTaskEmergencyMapper sysTaskEmergencyMapper;
    
    @Autowired
    private SysUserMapper sysUserMapper;
    
    @Autowired
    private SysDeptMapper sysDeptMapper;
    
    @Autowired
    private SysTaskVehicleMapper sysTaskVehicleMapper;
    
    @Autowired
    private SysTaskAssigneeMapper sysTaskAssigneeMapper;
    
    @Autowired
    private VehicleInfoMapper vehicleInfoMapper;
    
    @Autowired
    private IDispatchOrdService dispatchOrdService;
    
    @Autowired
    private ISysTaskEmergencyService sysTaskEmergencyService;
 
    @Autowired
    private ITaskAttachmentSyncService taskAttachmentSyncService;
 
    @Autowired
    private ISysTaskService sysTaskService;
 
    @Autowired
    private ITaskAttachmentService taskAttachmentService;
 
 
    @Autowired
    private ApplicationEventPublisher eventPublisher;
    
    @Autowired
    private LegacyTransferSyncMapper legacyTransferSyncMapper;
 
 
    @Autowired
    private TaskEmergencySyncService taskEmergencySyncService;
 
 
    @Autowired
    private ITaskDispatchSyncService taskDispatchSyncService;
 
 
 
 
    @Override
    public Long syncEmergencyTaskToLegacy(Long taskId) {
        return taskEmergencySyncService.syncEmergency(taskId);
    }
 
    /**
     * 批量同步未同步的急救转运任务
     * 使用分页查询,确保所有符合条件的任务都能被同步
     */
    @Override
    public int batchSyncPendingTasks() {
        if (!legacyConfig.isEnabled()) {
            log.info("旧系统同步已禁用");
            return 0;
        }
        
        try {
            int totalSuccessCount = 0;
            int pageSize = 100; // 每页100条
            int offset = 0;
            
            while (true) {
                // 分页查询未同步的急救转运任务(同步状态为0或3的任务)
                List<SysTaskEmergency> pendingTasks = sysTaskEmergencyService.selectPendingSyncTasks(offset, pageSize);
                
                if (pendingTasks == null || pendingTasks.isEmpty()) {
                    log.info("没有更多需要同步的任务,offset: {}", offset);
                    break; // 没有更多数据,退出循环
                }
                
//                log.info("开始同步第 {} 页,任务数量: {}", (offset / pageSize) + 1, pendingTasks.size());
                
                int pageSuccessCount = 0;
                for (SysTaskEmergency emergency : pendingTasks) {
                    Long serviceOrdId = syncEmergencyTaskToLegacy(emergency.getTaskId());
                    if (LongUtil.isNotEmpty(serviceOrdId)) {
                        pageSuccessCount++;
                    }
                    
                    // 避免过于频繁的请求
                    try {
                        Thread.sleep(1000); // 每个请求间隔1秒
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                        log.warn("同步被中断");
                        return totalSuccessCount + pageSuccessCount;
                    }
                }
                
                totalSuccessCount += pageSuccessCount;
//                log.info("第 {} 页同步完成,总数: {}, 成功: {}",
//                    (offset / pageSize) + 1, pendingTasks.size(), pageSuccessCount);
                
                // 如果本页数据少于每页大小,说明已经是最后一页
                if (pendingTasks.size() < pageSize) {
//                    log.info("已到达最后一页,同步结束");
                    break;
                }
                
                offset += pageSize; // 下一页
            }
            
//            log.info("批量同步完成,总成功数: {}", totalSuccessCount);
            return totalSuccessCount;
            
        } catch (Exception e) {
            log.error("批量同步任务异常", e);
            return 0;
        }
    }
    
    /**
     * 重新同步失败的任务
     */
    @Override    
    public boolean retrySyncTask(Long taskId) {
        try {
            // 重置同步状态
            SysTaskEmergency emergency = sysTaskEmergencyService.selectSysTaskEmergencyByTaskId(taskId);
            if (emergency != null) {
                emergency.setSyncStatus(0); // 重置为未同步
                emergency.setLegacyServiceOrdId(null);
                emergency.setSyncErrorMsg(null);
                sysTaskEmergencyService.updateSysTaskEmergency(emergency);
            }
            
            // 重新同步
            Long serviceOrdId = syncEmergencyTaskToLegacy(taskId);
            return LongUtil.isNotEmpty(serviceOrdId);
            
        } catch (Exception e) {
            log.error("重新同步任务失败,任务ID: {}", taskId, e);
            return false;
        }
    }
 
    @Override
    public Long syncDispatchOrderToLegacy(Long taskId) {
        return taskDispatchSyncService.syncDispatch(taskId);
    }
 
 
    /**
     * 同步任务附件到旧系统
     * @param taskAttachments
     * @param serviceOrdId
     * @param dispatchOrdId
     * @param oaUserID
     */
    public void syncAttachmentToLegacy(List<SysTaskAttachment> taskAttachments, Long serviceOrdId,Long dispatchOrdId,Integer oaUserID) {
        taskAttachments.forEach((taskAttachment)->{
            Long imageDataId=  taskAttachmentSyncService.syncAttachmentToImageData(taskAttachment,serviceOrdId,dispatchOrdId,oaUserID);
            if (imageDataId != null && imageDataId > 0) {
 
                taskAttachment.setSyncedToImageData(1);
                taskAttachment.setSyncTime(new Date());
                taskAttachment.setImageDataId(imageDataId);
                taskAttachmentService.updateAttachment(taskAttachment);
            }
        });
    }
 
 
    @Override
    public void syncTaskAttachment(Long taskId, Long dispatchOrdId, Long serviceOrdId, Integer oaUserID){
        List<SysTaskAttachment> taskAttachments= sysTaskService.getAttachmentsByTaskId(taskId);
        if (taskAttachments != null && !taskAttachments.isEmpty()) {
            //同步附件
            this.syncAttachmentToLegacy(taskAttachments,serviceOrdId,dispatchOrdId,oaUserID);
        }
    }
 
    /**
     * 批量同步未同步的调度单
     * 使用分页查询,确保所有符合条件的任务都能被同步
     */
    @Override
    public int batchSyncPendingDispatchOrders() {
        if (!legacyConfig.isEnabled()) {
            log.info("旧系统同步已禁用");
            return 0;
        }
        
        try {
            int totalSuccessCount = 0;
            int pageSize = 100; // 每页100条
            int offset = 0;
            
            while (true) {
                // 分页查询已同步服务单但未同步调度单的任务
                List<SysTaskEmergency> pendingTasks = sysTaskEmergencyService.selectPendingDispatchSyncTasks(offset, pageSize);
//                log.info("查询到未同步调度单的任务数量: {}", pendingTasks.size());
                if (pendingTasks == null || pendingTasks.isEmpty()) {
                    log.info("没有更多需要同步调度单的任务,offset: {}", offset);
                    break; // 没有更多数据,退出循环
                }
                
//                log.info("开始同步调度单第 {} 页,任务数量: {}", (offset / pageSize) + 1, pendingTasks.size());
                
                int pageSuccessCount = 0;
                for (SysTaskEmergency emergency : pendingTasks) {
//                    log.info("开始同步调度单,任务ID: {}", emergency.getTaskId());
                    Long dispatchOrdId = syncDispatchOrderToLegacy(emergency.getTaskId());
 
                    if (dispatchOrdId != null && dispatchOrdId > 0) {
                        pageSuccessCount++;
                    }
                    
                    // 避免过于频繁的请求
                    try {
                        Thread.sleep(1000); // 每个请求间隔1秒
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                        log.warn("同步调度单被中断");
                        return totalSuccessCount + pageSuccessCount;
                    }
                }
                
                totalSuccessCount += pageSuccessCount;
//                log.info("调度单第 {} 页同步完成,总数: {}, 成功: {}",
//                    (offset / pageSize) + 1, pendingTasks.size(), pageSuccessCount);
                
                // 如果本页数据少于每页大小,说明已经是最后一页
                if (pendingTasks.size() < pageSize) {
//                    log.info("已到达最后一页,调度单同步结束");
                    break;
                }
                
                offset += pageSize; // 下一页
            }
            
//            log.info("批量同步调度单完成,总成功数: {}", totalSuccessCount);
            return totalSuccessCount;
            
        } catch (Exception e) {
            log.error("批量同步调度单异常", e);
            return 0;
        }
    }
 
    @Override
    public boolean resyncDispatchOrderToLegacy(Long taskId) {
        SysTaskEmergency emergency=sysTaskEmergencyService.selectSysTaskEmergencyByTaskId(taskId);
        Long dispatchOrderId = emergency.getLegacyDispatchOrdId();
        if(LongUtil.isEmpty(dispatchOrderId)){
            Long serviceOrderId= taskEmergencySyncService.syncEmergency(taskId);
            if(LongUtil.isNotEmpty(serviceOrderId)) {
                emergency.setNeedResync(0);
//                emergency.setSyncStatus(2);
                emergency.setSyncTime(new Date());
                sysTaskEmergencyService.updateSysTaskEmergency(emergency);
                return true;
            }
            return false;
        }else {
            return taskDispatchSyncService.resyncDispatchOrderToLegacy(taskId);
        }
    }
 
 
    /**
     * 批量重新同步需要更新的调度单
     */
    @Override
    public int batchResyncPendingDispatchOrders() {
        if (!legacyConfig.isEnabled()) {
            log.info("旧系统同步已禁用");
            return 0;
        }
        
        try {
            int totalSuccessCount = 0;
            int pageSize = 100; // 每页100条
            int offset = 0;
            
            while (true) {
                // 分页查询需要重新同步的任务
                List<SysTaskEmergency> needResyncTasks = sysTaskEmergencyMapper.selectNeedResyncTasks(offset, pageSize);
 
//                log.info("查询到需要重新同步的任务数量: {}", needResyncTasks.size());
                if (needResyncTasks == null || needResyncTasks.isEmpty()) {
                    log.info("没有更多需要重新同步的任务,offset: {}", offset);
                    break; // 没有更多数据,退出循环
                }
 
//                log.info("开始重新同步调度单第 {} 页,任务数量: {}", (offset / pageSize) + 1, needResyncTasks.size());
 
                int pageSuccessCount = 0;
                for (SysTaskEmergency emergency : needResyncTasks) {
                    Long dispatchOrdId = emergency.getLegacyDispatchOrdId();
                    Long taskId = emergency.getTaskId();
                    if (LongUtil.isEmpty(dispatchOrdId)) {
                        //没有调度单,我们就调用创建调度单
                        Long serviceOrderId = syncDispatchOrderToLegacy(taskId);
                        if (LongUtil.isNotEmpty(serviceOrderId)) {
                            emergency.setNeedResync(0);
                            emergency.setDispatchSyncTime(new Date());
                            emergency.setDispatchSyncErrorMsg(null);
                            sysTaskEmergencyService.updateSysTaskEmergency(emergency);
 
                            continue;
                        }
//                    log.info("开始重新同步调度单,任务ID: {}", emergency.getTaskId());
                        boolean success = resyncDispatchOrderToLegacy(emergency.getTaskId());
 
                        if (success) {
                            pageSuccessCount++;
                        }
 
                        // 避免过于频繁的请求
                        try {
                            Thread.sleep(1000); // 每个请求间隔1秒
                        } catch (InterruptedException e) {
                            Thread.currentThread().interrupt();
                            log.warn("重新同步调度单被中断");
                            return totalSuccessCount + pageSuccessCount;
                        }
                    }
 
                    totalSuccessCount += pageSuccessCount;
//                log.info("调度单重新同步第 {} 页完成,总数: {}, 成功: {}",
//                    (offset / pageSize) + 1, needResyncTasks.size(), pageSuccessCount);
 
                    // 如果本页数据少于每页大小,说明已经是最后一页
                    if (needResyncTasks.size() < pageSize) {
//                    log.info("已到达最后一页,调度单重新同步结束");
                        break;
                    }
 
                    offset += pageSize; // 下一页
                }
            }
//            log.info("批量重新同步调度单完成,总成功数: {}", totalSuccessCount);
            return totalSuccessCount;
            
        } catch (Exception e) {
            log.error("批量重新同步调度单异常", e);
            return 0;
        }
    }
}