xuhy
2026-04-24 a001c0f9a270702caa1fcd171e872670a5ae0c36
[feat] 巡游打卡详情
1个文件已添加
7个文件已修改
159 ■■■■■ 已修改文件
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/vo/XpAppUserCouponListVo.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/XpOperationsUserClientFallbackFactory.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpOperationsUserClient.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpCruiseCheckInRuleController.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRecordServiceImpl.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/XpCruiseCheckInRecordVO.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpCruiseCheckInRecordMapper.xml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/TestMsgSchedule.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/vo/XpAppUserCouponListVo.java
@@ -61,6 +61,7 @@
    @ApiModelProperty(value = "活动名称")
    private String acticityName;
    private Long couponid;
    @ApiModelProperty(value = "优惠券id")
    private Long coupond;
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/XpOperationsUserClientFallbackFactory.java
New file
@@ -0,0 +1,40 @@
package com.xiaopeng.api.factory.account;
import com.xiaopeng.api.feignClient.account.XpOperationsUserClient;
import com.xiaopeng.api.model.account.XpOperationsUser;
import com.xiaopeng.api.vo.account.XpOperationsUserProfileVO;
import com.xiaopeng.common.core.domain.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Component
public class XpOperationsUserClientFallbackFactory implements FallbackFactory<XpOperationsUserClient> {
    @Override
    public XpOperationsUserClient create(Throwable cause) {
        return new XpOperationsUserClient() {
            @Override
            public R<List<XpOperationsUser>> listByIds(List<Long> ids) {
                log.error("查询运维人员信息失败,ids={}, err={}", ids, cause.getMessage());
                return R.ok(new ArrayList<>());
            }
            @Override
            public R<List<XpOperationsUser>> listByName(String nickName) {
                log.error("查询运维人员信息失败,nickName={}, err={}", nickName, cause.getMessage());
                return R.ok(new ArrayList<>());
            }
            @Override
            public R<XpOperationsUserProfileVO> getProfile(Long id) {
                log.error("查询运维人员信息失败,id={}, err={}", id, cause.getMessage());
                return R.ok(new XpOperationsUserProfileVO());
            }
        };
    }
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpOperationsUserClient.java
@@ -1,6 +1,6 @@
package com.xiaopeng.api.feignClient.account;
import com.xiaopeng.api.factory.account.XpOperationUserClientFallbackFactory;
import com.xiaopeng.api.factory.account.XpOperationsUserClientFallbackFactory;
import com.xiaopeng.api.model.account.XpOperationsUser;
import com.xiaopeng.api.vo.account.XpOperationsUserProfileVO;
import com.xiaopeng.common.core.domain.R;
@@ -13,14 +13,9 @@
import java.util.List;
/**
 * 小程序用户Feign客户端
 *
 * @author mitao
 */
@FeignClient(contextId = "XpOperationsUserClient",
        value = ServiceNameConstantsEnum.XP_ACCOUNT_SERVICE,
        fallbackFactory = XpOperationUserClientFallbackFactory.class)
        fallbackFactory = XpOperationsUserClientFallbackFactory.class)
public interface XpOperationsUserClient {
    /**
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpCruiseCheckInRuleController.java
@@ -1,13 +1,13 @@
package com.xiaopeng.maintenance.controller;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xiaopeng.api.model.maintenance.XpCruiseCheckInRecord;
import com.xiaopeng.api.model.maintenance.XpCruiseCheckInRule;
import com.xiaopeng.api.model.operation.SysOperLog;
import com.xiaopeng.api.vo.account.LoginOperationUser;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.utils.poi.ExcelUtil;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.common.security.service.TokenService;
import com.xiaopeng.maintenance.dto.XpCruiseCheckInRuleDto;
@@ -26,10 +26,15 @@
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
/**
@@ -37,6 +42,7 @@
 */
@RestController
@RequestMapping("")
@Slf4j
public class XpCruiseCheckInRuleController {
    @Resource
@@ -148,7 +154,6 @@
    @ApiOperation(value = "巡游打卡统计", tags = {"管理后台-巡游打卡管理"})
    @PostMapping("/maintenance-admin/api/v1/cruiseCheckInRecord/statistic")
    public R<List<XpCruiseCheckInStatisticsVO>> pageList(@RequestBody XpCruiseCheckInStatisticsQuery  query) {
        return R.ok(xpCruiseCheckInRecordService.statistics(query));
    }
@@ -156,8 +161,26 @@
    @PostMapping("/maintenance-admin/api/v1/cruiseCheckInRecord/export")
    public R<PageInfo<XpCruiseCheckInRecordVO>> pageListExport(@RequestBody XpCruiseCheckInRecordQuery query, HttpServletResponse response) {
        List<XpCruiseCheckInRecordVO> list = xpCruiseCheckInRecordService.all(query);
        ExcelUtil<XpCruiseCheckInRecordVO> util = new ExcelUtil<>(XpCruiseCheckInRecordVO.class);
        util.exportExcel(response, list, "巡游打卡记录");
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), XpCruiseCheckInRecordVO.class, list);
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        ServletOutputStream outputStream = null;
        try {
            String fileName = URLEncoder.encode("巡游打卡记录.xls", "utf-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName);
            outputStream = response.getOutputStream();
            workbook.write(outputStream);
        } catch (IOException e) {
            log.error("导出巡游打卡记录失败", e);
        } finally {
            try {
                if (outputStream != null) {
                    outputStream.close();
                }
            } catch (IOException e) {
                log.error("关闭输出流失败", e);
            }
        }
        return R.ok();
    }
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRecordServiceImpl.java
@@ -40,27 +40,32 @@
    public PageInfo<XpCruiseCheckInRecordVO> pageList(XpCruiseCheckInRecordQuery query) {
        PageInfo<XpCruiseCheckInRecordVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<XpCruiseCheckInRecordVO> list = xpCruiseCheckInRecordMapper.selectCruiseCheckInRecordList(pageInfo, query);
        List<Long> ids = list.stream().map(XpCruiseCheckInRecordVO::getOperationsUserId).collect(Collectors.toList());
        List<XpOperationsUser> xpOperationsUsers = xpOperationsUserClient.listByIds(ids).getData();
        Map<Long, XpOperationsUser> userMap = xpOperationsUsers.stream().collect(Collectors.toMap(XpOperationsUser::getId, Function.identity()));
        list = list.stream().map(record -> {
                    XpOperationsUser user = userMap.get(record.getOperationsUserId());
                    if (user == null) return null;
                    record.setOperationsUserId(user.getId());
                    record.setOperationsUserName(user.getNickName());
                    record.setPhoneNumber(user.getPhoneNumber());
                    if (StringUtils.isNotBlank(query.getOperationsUserName()) && !record.getOperationsUserName().contains(query.getOperationsUserName())) {
                        return null;
                    }
                    if (StringUtils.isNotBlank(query.getPhoneNumber()) && !record.getPhoneNumber().contains(query.getPhoneNumber())) {
                        return null;
                    }
                    return record;
                })
                .filter(Objects::nonNull)
                .collect(Collectors.toList());
        for (XpCruiseCheckInRecordVO xpCruiseCheckInRecordVO : list) {
            XpOperationsUser user = userMap.get(xpCruiseCheckInRecordVO.getOperationsUserId());
            if (user == null) continue;
            xpCruiseCheckInRecordVO.setOperationsUserId(user.getId());
            xpCruiseCheckInRecordVO.setOperationsUserName(user.getNickName());
            xpCruiseCheckInRecordVO.setPhoneNumber(user.getPhoneNumber());
        }
        list.removeIf(vo -> {
            if (StringUtils.isNotBlank(query.getOperationsUserName()) && !vo.getOperationsUserName().contains(query.getOperationsUserName())) {
                return true;
            }
            return StringUtils.isNotBlank(query.getPhoneNumber()) && !vo.getPhoneNumber().contains(query.getPhoneNumber());
        });
        pageInfo.setRecords(list);
        return pageInfo;
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/XpCruiseCheckInRecordVO.java
@@ -1,5 +1,6 @@
package com.xiaopeng.maintenance.vo;
import cn.afterturn.easypoi.excel.annotation.Excel;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.xiaopeng.api.model.maintenance.XpCheckLocation;
@@ -22,6 +23,7 @@
    @ApiModelProperty(value = "规则id")
    private Long ruleId;
    @ApiModelProperty(value = "打卡规则名称")
    @Excel(name = "打卡规则名称", width = 20)
    private String ruleName;
    @ApiModelProperty(value = "(0=不循环,1=每天循环)")
    private Integer cyclicMode;
@@ -38,7 +40,9 @@
    @ApiModelProperty(value = "运维人员id")
    private Long operationsUserId;
    @ApiModelProperty(value = "运维人员姓名")
    @Excel(name = "运维人员", width = 20)
    private String operationsUserName;
    @Excel(name = "手机号", width = 20)
    @ApiModelProperty(value = "运维人员手机号")
    private String phoneNumber;
    @ApiModelProperty(value = "所属分队")
@@ -58,6 +62,7 @@
    private BigDecimal locationLatitude;
    @ApiModelProperty(value = "打卡点位名称")
    @Excel(name = "打卡点位", width = 20)
    private String locationAddress;
    @ApiModelProperty(value = "打卡点位范围")
@@ -72,12 +77,15 @@
    @ApiModelProperty(value = "打卡时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @Excel(name = "打卡时间", width = 20)
    private LocalDateTime checkInTime;
    @ApiModelProperty(value = "打卡结果(1=正常打卡,2=迟到打卡,3=未打卡)")
    @Excel(name = "打卡状态", width= 20, replace = {"正常打卡_1", "迟到打卡_2", "未打卡_3"})
    private Integer checkInResult;
    @ApiModelProperty(value = "现场情况(1=正常,2=拥堵)")
    @Excel(name = "巡游结果", width = 20,replace = {"正常_1", "拥堵_2"})
    private Integer fieldSituation;
    @ApiModelProperty(value = "现场照片JSON数组")
xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpCruiseCheckInRecordMapper.xml
@@ -69,12 +69,15 @@
    <select id="selectCruiseCheckInRecordList" resultMap="CruiseCheckInRecordVOMap">
        SELECT
        <include refid="CruiseCheckInRecordColumns"/>
        r.id,
        r.check_in_time,
        r.check_in_result,
        r.field_situation,
        cl.location_address,
        cr.name AS rule_name
        FROM xp_cruise_check_in_record r
        LEFT JOIN xp_cruise_check_in_rule_location rl ON r.cruise_check_in_rule_id = rl.cruise_check_in_rule_id AND r.check_location_id = rl.check_location_id AND rl.is_deleted = '0'
        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'
        JOIN xp_check_location cl ON r.check_location_id = cl.id AND cl.is_deleted = '0'
        JOIN xp_cruise_check_in_rule cr ON r.cruise_check_in_rule_id = cr.id AND cr.is_deleted = '0'
        WHERE r.is_deleted = '0'
        <if test="query.fieldSituation != null">
            AND r.field_situation = #{query.fieldSituation}
@@ -104,9 +107,9 @@
        SELECT
        <include refid="CruiseCheckInRecordColumns"/>
        FROM xp_cruise_check_in_record r
        LEFT JOIN xp_cruise_check_in_rule_location rl ON r.cruise_check_in_rule_id = rl.cruise_check_in_rule_id AND r.check_location_id = rl.check_location_id AND rl.is_deleted = '0'
        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'
        JOIN xp_cruise_check_in_rule_location rl ON r.cruise_check_in_rule_id = rl.cruise_check_in_rule_id AND r.check_location_id = rl.check_location_id
        JOIN xp_check_location cl ON r.check_location_id = cl.id AND cl.is_deleted = '0'
        JOIN xp_cruise_check_in_rule cr ON r.cruise_check_in_rule_id = cr.id AND cr.is_deleted = '0'
        WHERE r.id = #{id}
          AND r.is_deleted = '0'
    </select>
@@ -119,9 +122,9 @@
        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.operations_user_id
        LEFT JOIN xp_fleet f ON fo.fleet_id = f.id
        JOIN xp_cruise_check_in_rule cr ON r.cruise_check_in_rule_id = cr.id AND cr.is_deleted = '0'
        JOIN xp_fleet_operations fo ON r.operations_user_id = fo.operations_user_id
        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 != ''">
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/TestMsgSchedule.java
@@ -16,7 +16,7 @@
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
@Component
//@Component
@Slf4j
//public class TestMsgHandler implements BusinessMsgHandler{
public class TestMsgSchedule  {