liujie
2026-03-24 3f61f59c64f175d11e179dc6069fb1f20d70a366
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
package com.xiaopeng.vehicleConvoy.service.impl;
 
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiaopeng.api.feignClient.account.SysUserClient;
import com.xiaopeng.api.feignClient.account.XpOperationUserClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
import com.xiaopeng.api.model.account.SysUser;
import com.xiaopeng.api.model.account.XpOperationsUser;
import com.xiaopeng.api.model.vehicleConvoy.XpPolicyApplication;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.enums.AuditStateEnum;
import com.xiaopeng.common.core.enums.PolicyApplicationAuditStateEnum;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.common.security.utils.SecurityUtils;
import com.xiaopeng.evi.oss.service.AliOssService;
import com.xiaopeng.vehicleConvoy.mapper.XpPolicyApplicationMapper;
import com.xiaopeng.vehicleConvoy.mapper.XpVehicleMapper;
import com.xiaopeng.vehicleConvoy.model.dto.XpPolicyApplicationAuditDTO;
import com.xiaopeng.vehicleConvoy.model.query.XpPolicyApplicationQuery;
import com.xiaopeng.vehicleConvoy.model.vo.QueryPolicyInfoVO;
import com.xiaopeng.vehicleConvoy.model.vo.XpPolicyApplicationVO;
import com.xiaopeng.vehicleConvoy.service.IXpPolicyApplicationService;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
 
import javax.annotation.Resource;
import java.io.UnsupportedEncodingException;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
 
/**
 * <p>
 * 保单申请 服务实现类
 * </p>
 *
 * @author mitao
 * @since 2026-02-03
 */
@Service
@RequiredArgsConstructor(onConstructor_ = @Lazy)
public class XpPolicyApplicationServiceImpl extends ServiceImpl<XpPolicyApplicationMapper, XpPolicyApplication> implements IXpPolicyApplicationService {
 
    private final XpOperationUserClient xpOperationUserClient;
    private final XpVehicleClient xpVehicleClient;
    private final SysUserClient sysUserClient;
    private final XpVehicleMapper xpVehicleMapper;
    private final AliOssService aliOssService;
    @Override
    public PageInfo<XpPolicyApplicationVO> pageList(XpPolicyApplicationQuery query) {
        PageInfo<XpPolicyApplicationVO> resultPage = new PageInfo<>(query.getPageNum(), query.getPageSize());
        // 1. 根据运维人员名称查询运维人员ID列表
        List<Long> operationUserIds = null;
        List<Long> vehicleIds = null;
        if (StringUtils.isNotBlank(query.getNickName())) {
            R<List<XpOperationsUser>> userData = xpOperationUserClient.listByName(query.getNickName());
            if (R.isSuccess(userData)) {
                if (CollUtil.isEmpty(userData.getData())) {
                    return resultPage;
                }
                operationUserIds = userData.getData().stream().map(XpOperationsUser::getId).collect(Collectors.toList());
            }
        }
 
        // 2.根据车牌号获取车辆ID列表
        if (StringUtils.isNotBlank(query.getPlateNumber())) {
            R<List<XpVehicle>> vehicleData = xpVehicleClient.listByPlateNumber(query.getPlateNumber());
            if (R.isSuccess(vehicleData)) {
                vehicleIds = vehicleData.getData().stream().map(XpVehicle::getId).collect(Collectors.toList());
            }
        }
 
        // 3.分页查询保单申请列表
        LambdaQueryWrapper<XpPolicyApplication> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        if (Objects.nonNull(query.getStartTime())) {
            lambdaQueryWrapper.ge(XpPolicyApplication::getCreateTime, LocalDateTime.of(query.getStartTime(), LocalTime.MIN));
        }
        if (Objects.nonNull(query.getStartTime())) {
            lambdaQueryWrapper.le(XpPolicyApplication::getCreateTime, LocalDateTime.of(query.getEndTime(), LocalTime.MAX));
        }
        lambdaQueryWrapper.in(CollUtil.isNotEmpty(operationUserIds), XpPolicyApplication::getApplicantId, operationUserIds)
                .in(CollUtil.isNotEmpty(vehicleIds), XpPolicyApplication::getVehicleId, vehicleIds)
                .eq(Objects.nonNull(query.getAuditStatus()), XpPolicyApplication::getAuditStatus, query.getAuditStatus())
                .orderByDesc(XpPolicyApplication::getCreateTime);
        Page<XpPolicyApplication> page = page(new Page<>(query.getPageNum(), query.getPageSize()), lambdaQueryWrapper);
        //4.批量获取相关用户和车辆信息
        Set<Long> operationsUserIdSet = page.getRecords().stream().map(XpPolicyApplication::getApplicantId).filter(Objects::nonNull).collect(Collectors.toSet());
        Set<Long> vehicleIdSet = page.getRecords().stream().map(XpPolicyApplication::getVehicleId).filter(Objects::nonNull).collect(Collectors.toSet());
        Set<Long> auditUserIds = page.getRecords().stream().map(XpPolicyApplication::getAuditUserId).filter(Objects::nonNull).collect(Collectors.toSet());
        Map<Long, XpVehicle> longXpVehicleMap = batchGetVehicles(vehicleIdSet);
        Map<Long, XpOperationsUser> longXpOperationsUserMap = batchGetOperationsUsers(operationsUserIdSet);
        Map<Long, SysUser> auditUserMap = batchGetUsers(auditUserIds);
 
        // 5. 组装 VO
        List<XpPolicyApplicationVO> voList = page.getRecords().stream()
                .map(item -> convertToPageVO(item, longXpVehicleMap, longXpOperationsUserMap, auditUserMap))
                .collect(Collectors.toList());
        // 6. 返回分页结果
        resultPage.setTotal(page.getTotal());
        resultPage.setRecords(voList);
        return resultPage;
    }
 
    /**
     * 转换为页面 VO
     *
     * @param item
     * @param longXpVehicleMap
     * @param longXpOperationsUserMap
     * @param auditUserMap
     * @return
     */
    private XpPolicyApplicationVO convertToPageVO(XpPolicyApplication item, Map<Long, XpVehicle> longXpVehicleMap,
                                                  Map<Long, XpOperationsUser> longXpOperationsUserMap, Map<Long, SysUser> auditUserMap) {
        XpPolicyApplicationVO xpPolicyApplicationVO = BeanUtil.copyProperties(item, XpPolicyApplicationVO.class);
        xpPolicyApplicationVO.setAuditStatusDesc(AuditStateEnum.getDescByCode(item.getAuditStatus()));
        // 车辆信息
        if (Objects.nonNull(item.getVehicleId())) {
            XpVehicle xpVehicle = longXpVehicleMap.get(item.getVehicleId());
            if (Objects.nonNull(xpVehicle)) {
                xpPolicyApplicationVO.setPlateNumber(xpVehicle.getPlateNumber());
                xpPolicyApplicationVO.setVehicleCode(xpVehicle.getVehicleCode());
            }
        }
        // 申请人信息
        if (Objects.nonNull(item.getApplicantId())) {
            XpOperationsUser operationsUser = longXpOperationsUserMap.get(item.getApplicantId());
            if (Objects.nonNull(operationsUser)) {
                xpPolicyApplicationVO.setNickName(operationsUser.getNickName());
                xpPolicyApplicationVO.setPhoneNumber(operationsUser.getPhoneNumber());
            }
        }
        // 审核人信息
        if (Objects.nonNull(item.getAuditUserId())) {
            SysUser sysUser = auditUserMap.get(item.getAuditUserId());
            if (Objects.nonNull(sysUser)) {
                xpPolicyApplicationVO.setAuditUserName(sysUser.getNickName());
            }
        }
        return xpPolicyApplicationVO;
    }
 
    /**
     * 批量获取系统用户信息
     */
    private Map<Long, SysUser> batchGetUsers(Set<Long> auditUserIds) {
        if (CollectionUtils.isEmpty(auditUserIds)) {
            return new HashMap<>();
        }
        try {
            R<List<SysUser>> result = sysUserClient.listByIds(new ArrayList<>(auditUserIds));
            if (Objects.nonNull(result) && Objects.nonNull(result.getData())) {
                return result.getData().stream()
                        .collect(Collectors.toMap(SysUser::getId, Function.identity(), (a, b) -> a));
            }
        } catch (Exception e) {
            log.error("批量获取管理员用户信息失败", e);
        }
        return new HashMap<>();
    }
 
    /**
     * 批量获取车辆信息
     */
    private Map<Long, XpVehicle> batchGetVehicles(Set<Long> vehicleIds) {
        if (CollectionUtils.isEmpty(vehicleIds)) {
            return new HashMap<>();
        }
        try {
            R<List<XpVehicle>> result = xpVehicleClient.listByIds(new ArrayList<>(vehicleIds));
            if (Objects.nonNull(result) && Objects.nonNull(result.getData())) {
                return result.getData().stream()
                        .collect(Collectors.toMap(XpVehicle::getId, Function.identity(), (a, b) -> a));
            }
        } catch (Exception e) {
            log.error("批量获取车辆信息失败", e);
        }
        return new HashMap<>();
    }
 
    /**
     * 批量获取用户信息
     */
    private Map<Long, XpOperationsUser> batchGetOperationsUsers(Set<Long> operationsUserIds) {
        if (CollectionUtils.isEmpty(operationsUserIds)) {
            return new HashMap<>();
        }
        try {
            R<List<XpOperationsUser>> result = xpOperationUserClient.listByIds(new ArrayList<>(operationsUserIds));
            if (Objects.nonNull(result) && Objects.nonNull(result.getData())) {
                return result.getData().stream()
                        .collect(Collectors.toMap(XpOperationsUser::getId, Function.identity(), (a, b) -> a));
            }
        } catch (Exception e) {
            log.error("批量获取运维用户信息失败", e);
        }
        return new HashMap<>();
    }
 
    @Override
    public void batchAudit(XpPolicyApplicationAuditDTO dto) {
        // 1.查询待审核的保单申请记录
        List<XpPolicyApplication> applications = lambdaQuery().in(XpPolicyApplication::getId, dto.getIds())
                .eq(XpPolicyApplication::getAuditStatus, AuditStateEnum.PENDING_APPROVAL.getCode()).list();
        if (CollectionUtils.isEmpty(applications)) {
            return;
        }
        // 2.批量更新审核状态和审核信息
        LocalDateTime now = LocalDateTime.now();
        Long userId = SecurityUtils.getUserId();
        applications.forEach(app -> {
            app.setAuditStatus(dto.getAuditStatus());
            app.setAuditRemarks(dto.getAuditRemarks());
            app.setAuditUserId(userId);
            app.setAuditTime(now);
        });
        updateBatchById(applications);
    }
 
    @Override
    public void applyPolicyInformation(Long vehicleId, Long userId) {
        XpPolicyApplication xpPolicyApplication = new XpPolicyApplication();
        xpPolicyApplication.setVehicleId(vehicleId);
        xpPolicyApplication.setApplicantId(userId);
        xpPolicyApplication.setApplyTime(LocalDateTime.now());
        xpPolicyApplication.setAuditStatus(PolicyApplicationAuditStateEnum.PENDING_APPROVAL.getCode());
        this.save(xpPolicyApplication);
    }
 
    @Override
    public QueryPolicyInfoVO queryPolicyInfoByVid(Long vehicleId, Long id) {
 
        XpPolicyApplication xpPolicyApplication = this.getOne(Wrappers.lambdaQuery(XpPolicyApplication.class)
                .eq(XpPolicyApplication::getVehicleId, vehicleId)
                .eq(XpPolicyApplication::getApplicantId, id)
                .orderByDesc(XpPolicyApplication::getCreateTime)
                .last("limit 1"));
        QueryPolicyInfoVO queryPolicyInfoVO = new QueryPolicyInfoVO();
        if (Objects.nonNull(xpPolicyApplication)) {
            XpPolicyApplicationVO xpPolicyApplicationVO = new XpPolicyApplicationVO();
            BeanUtils.copyProperties(xpPolicyApplication, xpPolicyApplicationVO);
            // 查询车辆
            if (Objects.nonNull(xpPolicyApplication.getVehicleId())) {
                XpVehicle xpVehicle = xpVehicleMapper.selectById(xpPolicyApplication.getVehicleId());
                xpPolicyApplicationVO.setPlateNumber(xpVehicle.getPlateNumber());
                xpPolicyApplicationVO.setVehicleCode(xpVehicle.getVehicleCode());
                xpPolicyApplicationVO.setAuditRemarks(xpPolicyApplication.getAuditRemarks());
                if (xpPolicyApplicationVO.getAuditStatus() == 2 && StringUtils.isNotBlank(xpVehicle.getPolicyInformation())) {
                    JSONArray jsonArray = JSONArray.parseArray(xpVehicle.getPolicyInformation());
                        for (int i = 0; i < jsonArray.size(); i++) {
                            JSONObject jsonObject = jsonArray.getJSONObject(i);
                            if (Objects.isNull(jsonObject)) {
                                continue;
                            }
                            // 1
                            String downloadUrl = jsonObject.getString("url");;
                            try {
                                downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
                            } catch (UnsupportedEncodingException e) {
                                log.error("获取图片下载地址失败", e);
                            }
                            jsonObject.put("url", downloadUrl);
                        }
                    xpPolicyApplicationVO.setPolicyInformation(JSONArray.toJSONString(jsonArray));
 
                }
            }
            queryPolicyInfoVO.setStatus(xpPolicyApplication.getAuditStatus());
            queryPolicyInfoVO.setXpPolicyApplicationVO(xpPolicyApplicationVO);
        } else {
            queryPolicyInfoVO.setStatus(0);
        }
        return queryPolicyInfoVO;
    }
 
}