puzhibing
2026-02-28 cdb9031970180a0b845164d1af461d29d16f5d79
Merge remote-tracking branch 'origin/master'

# Conflicts:
# xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/vehicleConvoy/XpVehicle.java
# xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/vehicleConvoy/XpVehicleAnnualRecord.java
1个文件已添加
10个文件已修改
175 ■■■■■ 已修改文件
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/vehicleConvoy/XpVehicleAnnualRecord.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpShiftController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/IXpShiftService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpShiftServiceImpl.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/config/MyLocaleResolver.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpInvitationCodeController.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/resources/template/邀请码导入模板.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/config/MyLocaleResolver.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/pom.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/model/query/VehiclePageQuery.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/vehicleConvoy/XpVehicleAnnualRecord.java
@@ -6,6 +6,7 @@
import java.time.LocalDateTime;
import java.io.Serializable;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.xiaopeng.common.core.web.domain.BaseModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -25,7 +26,7 @@
@Accessors(chain = true)
@TableName("xp_vehicle_annual_record")
@ApiModel(value="XpVehicleAnnualRecord对象", description="车辆年检信息修改记录")
public class XpVehicleAnnualRecord implements Serializable {
public class XpVehicleAnnualRecord extends BaseModel {
    private static final long serialVersionUID = 1L;
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpShiftController.java
@@ -43,15 +43,13 @@
    @ApiOperation(value = "班次管理新增", tags = "管理后台-运维执行")
    @PostMapping("/api/v1/shift/add")
    public R<String> add(@RequestBody XpShift dto) {
        xpShiftService.save(dto);
        return R.ok();
        return xpShiftService.add(dto);
    }
    @ApiOperation(value = "班次管理编辑", tags = "管理后台-运维执行")
    @PostMapping("/api/v1/shift/edit")
    public R<String> edit(@RequestBody XpShift dto) {
        xpShiftService.updateById(dto);
        return R.ok();
        return xpShiftService.edit(dto);
    }
    @ApiOperation(value = "班次管理删除", tags = "管理后台-运维执行")
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/IXpShiftService.java
@@ -2,6 +2,7 @@
import com.xiaopeng.api.model.maintenance.XpShift;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.maintenance.model.query.XpShiftQuery;
@@ -31,4 +32,18 @@
     * @return
     */
    List<XpShift> queryList();
    /**
     * 新增
     * @param dto
     * @return
     */
    R<String> add(XpShift dto);
    /**
     * 编辑
     * @param dto
     * @return
     */
    R<String> edit(XpShift dto);
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpShiftServiceImpl.java
@@ -46,4 +46,46 @@
    public List<XpShift> queryList() {
        return this.list(new LambdaQueryWrapper<XpShift>().eq(XpShift::getDeleted, 0));
    }
    @Override
    public R<String> add(XpShift dto) {
        // 判断结束时间是否大于开始时间 格式为 HH:mm
        if (dto.getEndTime().compareTo(dto.getStartTime()) < 0) {
            return R.fail("结束时间不能小于开始时间");
        }
        // 判断休息结束时间是否大于休息开始时间 格式为 HH:mm
        if (dto.getRestEndTime() != null && dto.getRestStartTime() != null && dto.getRestEndTime().compareTo(dto.getRestStartTime()) < 0) {
            return R.fail("休息结束时间不能小于休息开始时间");
        }
        if (this.count(new LambdaQueryWrapper<XpShift>().eq(XpShift::getShiftName, dto.getShiftName())) > 0) {
            return R.fail("班次名称已存在");
        }
        this.save(dto);
        return R.ok();
    }
    @Override
    public R<String> edit(XpShift dto) {
        // 判断结束时间是否大于开始时间 格式为 HH:mm
        if (dto.getEndTime().compareTo(dto.getStartTime()) < 0) {
            return R.fail("结束时间不能小于开始时间");
        }
        // 判断休息结束时间是否大于休息开始时间 格式为 HH:mm
        if (dto.getRestEndTime() != null && dto.getRestStartTime() != null && dto.getRestEndTime().compareTo(dto.getRestStartTime()) < 0) {
            return R.fail("休息结束时间不能小于休息开始时间");
        }
        if (this.count(new LambdaQueryWrapper<XpShift>().eq(XpShift::getShiftName, dto.getShiftName()).ne(XpShift::getId, dto.getId())) > 0) {
            return R.fail("班次名称已存在");
        }
        this.updateById(dto);
        return R.ok();
    }
}
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/config/MyLocaleResolver.java
@@ -26,6 +26,9 @@
        }
        //如果请求不为空 
        //If the request is not empty.
        if (!StringUtils.hasLength(language)){
            language = "1";
        }
        if (language.equals("1")) {
            locale = new Locale("zh", "CN");
        } else if (language.equals("2")) {
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpInvitationCodeController.java
@@ -5,6 +5,8 @@
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
import cn.hutool.core.io.resource.ClassPathResource;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.xiaopeng.api.model.account.SysUser;
@@ -26,6 +28,7 @@
import com.xiaopeng.operation.service.IXpWhitelistService;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.openxml4j.exceptions.NotOfficeXmlFileException;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@@ -37,6 +40,7 @@
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
@@ -56,7 +60,7 @@
@RestController
@Api(tags = "邀请码管理")
@Slf4j
@RequestMapping("/api/v1/invitation")
@RequestMapping("")
public class XpInvitationCodeController {
    @Resource
    private IXpInvitationCodeService xpInvitationCodeService;
@@ -64,7 +68,7 @@
    private IXpWhitelistService xpWhitelistService;
    @ApiOperation(value = "邀请码管理分页列表",response = XpInvitationCode.class)
    @PostMapping("/pageList")
    @PostMapping("/api/v1/invitation/pageList")
    public R<PageInfo<XpInvitationCode>> pageList(@RequestBody InvitationPageListQuery query) {
        PageInfo<XpInvitationCode> pageList = xpInvitationCodeService.pageList(query);
        return R.ok(pageList);
@@ -72,7 +76,7 @@
    /**
     * 生成邀请码
     */
    @PutMapping("/add")
    @PutMapping("/api/v1/invitation/add")
    @ResponseBody
    @ApiOperation(value = "生成邀请码")
    @ApiImplicitParams({
@@ -85,7 +89,7 @@
    /**
     * 解绑
     */
    @PutMapping("/unbind")
    @PutMapping("/api/v1/invitation/unbind")
    @ResponseBody
    @ApiOperation(value = "解绑")
    @ApiImplicitParams({
@@ -99,8 +103,8 @@
        xpInvitationCodeService.update(xpInvitationCodeUpdateWrapper);
        return R.ok();
    }
    @ApiOperation(value = "点位导入模板下载")
    @GetMapping("/import-template")
    @ApiOperation(value = "邀请码导入模板下载")
    @GetMapping("/api/v1/invitation/import-template")
    public void importTemplate() {
        List<InvitationCodeImportExcel> invitationCodeImportExcels = new ArrayList<>();
        InvitationCodeImportExcel invitationCodeImportExcel = new InvitationCodeImportExcel();
@@ -108,14 +112,17 @@
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), InvitationCodeImportExcel.class, invitationCodeImportExcels);
        HttpServletResponse response = WebUtils.response();
        ServletOutputStream outputStream = null;
        //1.获取excel模板
        ClassPathResource classPathResource = new ClassPathResource("template/邀请码导入模板.xlsx");
        TemplateExportParams params = new TemplateExportParams(classPathResource.getPath());
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        try {
            String fileName = URLEncoder.encode("邀请码导入模板.xlsx", "utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setHeader("Content-dispodition", "attachment;filename=" + fileName);
            outputStream = response.getOutputStream();
            workbook.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("邀请码导入模板下载失败!");
@@ -127,15 +134,12 @@
            }
        }
    }
    @Log(title = "邀请码导入", businessType = BusinessType.IMPORT)
    @ApiOperation(value = "邀请码导入")
    @PostMapping("/importExcel")
    @PostMapping("/base/v1/invitation/importExcel")
    public R<String> importExcel(@RequestPart("file") MultipartFile file) {
        ImportParams params = new ImportParams();
//        params.setTitleRows(1); // 标题行数
        params.setHeadRows(1); //表头行数
        InputStream inputStream = null;
//        List<CustomerImportFailedData> failedData = new ArrayList<>();
        List<InvitationCodeImportExcel> invitationCodeImportExcels;
        try {
            inputStream = file.getInputStream();
@@ -204,7 +208,7 @@
        return R.ok();
    }
    @ApiOperation(value = "邀请码导出")
    @PostMapping(value = "/exportExcel")
    @PostMapping(value = "/api/v1/invitation/exportExcel")
    public void exportExcel(@RequestBody InvitationPageListQuery query) {
        List<XpInvitationCode> list = xpInvitationCodeService.exportList(query);
        List<XpInvitationCodeExportExcel> xpWhitelistExportExcels = new ArrayList<>();
@@ -245,7 +249,7 @@
    /**
     * 批量删除
     */
    @GetMapping("/deleteByIds")
    @GetMapping("/api/v1/invitation/deleteByIds")
    @ResponseBody
    @ApiOperation(value = "批量删除")
    public R deleteByIds(String ids){
xp-robotaxi-operation-boot/src/main/resources/template/邀请码导入模板.xlsx
Binary files differ
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/config/MyLocaleResolver.java
@@ -24,6 +24,9 @@
        if (StringUtils.isEmpty(language)) {
            locale = Locale.getDefault();
        }
        if (!StringUtils.hasLength(language)){
            language = "1";
        }
        //如果请求不为空 
        //If the request is not empty.
        if (language.equals("1")) {
xp-robotaxi-vehicle-convoy-boot/pom.xml
@@ -119,6 +119,26 @@
            <version>1.33</version>
        </dependency>
        <!-- easypoi -->
        <!-- Apache POI 核心依赖 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.2.3</version>
        </dependency>
        <!-- Apache POI OOXML 支持(用于 .xlsx 文件) -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.2.3</version>
        </dependency>
        <!-- Apache POI XMLBeans(可选,用于复杂 XML 处理) -->
        <dependency>
            <groupId>org.apache.xmlbeans</groupId>
            <artifactId>xmlbeans</artifactId>
            <version>5.1.1</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
@@ -116,7 +116,9 @@
        XpVehicle xpVehicle = xpVehicleService.getById(id);
        // 获取车队
        XpFleetVehicle xpFleetVehicle = vehicleService.getOne(new LambdaQueryWrapper<XpFleetVehicle>().eq(XpFleetVehicle::getVehicleId, xpVehicle.getId()));
        xpVehicle.setFleetId(xpFleetVehicle.getFleetId());
        if (Objects.nonNull(xpFleetVehicle)) {
            xpVehicle.setFleetId(xpFleetVehicle.getFleetId());
        }
        return R.ok(xpVehicle);
    }
    /**
@@ -208,7 +210,39 @@
    public R<PageInfo<XpVehicle>> vehiclePageList(@RequestBody VehiclePageQuery query) {
        return R.ok(xpVehicleService.vehiclePageList(query));
    }
    /**
     * 导出在库车辆列表
     *
     * @param query 查询参数
     */
    @ApiOperation(value = "下载导入模板", tags = {"管理后台-车辆管理-在库车辆管理"})
    @PostMapping("/api/v1/vehicle/importTemplate")
    public void importTemplate() {
        // 1. 查询导出数据
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), XpVehicleExportExcel.class, new ArrayList<>());
        // 4. 输出到响应流
        HttpServletResponse response = WebUtils.response();
        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);
            }
        }
    }
    /**
     * 导入车辆
     *
@@ -320,7 +354,7 @@
     * @param id
     * @return
     */
    @ApiOperation(value = "删除在库车辆")
    @ApiOperation(value = "删除在库车辆",tags = {"管理后台-车辆管理-在库车辆管理"})
    @DeleteMapping("/api/v1/vehicle/delete/{id}")
    public R<?> delete(@ApiParam(name = "id", value = "车辆ID") @PathVariable Long id) {
        xpVehicleService.removeById(id);
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/model/query/VehiclePageQuery.java
@@ -8,6 +8,7 @@
import lombok.EqualsAndHashCode;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * 在库车辆管理分页查询参数
@@ -32,10 +33,10 @@
    private Integer status;
    @ApiModelProperty(value = "开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate startTime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone =  "GMT+8")
    private LocalDateTime startTime;
    @ApiModelProperty(value = "结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate endTime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone =  "GMT+8")
    private LocalDateTime endTime;
}