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
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
package com.ruoyi.system.service.impl;
 
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.*;
import com.ruoyi.system.domain.vo.TaskCreateVO;
import com.ruoyi.system.mapper.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
@Service
@Slf4j
public class TaskDispatchSyncUtilService {
 
    @Autowired
    private SysUserMapper sysUserMapper;
 
    @Autowired
    private SysTaskMapper sysTaskMapper;
    @Autowired
    private SysTaskAssigneeMapper sysTaskAssigneeMapper;
 
    @Autowired
    private TaskSyncUtilService taskSyncUtilService;
 
    @Autowired
    private SysDeptMapper sysDeptMapper;
    /**
     * 构建调度单同步参数
     */
    public Map<String, Object> buildDispatchOrderParams(SysTask task, SysTaskEmergency emergency) {
        Map<String, Object> params = new HashMap<>();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
        // 获取管理员ID(创建人ID对应的OA_UserID)
        String adminID = taskSyncUtilService.getAdminID(task);
 
        // 获取调度单类型(从任务所属部门的调度单编码获取)
        String dispatchOrdClass = "SA"; // 默认值
        if (task.getDeptId() != null) {
            try {
                SysDept dept = sysDeptMapper.selectDeptById(task.getDeptId());
                if (dept != null && StringUtils.isNotEmpty(dept.getDispatchOrderClass())) {
                    dispatchOrdClass = dept.getDispatchOrderClass();
//                    log.info("获取任务所属部门的调度单编码成功,部门ID: {}, 调度单编码: {}", task.getDeptId(), dispatchOrdClass);
                }
            } catch (Exception e) {
                log.error("查询任务所属部门信息异常,部门ID: {}", task.getDeptId(), e);
            }
        }
        params.put("AdminID", adminID);
 
        // 基本信息
        params.put("DispatchOrdClass", dispatchOrdClass);
        params.put("ServiceOrdID", emergency.getLegacyServiceOrdId().toString());
        params.put("DispatchOrdState", "1"); // 调度单状态
 
        // 时间信息
        if (task.getPlannedStartTime() != null) {
            params.put("DispatchOrdTraSDTime", sdf.format(task.getPlannedStartTime())); // 拟出发时间
        } else {
            params.put("DispatchOrdTraSDTime", "");
        }
        params.put("DispatchOrd_NS_Time", task.getCreateTime() != null ? sdf.format(task.getCreateTime()) : sdf.format(new Date())); // 开单时间
 
        // 车辆信息 - 从任务关联的车辆获取CarID
        Long carId = getTaskVehicleCarId(task.getTaskId());
        params.put("DispatchOrdCarID", carId.toString());
 
 
        // 联系人信息
        params.put("DispatchOrdCoName", StringUtils.nvl(emergency.getPatientContact(), ""));
        params.put("DispatchOrdCoPhone", StringUtils.nvl(emergency.getPatientPhone(), ""));
        params.put("ServiceOrdCoName", StringUtils.nvl(emergency.getPatientContact(), ""));
        params.put("ServiceOrdCoPhone", StringUtils.nvl(emergency.getPatientPhone(), ""));
        params.put("ServiceOrdPtName", StringUtils.nvl(emergency.getPatientName(), ""));
        params.put("ServiceOrdTraStreet",StringUtils.nvl(task.getDepartureAddress(), StringUtils.nvl(emergency.getHospitalOutAddress(), "")));
        // 地址信息
        params.put("DispatchOrdTraStreet", StringUtils.nvl(task.getDepartureAddress(), StringUtils.nvl(emergency.getHospitalOutAddress(), "")));
        params.put("DispatchOrdTraEnd", StringUtils.nvl(task.getDestinationAddress(), StringUtils.nvl(emergency.getHospitalInAddress(), "")));
        params.put("DispatchOrdTraVia", ""); // 实际途经地
 
        // 操作命令
        params.put("DispatchOrd_Check", "0"); // 3=直接强制完成
 
        // 绩效和费用:确保数值字段不为null
        String transferPrice = "0";
        if (emergency.getTransferPrice() != null) {
            try {
                transferPrice = emergency.getTransferPrice().toString();
                if (transferPrice.contains(".")) {
                    transferPrice = new java.math.BigDecimal(transferPrice).stripTrailingZeros().toPlainString();
                }
            } catch (Exception e) {
                log.warn("转换转运价格失败,任务ID: {}, 使用默认值0", task.getTaskId(), e);
                transferPrice = "0";
            }
        }
        params.put("DispatchOrdPerfomance", transferPrice);
        params.put("StretcherMoney", "0"); // 抬担架费
        params.put("AddMoneyType", ""); // 附加项目
        params.put("AddMoney", "0"); // 附加项目费用
        params.put("AddMoneyExplain", ""); // 附加项目说明
 
        // 人员信息
        params.put("EntourageName_aid1", ""); // 外援人员1
        params.put("EntourageName_aid2", ""); // 外援人员2
        params.put("DispatchOrd_NS_ID", adminID); // 调度人员ID
        params.put("RecommendedCar", ""); // 指定车型
        params.put("ServiceOrdTaskRemarks", StringUtils.nvl(task.getTaskDescription(), "")); // 医护司备注
 
        // 电话信息
        params.put("Phone", StringUtils.nvl(emergency.getPatientPhone(), ""));
        params.put("TEL_Time", sdf.format(new Date()));
        params.put("TEL_Remarks", "新系统同步创建调度单");
 
        // 时长信息
        params.put("TimeLength_Program", "0"); // 大型活动保障时长
        params.put("TimeLength_ICU", "0"); // 居家ICU时长
        params.put("TimeLength_Wait", "0"); // 等待时长
 
        // 里程数
        params.put("DispatchOrdTraStreetMileage", ""); // 开始里程数
        params.put("DispatchOrdTraEndMileage", ""); // 结束里程数
 
        // 服务单相关信息(从admin_save_24.gds 221-255行补充)
        params.put("ServiceOrdPtCondition", StringUtils.nvl(emergency.getPatientCondition(), "")); // 病情描述
        params.put("ServiceOrdPtDoctor", ""); // 患者医生
        params.put("ServiceOrdPtDoctorPhone", ""); // 患者医生电话
        params.put("TransferModeID", ""); // 转运方式
        params.put("ServiceOrdVIP", "0"); // VIP客户
        // 价格字段复用,确保一致性
        params.put("ServiceOrdTraTxnPrice", transferPrice); // 成交价
        params.put("ServiceOrdTraPrePayment", "0"); // 需预付款
        params.put("SettlementPrice", "0"); // 结算价
        params.put("ServiceOrdTraPriceReason", ""); // 差价原因
        params.put("ServiceOrd_CC_ID", ""); // 客服人员ID
        params.put("ServiceOrd_Sale_ID", ""); // 销售人员ID
        params.put("ServiceOrdIntroducer", ""); // 介绍人
        params.put("ServiceOrd_work_ID", ""); // 主要企微客服ID
        params.put("ServiceOrd_work_IDs", ""); // 其他企微客服ID
        params.put("ServiceOrd_work_is", "0"); // 是否企微成交
        params.put("CommissionScenarioID", "0"); // 企微绩效方案
        params.put("ServiceOrdApptDate", task.getPlannedStartTime() != null ? sdf.format(task.getPlannedStartTime()) : ""); // 预约时间
        params.put("ServiceOrdPtDiagnosis", ""); // 诊断
        params.put("ServiceOrdOperationRemarks", "新系统同步创建"); // 操作备注
        params.put("ServiceOrdEstimatedOrderDate", ""); // 预计派单时间
        params.put("ServiceOrdEstimatedOrderDateOld", ""); // 原预计派单时间
        params.put("ServiceOrdViaDistance", "0"); // 中途距离
        // 距离字段:确保不为空,避免旧系统接口报错
        String transferDistance = "0";
        if (emergency.getTransferDistance() != null) {
            try {
                transferDistance = emergency.getTransferDistance().toString();
                // 去除可能的小数点后多余的0
                if (transferDistance.contains(".")) {
                    transferDistance = new java.math.BigDecimal(transferDistance).stripTrailingZeros().toPlainString();
                }
            } catch (Exception e) {
                log.warn("转换转运距离失败,任务ID: {}, 使用默认值0", task.getTaskId(), e);
                transferDistance = "0";
            }
        }
//        log.info("转运距离:{}",transferDistance);
        params.put("ServiceOrdTraDistance", transferDistance);
        params.put("OrderLevel", "0"); // 查看等级
        params.put("ServiceOrdDepartureType", "1"); // 预约类型
        params.put("ConditionLevel", "0"); // 病重级别
        params.put("DirectionType", "0"); // 转运去向
        params.put("ServiceOrdPtOutHospID", emergency.getHospitalOutId() != null ? emergency.getHospitalOutId().toString() : "0"); // 转出医院ID
        params.put("ServiceOrdPtServices", emergency.getHospitalOutBedNumber()==null?"":emergency.getHospitalOutBedNumber().toString()); // 转出床位
        params.put("ServiceOrdPtServicesID",emergency.getHospitalOutDepartmentId()==null?"":emergency.getHospitalOutDepartmentId().toString()); // 转出科室ID
        params.put("ServiceOrdPtInServicesID",emergency.getHospitalInDepartmentId()==null?"":emergency.getHospitalInDepartmentId().toString()); // 转入科室ID
        params.put("ServiceOrdPtInServices", emergency.getHospitalInBedNumber()==null?"":emergency.getHospitalInBedNumber().toString());// 转入床位
        params.put("ServiceOrdPtInHospID", emergency.getHospitalInId() != null ? emergency.getHospitalInId().toString() : "0"); // 转入医院ID
        params.put("ServiceOrdPtOutHosp", StringUtils.nvl(emergency.getHospitalOutName(), "")); // 转出医院
        params.put("ServiceOrdTraVia", StringUtils.nvl(task.getDepartureAddress(), StringUtils.nvl(emergency.getHospitalOutAddress(), ""))); // 转出地址
        params.put("ServiceOrdPtInHosp", StringUtils.nvl(emergency.getHospitalInName(), "")); // 转入医院
        params.put("ServiceOrdTraEnd", StringUtils.nvl(task.getDestinationAddress(), StringUtils.nvl(emergency.getHospitalInAddress(), ""))); // 转入地址
        params.put("FromHQ2_is", "0"); // 广州总部推送任务标记
 
        // 病情ID列表(ICD-10疾病ID,用于诊断ICD)
        // 格式:逗号分隔的ID列表,如 ",1,2,3,"
        String ordIcdId = "";
        if (StringUtils.isNotEmpty(emergency.getDiseaseIds())) {
            // 将存储的 "1,2,3" 格式转换为旧系统要求的 ",1,2,3," 格式
            ordIcdId = "," + emergency.getDiseaseIds() + ",";
            log.info("病情ID列表已设置,任务ID: {}, OrdICD_ID: {}", task.getTaskId(), ordIcdId);
        }
        params.put("OrdICD_ID", ordIcdId);
        params.put("OrdICD_ID_old", ""); // 旧病情ID列表(用于对比是否需要更新)
 
        // 执行人员信息(随行人员)
        syncTaskAssignees(task, params);
 
        return params;
    }
 
 
    @Autowired
    private SysTaskVehicleMapper sysTaskVehicleMapper;
    @Autowired
    private VehicleInfoMapper vehicleInfoMapper;
 
 
    /**
     * 获取任务关联车辆的旧系统CarID
     *
     * @param taskId 任务ID
     * @return CarID,如果未找到则返回0L
     */
    private Long getTaskVehicleCarId(Long taskId) {
        try {
            // 从 sys_task_vehicle 表查询车辆ID
            List<SysTaskVehicle> taskVehicles = sysTaskVehicleMapper.selectSysTaskVehicleByTaskId(taskId);
            if (taskVehicles != null && !taskVehicles.isEmpty()) {
                // 取第一个关联的车辆
                Long vehicleId = taskVehicles.get(0).getVehicleId();
                if (vehicleId != null) {
                    // 从 tb_vehicle_info 表获取 car_id
                    VehicleInfo vehicleInfo = vehicleInfoMapper.selectVehicleInfoById(vehicleId);
                    if (vehicleInfo != null && vehicleInfo.getCarId() != null) {
                        Long carId = vehicleInfo.getCarId().longValue();
                        log.info("获取任务关联车辆的CarID成功,任务ID: {}, 车辆ID: {}, CarID: {}",
                                taskId, vehicleId, carId);
                        return carId;
                    } else {
                        log.warn("车辆信息中未配置CarID,任务ID: {}, 车辆ID: {}", taskId, vehicleId);
                    }
                } else {
                    log.warn("任务车辆关联记录中车辆ID为空,任务ID: {}", taskId);
                }
            } else {
                log.warn("任务未关联车辆,任务ID: {}", taskId);
            }
        } catch (Exception e) {
            log.error("查询任务关联车辆的CarID异常,任务ID: {}", taskId, e);
        }
        return 0L;
    }
 
    /**
     * 获取任务的执行人员信息列表(包含角色类型)
     *
     * @param taskId 任务ID
     * @return 执行人员信息列表
     */
    private List<TaskCreateVO.AssigneeInfo> getTaskAssignees(Long taskId) {
        List<TaskCreateVO.AssigneeInfo> assignees = new java.util.ArrayList<>();
 
        try {
            // 从数据库查询执行人员信息(按排序顺序)
            List<SysTaskAssignee> taskAssignees = sysTaskAssigneeMapper.selectSysTaskAssigneeByTaskId(taskId);
 
            if (taskAssignees != null && !taskAssignees.isEmpty()) {
                // 将数据库中的执行人员转换为AssigneeInfo对象
                for (SysTaskAssignee taskAssignee : taskAssignees) {
                    TaskCreateVO.AssigneeInfo assignee = new TaskCreateVO.AssigneeInfo();
                    assignee.setUserId(taskAssignee.getUserId());
                    assignee.setUserName(taskAssignee.getUserName());
                    assignee.setUserType(taskAssignee.getUserType());
                    assignees.add(assignee);
                }
 
                log.info("从数据库获取执行人员信息成功,任务ID: {}, 人员数量: {}", taskId, assignees.size());
                return assignees;
            }
 
            // 如果数据库中没有执行人员信息,尝试从任务的主要执行人获取
//            log.warn("数据库中未找到执行人员信息,尝试从任务主要执行人获取,任务ID: {}", taskId);
            SysTask task = sysTaskMapper.selectSysTaskByTaskId(taskId);
            if (task != null && task.getAssigneeId() != null) {
                SysUser user = sysUserMapper.selectUserById(task.getAssigneeId());
                if (user != null) {
                    TaskCreateVO.AssigneeInfo assignee = new TaskCreateVO.AssigneeInfo();
                    assignee.setUserId(user.getUserId());
                    assignee.setUserName(user.getNickName());
                    assignee.setUserType(taskSyncUtilService.getUserType(user)); // 通过角色判断类型
                    assignees.add(assignee);
                }
            }
        } catch (Exception e) {
            log.error("获取任务执行人员信息异常,任务ID: {}", taskId, e);
        }
 
        return assignees;
    }
    /**
     * 同步任务执行人员信息到调度单随行人员参数
     *
     * @param task 任务信息
     * @param params 调度单参数Map
     */
    private void syncTaskAssignees(SysTask task, Map<String, Object> params) {
        try {
            // 获取任务的执行人员信息列表(包含角色类型) //TODO 如果有两个司机就要 设置 Entourage_1和Entourage_2
            //两个护士就要设置 Entourage_4和Entourage_6
            //两个医生要设置 Entourage_3和Entourage_5
            List<TaskCreateVO.AssigneeInfo> assignees = getTaskAssignees(task.getTaskId());
 
            if (assignees == null || assignees.isEmpty()) {
                log.warn("任务无执行人员,任务ID: {}", task.getTaskId());
                // 设置默认空值
                params.put("EntourageLeadID", "");
                params.put("Entourage_1", ""); // 司机
                params.put("Entourage_2", ""); //司机
                params.put("Entourage_3", ""); // 医生
                params.put("Entourage_5", ""); //医生
                params.put("Entourage_4", ""); // 护士
                params.put("Entourage_6", ""); // 护士
 
                return;
            }
 
            String leadEntourageId = ""; // 领队的EntourageID
            String driverOaId = "";      // 司机的OA_UserID
            String doctorOaId = "";      // 医生的OA_UserID
            String nurseOaId = "";       // 护士的OA_UserID
 
            // 遍历执行人员,根据角色类型分配到对应的Entourage参数
            for (int i = 0; i < assignees.size(); i++) {
                TaskCreateVO.AssigneeInfo assignee = assignees.get(i);
                Long userId = assignee.getUserId();
                String userType = assignee.getUserType(); // 直接使用前端传递的角色类型
 
                if (userId == null) {
                    continue;
                }
 
                // 查询用户的OA_UserID
                SysUser user = sysUserMapper.selectUserById(userId);
                if (user == null || user.getOaUserId() == null) {
                    log.warn("执行人员信息不存在或未配置OA_UserID,用户ID: {}", userId);
                    continue;
                }
 
                String oaUserId = user.getOaUserId().toString();
 
                // 根据用户类型分配到对应的Entourage参数
                if ("driver".equals(userType)) {
                    if (driverOaId.isEmpty()) {
                        driverOaId = oaUserId;
                        if(params.get("Entourage_1")==null) {
                            params.put("Entourage_1", oaUserId);
                        }else{
                            params.put("Entourage_2", oaUserId);
                        }
                        // 如果是第一个执行人员,设置为领队
                        if (i == 0 && leadEntourageId.isEmpty()) {
                            leadEntourageId = "1"; // 司机对应Entourage_1
                        }
                    }
                } else if ("doctor".equals(userType)) {
                    if (doctorOaId.isEmpty()) {
                        doctorOaId = oaUserId;
                        if(params.get("Entourage_3")==null) {
                            params.put("Entourage_3", oaUserId);
                        }else{
                            params.put("Entourage_5", oaUserId);
                        }
                        // 如果是第一个执行人员,设置为领队
                        if (i == 0 && leadEntourageId.isEmpty()) {
                            leadEntourageId = "3"; // 医生对应Entourage_3
                        }
                    }
                } else if ("nurse".equals(userType)) {
                    if (nurseOaId.isEmpty()) {
                        nurseOaId = oaUserId;
                        if(params.get("Entourage_4")==null) {
                            params.put("Entourage_4", oaUserId);
                        }else{
                            params.put("Entourage_6", oaUserId);
                        }
                        // 如果是第一个执行人员,设置为领队
                        if (i == 0 && leadEntourageId.isEmpty()) {
                            leadEntourageId = "4"; // 护士对应Entourage_4
                        }
                    }
                }
            }
 
            // 设置参数
            params.put("EntourageLeadID", leadEntourageId);
//            params.put("Entourage_1", driverOaId);  // 司机
//            params.put("Entourage_3", doctorOaId);  // 医生
//            params.put("Entourage_4", nurseOaId);   // 护士
 
//            log.info("任务执行人员同步成功,任务ID: {}, 领队ID: {}, 司机: {}, 医生: {}, 护士: {}",
//                task.getTaskId(), leadEntourageId, driverOaId, doctorOaId, nurseOaId);
 
        } catch (Exception e) {
            log.error("同步任务执行人员异常,任务ID: {}", task.getTaskId(), e);
            // 设置默认空值
            params.put("EntourageLeadID", "");
            params.put("Entourage_1", "");
            params.put("Entourage_3", "");
            params.put("Entourage_4", "");
        }
    }
}