xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpOperationsUserController.java
@@ -106,6 +106,13 @@ return R.ok(xpOperationsUserService.listByName(nickName)); } @GetMapping("/logan/inner/xpOperationsUser/profile") public R<XpOperationsUserProfileVO> profile(@RequestParam("id")Long id) { return R.ok(xpOperationsUserService.getUserProfile(id)); } /** * 根据用户ID列表批量查询用户及角色信息(内部接口) * xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpOperationsUserClient.java
@@ -2,9 +2,11 @@ import com.xiaopeng.api.factory.account.XpOperationUserClientFallbackFactory; import com.xiaopeng.api.model.account.XpOperationsUser; import com.xiaopeng.api.vo.account.XpOperationsUserProfileVO; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; @@ -37,4 +39,7 @@ */ @PostMapping("/logan/inner/xpOperationsUser/listByName") R<List<XpOperationsUser>> listByName(@RequestParam("nickName") String nickName); @GetMapping("/logan/inner/xpOperationsUser/profile") R<XpOperationsUserProfileVO> getProfile(@RequestParam("id")Long id); } xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpCruiseCheckInRuleController.java
@@ -108,14 +108,14 @@ @ApiOperation(value = "查询巡游打卡记录详情", tags = {"管理后台-巡游打卡管理"}) @GetMapping("/maintenance-admin/api/v1/cruiseCheckInRecord/{id}") public R<XpCruiseCheckInRecordVO> pageList(@PathVariable("id")Long id) { public R<XpCruiseCheckInRecordVO> detail(@PathVariable("id")Long id) { XpCruiseCheckInRecordVO xpCruiseCheckInRecordVO = xpCruiseCheckInRecordService.detail(id); return R.ok(xpCruiseCheckInRecordVO); } @ApiOperation(value = "巡游打卡统计", tags = {"管理后台-巡游打卡管理"}) @PostMapping("/maintenance-admin/api/v1/cruiseCheckInRecord/statistic") public R<XpCruiseCheckInStatisticsVO> pageList(@RequestBody XpCruiseCheckInStatisticsQuery query) { public R<List<XpCruiseCheckInStatisticsVO>> pageList(@RequestBody XpCruiseCheckInStatisticsQuery query) { return R.ok(xpCruiseCheckInRecordService.statistics(query)); } xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/mapper/XpCruiseCheckInRecordMapper.java
@@ -17,7 +17,7 @@ XpCruiseCheckInRecordVO detail(@Param("id")Long id); XpCruiseCheckInStatisticsVO selectCruiseCheckInStatistics(@Param("query") XpCruiseCheckInStatisticsQuery query); List<XpCruiseCheckInStatisticsVO> selectCruiseCheckInStatistics(@Param("query") XpCruiseCheckInStatisticsQuery query); List<XpCruiseCheckInRecordVO> selectCruiseCheckInRecordList(@Param("query") XpCruiseCheckInRecordQuery query); } xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/IXpCruiseCheckInRecordService.java
@@ -16,7 +16,7 @@ XpCruiseCheckInRecordVO detail(Long id); XpCruiseCheckInStatisticsVO statistics(XpCruiseCheckInStatisticsQuery query); List<XpCruiseCheckInStatisticsVO> statistics(XpCruiseCheckInStatisticsQuery query); List<XpCruiseCheckInRecordVO> all(XpCruiseCheckInRecordQuery query); } xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRecordServiceImpl.java
@@ -3,9 +3,12 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xiaopeng.api.feignClient.account.XpOperationsUserClient; import com.xiaopeng.api.model.account.XpOperationsUser; import com.xiaopeng.api.model.maintenance.XpCheckLocation; import com.xiaopeng.api.model.maintenance.XpCruiseCheckInRecord; import com.xiaopeng.api.vo.account.XpOperationsUserProfileVO; import com.xiaopeng.common.core.web.page.PageInfo; import com.xiaopeng.maintenance.mapper.XpCruiseCheckInRecordMapper; import com.xiaopeng.maintenance.service.IXpCheckLocationService; import com.xiaopeng.maintenance.service.IXpCruiseCheckInRecordService; import com.xiaopeng.maintenance.vo.XpCruiseCheckInRecordQuery; import com.xiaopeng.maintenance.vo.XpCruiseCheckInRecordVO; @@ -13,8 +16,10 @@ import com.xiaopeng.maintenance.vo.XpCruiseCheckInStatisticsVO; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.time.LocalDate; import java.util.Collections; import java.util.List; import java.util.Map; @@ -60,25 +65,48 @@ return pageInfo; } IXpCheckLocationService checkLocationService; @Override public XpCruiseCheckInRecordVO detail(Long id) { XpCruiseCheckInRecordVO vo = xpCruiseCheckInRecordMapper.detail(id); // Xp XpCheckLocation location = checkLocationService.getById(vo.getCheckLocationId()); vo.setLocationRange(location.getLocationRange()); vo.setDetailAddr(location.getLocationAddress()); List<Long> ids = Collections.singletonList(vo.getOperationsUserId()); List<XpOperationsUser> xpOperationsUsers = xpOperationsUserClient.listByIds(ids).getData(); Map<Long, XpOperationsUser> userMap = xpOperationsUsers.stream().collect(Collectors.toMap(XpOperationsUser::getId, Function.identity())); XpOperationsUser user = userMap.get(vo.getOperationsUserId()); if (user != null) { XpOperationsUserProfileVO profile = xpOperationsUserClient.getProfile(user.getId()).getData(); vo.setOperationsUserId(user.getId()); vo.setOperationsUserName(user.getNickName()); vo.setPhoneNumber(user.getPhoneNumber()); vo.setFleetName(profile.getFleet().getFleetName()); vo.setRole(profile.getRoles().stream().map(XpOperationsUserProfileVO.RoleInfoVO::getRoleName).collect(Collectors.joining(","))); } return xpCruiseCheckInRecordMapper.detail(id); return vo; } @Override public XpCruiseCheckInStatisticsVO statistics(XpCruiseCheckInStatisticsQuery query) { return xpCruiseCheckInRecordMapper.selectCruiseCheckInStatistics(query); public List<XpCruiseCheckInStatisticsVO> statistics(XpCruiseCheckInStatisticsQuery query) { List<XpCruiseCheckInStatisticsVO> vos = xpCruiseCheckInRecordMapper.selectCruiseCheckInStatistics(query); if (CollectionUtils.isEmpty(vos) || vos.size() < 7) { String date = vos.get(vos.size() - 1).getDate(); LocalDate endDate = LocalDate.parse(date); LocalDate startDate = endDate.minusDays(6); for (int i = 7 - vos.size(); i > 0; i--) { XpCruiseCheckInStatisticsVO v = new XpCruiseCheckInStatisticsVO(); v.setDate(startDate.toString()); startDate = startDate.plusDays(1); vos.add(0, v); } } return vos; } xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/XpCruiseCheckInRecordVO.java
@@ -1,11 +1,15 @@ package com.xiaopeng.maintenance.vo; import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import com.xiaopeng.api.model.maintenance.XpCheckLocation; import com.xiaopeng.api.model.maintenance.XpCruiseCheckInRule; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; @Data @@ -14,6 +18,36 @@ @ApiModelProperty(value = "主键") private Long id; /** * 规则名称 */ @TableField("name") private String name; /** * 任务开始时间 */ @TableField("start_time") private LocalDateTime startTime; /** * 任务结束时间 */ @TableField("end_time") private LocalDateTime endTime; /** * 循环方式(0=不循环,1=每天循环) */ @TableField("cyclic_mode") private Integer cyclicMode; // 点位总数: // 当前点位排序: // XpCheckLocation and XpCruiseCheckInRule @ApiModelProperty(value = "运维人员id") private Long operationsUserId; @@ -24,12 +58,28 @@ @ApiModelProperty(value = "运维人员手机号") private String phoneNumber; @ApiModelProperty(value = "所属分队") private String fleetName; @ApiModelProperty(value = "角色") private String role; @ApiModelProperty(value = "打卡点位id") private Long checkLocationId; @ApiModelProperty(value = "打卡点位名称") private String locationAddress; @ApiModelProperty(value = "打卡点位范围") private BigDecimal locationRange; @ApiModelProperty(value = "打卡点位限时") private String locationTimeLimit; @ApiModelProperty(value = "打卡点位详细地址") private String detailAddr; @ApiModelProperty(value = "巡游打卡规则id") private Integer cruiseCheckInRuleId; xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/XpCruiseCheckInStatisticsVO.java
@@ -14,7 +14,7 @@ public class XpCruiseCheckInStatisticsVO implements Serializable { @ApiModelProperty(value = "日期") LocalDate date; private String date; @ApiModelProperty(value = "准时次数") private Integer punctual; @@ -27,6 +27,5 @@ @ApiModelProperty(value = "堵车次数") private Integer traffic; } xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpCruiseCheckInRecordMapper.xml
@@ -69,17 +69,7 @@ <select id="detail" resultMap="CruiseCheckInRecordVOMap"> SELECT r.id, r.operations_user_id, r.check_location_id, cl.location_address, r.cruise_check_in_rule_id, cr.name AS rule_name, r.check_in_time, r.check_in_result, r.field_situation, r.scene_photo, r.scene_description r.*,cr.*,cl.* FROM xp_cruise_check_in_record r LEFT JOIN xp_check_location cl ON r.check_location_id = cl.id AND cl.is_deleted = '0' LEFT JOIN xp_cruise_check_in_rule cr ON r.cruise_check_in_rule_id = cr.id AND cr.is_deleted = '0' @@ -89,15 +79,15 @@ <select id="selectCruiseCheckInStatistics" resultType="com.xiaopeng.maintenance.vo.XpCruiseCheckInStatisticsVO"> SELECT DATE(r.check_in_time) AS date, DATE(r.check_in_time) AS `date`, COUNT(CASE WHEN r.check_in_result = 1 THEN 1 END) AS punctual, COUNT(CASE WHEN r.check_in_result = 2 THEN 1 END) AS late, COUNT(CASE WHEN r.field_situation = 1 THEN 1 END) AS noTraffic, COUNT(CASE WHEN r.field_situation = 2 THEN 1 END) AS traffic FROM xp_cruise_check_in_record r LEFT JOIN xp_cruise_check_in_rule cr ON r.cruise_check_in_rule_id = cr.id AND cr.is_deleted = '0' LEFT JOIN xp_fleet_operations fo ON r.operations_user_id = fo.operationsUserId LEFT JOIN xp_fleet f ON fo.fleetId = f.id LEFT JOIN xp_fleet_operations fo ON r.operations_user_id = fo.operations_user_id LEFT JOIN xp_fleet f ON fo.fleet_id = f.id WHERE r.is_deleted = '0' AND r.check_in_time IS NOT NULL <if test="query.ruleName != null and query.ruleName != ''"> @@ -113,7 +103,7 @@ AND DATE(r.check_in_time) <= #{query.endDate} </if> GROUP BY DATE(r.check_in_time) ORDER BY date DESC ORDER BY `date` DESC </select> </mapper>