liujie
2026-02-28 6512fdd9c725c9b6cf5436df958e4fdf81ad82d0
Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi
23个文件已删除
42个文件已修改
1438 ■■■■■ 已修改文件
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/constant/I18nKeyConstant.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysGroupController.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpOperationsRoleController.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/ISysGroupService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysGroupServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysLoginService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpOperationsUserServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/resources/i18n/messages.properties 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/resources/i18n/messages_en_US.properties 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/resources/i18n/messages_zh_CN.properties 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/resources/mapper/account/XpOperationsUserMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/XpOperationsUser.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/FleetInfoVO.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/XpOperationsUserProfileVO.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/down/MessageType.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/down/MsgContent.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/down/RtMsgHeader.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/down/SourceType.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/down/cloudCreateOrder/RtTaskListResponse.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/down/cloudCreateOrder/RtTaskResult.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/down/cloudCreateOrder/TaskResultStatus.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/down/cloudOrderOperation/OrderOperationState.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/down/cloudOrderOperation/OrderOperationStatus.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/MessageType.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/MsgContent.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/RtMsgHeader.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/navigationDeviationEvent/NavigationDeviationEvent.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/systemStatusXpu/AbnormalReason.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/systemStatusXpu/DrivingMode.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/systemStatusXpu/GearLevel.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/systemStatusXpu/ServiceAvailability.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/systemStatusXpu/SystemPhase.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/systemStatusXpu/VehicleDynamicStatus.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/systemStatusXpu/VehicleStaticInfo.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/systemStatusXpu/VehicleStatus.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/xpuNavigationRequest/NavigationRequest.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/xpuNavigationRequest/NavigationType.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/constant/I18nKeyConstant.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskManagementController.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/dto/SchedulingDetailDto.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/exportExcel/XpTaskExportExcel.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/TaskManagementAccidentDetailVO.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/TaskManagementChargingDetailVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/TaskManagementCleanDetailVO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/TaskManagementDetectionDetailVO.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/TaskManagementPageListVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/TaskManagementPreparationDetailVO.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/TaskManagementRepairDetailVO.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/TaskManagementRoutineDetailVO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/XpTaskService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpClockInServiceImpl.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpSchedulingDetailServiceImpl.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java 266 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/TaskRuleDetailVO.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/resources/i18n/messages.properties 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpSchedulingDetailMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpWorkOrderMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpElectronicFenceAreaController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderEvaluateServiceImpl.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/config/MessageLocalConfig.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/config/MyLocaleResolver.java 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/controller/AliPushController.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/resources/i18n/messages.properties 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/constant/I18nKeyConstant.java
@@ -40,4 +40,7 @@
    //========== 验证码相关 ==========
    String SMS_PUSH_FAILED = "sms.push.failed";
    //========== 权限组相关 ==========
    String SYS_GROUP_DELETE_FAIL = "sys.group.delete.fail";
}
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/SysGroupController.java
@@ -11,6 +11,7 @@
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.web.page.PageInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
@@ -33,38 +34,46 @@
    private final ISysGroupService sysGroupService;
    @ApiOperation("新增权限组")
    @ApiOperation(value = "新增权限组", tags = {"管理后台-权限组管理"})
    @PostMapping("/api/v1/group/add")
    public R<?> add(@Validated @RequestBody SysGroupAddDTO dto) {
        sysGroupService.addGroup(dto);
        return R.ok();
    }
    @ApiOperation("编辑权限组")
    @ApiOperation(value = "编辑权限组", tags = {"管理后台-权限组管理"})
    @PostMapping("/api/v1/group/edit")
    public R<?> edit(@Validated @RequestBody SysGroupEditDTO dto) {
        sysGroupService.editGroup(dto);
        return R.ok();
    }
    @ApiOperation("权限组详情")
    @ApiOperation(value = "权限组详情", tags = {"管理后台-权限组管理"})
    @GetMapping("/api/v1/group/queryById")
    public R<SysGroupDetailVO> queryById(@ApiParam(value = "权限组id", required = true) @RequestParam Long id) {
        SysGroupDetailVO detail = sysGroupService.getGroupDetail(id);
        return R.ok(detail);
    }
    @ApiOperation("权限组分页列表")
    @ApiOperation(value = "权限组分页列表", tags = {"管理后台-权限组管理"})
    @PostMapping("/api/v1/group/pageList")
    public R<PageInfo<SysGroupPageVO>> pageList(@Validated @RequestBody SysGroupPageQuery query) {
        PageInfo<SysGroupPageVO> pageInfo = sysGroupService.pageList(query);
        return R.ok(pageInfo);
    }
    @ApiOperation("通过权限组id查询绑定账号列表")
    @ApiOperation(value = "通过权限组id查询绑定账号列表", tags = {"管理后台-权限组管理"})
    @PostMapping("/api/v1/group/queryUserPageList")
    public R<PageInfo<GroupUserVO>> queryUserPageList(@Validated @RequestBody GroupUserPageQuery query) {
        PageInfo<GroupUserVO> pageInfo = sysGroupService.queryUserPageList(query);
        return R.ok(pageInfo);
    }
    @ApiOperation(value = "删除权限组", tags = {"管理后台-权限组管理"})
    @DeleteMapping("/api/v1/group")
    @ApiImplicitParam(name = "id", value = "权限组ID")
    public R<?> deleteById(@RequestParam Long id) {
        sysGroupService.deleteById(id);
        return R.ok();
    }
}
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpOperationsRoleController.java
@@ -10,6 +10,7 @@
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
@@ -22,8 +23,7 @@
 * @author mitao
 * @since 2026-02-03
 */
@Controller
@RequestMapping("")
@RestController
public class XpOperationsRoleController {
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/ISysGroupService.java
@@ -67,4 +67,10 @@
     * @return true=唯一,false=不唯一
     */
    boolean checkGroupNameUnique(String groupName, Long excludeId);
    /**
     * 删除权限组
     * @param id
     */
    void deleteById(Long id);
}
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysGroupServiceImpl.java
@@ -15,8 +15,10 @@
import com.xiaopeng.account.model.vo.SysMenuVO;
import com.xiaopeng.account.service.ISysGroupMenuService;
import com.xiaopeng.account.service.ISysGroupService;
import com.xiaopeng.account.service.ISysRoleService;
import com.xiaopeng.api.feignClient.operation.SysMenuClient;
import com.xiaopeng.api.model.account.SysGroup;
import com.xiaopeng.api.model.account.SysRole;
import com.xiaopeng.api.model.operation.SysMenu;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.exception.ServiceException;
@@ -50,6 +52,7 @@
    private final ISysGroupMenuService groupMenuService;
    private final SysMenuClient sysMenuClient;
    private final ISysRoleService sysRoleService;
    /**
     * 新增权限组
@@ -298,4 +301,17 @@
            }
        }
    }
    /**
     * 删除权限组
     * @param id
     */
    @Override
    public void deleteById(Long id) {
        Long count = sysRoleService.lambdaQuery().eq(SysRole::getGroupId, id).count();
        if (count > 0) {
            throw new ServiceException("删除失败,该权限组已关联角色", I18nKeyConstant.SYS_GROUP_DELETE_FAIL);
        }
        removeById(id);
    }
}
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysLoginService.java
@@ -160,8 +160,6 @@
        if (!operationsUser.getStatus()){
            throw new ServiceException("账号已禁用!");
        }
        // todo 查询运维人员角色集合
        // todo 权限集合
        // 用户名或密码为空 错误
        if (StringUtils.isAnyBlank(phoneNumber, password)) {
            throw new ServiceException("用户/验证码必须填写");
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpOperationsUserServiceImpl.java
@@ -1,6 +1,7 @@
package com.xiaopeng.account.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.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -158,20 +159,23 @@
        }
        // 8. 查询角色信息
        List<XpOperationsUserWithRoleVO> userWithRoles = xpOperationsRoleMapper.selectUsersWithRoleByIds(Collections.singletonList(userId));
        if (!CollectionUtils.isEmpty(userWithRoles)) {
            List<XpOperationsUserProfileVO.RoleInfoVO> roleVOs = userWithRoles.stream()
                    .filter(r -> r.getRoleId() != null)
        List<XpOperationsRole> xpOperationsRoles = xpOperationsRoleMapper
                .selectList(new LambdaQueryWrapper<XpOperationsRole>().eq(XpOperationsRole::getOperationsUserId, userId));
        if (CollUtil.isNotEmpty(xpOperationsRoles)) {
            List<Long> roleIds = xpOperationsRoles.stream().map(XpOperationsRole::getRoleId).collect(Collectors.toList());
            List<SysRole> sysRoles = sysRoleMapper.selectList(Wrappers.lambdaQuery(SysRole.class)
                    .in(SysRole::getId, roleIds));
            List<XpOperationsUserProfileVO.RoleInfoVO> roleVOs = sysRoles.stream()
                    .filter(r -> r.getId() != null)
                    .map(r -> {
                        XpOperationsUserProfileVO.RoleInfoVO roleVO = new XpOperationsUserProfileVO.RoleInfoVO();
                        roleVO.setRoleId(r.getRoleId());
                        roleVO.setRoleId(r.getId());
                        roleVO.setRoleName(r.getRoleName());
                        return roleVO;
                    })
                    .collect(Collectors.toList());
            vo.setRoles(roleVOs);
        }
        return vo;
    }
@@ -183,6 +187,7 @@
        //保存审核记录
        XpQualificationAudit xpQualificationAudit = BeanUtil.copyProperties(dto, XpQualificationAudit.class, "id");
        xpQualificationAudit.setAuditStatus(1);
        xpQualificationAudit.setOperationsUserId(dto.getId());
        xpQualificationAuditService.save(xpQualificationAudit);
    }
@@ -203,7 +208,7 @@
                .in(XpOperationsRole::getOperationsUserId, operationsUserIds));
        if(!CollectionUtils.isEmpty(xpOperationsRoles)){
            List<Long> roleIds = xpOperationsRoles.stream().map(XpOperationsRole::getRoleId).collect(Collectors.toList());
            List<Long> roleIds = xpOperationsRoles.stream().map(XpOperationsRole::getRoleId).distinct().collect(Collectors.toList());
            // 查询列表关联的所有角色
            List<SysRole> sysRoles = sysRoleMapper.selectList(Wrappers.lambdaQuery(SysRole.class)
                    .in(SysRole::getId, roleIds));
@@ -213,6 +218,10 @@
                Map<Long, List<SysRole>> map = new HashMap<>();
                for (XpOperationsRole xpOperationsRole : xpOperationsRoles) {
                    List<SysRole> sysRoleList = sysRoles.stream().filter(sysRole -> sysRole.getId().equals(xpOperationsRole.getRoleId())).collect(Collectors.toList());
                    List<SysRole> roleList = map.get(xpOperationsRole.getOperationsUserId());
                    if(!CollectionUtils.isEmpty(roleList)){
                        sysRoleList.addAll(roleList);
                    }
                    map.put(xpOperationsRole.getOperationsUserId(), sysRoleList);
                }
                // 角色名称匹配
xp-robotaxi-account-boot/src/main/resources/i18n/messages.properties
@@ -30,3 +30,4 @@
group.not.exists=权限组不存在
request.failed=请求失败,请稍后重试!
sms.push.failed=短信发送失败,请稍后重试!
sys.group.delete.fail=删除失败,该权限组已关联角色
xp-robotaxi-account-boot/src/main/resources/i18n/messages_en_US.properties
@@ -29,4 +29,5 @@
group.name.exists=The group name already exists
group.not.exists=Group is not exist
request.failed=Request failed. Please try again later!
sms.push.failed=SMS sending failed. Please try again later!
sms.push.failed=SMS sending failed. Please try again later!
sys.group.delete.fail=Deletion failed. This permission group has been associated with a role
xp-robotaxi-account-boot/src/main/resources/i18n/messages_zh_CN.properties
@@ -30,3 +30,4 @@
group.not.exists=权限组不存在
request.failed=请求失败,请稍后重试!
sms.push.failed=短信发送失败,请稍后重试!
sys.group.delete.fail=删除失败,该权限组已关联角色
xp-robotaxi-account-boot/src/main/resources/mapper/account/XpOperationsUserMapper.xml
@@ -32,7 +32,6 @@
        xou.id_card_front, xou.id_card_back, xou.driver_license, xou.certificate_of_no_criminal_record,
        xou.training_graduation_certificate, xou.is_deleted, xou.create_time, xou.update_time, xou.create_by
            from xp_operations_user xou
        left join xp_operations_role xore on xou.id = xore.operations_user_id
        where xou.is_deleted = 0
            <if test="query.nickName != null and query.nickName != ''">
                and xou.nick_name like concat('%',#{query.nickName},'%')
@@ -41,13 +40,13 @@
                and xou.phone_number like concat('%',#{query.phoneNumber},'%')
            </if>
            <if test="query.roleId != null">
                and xore.role_id = #{query.roleId}
                AND EXISTS (SELECT 1 FROM xp_operations_role xore
                    WHERE xore.operations_user_id = xou.id
                    AND xore.role_id = #{query.roleId})
            </if>
            <if test="query.status != null">
                and xou.status = #{query.status}
            </if>
        order by xou.create_time desc
    </select>
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/XpOperationsUser.java
@@ -39,6 +39,9 @@
    @ApiModelProperty(value = "唯一编号")
    private String uniqueNumber;
    @ApiModelProperty(value = "性别 1-男 2-女")
    private Integer sex;
    @ApiModelProperty(value = "头像")
    private String avatar;
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/FleetInfoVO.java
@@ -1,5 +1,7 @@
package com.xiaopeng.api.vo.account;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import lombok.Data;
import java.io.Serializable;
@@ -16,40 +18,48 @@
    /**
     * 车队ID
     */
    @ApiModelProperty(value = "车队ID")
    private Long fleetId;
    /**
     * 车队名称
     */
    @ApiModelProperty(value = "车队名称")
    private String fleetName;
    /**
     * 省份名称
     */
    @ApiModelProperty(value = "省份名称")
    private String provinceName;
    /**
     * 城市名称
     */
    @ApiModelProperty(value = "城市名称")
    private String cityName;
    /**
     * 区县名称
     */
    @ApiModelProperty(value = "区县名称")
    private String districtName;
    /**
     * 车队队长ID
     */
    @ApiModelProperty(value = "车队队长ID")
    private Long captainId;
    /**
     * 车队队长名称
     */
    @ApiModelProperty(value = "车队队长名称")
    private String fleetLeaderName;
    /**
     * 车队队长头像
     */
    @ApiModelProperty(value = "车队队长头像")
    private String fleetLeaderAvatar;
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/XpOperationsUserProfileVO.java
@@ -1,5 +1,6 @@
package com.xiaopeng.api.vo.account;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -12,6 +13,7 @@
 * @author mitao
 * @date 2026-02-14
 */
@ApiModel(value = "运维人员个人中心首页VO")
@Data
public class XpOperationsUserProfileVO implements Serializable {
    private static final long serialVersionUID = 1L;
@@ -27,6 +29,9 @@
     */
    @ApiModelProperty(value = "姓名")
    private String nickName;
    @ApiModelProperty(value = "性别 1-男 2-女")
    private Integer sex;
    /**
     * 唯一编号
@@ -66,6 +71,9 @@
    @ApiModelProperty("是否上班中")
    private Boolean workFlag;
    @ApiModelProperty(value = "登录设备类型 1-Android 2-iOS")
    private Integer deviceType;
    /**
     * 角色信息VO
     */
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/down/MessageType.java
File was deleted
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/down/MsgContent.java
File was deleted
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/down/RtMsgHeader.java
File was deleted
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/down/SourceType.java
File was deleted
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/down/cloudCreateOrder/RtTaskListResponse.java
File was deleted
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/down/cloudCreateOrder/RtTaskResult.java
File was deleted
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/down/cloudCreateOrder/TaskResultStatus.java
File was deleted
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/down/cloudOrderOperation/OrderOperationState.java
File was deleted
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/down/cloudOrderOperation/OrderOperationStatus.java
File was deleted
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/MessageType.java
File was deleted
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/MsgContent.java
File was deleted
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/RtMsgHeader.java
File was deleted
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/navigationDeviationEvent/NavigationDeviationEvent.java
File was deleted
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/systemStatusXpu/AbnormalReason.java
File was deleted
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/systemStatusXpu/DrivingMode.java
File was deleted
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/systemStatusXpu/GearLevel.java
File was deleted
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/systemStatusXpu/ServiceAvailability.java
File was deleted
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/systemStatusXpu/SystemPhase.java
File was deleted
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/systemStatusXpu/VehicleDynamicStatus.java
File was deleted
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/systemStatusXpu/VehicleStaticInfo.java
File was deleted
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/systemStatusXpu/VehicleStatus.java
File was deleted
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/xpuNavigationRequest/NavigationRequest.java
File was deleted
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/proto/up/xpuNavigationRequest/NavigationType.java
File was deleted
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
@@ -27,15 +27,18 @@
import com.xiaopeng.api.vo.OrderType;
import com.xiaopeng.api.vo.SystemEventType;
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
import com.xiaopeng.api.vo.automaticPilot.proto.down.cloudOrderOperation.ActionType;
import com.xiaopeng.api.vo.automaticPilot.proto.down.cloudOrderOperation.OrderOperationType;
import com.xiaopeng.api.vo.automaticPilot.proto.down.cloudOrderOperation.PointType;
import com.xiaopeng.api.vo.automaticPilot.proto.up.navigationDeviationEvent.NavigationDeviationEvent;
import com.xiaopeng.api.vo.automaticPilot.proto.up.navigationDeviationEvent.NavigationDeviationMessage;
import com.xiaopeng.api.vo.automaticPilot.proto.up.orderStateUpdateEvent.OrderStatusInfoEvent;
import com.xiaopeng.api.vo.automaticPilot.proto.up.systemStatusXpu.*;
import com.xiaopeng.api.vo.automaticPilot.proto.up.xpuNavigationRequest.NavigationRequest;
import com.xiaopeng.api.vo.automaticPilot.protobuf.*;
import com.xiaopeng.api.vo.automaticPilot.protobuf.AbnormalReason;
import com.xiaopeng.api.vo.automaticPilot.protobuf.GearLevel;
import com.xiaopeng.api.vo.automaticPilot.protobuf.OrderPhase;import com.xiaopeng.api.vo.automaticPilot.protobuf.OrderStatusInfo;
import com.xiaopeng.api.vo.automaticPilot.protobuf.RealtimePose;
import com.xiaopeng.api.vo.automaticPilot.protobuf.ResponseMessage;
import com.xiaopeng.api.vo.automaticPilot.protobuf.RtTripInfo;
import com.xiaopeng.api.vo.automaticPilot.protobuf.StatusCode;
import com.xiaopeng.api.vo.automaticPilot.protobuf.VehicleDynamicStatus;
import com.xiaopeng.api.vo.automaticPilot.protobuf.VehicleStaticInfo;
import com.xiaopeng.api.vo.automaticPilot.protobuf.VehicleStatus;
import com.xiaopeng.api.vo.automaticPilot.protobuf.Wgs;
import com.xiaopeng.api.vo.operation.RouteVo;
import com.xiaopeng.api.vo.vehicleConvoy.CancelTaxiPassengerVo;
import com.xiaopeng.automaticPilot.util.XPUUtil;
@@ -875,8 +878,8 @@
                            taskBuilder.setTaskId("MISSION_"+ IdUtil.fastUUID());
                            taskBuilder.setTaskType(com.xiaopeng.api.vo.automaticPilot.protobuf.OrderType.ORDER_TYPE_CRUISE);
                            com.xiaopeng.api.vo.automaticPilot.protobuf.RtTask task = taskBuilder.build();
                            com.xiaopeng.api.vo.automaticPilot.protobuf.RtTaskList taskList = com.xiaopeng.api.vo.automaticPilot.protobuf.RtTaskList.newBuilder().addTasks(task).build();
                            RtTask task = taskBuilder.build();
                            RtTaskList taskList = RtTaskList.newBuilder().addTasks(task).build();
                            SnowFlake snowFlake = new SnowFlake(0, 0);
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/constant/I18nKeyConstant.java
@@ -9,7 +9,4 @@
    String TASK_NOT_EXIST = "task.not.exist";
    String VEHICLE_NOT_EXIST = "vehicle.not.exist";
    String TASK_RULE_NOT_CONFIG = "task.rule.not.config";
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java
@@ -7,8 +7,10 @@
import com.xiaopeng.api.model.maintenance.XpErrorType;
import com.xiaopeng.api.model.maintenance.XpTask;
import com.xiaopeng.api.model.maintenance.XpTaskHandleDetailRoutine;
import com.xiaopeng.api.model.order.XpCruiseOrder;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.vo.account.LoginOperationUser;
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.common.security.service.TokenService;
@@ -24,6 +26,10 @@
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
@@ -45,6 +51,8 @@
public class XpTaskController {
    @Resource
    private XpTaskService xpTaskService;
    @Resource
    private MongoTemplate mongoTemplate;
    @Resource
    private TokenService tokenService;
    @Resource
@@ -74,21 +82,28 @@
    @ApiOperation(value = "查询车辆不分页列表", tags = "运维APP-任务中心")
    @PostMapping("/api/v1/task/listVehicle")
    public R<List<VehicleListVO>> listVehicle() {
        LoginOperationUser loginOperationUser = tokenService.getLoginOperationUser();
        XpOperationsUser xpOperationsUser = loginOperationUser.getXpOperationsUser();
        // 查询当前人员所属车队 查询车队关联车辆
        R<List<Long>> vehicleByUserId = xpFleetOperationsClient.getVehicleByUserId(xpOperationsUser.getId());
        List<Long> vehicleIds = vehicleByUserId.getData();
        if (vehicleIds != null && !vehicleIds.isEmpty()){
            // todo 查询车辆列表 获取经纬度
            List<XpVehicle> data = xpVehicleClient.listByIds(vehicleIds).getData();
            if (data!=null){
                List<VehicleListVO> vehicleListVOS = new ArrayList<>();
                for (XpVehicle xpVehicle : data) {
                    VehicleListVO vehicleListVO = new VehicleListVO();
                    vehicleListVO.setId(xpVehicle.getId());
//                    vehicleListVO.setVehicleLon(xpVehicle.getVehicleLon());
//                    vehicleListVO.setVehicleLat(xpVehicle.getVehicleLat());
                    VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class);
                    if(vehiclePosition!=null){
                        double x = vehiclePosition.getPoint().getX();
                        double y = vehiclePosition.getPoint().getY();
                        vehicleListVO.setVehicleLon(x+"");
                        vehicleListVO.setVehicleLat(y+"");
                    }
                    vehicleListVO.setVehicleCode(xpVehicle.getVehicleCode());
                    vehicleListVO.setVehicleColor(xpVehicle.getVehicleColor());
                    vehicleListVO.setPlateNumber(xpVehicle.getPlateNumber());
@@ -110,6 +125,7 @@
        xpTaskService.saveVehicleAccident(dto, xpOperationsUser);
        return R.ok();
    }
    @ApiOperation(value = "车辆事故任务详情", tags = "运维APP-任务中心")
    @GetMapping("/api/v1/task/vehicleAccidentDetail")
    public R<TaskAccidentDetailVO> vehicleAccidentDetail(Long id) {
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskManagementController.java
@@ -3,6 +3,7 @@
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import com.xiaopeng.api.feignClient.account.XpOperationUserClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetOperationsClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
import com.xiaopeng.api.model.account.SysUser;
@@ -35,6 +36,7 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@@ -46,7 +48,9 @@
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
 * <p>
@@ -67,6 +71,8 @@
    private TokenService tokenService;
    @Resource
    private IXpErrorTypeService xpErrorTypeService;
    @Resource
    private XpOperationUserClient operationUserClient;
    @Resource
    private XpFleetOperationsClient xpFleetOperationsClient;
    @Resource
@@ -95,7 +101,18 @@
            xpTaskExportExcel.setTaskTypeName(task.getTaskTypeName());
            xpTaskExportExcel.setTaskUrgencyLevel(task.getTaskUrgencyLevel());
            xpTaskExportExcel.setTaskDescription(task.getTaskDescription());
            xpTaskExportExcel.setHandleUserName(task.getHandleUserName());
            if (StringUtils.hasLength(task.getHandleUserId())){
                String[] split = task.getHandleUserId().split(",");
                List<XpOperationsUser> users = operationUserClient.listByIds(Arrays.stream(split).map(Long::parseLong).collect(Collectors.toList())).getData();
                if (users!=null){
                    StringBuilder handleUserName = new StringBuilder();
                    for (XpOperationsUser user : users) {
                        handleUserName.append(user.getNickName()).append(";");
                    }
                    xpTaskExportExcel.setHandleUserName(handleUserName.toString());
                }
            }
            xpTaskExportExcel.setNumber(num);
            xpTaskExportExcel.setStatus(task.getStatus());
            LocalDateTime createTime = task.getCreateTime();
@@ -150,6 +167,9 @@
        xpTaskService.saveTask(dto, reportUserId);
        return R.ok();
    }
    @ApiOperation(value = "任务详情")
    @GetMapping("/taskDetail")
    public R<TaskManagementDetailVO> taskDetail(Long id) {
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/dto/SchedulingDetailDto.java
@@ -4,6 +4,7 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
import java.util.Map;
@Data
@@ -75,14 +76,8 @@
    private Map<String, String> thirty;
    @ApiModelProperty("31")
    private Map<String, String> thirtyOne;
    @ApiModelProperty("全天")
    private Long allDay;
    @ApiModelProperty("早")
    private Long morning;
    @ApiModelProperty("中")
    private Long midDay;
    @ApiModelProperty("晚")
    private Long evening;
    @ApiModelProperty("小计统计")
    private List<Map<String, String>> subtotal;
    /**
     * 天数,用逗号分隔
     */
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/exportExcel/XpTaskExportExcel.java
@@ -25,7 +25,7 @@
    @Excel(name = "车牌号",width = 20)
    private String plateNumber;
    @ApiModelProperty(value = "任务类别1常规 2事故")
    @Excel(name = "任务类别",width = 20)
    @Excel(name = "任务类别",width = 20,replace = {"常规_1","事故_2"})
    private Integer taskCategory;
    @ApiModelProperty(value = "类型")
    @Excel(name = "类型",width = 40)
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/TaskManagementAccidentDetailVO.java
@@ -59,7 +59,12 @@
    private String reportUserPhone;
    @ApiModelProperty(value = "上报人头像")
    private String reportUserAvatar;
    @ApiModelProperty(value = "上报人时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "处理时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime handleTime;
    @ApiModelProperty(value = "处理id")
    private Long handleUserId;
    @ApiModelProperty(value = "处理名称")
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/TaskManagementChargingDetailVO.java
@@ -36,6 +36,8 @@
    private String vehicleVin;
    @ApiModelProperty(value = "车辆地址")
    private String vehicleLocation;
    @ApiModelProperty(value = "车辆图片")
    private String vehiclePictures;
    @ApiModelProperty(value = "任务编号")
    private String taskCode;
    @ApiModelProperty(value = "开始剩余电量")
@@ -58,4 +60,5 @@
    private Long endOperationsUserId;
    @ApiModelProperty(value = "结束充电操作人名称")
    private String endOperationsUserName;
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/TaskManagementCleanDetailVO.java
@@ -36,7 +36,8 @@
    private String vehicleVin;
    @ApiModelProperty(value = "车辆地址")
    private String vehicleLocation;
    @ApiModelProperty(value = "车辆图片")
    private String vehiclePictures;
    @ApiModelProperty(value = "任务编号")
    private String taskCode;
@@ -46,5 +47,11 @@
    private Long operationUserId;
    @ApiModelProperty(value = "操作人名称")
    private String operationsUserName;
    @ApiModelProperty(value = "上报人时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "处理时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime handleTime;
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/TaskManagementDetectionDetailVO.java
@@ -36,6 +36,8 @@
    private String vehicleVin;
    @ApiModelProperty(value = "车辆地址")
    private String vehicleLocation;
    @ApiModelProperty(value = "车辆图片")
    private String vehiclePictures;
    @ApiModelProperty(value = "任务编号")
    private String taskCode;
@@ -95,4 +97,10 @@
    @ApiModelProperty(value = "检测时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime checkTime;
    @ApiModelProperty(value = "上报人时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "处理时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime handleTime;
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/TaskManagementPageListVO.java
@@ -39,7 +39,7 @@
    @ApiModelProperty(value = "状态 0=待到达 1=待处理 2=已完成 3=已取消")
    private Integer status;
    @ApiModelProperty(value = "处理人id")
    private Integer handleUserId;
    private String handleUserId;
    @ApiModelProperty(value = "处理人名称")
    private String handleUserName;
    @ApiModelProperty(value = "任务描述")
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/TaskManagementPreparationDetailVO.java
@@ -36,6 +36,8 @@
    private String vehicleVin;
    @ApiModelProperty(value = "车辆地址")
    private String vehicleLocation;
    @ApiModelProperty(value = "车辆图片")
    private String vehiclePictures;
    @ApiModelProperty(value = "任务编号")
    private String taskCode;
    @ApiModelProperty(value = "左前轮")
@@ -67,6 +69,8 @@
    @ApiModelProperty(value = "遗失物品")
    private String lostItems;
    @ApiModelProperty(value = "遗失物品说明")
    private String lostItemsDetail;
    @ApiModelProperty(value = "备注")
    private String remarks;
@@ -78,4 +82,5 @@
    @ApiModelProperty(value = "操作时间")
    private LocalDateTime operationsTime;
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/TaskManagementRepairDetailVO.java
@@ -37,7 +37,8 @@
    private String vehicleVin;
    @ApiModelProperty(value = "车辆地址")
    private String vehicleLocation;
    @ApiModelProperty(value = "车辆图片")
    private String vehiclePictures;
    @ApiModelProperty(value = "任务编号")
    private String taskCode;
@@ -76,4 +77,5 @@
    @ApiModelProperty(value = "取回时间")
    private LocalDateTime returnTime;
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/TaskManagementRoutineDetailVO.java
@@ -35,6 +35,8 @@
    private String vehicleVin;
    @ApiModelProperty(value = "车辆地址")
    private String vehicleLocation;
    @ApiModelProperty(value = "车辆图片")
    private String vehiclePictures;
    @ApiModelProperty(value = "任务编号")
    private String taskCode;
    @ApiModelProperty(value = "完成任务情况描述")
@@ -48,4 +50,8 @@
    @ApiModelProperty(value = "处理时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime handleTime;
    @ApiModelProperty(value = "上报人时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime createTime;
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/XpTaskService.java
@@ -91,4 +91,7 @@
     */
    XpTask queryInfoByVehicleId(Long vehicleId);
    void saveVehicleAccidentError(Long vehicleId);
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpClockInServiceImpl.java
@@ -169,6 +169,7 @@
        } else {
            xpClockIn.setClockInResult(1);
        }
        xpClockIn.setAppUserId(null);
        this.updateById(xpClockIn);
        return R.ok();
    }
@@ -253,12 +254,16 @@
        List<Long> ids = appUserIdList.stream().map(Long::parseLong).collect(Collectors.toList());
        List<XpOperationsUserWithRoleVO> data = xpOperationUserClient.listByIdsWithRole(ids).getData();
        //将查询结果组装成map对象,用于循环中提取数据
        Map<Long,XpOperationsUserWithRoleVO> map = data.stream().collect(Collectors.toMap(XpOperationsUserWithRoleVO::getId, item->item));
        for (ClockInStatisticsDto clockInStatistic : clockInStatistics) {
            String appUserId = clockInStatistic.getAppUserId();
            XpOperationsUserWithRoleVO xpOperationsUserWithRoleVO = map.get(Long.parseLong(appUserId));
            clockInStatistic.setName(xpOperationsUserWithRoleVO.getNickName());
            clockInStatistic.setRoleName(xpOperationsUserWithRoleVO.getRoleName());
            //运维账号可以拥有多个角色
            List<XpOperationsUserWithRoleVO> collect = data.stream().filter(x->x.getId().equals(Long.parseLong(appUserId))).collect(Collectors.toList());
            if(!collect.isEmpty()){
                XpOperationsUserWithRoleVO xpOperationsUserWithRoleVO = collect.get(0);
                clockInStatistic.setName(xpOperationsUserWithRoleVO.getNickName());
            }
            String roleName = collect.stream().map(XpOperationsUserWithRoleVO::getRoleName).collect(Collectors.joining(";"));
            clockInStatistic.setRoleName(roleName);
            Integer shouldClockInDays = clockInStatistic.getShouldClockInDays();
            Integer clockInDays = clockInStatistic.getClockInDays();
            clockInStatistic.setNotClockInDays(shouldClockInDays - clockInDays);
@@ -306,13 +311,16 @@
        List<String> appUserIdList = clockInStatistics.stream().map(ClockInStatisticsDto::getAppUserId).collect(Collectors.toList());
        List<Long> ids = appUserIdList.stream().map(Long::parseLong).collect(Collectors.toList());
        List<XpOperationsUserWithRoleVO> data = xpOperationUserClient.listByIdsWithRole(ids).getData();
        //将查询结果组装成map对象,用于循环中提取数据
        Map<Long,XpOperationsUserWithRoleVO> map = data.stream().collect(Collectors.toMap(XpOperationsUserWithRoleVO::getId, item->item));
        for (ClockInStatisticsDto clockInStatistic : clockInStatistics) {
            String appUserId = clockInStatistic.getAppUserId();
            XpOperationsUserWithRoleVO xpOperationsUserWithRoleVO = map.get(Long.parseLong(appUserId));
            clockInStatistic.setName(xpOperationsUserWithRoleVO.getNickName());
            clockInStatistic.setRoleName(xpOperationsUserWithRoleVO.getRoleName());
            //运维账号可以拥有多个角色
            List<XpOperationsUserWithRoleVO> collect = data.stream().filter(x->x.getId().equals(Long.parseLong(appUserId))).collect(Collectors.toList());
            if(!collect.isEmpty()){
                XpOperationsUserWithRoleVO xpOperationsUserWithRoleVO = collect.get(0);
                clockInStatistic.setName(xpOperationsUserWithRoleVO.getNickName());
            }
            String roleName = collect.stream().map(XpOperationsUserWithRoleVO::getRoleName).collect(Collectors.joining(";"));
            clockInStatistic.setRoleName(roleName);
            Integer shouldClockInDays = clockInStatistic.getShouldClockInDays();
            Integer clockInDays = clockInStatistic.getClockInDays();
            clockInStatistic.setNotClockInDays(shouldClockInDays - clockInDays);
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpSchedulingDetailServiceImpl.java
@@ -136,9 +136,11 @@
    public PageInfo<SchedulingDetailDto> pageList(SchedulingDetailVo query) {
        PageInfo<SchedulingDetailDto> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<SchedulingDetailDto> schedulingDetailDtos = this.baseMapper.pageList(pageInfo, query.getMonth());
        LocalDate parse1 = LocalDate.parse(query.getMonth(), DateTimeFormatter.ofPattern("yyyy-MM"));
        LocalDate parse1 = LocalDate.parse(query.getMonth() + "-01", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        //找出月份的最大天
        int dayOfMonth = parse1.with(TemporalAdjusters.lastDayOfMonth()).getDayOfMonth();
        List<XpShift> xpShifts = xpShiftService.list(new QueryWrapper<XpShift>().eq("is_deleted", 0).orderByAsc("id"));
        for (SchedulingDetailDto schedulingDetailDto : schedulingDetailDtos) {
            String days = schedulingDetailDto.getDays();
            if (StringUtils.isNotBlank(days)) {
@@ -157,14 +159,20 @@
                    }
                    setEnglishDay(i, schedulingDetailDto, map1);
                }
                long allDay = list.stream().filter(s -> s.contains("全天")).count();
                long morning = list.stream().filter(s -> s.contains("早")).count();
                long midDay = list.stream().filter(s -> s.contains("中")).count();
                long evening = list.stream().filter(s -> s.contains("晚")).count();
                schedulingDetailDto.setAllDay(allDay);
                schedulingDetailDto.setMorning(morning);
                schedulingDetailDto.setMidDay(midDay);
                schedulingDetailDto.setEvening(evening);
                List<Map<String, String>> maps = new ArrayList<>();
                for (XpShift xpShift : xpShifts) {
                    String shiftName = xpShift.getShiftName();
                    long allDay = list.stream().filter(s -> s.contains(shiftName)).count();
                    Map<String, String> map = new HashMap<>();
                    map.put("shiftId", xpShift.getId().toString());
                    map.put("shiftName", shiftName);
                    map.put("shiftColor", xpShift.getShiftColor());
                    map.put("count", allDay + "");
                    maps.add(map);
                }
                schedulingDetailDto.setSubtotal(maps);
            }
        }
        pageInfo.setRecords(schedulingDetailDtos);
@@ -401,7 +409,7 @@
            xpScheduling.setCreateBy(userId.toString());
            xpScheduling.setUpdateBy(userId.toString());
        }
        xpScheduling.setSchedulingDate(LocalDate.parse(month, DateTimeFormatter.ofPattern("yyyy-MM")));
        xpScheduling.setSchedulingDate(LocalDate.parse(month + "-01", DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        xpScheduling.setCommitUserId(userId);
        xpSchedulingService.saveOrUpdate(xpScheduling);
@@ -550,13 +558,13 @@
        List<SchedulingDetailDto> schedulingDetailDtos = this.baseMapper.pageList(pageInfo, month);
        List<ExportSchedulingDetailDto> exportSchedulingDetailDtos = new ArrayList<>();
        //获取月份的最大天数
        LocalDate parse1 = LocalDate.parse(month, DateTimeFormatter.ofPattern("yyyy-MM"));
        LocalDate parse1 = LocalDate.parse(month + "-01", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        int dayOfMonth = parse1.with(TemporalAdjusters.lastDayOfMonth()).getDayOfMonth();
        //构建表头第二行数据
        ExportSchedulingDetailDto exportSchedulingDetailDto = new ExportSchedulingDetailDto();
        exportSchedulingDetailDto.setFleetName("");
        for (int i = 1; i <= dayOfMonth; i++) {
            LocalDate parse = LocalDate.parse(month + "-" + i, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
            LocalDate parse = LocalDate.parse(month + "-" + String.format("%02d", i), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
            String week = "";
            switch (parse.getDayOfWeek()){
                case MONDAY:
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
@@ -1,8 +1,10 @@
package com.xiaopeng.maintenance.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.dto.pushMessage.AliPushMessageDTO;
@@ -17,6 +19,7 @@
import com.xiaopeng.api.model.account.XpOperationsUserNotification;
import com.xiaopeng.api.model.maintenance.*;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
import com.xiaopeng.common.core.constant.AliPushTypeConstant;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.enums.NotificationTypeEnum;
@@ -44,9 +47,15 @@
import org.redisson.api.RedissonClient;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.LocalTime;
@@ -69,6 +78,8 @@
    private RedissonClient redissonClient;
    @Autowired
    private XpErrorTypeMapper errorTypeMapper;
    @Resource
    private XpOperationUserClient operationUserClient;
    @Autowired
    private XpTaskHandleDetailMapper xpTaskHandleDetailMapper;
@@ -78,6 +89,8 @@
    private XpVehicleRepairMapper vehicleRepairMapper;
    @Autowired
    private XpVehiclePreparationMapper vehiclePreparationMapper;
    @Autowired
    private XpVehicleDescriptionMapper vehicleDescriptionMapper;
    @Autowired
    private XpVehicleDetectionMapper vehicleDetectionMapper;
@@ -94,6 +107,8 @@
    private XpVehicleClient xpVehicleClient;
    @Autowired
    private XpTaskRuleMapper xpTaskRuleMapper;
    @Autowired
    private MongoTemplate mongoTemplate;
    @Autowired
    private XpAliPushMessageClient xpAliPushMessageClient;
    @Autowired
@@ -154,6 +169,7 @@
        return pageInfo;
    }
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void saveVehicleAccident(SaveVehicleAccidentDto dto, XpOperationsUser xpOperationsUser) {
        XpTask xpTask = new XpTask();
@@ -164,11 +180,18 @@
        xpTask.setTaskTypeId(dto.getTaskTypeId());
        xpTask.setTaskUrgencyLevel(dto.getTaskUrgencyLevel());
        xpTask.setTaskDescription(dto.getTaskDescription());
        // todo 获取车辆当前位置
//        xpTask.setVehicleLocation();
       xpTask.setVehicleId(dto.getId());
//        xpTask.setVehicleLon();
//        xpTask.setVehicleLat();
        XpVehicle vehicle = xpVehicleClient.queryById(xpTask.getVehicleId()).getData();
        if (vehicle!=null){
            VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vehicle.getVehicleVin())), VehiclePosition.class);
            if (vehiclePosition != null) {
                double x = vehiclePosition.getPoint().getX();
                double y = vehiclePosition.getPoint().getY();
                xpTask.setVehicleLon(new BigDecimal(x));
                xpTask.setVehicleLat(new BigDecimal(y));
            }
        }
        xpTask.setVehicleId(dto.getId());
        xpTask.setReportUserId(xpOperationsUser.getId());
        xpTask.setReportTime(LocalDateTime.now());
        xpTask.setStatus(0);
@@ -176,23 +199,25 @@
        XpTaskRule taskRule = xpTaskRuleService.lambdaQuery().last("limit 1").one();
        XpTaskRuleRole taskRuleRole = xpTaskRuleRoleService.lambdaQuery().eq(XpTaskRuleRole::getRuleType, 9).last("limit 1").one();
        if (Objects.isNull(taskRuleRole) || Objects.isNull(taskRule)) {
            throw new ServiceException("未配置车辆事故任务分配规则", I18nKeyConstant.TASK_RULE_NOT_CONFIG);
            throw new ServiceException("未配置车辆事故任务分配规则");
        }
        R<List<XpOperationsRole>> xpOperationsRoleResult = xpOperationUserClient.getXpOperationsRoleByRoleId(taskRuleRole.getRoleId());
        if (CollUtil.isNotEmpty(xpOperationsRoleResult.getData())) {
            List<Long> userIds = xpOperationsRoleResult.getData().stream().map(XpOperationsRole::getOperationsUserId).collect(Collectors.toList());
            xpTask.setHandleUserId(StringUtils.join(userIds, ","));
        }
        // 根据事故处理限时配置设置任务截止时间
        LocalDateTime endTime = LocalDateTime.now().plusMinutes(taskRule.getProcessingTimeLimit());
        xpTask.setEndTime(endTime);
        this.save(xpTask);
        //发送消息通知
        // 发送消息通知
        List<Long> userIds = Arrays.stream(xpTask.getHandleUserId().split(",")).map(Long::valueOf).collect(Collectors.toList());
        if (CollUtil.isNotEmpty(userIds)) {
            R<List<XpOperationsUser>> xpOperationUserResult = xpOperationUserClient.listByIds(userIds);
            List<XpOperationsUser> data = xpOperationUserResult.getData();
            if (CollUtil.isNotEmpty(data)) {
                R<XpVehicle> xpVehicleR = xpVehicleClient.queryById(dto.getId());
                XpVehicle vehicle = xpVehicleR.getData();
                String plateNumber = Objects.nonNull(vehicle) ? vehicle.getPlateNumber() : "";
                // 车辆${车牌号}在${车辆位置信息}发生了紧急事故,请在${到达现场限时}内到达现场!${APP链接}
                String content = String.format("车辆%s在%s发生了紧急事故,请在%d分钟内到达现场!", plateNumber, xpTask.getVehicleLocation(), taskRule.getProcessingTimeLimit());
@@ -217,6 +242,7 @@
    /**
     * 推送阿里云通知
     *
     * @param data
     * @param content
     * @param xpTask
@@ -232,7 +258,7 @@
                .body(JSONObject.toJSONString(param))
                .account(account).title("车辆事故警示")
                .pushType(AliPushTypeConstant.NOTICE)
                        .deviceType(data.get(0).getDeviceType())
                .deviceType(data.get(0).getDeviceType())
                .build());
    }
@@ -840,6 +866,17 @@
        PageInfo<TaskManagementPageListVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<TaskManagementPageListVO> list = this.baseMapper.pageListManagement(pageInfo, query);
        for (TaskManagementPageListVO taskManagementPageListVO : list) {
            if (org.springframework.util.StringUtils.hasLength(taskManagementPageListVO.getHandleUserId())){
                String[] split = taskManagementPageListVO.getHandleUserId().split(",");
                List<XpOperationsUser> users = operationUserClient.listByIds(Arrays.stream(split).map(Long::parseLong).collect(Collectors.toList())).getData();
                if (users!=null){
                    StringBuilder handleUserName = new StringBuilder();
                    for (XpOperationsUser user : users) {
                        handleUserName.append(user.getNickName()).append(";");
                    }
                    taskManagementPageListVO.setHandleUserName(handleUserName.toString());
                }
            }
            if (taskManagementPageListVO.getTaskCategory() == 1) {
                switch (taskManagementPageListVO.getTaskTypeId()) {
                    case "1":
@@ -873,7 +910,7 @@
                        taskManagementPageListVO.setTaskTypeName("");
                        break;
                }
            }else{
            } else {
                StringBuilder taskTypeName = new StringBuilder();
                String[] typeIds = taskManagementPageListVO.getTaskTypeId().split(",");
                List<XpErrorType> xpErrorTypes = errorTypeMapper.selectList(new LambdaQueryWrapper<XpErrorType>()
@@ -902,12 +939,151 @@
    @Override
    public List<TaskManagementPageListVO> exportList(TaskManagementPageListQuery query) {
        List<TaskManagementPageListVO> list = this.baseMapper.exportList(query);
        for (TaskManagementPageListVO taskManagementPageListVO : list) {
            if (org.springframework.util.StringUtils.hasLength(taskManagementPageListVO.getHandleUserId())){
                String[] split = taskManagementPageListVO.getHandleUserId().split(",");
                List<XpOperationsUser> users = operationUserClient.listByIds(Arrays.stream(split).map(Long::parseLong).collect(Collectors.toList())).getData();
                if (users!=null){
                    StringBuilder handleUserName = new StringBuilder();
                    for (XpOperationsUser user : users) {
                        handleUserName.append(user.getNickName()).append(";");
                    }
                    taskManagementPageListVO.setHandleUserName(handleUserName.toString());
                }
            }
            if (taskManagementPageListVO.getTaskCategory() == 1) {
                switch (taskManagementPageListVO.getTaskTypeId()) {
                    case "1":
                        taskManagementPageListVO.setTaskTypeName("车辆检查");
                        break;
                    case "2":
                        taskManagementPageListVO.setTaskTypeName("车辆充电");
                        break;
                    case "3":
                        taskManagementPageListVO.setTaskTypeName("车辆整备");
                        break;
                    case "4":
                        taskManagementPageListVO.setTaskTypeName("整备洗车");
                        break;
                    case "5":
                        taskManagementPageListVO.setTaskTypeName("车辆维修");
                        break;
                    case "6":
                        taskManagementPageListVO.setTaskTypeName("车辆保养");
                        break;
                    case "7":
                        taskManagementPageListVO.setTaskTypeName("车辆保险到期");
                        break;
                    case "8":
                        taskManagementPageListVO.setTaskTypeName("车辆年检到期");
                        break;
                    case "9":
                        taskManagementPageListVO.setTaskTypeName("车辆运营资质到期");
                        break;
                    default:
                        taskManagementPageListVO.setTaskTypeName("");
                        break;
                }
            } else {
                StringBuilder taskTypeName = new StringBuilder();
                String[] typeIds = taskManagementPageListVO.getTaskTypeId().split(",");
                List<XpErrorType> xpErrorTypes = errorTypeMapper.selectList(new LambdaQueryWrapper<XpErrorType>()
                        .in(XpErrorType::getId, Arrays.asList(typeIds)).orderByAsc(XpErrorType::getParentId));
                List<XpErrorType> parents = new ArrayList<>();
                for (XpErrorType xpErrorType : xpErrorTypes) {
                    if (xpErrorType.getParentId() == 0) {
                        parents.add(xpErrorType);
                    }
                }
                for (XpErrorType parent : parents) {
                    List<XpErrorType> children = xpErrorTypes.stream().filter(e -> e.getParentId().equals(parent.getId())).collect(Collectors.toList());
                    taskTypeName.append(parent.getErrorName()).append(">");
                    for (XpErrorType child : children) {
                        taskTypeName.append(child.getErrorName()).append(";");
                    }
                }
                taskManagementPageListVO.setTaskTypeName(taskTypeName.substring(0, taskTypeName.length() - 1));
            }
        }
        return list;
    }
    @Override
    public XpTask queryInfoByVehicleId(Long vehicleId) {
        return this.baseMapper.queryInfoByVehicleId(vehicleId);
    }
    @Override
    public void saveVehicleAccidentError(Long vehicleId) {
        XpTask xpTask = new XpTask();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
        xpTask.setTaskCode(code);
        xpTask.setTaskCategory(2);
        // todo 事故类型待客户确定
        xpTask.setTaskTypeId("1");
        xpTask.setTaskUrgencyLevel(0);
        xpTask.setTaskDescription("车辆发生异常");
        XpVehicle vehicle = xpVehicleClient.queryById(xpTask.getVehicleId()).getData();
        if (vehicle!=null){
            VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vehicle.getVehicleVin())), VehiclePosition.class);
            if (vehiclePosition != null) {
                double x = vehiclePosition.getPoint().getX();
                double y = vehiclePosition.getPoint().getY();
                xpTask.setVehicleLon(new BigDecimal(x));
                xpTask.setVehicleLat(new BigDecimal(y));
            }
        }
        xpTask.setVehicleId(vehicleId);
        // 系统上传异常任务标识
        xpTask.setReportUserId(0L);
        xpTask.setReportTime(LocalDateTime.now());
        xpTask.setStatus(0);
        xpTask.setCreateBy("admin");
        XpTaskRule taskRule = xpTaskRuleService.lambdaQuery().last("limit 1").one();
        XpTaskRuleRole taskRuleRole = xpTaskRuleRoleService.lambdaQuery().eq(XpTaskRuleRole::getRuleType, 9).last("limit 1").one();
        if (Objects.isNull(taskRuleRole) || Objects.isNull(taskRule)) {
            throw new ServiceException("未配置车辆事故任务分配规则");
        }
        R<List<XpOperationsRole>> xpOperationsRoleResult = xpOperationUserClient.getXpOperationsRoleByRoleId(taskRuleRole.getRoleId());
        if (CollUtil.isNotEmpty(xpOperationsRoleResult.getData())) {
            List<Long> userIds = xpOperationsRoleResult.getData().stream().map(XpOperationsRole::getOperationsUserId).collect(Collectors.toList());
            xpTask.setHandleUserId(StringUtils.join(userIds, ","));
        }
        // 根据事故处理限时配置设置任务截止时间
        LocalDateTime endTime = LocalDateTime.now().plusMinutes(taskRule.getProcessingTimeLimit());
        xpTask.setEndTime(endTime);
        this.save(xpTask);
        // 发送消息通知
        List<Long> userIds = Arrays.stream(xpTask.getHandleUserId().split(",")).map(Long::valueOf).collect(Collectors.toList());
        if (CollUtil.isNotEmpty(userIds)) {
            R<List<XpOperationsUser>> xpOperationUserResult = xpOperationUserClient.listByIds(userIds);
            List<XpOperationsUser> data = xpOperationUserResult.getData();
            if (CollUtil.isNotEmpty(data)) {
                String plateNumber = Objects.nonNull(vehicle) ? vehicle.getPlateNumber() : "";
                // 车辆${车牌号}在${车辆位置信息}发生了紧急事故,请在${到达现场限时}内到达现场!${APP链接}
                String content = String.format("车辆%s在%s发生了紧急事故,请在%d分钟内到达现场!", plateNumber, xpTask.getVehicleLocation(), taskRule.getProcessingTimeLimit());
                List<XpOperationsUserNotification> notifications = data.stream().map(item -> {
                    XpOperationsUserNotification notification = new XpOperationsUserNotification();
                    notification.setOperationsUserId(item.getId());
                    notification.setNotificationContent(content);
                    notification.setReadStatus(0);
                    notification.setCreateTime(LocalDateTime.now());
                    return notification;
                }).collect(Collectors.toList());
                xpOperationUserNotificationClient.addNotificationBatch(notifications);
                // 发送阿里云推送
                Map<Integer, List<XpOperationsUser>> operationUserMap = data.stream().collect(Collectors.groupingBy(XpOperationsUser::getDeviceType));
                for (Map.Entry<Integer, List<XpOperationsUser>> integerListEntry : operationUserMap.entrySet()) {
                    List<XpOperationsUser> value = integerListEntry.getValue();
                    pushAliMessage(value, content, xpTask);
                }
            }
        }
    }
    @Override
@@ -923,7 +1099,8 @@
    @Override
    public void saveTask(SaveErrorTaskDto dto, Long reportUserId) {
        List<Long> vehicleIds = dto.getVehicleIds();
        List<XpVehicle> vehicles = xpVehicleClient.listByIds(vehicleIds).getData();
        List<XpTask> saveTask = new ArrayList<>();
        for (Long vehicleId : dto.getVehicleIds()) {
            XpTask task = new XpTask();
@@ -939,6 +1116,18 @@
                task.setEndTime(LocalDateTime.now().plusMinutes(taskRule.getProcessingTimeLimit()));
            }
            task.setTaskCategory(2);
            XpTaskRuleRole taskRuleRole = xpTaskRuleRoleService.lambdaQuery().eq(XpTaskRuleRole::getRuleType, 9).last("limit 1").one();
            if (Objects.isNull(taskRuleRole) || Objects.isNull(taskRule)) {
                throw new ServiceException("未配置车辆事故任务分配规则");
            }
            R<List<XpOperationsRole>> xpOperationsRoleResult = xpOperationUserClient.getXpOperationsRoleByRoleId(taskRuleRole.getRoleId());
            if (CollUtil.isNotEmpty(xpOperationsRoleResult.getData())) {
                List<Long> userIds = xpOperationsRoleResult.getData().stream().map(XpOperationsRole::getOperationsUserId).collect(Collectors.toList());
                task.setHandleUserId(StringUtils.join(userIds, ","));
            }
            // 根据事故处理限时配置设置任务截止时间
            LocalDateTime endTime = LocalDateTime.now().plusMinutes(taskRule.getProcessingTimeLimit());
            task.setEndTime(endTime);
            task.setTaskTypeId(dto.getTaskTypeId());
            task.setTaskUrgencyLevel(dto.getTaskUrgencyLevel());
            task.setTaskDescription(dto.getTaskDescription());
@@ -949,9 +1138,40 @@
            task.setVehicleLat(dto.getVehicleLat());
            task.setReportUserId(reportUserId);
            task.setReportTime(LocalDateTime.now());
            saveTask.add( task);
            saveTask.add(task);
            // 发送消息通知
            List<Long> userIds = Arrays.stream(task.getHandleUserId().split(",")).map(Long::valueOf).collect(Collectors.toList());
            if (CollUtil.isNotEmpty(userIds)) {
                XpVehicle vehicle = vehicles.stream().filter(e -> e.getId().equals(vehicleId)).findFirst().orElse(null);
                R<List<XpOperationsUser>> xpOperationUserResult = xpOperationUserClient.listByIds(userIds);
                List<XpOperationsUser> data = xpOperationUserResult.getData();
                if (CollUtil.isNotEmpty(data)) {
                    String plateNumber = Objects.nonNull(vehicle) ? vehicle.getPlateNumber() : "";
                    // 车辆${车牌号}在${车辆位置信息}发生了紧急事故,请在${到达现场限时}内到达现场!${APP链接}
                    String content = String.format("车辆%s在%s发生了紧急事故,请在%d分钟内到达现场!", plateNumber, task.getVehicleLocation(), taskRule.getProcessingTimeLimit());
                    List<XpOperationsUserNotification> notifications = data.stream().map(item -> {
                        XpOperationsUserNotification notification = new XpOperationsUserNotification();
                        notification.setOperationsUserId(item.getId());
                        notification.setNotificationContent(content);
                        notification.setReadStatus(0);
                        notification.setCreateTime(LocalDateTime.now());
                        return notification;
                    }).collect(Collectors.toList());
                    xpOperationUserNotificationClient.addNotificationBatch(notifications);
                    // 发送阿里云推送
                    Map<Integer, List<XpOperationsUser>> operationUserMap = data.stream().collect(Collectors.groupingBy(XpOperationsUser::getDeviceType));
                    for (Map.Entry<Integer, List<XpOperationsUser>> integerListEntry : operationUserMap.entrySet()) {
                        List<XpOperationsUser> value = integerListEntry.getValue();
                        pushAliMessage(value, content, task);
                    }
                }
            }
        }
        this.saveBatch(saveTask);
    }
@@ -988,6 +1208,7 @@
                    taskManagementDetectionDetailVO.setVehicleCode(vehicle.getVehicleCode());
                    taskManagementDetectionDetailVO.setVehicleVin(vehicle.getVehicleVin());
                    taskManagementDetectionDetailVO.setVehicleLocation(task.getVehicleLocation());
                    taskManagementDetectionDetailVO.setVehiclePictures(vehicle.getVehiclePictures());
                    taskManagementDetectionDetailVO.setTaskCode(task.getTaskCode());
                    XpVehicleDetection vehicleDetection = vehicleDetectionMapper.selectOne(new LambdaQueryWrapper<XpVehicleDetection>()
                            .eq(XpVehicleDetection::getTaskId, id).last("limit 1"));
@@ -1031,6 +1252,8 @@
                    taskManagementChargingDetailVO.setVehicleVin(vehicle.getVehicleVin());
                    taskManagementChargingDetailVO.setVehicleLocation(task.getVehicleLocation());
                    taskManagementChargingDetailVO.setTaskCode(task.getTaskCode());
                    taskManagementChargingDetailVO.setVehiclePictures(vehicle.getVehiclePictures());
                    XpChargingRecord chargingRecord = chargingRecordMapper.selectOne(new LambdaQueryWrapper<XpChargingRecord>()
                            .eq(XpChargingRecord::getTaskId, id).last("limit 1"));
                    if (chargingRecord != null) {
@@ -1070,8 +1293,16 @@
                    taskManagementPreparationDetailVO.setVehicleVin(vehicle.getVehicleVin());
                    taskManagementPreparationDetailVO.setVehicleLocation(task.getVehicleLocation());
                    taskManagementPreparationDetailVO.setTaskCode(task.getTaskCode());
                    taskManagementPreparationDetailVO.setVehiclePictures(vehicle.getVehiclePictures());
                    XpVehiclePreparation vehiclePreparation = vehiclePreparationMapper.selectOne(new LambdaQueryWrapper<XpVehiclePreparation>()
                            .eq(XpVehiclePreparation::getTaskId, id).last("limit 1"));
                    XpVehicleDescription xpVehicleDescription = vehicleDescriptionMapper.selectOne(
                            new LambdaQueryWrapper<XpVehicleDescription>().eq(XpVehicleDescription::getDescriptionType, 5)
                    );
                    if (xpVehicleDescription != null)      {
                        taskManagementPreparationDetailVO.setLostItemsDetail(xpVehicleDescription.getDescriptionContent());
                    }
                    if (vehiclePreparation != null) {
                        taskManagementPreparationDetailVO.setLeftFrontWheel(vehiclePreparation.getLeftFrontWheel());
                        taskManagementPreparationDetailVO.setRightFrontWheel(vehiclePreparation.getRightFrontWheel());
@@ -1109,6 +1340,8 @@
                    taskManagementCleanDetailVO.setVehicleVin(vehicle.getVehicleVin());
                    taskManagementCleanDetailVO.setVehicleLocation(task.getVehicleLocation());
                    taskManagementCleanDetailVO.setTaskCode(task.getTaskCode());
                    taskManagementCleanDetailVO.setVehiclePictures(vehicle.getVehiclePictures());
                    XpVehicleClean vehicleClean = vehicleCleanMapper.selectOne(new LambdaQueryWrapper<XpVehicleClean>()
                            .eq(XpVehicleClean::getTaskId, id).last("limit 1"));
                    if (vehicleClean != null) {
@@ -1136,6 +1369,8 @@
                    taskManagementRepairDetailVO.setVehicleVin(vehicle.getVehicleVin());
                    taskManagementRepairDetailVO.setVehicleLocation(task.getVehicleLocation());
                    taskManagementRepairDetailVO.setTaskCode(task.getTaskCode());
                    taskManagementRepairDetailVO.setVehiclePictures(vehicle.getVehiclePictures());
                    XpVehicleRepair vehicleRepair = vehicleRepairMapper.selectOne(new LambdaQueryWrapper<XpVehicleRepair>()
                            .eq(XpVehicleRepair::getTaskId, id).last("limit 1"));
                    if (vehicleRepair != null) {
@@ -1176,6 +1411,7 @@
                    res.setVehicleLocation(task.getVehicleLocation());
                    res.setVehicleVin(vehicle.getVehicleVin());
                    res.setTaskCode(task.getTaskCode());
                    res.setVehiclePictures(vehicle.getVehiclePictures());
                    XpTaskHandleDetailRoutine xpTaskHandleDetailRoutine = xpTaskHandleDetailRoutineMapper.selectOne(new LambdaQueryWrapper<XpTaskHandleDetailRoutine>()
                            .eq(XpTaskHandleDetailRoutine::getTaskId, id));
                    if (xpTaskHandleDetailRoutine != null) {
@@ -1214,6 +1450,8 @@
            for (XpErrorType xpErrorType : xpErrorTypes) {
                xpErrorType.setChild(errorType.get(xpErrorType.getId()));
            }
            res.setCreateTime(task.getCreateTime());
            res.setHandleTime(task.getHandleTime());
            res.setErrorTypeList(xpErrorTypes);
            res.setStatus(task.getStatus());
            res.setTaskDescription(task.getTaskDescription());
@@ -1247,7 +1485,7 @@
            }
            XpTaskHandleDetail xpTaskHandleDetail = xpTaskHandleDetailMapper.selectOne(new LambdaQueryWrapper<XpTaskHandleDetail>()
                    .eq(XpTaskHandleDetail::getTaskId, id));
            if (xpTaskHandleDetail != null){
            if (xpTaskHandleDetail != null) {
                res.setDeathCount(xpTaskHandleDetail.getDeathCount());
                res.setSevereCount(xpTaskHandleDetail.getSevereCount());
                res.setMinorCount(xpTaskHandleDetail.getMinorCount());
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/TaskRuleDetailVO.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.xiaopeng.api.model.maintenance.XpTaskRuleRole;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -10,6 +11,7 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;
@Data
@@ -23,7 +25,8 @@
    @ApiModelProperty(value = "车辆日常监测 频次")
    private Integer vehicleInspectionFrequency;
    @ApiModelProperty(value = "车辆日常检测 任务下放时间")
    private LocalDateTime vehicleInspectionTime;
    @JsonFormat(pattern = "HH:mm:ss", timezone = "GMT+8")
    private LocalTime vehicleInspectionTime;
    @ApiModelProperty(value = "车辆日常监测 紧急程度 0=P0 1=P1 2=P2 3=P3")
    private Integer vehicleInspectionLevel;
@@ -32,7 +35,8 @@
    private Boolean vehicleCollection;
    @ApiModelProperty(value = "车辆收车每日时间")
    private LocalDateTime vehicleCollectionTime;
    @JsonFormat(pattern = "HH:mm:ss", timezone = "GMT+8")
    private LocalTime vehicleCollectionTime;
    @ApiModelProperty(value = "车辆保养周期是否启用")
    private Boolean maintenanceCycle;
@@ -44,7 +48,8 @@
    private Integer maintenanceCycleTimeType;
    @ApiModelProperty(value = "车辆保养周期 任务下放时间")
    private LocalDateTime maintenanceCycleTaskTime;
    @JsonFormat(pattern = "HH:mm:ss", timezone = "GMT+8")
    private LocalTime maintenanceCycleTaskTime;
    @ApiModelProperty(value = "车辆保养周期 紧急程度 0=P0 1=P1 2=P2 3=P3")
    private Integer maintenanceCycleLevel;
@@ -59,7 +64,11 @@
    private Integer chargingStrategyLevel;
    @ApiModelProperty(value = "车身清洁保养周期X")
    private Integer vehicleCleanTime;
    private Integer vehicleCleanCycle;
    @ApiModelProperty(value = "车身清洁保养任务下放时间")
    @JsonFormat(pattern = "HH:mm:ss", timezone = "GMT+8")
    private LocalTime vehicleCleanTime;
    @ApiModelProperty(value = "车身清洁保养周期X 1=天 2=月")
    private Integer vehicleCleanTimeType;
@@ -68,7 +77,11 @@
    private Integer vehicleCleanLevel;
    @ApiModelProperty(value = "日常整备保养周期X")
    private Integer routineMaintenanceTime;
    private Integer routineMaintenanceCycle;
    @ApiModelProperty(value = "日常整备保养任务下放时间")
    @JsonFormat(pattern = "HH:mm:ss", timezone = "GMT+8")
    private LocalTime routineMaintenanceTime;
    @ApiModelProperty(value = "日常整备保养周期X 1=天 2=月")
    private Integer routineMaintenanceTimeType;
xp-robotaxi-maintenance-boot/src/main/resources/i18n/messages.properties
@@ -1,5 +1,4 @@
# 中文
welcome.message=欢迎来到我们的应用程序!
task.not.exist=任务不存在
vehicle.not.exist=车辆不存在
task.rule.not.config=未配置车辆事故任务分配规则
vehicle.not.exist=车辆不存在
xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpSchedulingDetailMapper.xml
@@ -5,8 +5,8 @@
    <select id="pageList" resultType="com.xiaopeng.maintenance.dto.SchedulingDetailDto">
        SELECT
            aa.fleet_id as fleetId
            aa.fleet_name as fleetName,
            bb.fleet_id as fleetId,
            bb.days
        FROM
            xp_fleet aa
xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpWorkOrderMapper.xml
@@ -18,7 +18,7 @@
        from xp_work_order wo
        where 1=1 and wo.is_deleted = 0
        <if test="query.feedbackUserPhone != null and query.feedbackUserPhone != ''">
            and wo.feedbackUserPhone like concat('%',#{query.feedbackUserPhone},'%')
            and wo.feedback_user_phone like concat('%',#{query.feedbackUserPhone},'%')
        </if>
        <if test="query.problemSource != null">
            and wo.problem_source = #{query.problemSource}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpElectronicFenceAreaController.java
@@ -34,7 +34,7 @@
     * @return 区域信息
     */
    @ApiOperation(value = "根据区域ID查询区域信息", notes = "根据区域ID查询区域信息", tags = {"内部接口"})
    @PostMapping("/inner/v1/xp-electronic-fence-area/queryById/queryById")
    @PostMapping("/inner/v1/xp-electronic-fence-area/queryById")
    public R<XpElectronicFenceArea> queryById(@RequestParam("id") Long id) {
        return R.ok(xpElectronicFenceAreaService.getById(id));
    }
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderEvaluateServiceImpl.java
@@ -11,11 +11,13 @@
import com.xiaopeng.api.feignClient.operation.XpSystemSettingClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
import com.xiaopeng.api.model.account.XpAppUser;
import com.xiaopeng.api.model.operation.XpFeedbackType;
import com.xiaopeng.api.model.operation.XpInvitationCode;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.model.order.XpOrder;
import com.xiaopeng.api.model.order.XpOrderEvaluate;
import com.xiaopeng.api.vo.account.GetUserListByUidsVo;
import com.xiaopeng.common.core.constant.HttpStatus;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.utils.StringUtils;
import com.xiaopeng.common.core.web.page.PageInfo;
@@ -109,13 +111,13 @@
        }
        // 4. 批量查询关联数据
        Map<Long, XpAppUser> userMap = batchGetUsers(userIds);
        JSONObject jsonObject = batchGetUsers(userIds);
        Map<Long, XpVehicle> vehicleMap = batchGetVehicles(vehicleIds);
        Map<Long, XpOrder> orderMap = batchGetOrders(orderIds);
        // 5. 根据查询条件过滤(手机号、车牌号)
        List<OrderEvaluatePageVO> voList = evaluatePage.getRecords().stream()
                .map(evaluate -> convertToPageVO(evaluate, userMap, vehicleMap, orderMap))
                .map(evaluate -> convertToPageVO(evaluate, jsonObject, vehicleMap, orderMap))
                .filter(vo -> filterByQuery(vo, query))
                .collect(Collectors.toList());
@@ -137,22 +139,26 @@
        GetUserListByUidsVo getUserListByUidsVo = new GetUserListByUidsVo();
        getUserListByUidsVo.setUids(userIds);
        getUserListByUidsVo.setGetPreCarOwner(false);
        UserResourcesDto userListByUids = userResourcesClient.getUserListByUids(getUserListByUidsVo);
        // todo 查不到用户信息
//        UserResourcesDto userListByUids = userResourcesClient.getUserListByUids(getUserListByUidsVo);
        for (OrderEvaluateManagementPageListVO orderEvaluateManagementPageListVO : list) {
            Object data = userListByUids.getData();
//            Object data = userListByUids.getData();
            // 转化为jsonArray
            JSONArray jsonArray = JSON.parseArray(JSON.toJSONString(data));
            for (Object o : jsonArray) {
                // 转化为JsonObject
                JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(o));
                String mobile = jsonObject.getString("mobile");
                String nickName = jsonObject.getString("nickName");
                String headImage = jsonObject.getString("headImage");
                orderEvaluateManagementPageListVO.setPhoneNumber(mobile);
                orderEvaluateManagementPageListVO.setNickName(nickName);
                orderEvaluateManagementPageListVO.setHeadImage(headImage);
//            JSONArray jsonArray = JSON.parseArray(JSON.toJSONString(data));
//            for (Object o : jsonArray) {
//                // 转化为JsonObject
//                JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(o));
//                String mobile = jsonObject.getString("mobile");
//                String nickName = jsonObject.getString("nickName");
//                String headImage = jsonObject.getString("headImage");
//                orderEvaluateManagementPageListVO.setPhoneNumber(mobile);
//                orderEvaluateManagementPageListVO.setNickName(nickName);
//                orderEvaluateManagementPageListVO.setHeadImage(headImage);
//            }
            XpFeedbackType feedbackType = systemSettingClient.getFeedbackTypeById(orderEvaluateManagementPageListVO.getFeedbackTypeId()).getData();
            if (feedbackType!=null){
                orderEvaluateManagementPageListVO.setFeedbackTypeName(feedbackType.getFeedbackType());
            }
            systemSettingClient.getFeedbackTypeById(orderEvaluateManagementPageListVO.getFeedbackTypeId());
        }
        pageInfo.setRecords(list);
        return pageInfo;
@@ -161,20 +167,22 @@
    /**
     * 批量获取用户信息
     */
    private Map<Long, XpAppUser> batchGetUsers(Set<Long> userIds) {
    private JSONObject batchGetUsers(Set<Long> userIds) {
        if (CollectionUtils.isEmpty(userIds)) {
            return new HashMap<>();
            return new JSONObject();
        }
        try {
            R<List<XpAppUser>> result = xpAppUserClient.listByIds(new ArrayList<>(userIds));
            if (Objects.nonNull(result) && Objects.nonNull(result.getData())) {
                return result.getData().stream()
                        .collect(Collectors.toMap(XpAppUser::getId, Function.identity(), (a, b) -> a));
            GetUserListByUidsVo getUserListByUidsVo = new GetUserListByUidsVo();
            getUserListByUidsVo.setUids(new ArrayList<>(userIds));
            getUserListByUidsVo.setGetPreCarOwner(Boolean.TRUE);
            UserResourcesDto userListByUids = userResourcesClient.getUserListByUids(getUserListByUidsVo);
            if (userListByUids.getCode().equals(HttpStatus.SUCCESS)) {
                return JSONObject.parseObject(userListByUids.getData().toString());
            }
        } catch (Exception e) {
            log.error("批量获取用户信息失败: {}", e.getMessage());
        }
        return new HashMap<>();
        return new JSONObject();
    }
    /**
@@ -212,7 +220,7 @@
     * VO转换
     */
    private OrderEvaluatePageVO convertToPageVO(XpOrderEvaluate evaluate,
                                                Map<Long, XpAppUser> userMap,
                                                JSONObject jsonObject,
                                                Map<Long, XpVehicle> vehicleMap,
                                                Map<Long, XpOrder> orderMap) {
        OrderEvaluatePageVO vo = new OrderEvaluatePageVO();
@@ -224,10 +232,10 @@
        vo.setEvaluateTime(evaluate.getEvaluateTime());
        // 用户信息
        if (Objects.nonNull(evaluate.getAppUserId()) && userMap.containsKey(evaluate.getAppUserId())) {
            XpAppUser user = userMap.get(evaluate.getAppUserId());
            vo.setNickName(user.getNickName());
            vo.setPhoneNumber(user.getPhoneNumber());
        if (Objects.nonNull(evaluate.getAppUserId()) && jsonObject.containsKey(evaluate.getAppUserId().toString())) {
            JSONObject userInfo = jsonObject.getJSONObject(evaluate.getAppUserId().toString());
            vo.setNickName(userInfo.getString("nickName"));
            vo.setPhoneNumber(userInfo.getString("mobile"));
        }
        // 车辆信息
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/config/MessageLocalConfig.java
@@ -54,9 +54,9 @@
    }
    @Bean//注册国际化组件
    public LocaleResolver localeResolver(){
        return new MyLocaleResolver();
    }
//    @Bean//注册国际化组件
//    public LocaleResolver localeResolver(){
//        return new MyLocaleResolver();
//    }
}
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/config/MyLocaleResolver.java
@@ -1,80 +1,80 @@
package com.xiaopeng.pushMessage.config;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Locale;
public class MyLocaleResolver implements LocaleResolver {
    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        //1=中文,2=英文,3=印尼文
        //1=Chinese, 2=English, 3=Indonesian.
        String language = getQueryParams(request, "language");
        Locale locale = null;
        if (StringUtils.isEmpty(language)) {
            locale = Locale.getDefault();
        }
        //如果请求不为空
        //If the request is not empty.
        if (language.equals("1")) {
            locale = new Locale("zh", "CN");
        } else if (language.equals("2")) {
            locale = new Locale("en", "US");
        }
        return locale;
    }
    @Override
    public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
    }
    public String getQueryParams(HttpServletRequest request, String key) {
        try {
            String method = request.getMethod();
            if("POST".equals(method)){
                String parameter = request.getParameter(key);
                if(!StringUtils.isEmpty(parameter)){
                    return parameter;
                }
                Object attribute = request.getAttribute(key);
                if(null != attribute){
                    return attribute.toString();
                }
                StringBuffer sb = new StringBuffer();
                ServletInputStream inputStream = request.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
                String s;
                while ((s = bufferedReader.readLine()) != null){
                    sb.append(s);
                }
                bufferedReader.close();
                inputStream.close();
                JSONObject jsonObject = JSON.parseObject(sb.toString());
                return jsonObject.getString(key);
            }else{
                String parameter = request.getParameter(key);
                if(!StringUtils.isEmpty(parameter)){
                    return parameter;
                }
                Object attribute = request.getAttribute(key);
                if(null != attribute){
                    return attribute.toString();
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
}
//package com.xiaopeng.pushMessage.config;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONObject;
//import org.springframework.util.StringUtils;
//import org.springframework.web.servlet.LocaleResolver;
//
//import javax.servlet.ServletInputStream;
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.io.BufferedReader;
//import java.io.InputStreamReader;
//import java.util.Locale;
//
//public class MyLocaleResolver implements LocaleResolver {
//
//    @Override
//    public Locale resolveLocale(HttpServletRequest request) {
//        //1=中文,2=英文,3=印尼文
//        //1=Chinese, 2=English, 3=Indonesian.
//        String language = getQueryParams(request, "language");
//
//        Locale locale = null;
//        if (StringUtils.isEmpty(language)) {
//            locale = Locale.getDefault();
//        }
//        //如果请求不为空
//        //If the request is not empty.
//        if (language.equals("1")) {
//            locale = new Locale("zh", "CN");
//        } else if (language.equals("2")) {
//            locale = new Locale("en", "US");
//        }
//        return locale;
//    }
//
//    @Override
//    public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
//    }
//
//
//    public String getQueryParams(HttpServletRequest request, String key) {
//        try {
//            String method = request.getMethod();
//            if("POST".equals(method)){
//                String parameter = request.getParameter(key);
//                if(!StringUtils.isEmpty(parameter)){
//                    return parameter;
//                }
//                Object attribute = request.getAttribute(key);
//                if(null != attribute){
//                    return attribute.toString();
//                }
//                StringBuffer sb = new StringBuffer();
//                ServletInputStream inputStream = request.getInputStream();
//                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
//                String s;
//                while ((s = bufferedReader.readLine()) != null){
//                    sb.append(s);
//                }
//                bufferedReader.close();
//                inputStream.close();
//                JSONObject jsonObject = JSON.parseObject(sb.toString());
//                return jsonObject.getString(key);
//            }else{
//                String parameter = request.getParameter(key);
//                if(!StringUtils.isEmpty(parameter)){
//                    return parameter;
//                }
//                Object attribute = request.getAttribute(key);
//                if(null != attribute){
//                    return attribute.toString();
//                }
//            }
//        }catch (Exception e){
//            e.printStackTrace();
//        }
//        return null;
//    }
//}
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/controller/AliPushController.java
@@ -22,7 +22,7 @@
     */
    @GetMapping("/base/v1/aliPush/test")
    public R<String> test(){
        String s = aliPushUtil.pushMessage(1, "13540694412", "事故即将超时提示", "{\"content\":\"车辆川A12345在天府新谷发生的紧急事故即将超时,剩余时间5分钟,请及时到达现场!\",\"strategy\":2\"type\":7,\"id\":1}","NOTICE");
        String s = aliPushUtil.pushMessage(1, "13540694412", "事故即将超时提示", "{\"content\":\"你目前剩余1条待办任务,请及时处理!\",\"strategy\":6,\"type\":2,\"id\":3}","NOTICE");
        return R.ok(s);
    }
    /**
@@ -31,7 +31,7 @@
     */
    @GetMapping("/base/v1/aliPush/test1")
    public R<String> test1(){
        String s = aliPushUtil.pushMessage(1, "13540694412", "APP版本更新提示", "{\"content\":\"新版本上线啦!请前往更新。\",\"strategy\":8\"type\":0,\"id\":0}","MESSAGE");
        String s = aliPushUtil.pushMessage(1, "13540694412", "APP版本更新提示", "{\"content\":\"新版本上线啦!请前往更新。\",\"strategy\":8,\"type\":0,\"id\":0}","MESSAGE");
        return R.ok(s);
    }
xp-robotaxi-vehicle-convoy-boot/src/main/resources/i18n/messages.properties
@@ -1,7 +1,7 @@
# 中文
fleet.operation.user.bound.v2=当前车队已和该人员关联
policy.application.audit.ids.notEmpty=保单申请ID列表不能为空
fleet.operation.user.bound.v1=运维人员[{0}]已绑定车队[{1}]
fleet.operation.user.bound.v1=
fleet.vehicle.bound.v2=当前车队已和该车辆关联
fleet.vehicle.bound.v1=车辆[{0}]已绑定车队[{1}]
policy.application.audit.status.notNull=保单审核状态不能为空