liujie
2026-04-24 1f40487e7d4adbfd5d1928decff818d42e92ec19
Merge branch '1.0' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi into 1.0
2个文件已添加
21个文件已修改
450 ■■■■■ 已修改文件
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/vo/XpAppUserCouponListVo.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCouponServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/resources/mapper/account/XpAppUserCouponMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/operation/XpActivityDto.java 62 ●●●●● 补丁 | 查看 | 原始文档 | 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-api/src/main/java/com/xiaopeng/api/model/operation/XpActicityUser.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpActivity.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpCruiseCheckInRuleController.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/mapper/XpCruiseCheckInRecordMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRecordServiceImpl.java 82 ●●●●● 补丁 | 查看 | 原始文档 | 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 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpActicityController.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpActicityService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpActicityStrategyService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpActicityUserService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityServiceImpl.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityStrategyServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityUserServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/TestMsgSchedule.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetVehicleController.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 operationCouponId;
}
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCouponServiceImpl.java
@@ -86,7 +86,7 @@
        Page<XpAppUserCouponListVo> list = baseMapper.userCouponList(page, query, Long.valueOf(uid));
        List<XpAppUserCouponListVo> records = list.getRecords();
        for (XpAppUserCouponListVo record : records) {
            XpCoupon data = xpCouponClient.getCouponById(record.getCouponid()).getData();
            XpCoupon data = xpCouponClient.getCouponById(record.getOperationCouponId()).getData();
            if(null != data){
                record.setConditionAmount(data.getConditionalAmount());
            }
xp-robotaxi-account-boot/src/main/resources/mapper/account/XpAppUserCouponMapper.xml
@@ -35,7 +35,7 @@
    <select id="userCouponList" resultType="com.xiaopeng.account.model.vo.XpAppUserCouponListVo">
        select t.*,t.status  from (
        SELECT id as couponId,
        coupon_id as couponid,
        coupon_id as operationCouponId,
        coupon_name as title,
        money as discountAmount,
        use_time as useTime,
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/operation/XpActivityDto.java
New file
@@ -0,0 +1,62 @@
package com.xiaopeng.api.dto.operation;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.xiaopeng.api.model.operation.XpActicityStrategy;
import com.xiaopeng.api.model.operation.XpActicityUser;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
import java.util.List;
@Data
@ApiModel(value = "活动信息Dto")
@AllArgsConstructor
@NoArgsConstructor
public class XpActivityDto {
    @ApiModelProperty(value = "活动id")
    private Long id;
    @ApiModelProperty(value = "活动名称")
    private String acticityName;
    @ApiModelProperty(value = "活动类型 如新人活动、媒体邀约活动、日常提频等")
    private Integer activityType;
    @ApiModelProperty(value = "开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime startTime;
    @ApiModelProperty(value = "结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime endTime;
    @ApiModelProperty(value = "状态 1=未开始 2=进行中 3=已结束 4=暂停")
    private Integer status;
    @ApiModelProperty(value = "备注")
    private String remarks;
    @ApiModelProperty(value = "注册启用 1=是 0=否")
    private Boolean registerEnable;
    @ApiModelProperty(value = "邀请启用 1=是 0=否")
    private Boolean inviteEnable;
    @ApiModelProperty(value = "图片")
    private String img;
    @ApiModelProperty(value = "富文本内容")
    private String richText;
    @ApiModelProperty(value = "活动策略")
    List<XpActicityStrategy> strategy;
    @ApiModelProperty(value = "发放用户")
    List<XpActicityUser> activityUser;
}
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-api/src/main/java/com/xiaopeng/api/model/operation/XpActicityUser.java
@@ -43,4 +43,6 @@
    @ApiModelProperty(value = "指定用户json数组")
    private String userList;
    @ApiModelProperty(value = "策略组名称")
    private String strategyName;
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpActivity.java
@@ -29,8 +29,6 @@
@ApiModel(value="XpActicity对象", description="活动管理")
public class XpActivity extends BaseModel {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
xp-robotaxi-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -60,4 +60,5 @@
com.xiaopeng.api.factory.operation.XpActicityClientFallbackFactory
com.xiaopeng.api.factory.maintenance.XpVehicleModelClientFallbackFactory
com.xiaopeng.api.factory.operation.XpTargetedServiceClientFallbackFactory
com.xiaopeng.api.factory.vehicleConvoy.VehicleMacClientFallbackFactory
com.xiaopeng.api.factory.vehicleConvoy.VehicleMacClientFallbackFactory
com.xiaopeng.api.factory.account.XpOperationsUserClientFallbackFactory
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpCruiseCheckInRuleController.java
@@ -1,13 +1,12 @@
package com.xiaopeng.maintenance.controller;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
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;
@@ -18,18 +17,19 @@
import com.xiaopeng.maintenance.model.vo.RealTimePositionVo;
import com.xiaopeng.maintenance.service.IXpCruiseCheckInRecordService;
import com.xiaopeng.maintenance.service.IXpCruiseCheckInRuleService;
import com.xiaopeng.maintenance.vo.XpCruiseCheckInRecordQuery;
import com.xiaopeng.maintenance.vo.XpCruiseCheckInRecordVO;
import com.xiaopeng.maintenance.vo.XpCruiseCheckInRuleListPage;
import com.xiaopeng.maintenance.vo.XpCruiseCheckInStatisticsQuery;
import com.xiaopeng.maintenance.vo.XpCruiseCheckInStatisticsVO;
import com.xiaopeng.maintenance.vo.*;
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 +37,7 @@
 */
@RestController
@RequestMapping("")
@Slf4j
public class XpCruiseCheckInRuleController {
    @Resource
@@ -148,7 +149,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 +156,30 @@
    @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);
            outputStream.flush();
        } catch (IOException e) {
            log.error("导出巡游打卡记录失败", e);
        } finally {
            try {
                if (outputStream != null) {
                    outputStream.close();
                }
                if (workbook != null) {
                    workbook.close();
                }
            } catch (IOException e) {
                log.error("关闭输出流失败", e);
            }
        }
        return R.ok();
    }
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/mapper/XpCruiseCheckInRecordMapper.java
@@ -20,4 +20,7 @@
    List<XpCruiseCheckInStatisticsVO> selectCruiseCheckInStatistics(@Param("query") XpCruiseCheckInStatisticsQuery query);
    List<XpCruiseCheckInRecordVO> selectCruiseCheckInRecordList(@Param("query") XpCruiseCheckInRecordQuery query);
    List<XpCruiseCheckInRecordVO> exportList(@Param("query") XpCruiseCheckInRecordQuery query);
}
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;
@@ -83,7 +88,9 @@
            vo.setOperationsUserId(user.getId());
            vo.setOperationsUserName(user.getNickName());
            vo.setPhoneNumber(user.getPhoneNumber());
            vo.setFleetName(profile.getFleet().getFleetName());
            if (profile.getFleet() != null) {
                vo.setFleetName(profile.getFleet().getFleetName());
            }
            vo.setRole(profile.getRoles().stream().map(XpOperationsUserProfileVO.RoleInfoVO::getRoleName).collect(Collectors.joining(",")));
        }
        return vo;
@@ -95,11 +102,11 @@
        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);
            LocalDate startDate = endDate.minusDays(vos.size() + 1);
            for (int i = 7 - vos.size(); i > 0; i--) {
                XpCruiseCheckInStatisticsVO v = new XpCruiseCheckInStatisticsVO();
                v.setDate(startDate.toString());
                startDate = startDate.plusDays(1);
                startDate = startDate.minusDays(1);
                vos.add(0, v);
            }
        }
@@ -110,27 +117,30 @@
    @Override
    public List<XpCruiseCheckInRecordVO> all(XpCruiseCheckInRecordQuery query) {
        List<XpCruiseCheckInRecordVO> list = xpCruiseCheckInRecordMapper.selectCruiseCheckInRecordList(query);
        List<XpCruiseCheckInRecordVO> list = xpCruiseCheckInRecordMapper.exportList(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());
        });
        return list;
    }
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 != ''">
@@ -140,4 +143,41 @@
        ORDER BY `date` DESC
    </select>
    <select id="exportList" resultType="com.xiaopeng.maintenance.vo.XpCruiseCheckInRecordVO">
        SELECT
        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
        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}
        </if>
        <if test="query.checkInResult != null and query.checkInResult == 3">
            AND r.check_in_result IS NULL
        </if>
        <if test="query.checkInResult != null and query.checkInResult != 3">
            AND r.check_in_result = #{query.checkInResult}
        </if>
        <if test="query.ruleName != null and query.ruleName != ''">
            AND cr.name LIKE CONCAT('%', #{query.ruleName}, '%')
        </if>
        <if test="query.locationAddress != null and query.locationAddress != ''">
            AND cl.location_address LIKE CONCAT('%', #{query.locationAddress}, '%')
        </if>
        <if test="query.startDate != null">
            AND DATE(r.check_in_time) &gt;= #{query.startDate}
        </if>
        <if test="query.endDate != null">
            AND DATE(r.check_in_time) &lt;= #{query.endDate}
        </if>
        ORDER BY r.check_in_time DESC
    </select>
</mapper>
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpActicityController.java
@@ -1,6 +1,7 @@
package com.xiaopeng.operation.controller;
import com.xiaopeng.api.dto.operation.XpActivityDto;
import com.xiaopeng.api.model.operation.XpActivity;
import com.xiaopeng.api.model.operation.XpCoupon;
import com.xiaopeng.api.query.operation.XpActivityPageListQuery;
@@ -13,6 +14,7 @@
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
@@ -35,12 +37,12 @@
@Api(tags = "活动管理")
@RestController
@RequestMapping("")
@Slf4j
@RequiredArgsConstructor(onConstructor_ = @Lazy)
public class XpActicityController {
    @Resource
    private IXpActicityService service;
    /**
     * 获取所有白名单手机号
@@ -93,28 +95,47 @@
    @PostMapping("/v1/api/appUserCoupon/add")
    @ApiOperation(value = "添加活动",tags = {"管理后台-活动管理"},response = XpCoupon.class)
    public R<?> add(@RequestBody XpActivity xpActivity){
        service.save(xpActivity);
    public R<?> add(@RequestBody XpActivityDto dto){
        service.save(dto);
        return R.ok();
    }
    @PostMapping("/v1/api/appUserCoupon/update")
    @ApiOperation(value = "修改活动",tags = {"管理后台-活动管理"},response = XpCoupon.class)
    public R<XpActivity> updateById(@RequestBody XpActivity xpActivity){
        service.updateById(xpActivity);
    @PostMapping("/v1/api/appUserCoupon/{op}")
    @ApiOperation(value = "修改活动状态,release,pause,resume,stop,del",tags = {"管理后台-活动管理"},response = XpCoupon.class)
    public R<XpActivity> updateById(@PathVariable String op,@RequestParam Long id){
        XpActivity activity = service.getById(id);
        switch (op){
            case "release":
                activity.setStatus(2);
                break;
            case "pause":
                activity.setStatus(4);
                break;
            case "resume":
                activity.setStatus(1);
                break;
            case "stop":
                activity.setStatus(3);
                break;
            case "del":
                activity.setDeleted(true);
                break;
            default:
                throw new UnsupportedOperationException("Unsupported" + op);
        }
        service.updateById(activity);
        log.info("修改活动状态:{}",activity);
        return R.ok();
    }
    @GetMapping("/v1/api/appUserCoupon/update")
    @GetMapping("/v1/api/appUserCoupon/detail")
    @ApiOperation(value = "活动详情",tags = {"管理后台-活动管理"},response = XpCoupon.class)
    public R<XpActivity> queryById(@RequestBody XpActivity xpActivity){
    public R<XpActivityDto> queryById(@RequestParam Long id){
        return R.ok(service.getById(xpActivity));
        return R.ok(service.detail(id));
    }
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpActicityService.java
@@ -1,6 +1,7 @@
package com.xiaopeng.operation.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xiaopeng.api.dto.operation.XpActivityDto;
import com.xiaopeng.api.model.operation.XpActivity;
import com.xiaopeng.api.query.operation.XpActivityPageListQuery;
import com.xiaopeng.common.core.web.page.PageInfo;
@@ -22,4 +23,8 @@
    List<String> findListToIds(String acticityName);
    XpActivity activiting();
    void save(XpActivityDto dto);
    XpActivityDto detail(Long id);
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpActicityStrategyService.java
@@ -3,6 +3,8 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.xiaopeng.api.model.operation.XpActicityStrategy;
import java.util.List;
/**
 * <p>
 * 活动策略配置 服务类
@@ -13,4 +15,5 @@
 */
public interface IXpActicityStrategyService extends IService<XpActicityStrategy> {
    List<XpActicityStrategy> listByActicityId(Long id);
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpActicityUserService.java
@@ -3,6 +3,8 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.xiaopeng.api.model.operation.XpActicityUser;
import java.util.List;
/**
 * <p>
 * 活动发放用户 服务类
@@ -13,4 +15,5 @@
 */
public interface IXpActicityUserService extends IService<XpActicityUser> {
    List<XpActicityUser> listByActicityId(Long id);
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityServiceImpl.java
@@ -1,17 +1,28 @@
package com.xiaopeng.operation.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.xiaopeng.api.dto.operation.XpActivityDto;
import com.xiaopeng.api.model.operation.XpActicityStrategy;
import com.xiaopeng.api.model.operation.XpActicityUser;
import com.xiaopeng.api.model.operation.XpActivity;
import com.xiaopeng.api.query.operation.XpActivityPageListQuery;
import com.xiaopeng.common.core.utils.bean.BeanUtils;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.operation.mapper.XpActicityMapper;
import com.xiaopeng.operation.service.IXpActicityService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiaopeng.operation.service.IXpActicityStrategyService;
import com.xiaopeng.operation.service.IXpActicityUserService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
 * <p>
@@ -24,6 +35,11 @@
@Service
public class XpActicityServiceImpl extends ServiceImpl<XpActicityMapper, XpActivity> implements IXpActicityService {
    @Resource
    private IXpActicityStrategyService strategyService;
    @Resource
    private IXpActicityUserService userService;
    @Override
    public PageInfo<XpActivity> pageList(XpActivityPageListQuery query) {
@@ -54,4 +70,38 @@
        return null;
    }
    @Override
    @Transactional
    public void save(XpActivityDto dto) {
        XpActivity activity = new XpActivity();
        BeanUtils.copyBeanProp(activity, dto);
        save(activity);
        List<XpActicityStrategy> strategy = dto.getStrategy();
        List<XpActicityUser> activityUser = dto.getActivityUser();
        strategy.forEach(e -> e.setActitcityId(activity.getId().intValue()));
        strategyService.saveBatch(strategy);
        Map<String, XpActicityStrategy> strategyMap = strategy.stream().collect(Collectors.toMap(
                XpActicityStrategy::getName,
                Function.identity()
        ));
        activityUser.forEach(item -> {
            item.setActitcityId(activity.getId().intValue());
            item.setActitcityStrategeId(strategyMap.get(item.getStrategyName()).getId());
        });
        userService.saveBatch(activityUser);
    }
    @Override
    public XpActivityDto detail(Long id) {
        XpActivity byId = getById(id);
        XpActivityDto ret = new XpActivityDto();
        BeanUtils.copyBeanProp(ret, byId);
        ret.setStrategy(strategyService.listByActicityId(id));
        ret.setActivityUser(userService.listByActicityId(id));
        return ret;
    }
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityStrategyServiceImpl.java
@@ -1,10 +1,13 @@
package com.xiaopeng.operation.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiaopeng.api.model.operation.XpActicityStrategy;
import com.xiaopeng.operation.mapper.XpActicityStrategyMapper;
import com.xiaopeng.operation.service.IXpActicityStrategyService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * <p>
@@ -17,4 +20,8 @@
@Service
public class XpActicityStrategyServiceImpl extends ServiceImpl<XpActicityStrategyMapper, XpActicityStrategy> implements IXpActicityStrategyService {
    @Override
    public List<XpActicityStrategy> listByActicityId(Long id) {
        return baseMapper.selectList(new LambdaQueryWrapper<XpActicityStrategy>().eq(XpActicityStrategy::getActitcityId, id));
    }
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityUserServiceImpl.java
@@ -1,10 +1,13 @@
package com.xiaopeng.operation.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiaopeng.api.model.operation.XpActicityUser;
import com.xiaopeng.operation.mapper.XpActicityUserMapper;
import com.xiaopeng.operation.service.IXpActicityUserService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * <p>
@@ -17,4 +20,8 @@
@Service
public class XpActicityUserServiceImpl extends ServiceImpl<XpActicityUserMapper, XpActicityUser> implements IXpActicityUserService {
    @Override
    public List<XpActicityUser> listByActicityId(Long id) {
        return baseMapper.selectList(new LambdaQueryWrapper<XpActicityUser>().eq(XpActicityUser::getActitcityId, id));
    }
}
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  {
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetVehicleController.java
@@ -75,7 +75,7 @@
    @Resource
    MongoTemplate mongoTemplate;
    @ApiOperation(value = "车辆", tags = {"流量接入-信息录入-车辆"})
    @PostMapping("/api/v1/xp-rt/vehicle/position")
    @PostMapping("/api/v1/xp-rt/vehicle/info")
    public R<?> JoinUs(
            @ApiParam(value = "车辆位置信息", required = true)
            @RequestBody VehiclePosition vp