package com.xiaopeng.vehicleConvoy.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; 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.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 java.time.LocalDateTime; import java.time.LocalTime; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; /** *

* 保单申请 服务实现类 *

* * @author mitao * @since 2026-02-03 */ @Service @RequiredArgsConstructor(onConstructor_ = @Lazy) public class XpPolicyApplicationServiceImpl extends ServiceImpl implements IXpPolicyApplicationService { private final XpOperationUserClient xpOperationUserClient; private final XpVehicleClient xpVehicleClient; private final SysUserClient sysUserClient; private final XpVehicleMapper xpVehicleMapper; @Override public PageInfo pageList(XpPolicyApplicationQuery query) { PageInfo resultPage = new PageInfo<>(query.getPageNum(), query.getPageSize()); // 1. 根据运维人员名称查询运维人员ID列表 List operationUserIds = null; List vehicleIds = null; if (StringUtils.isNotBlank(query.getNickName())) { R> 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> vehicleData = xpVehicleClient.listByPlateNumber(query.getPlateNumber()); if (R.isSuccess(vehicleData)) { vehicleIds = vehicleData.getData().stream().map(XpVehicle::getId).collect(Collectors.toList()); } } // 3.分页查询保单申请列表 LambdaQueryWrapper 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 page = page(new Page<>(query.getPageNum(), query.getPageSize()), lambdaQueryWrapper); //4.批量获取相关用户和车辆信息 Set operationsUserIdSet = page.getRecords().stream().map(XpPolicyApplication::getApplicantId).filter(Objects::nonNull).collect(Collectors.toSet()); Set vehicleIdSet = page.getRecords().stream().map(XpPolicyApplication::getVehicleId).filter(Objects::nonNull).collect(Collectors.toSet()); Set auditUserIds = page.getRecords().stream().map(XpPolicyApplication::getAuditUserId).filter(Objects::nonNull).collect(Collectors.toSet()); Map longXpVehicleMap = batchGetVehicles(vehicleIdSet); Map longXpOperationsUserMap = batchGetOperationsUsers(operationsUserIdSet); Map auditUserMap = batchGetUsers(auditUserIds); // 5. 组装 VO List 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 longXpVehicleMap, Map longXpOperationsUserMap, Map 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 batchGetUsers(Set auditUserIds) { if (CollectionUtils.isEmpty(auditUserIds)) { return new HashMap<>(); } try { R> 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 batchGetVehicles(Set vehicleIds) { if (CollectionUtils.isEmpty(vehicleIds)) { return new HashMap<>(); } try { R> 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 batchGetOperationsUsers(Set operationsUserIds) { if (CollectionUtils.isEmpty(operationsUserIds)) { return new HashMap<>(); } try { R> 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 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.getLoginUser().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()); if(xpPolicyApplicationVO.getAuditStatus() == 2){ xpPolicyApplicationVO.setPolicyInformation(xpVehicle.getPolicyInformation()); } } queryPolicyInfoVO.setStatus(xpPolicyApplication.getAuditStatus()); }else { queryPolicyInfoVO.setStatus(0); } return queryPolicyInfoVO; } }