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=保单审核状态不能为空