浏览代码

Merge remote-tracking branch 'origin/master'

Sheep 1 周之前
父节点
当前提交
b210bbeb05

+ 22 - 0
src/main/java/com/zsElectric/boot/business/controller/UserRefundsOrderInfoController.java

@@ -1,6 +1,10 @@
 package com.zsElectric.boot.business.controller;
 
+import cn.idev.excel.EasyExcel;
+import com.zsElectric.boot.business.model.dto.UserRefundsOrderInfoExportDTO;
+import com.zsElectric.boot.business.model.query.UserRefundsOrderInfoExportQuery;
 import com.zsElectric.boot.business.service.UserRefundsOrderInfoService;
+import jakarta.servlet.http.HttpServletResponse;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -18,6 +22,11 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import jakarta.validation.Valid;
 
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+
 /**
  * 退款订单前端控制层
  *
@@ -69,4 +78,17 @@ public class UserRefundsOrderInfoController  {
         boolean result = userRefundsOrderInfoService.deleteUserRefundsOrderInfos(ids);
         return Result.judge(result);
     }
+
+    @Operation(summary = "导出退款失败订单(success_time为空)")
+    @PostMapping("/export")
+    @PreAuthorize("@ss.hasPerm('business:user-refunds-order-info:export')")
+    public void exportUserRefundsOrderInfo(@RequestBody UserRefundsOrderInfoExportQuery queryParams, HttpServletResponse response) throws IOException {
+        String fileName = "退款失败订单.xlsx";
+        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+        response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, StandardCharsets.UTF_8));
+
+        List<UserRefundsOrderInfoExportDTO> exportList = userRefundsOrderInfoService.listExportUserRefundsOrderInfo(queryParams);
+        EasyExcel.write(response.getOutputStream(), UserRefundsOrderInfoExportDTO.class).sheet("退款失败订单")
+                .doWrite(exportList);
+    }
 }

+ 112 - 0
src/main/java/com/zsElectric/boot/business/controller/UserVehicleController.java

@@ -0,0 +1,112 @@
+package com.zsElectric.boot.business.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.zsElectric.boot.business.model.form.UserVehicleForm;
+import com.zsElectric.boot.business.model.query.UserVehicleQuery;
+import com.zsElectric.boot.business.model.vo.UserVehicleVO;
+import com.zsElectric.boot.business.service.UserVehicleService;
+import com.zsElectric.boot.core.web.PageResult;
+import com.zsElectric.boot.core.web.Result;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
+import lombok.RequiredArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 用户车辆管理前端控制层
+ *
+ * @author zsElectric
+ * @since 2026-03-03
+ */
+@Tag(name = "用户车辆管理接口")
+@RestController
+@RequestMapping("/api/v1/user-vehicle")
+@RequiredArgsConstructor
+public class UserVehicleController {
+
+    private final UserVehicleService userVehicleService;
+
+    @Operation(summary = "用户车辆分页列表")
+    @GetMapping("/page")
+    @PreAuthorize("@ss.hasPerm('business:user-vehicle:query')")
+    public PageResult<UserVehicleVO> getUserVehiclePage(UserVehicleQuery queryParams) {
+        IPage<UserVehicleVO> result = userVehicleService.getUserVehiclePage(queryParams);
+        return PageResult.success(result);
+    }
+
+    @Operation(summary = "获取用户车辆列表")
+    @GetMapping("/list/{userId}")
+    @PreAuthorize("@ss.hasPerm('business:user-vehicle:query')")
+    public Result<List<UserVehicleVO>> getUserVehicleList(
+            @Parameter(description = "用户ID") @PathVariable Long userId
+    ) {
+        List<UserVehicleVO> list = userVehicleService.getUserVehicleList(userId);
+        return Result.success(list);
+    }
+
+    @Operation(summary = "获取用户默认车辆")
+    @GetMapping("/default/{userId}")
+    @PreAuthorize("@ss.hasPerm('business:user-vehicle:query')")
+    public Result<UserVehicleVO> getDefaultVehicle(
+            @Parameter(description = "用户ID") @PathVariable Long userId
+    ) {
+        UserVehicleVO vehicle = userVehicleService.getDefaultVehicle(userId);
+        return Result.success(vehicle);
+    }
+
+    @Operation(summary = "新增用户车辆")
+    @PostMapping
+    @PreAuthorize("@ss.hasPerm('business:user-vehicle:add')")
+    public Result<Void> saveUserVehicle(@RequestBody @Valid UserVehicleForm formData) {
+        boolean result = userVehicleService.saveUserVehicle(formData);
+        return Result.judge(result);
+    }
+
+    @Operation(summary = "获取用户车辆表单数据")
+    @GetMapping("/{id}/form")
+    @PreAuthorize("@ss.hasPerm('business:user-vehicle:edit')")
+    public Result<UserVehicleForm> getUserVehicleForm(
+            @Parameter(description = "车辆ID") @PathVariable Long id
+    ) {
+        UserVehicleForm formData = userVehicleService.getUserVehicleFormData(id);
+        return Result.success(formData);
+    }
+
+    @Operation(summary = "修改用户车辆")
+    @PutMapping(value = "/{id}")
+    @PreAuthorize("@ss.hasPerm('business:user-vehicle:edit')")
+    public Result<Void> updateUserVehicle(
+            @Parameter(description = "车辆ID") @PathVariable Long id,
+            @RequestBody @Validated UserVehicleForm formData
+    ) {
+        boolean result = userVehicleService.updateUserVehicle(id, formData);
+        return Result.judge(result);
+    }
+
+    @Operation(summary = "删除用户车辆")
+    @DeleteMapping("/{ids}")
+    @PreAuthorize("@ss.hasPerm('business:user-vehicle:delete')")
+    public Result<Void> deleteUserVehicles(
+            @Parameter(description = "车辆ID,多个以英文逗号(,)分割") @PathVariable String ids
+    ) {
+        boolean result = userVehicleService.deleteUserVehicles(ids);
+        return Result.judge(result);
+    }
+
+    @Operation(summary = "设置默认车辆")
+    @PutMapping("/default/{userId}/{vehicleId}")
+    @PreAuthorize("@ss.hasPerm('business:user-vehicle:edit')")
+    public Result<Void> setDefaultVehicle(
+            @Parameter(description = "用户ID") @PathVariable Long userId,
+            @Parameter(description = "车辆ID") @PathVariable Long vehicleId
+    ) {
+        boolean result = userVehicleService.setDefaultVehicle(userId, vehicleId);
+        return Result.judge(result);
+    }
+}

+ 104 - 0
src/main/java/com/zsElectric/boot/business/controller/applet/AppletUserVehicleController.java

@@ -0,0 +1,104 @@
+package com.zsElectric.boot.business.controller.applet;
+
+import com.zsElectric.boot.business.converter.UserVehicleConverter;
+import com.zsElectric.boot.business.model.form.UserVehicleForm;
+import com.zsElectric.boot.business.model.vo.UserVehicleVO;
+import com.zsElectric.boot.business.service.UserVehicleService;
+import com.zsElectric.boot.common.annotation.Log;
+import com.zsElectric.boot.common.enums.LogModuleEnum;
+import com.zsElectric.boot.core.web.Result;
+import com.zsElectric.boot.security.util.SecurityUtils;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 小程序用户车辆管理控制层
+ *
+ * @author zsElectric
+ * @since 2026-03-03
+ */
+@Tag(name = "我的车辆接口")
+@RestController
+@RequestMapping("/applet/v1/vehicle")
+@RequiredArgsConstructor
+public class AppletUserVehicleController {
+
+    private final UserVehicleService userVehicleService;
+    private final UserVehicleConverter userVehicleConverter;
+
+    @Operation(summary = "我的车辆列表")
+    @GetMapping("/list")
+    public Result<List<UserVehicleVO>> getMyVehicleList() {
+        Long userId = SecurityUtils.getUserId();
+        List<UserVehicleVO> list = userVehicleService.getUserVehicleList(userId);
+        return Result.success(list);
+    }
+
+    @Operation(summary = "获取车辆详情")
+    @GetMapping("/{id}")
+    public Result<UserVehicleVO> getVehicleDetail(
+            @Parameter(description = "车辆ID") @PathVariable Long id
+    ) {
+        UserVehicleForm formData = userVehicleService.getUserVehicleFormData(id);
+        UserVehicleVO vo = userVehicleConverter.formToVO(formData);
+        return Result.success(vo);
+    }
+
+    @Operation(summary = "获取默认车辆")
+    @GetMapping("/default")
+    public Result<UserVehicleVO> getDefaultVehicle() {
+        Long userId = SecurityUtils.getUserId();
+        UserVehicleVO vehicle = userVehicleService.getDefaultVehicle(userId);
+        return Result.success(vehicle);
+    }
+
+    @Operation(summary = "新增车辆")
+    @PostMapping
+    @Log(value = "新增车辆", module = LogModuleEnum.APP_OTHER)
+    public Result<Void> addVehicle(@RequestBody @Valid UserVehicleForm formData) {
+        // 设置当前用户ID
+        formData.setUserId(SecurityUtils.getUserId());
+        boolean result = userVehicleService.saveUserVehicle(formData);
+        return Result.judge(result);
+    }
+
+    @Operation(summary = "修改车辆")
+    @PutMapping("/{id}")
+    @Log(value = "修改车辆", module = LogModuleEnum.APP_OTHER)
+    public Result<Void> updateVehicle(
+            @Parameter(description = "车辆ID") @PathVariable Long id,
+            @RequestBody @Valid UserVehicleForm formData
+    ) {
+        // 设置当前用户ID,确保只能修改自己的车辆
+        formData.setUserId(SecurityUtils.getUserId());
+        boolean result = userVehicleService.updateUserVehicle(id, formData);
+        return Result.judge(result);
+    }
+
+    @Operation(summary = "删除车辆")
+    @DeleteMapping("/{id}")
+    @Log(value = "删除车辆", module = LogModuleEnum.APP_OTHER)
+    public Result<Void> deleteVehicle(
+            @Parameter(description = "车辆ID") @PathVariable Long id
+    ) {
+        boolean result = userVehicleService.deleteUserVehicles(String.valueOf(id));
+        return Result.judge(result);
+    }
+
+    @Operation(summary = "设置默认车辆")
+    @PutMapping("/default/{id}")
+    @Log(value = "设置默认车辆", module = LogModuleEnum.APP_OTHER)
+    public Result<Void> setDefaultVehicle(
+            @Parameter(description = "车辆ID") @PathVariable Long id
+    ) {
+        Long userId = SecurityUtils.getUserId();
+        boolean result = userVehicleService.setDefaultVehicle(userId, id);
+        return Result.judge(result);
+    }
+}

+ 28 - 0
src/main/java/com/zsElectric/boot/business/converter/UserVehicleConverter.java

@@ -0,0 +1,28 @@
+package com.zsElectric.boot.business.converter;
+
+import com.zsElectric.boot.business.model.entity.UserVehicle;
+import com.zsElectric.boot.business.model.form.UserVehicleForm;
+import com.zsElectric.boot.business.model.vo.UserVehicleVO;
+import org.mapstruct.Mapper;
+
+import java.util.List;
+
+/**
+ * 用户车辆对象转换器
+ *
+ * @author zsElectric
+ * @since 2026-03-03
+ */
+@Mapper(componentModel = "spring")
+public interface UserVehicleConverter {
+
+    UserVehicleForm toForm(UserVehicle entity);
+
+    UserVehicle toEntity(UserVehicleForm formData);
+
+    UserVehicleVO toVO(UserVehicle entity);
+
+    UserVehicleVO formToVO(UserVehicleForm formData);
+
+    List<UserVehicleVO> toVOList(List<UserVehicle> entityList);
+}

+ 12 - 0
src/main/java/com/zsElectric/boot/business/mapper/UserRefundsOrderInfoMapper.java

@@ -3,11 +3,15 @@ package com.zsElectric.boot.business.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zsElectric.boot.business.model.entity.UserRefundsOrderInfo;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zsElectric.boot.business.model.dto.UserRefundsOrderInfoExportDTO;
+import com.zsElectric.boot.business.model.query.UserRefundsOrderInfoExportQuery;
 import com.zsElectric.boot.business.model.query.UserRefundsOrderInfoQuery;
 import com.zsElectric.boot.business.model.vo.UserRefundsOrderInfoVO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * 退款订单Mapper接口
  *
@@ -26,4 +30,12 @@ public interface UserRefundsOrderInfoMapper extends BaseMapper<UserRefundsOrderI
      */
     Page<UserRefundsOrderInfoVO> getUserRefundsOrderInfoPage(Page<UserRefundsOrderInfoVO> page,@Param("queryParams") UserRefundsOrderInfoQuery queryParams);
 
+    /**
+     * 导出退款订单数据(success_time为空)
+     *
+     * @param queryParams 查询参数
+     * @return 退款订单导出列表
+     */
+    List<UserRefundsOrderInfoExportDTO> listExportUserRefundsOrderInfo(@Param("queryParams") UserRefundsOrderInfoExportQuery queryParams);
+
 }

+ 26 - 0
src/main/java/com/zsElectric/boot/business/mapper/UserVehicleMapper.java

@@ -0,0 +1,26 @@
+package com.zsElectric.boot.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zsElectric.boot.business.model.entity.UserVehicle;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Update;
+
+/**
+ * 用户车辆信息Mapper接口
+ *
+ * @author zsElectric
+ * @since 2026-03-03
+ */
+@Mapper
+public interface UserVehicleMapper extends BaseMapper<UserVehicle> {
+
+    /**
+     * 清除用户所有车辆的默认状态
+     *
+     * @param userId 用户ID
+     * @return 更新的记录数
+     */
+    @Update("UPDATE c_user_vehicle SET is_default = 0 WHERE user_id = #{userId} AND is_deleted = 0")
+    int clearUserDefaultVehicle(@Param("userId") Long userId);
+}

+ 67 - 0
src/main/java/com/zsElectric/boot/business/model/entity/UserVehicle.java

@@ -0,0 +1,67 @@
+package com.zsElectric.boot.business.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.zsElectric.boot.common.base.BaseEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 用户车辆信息实体对象
+ *
+ * @author zsElectric
+ * @since 2026-03-03
+ */
+@Getter
+@Setter
+@TableName("c_user_vehicle")
+public class UserVehicle extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户ID,关联c_user_info表
+     */
+    private Long userId;
+
+    /**
+     * 车牌号
+     */
+    private String licensePlate;
+
+    /**
+     * 车辆品牌
+     */
+    private String brand;
+
+    /**
+     * 车辆型号
+     */
+    private String model;
+
+    /**
+     * 车辆颜色
+     */
+    private String color;
+
+    /**
+     * 车辆类型(1-新能源 2-燃油车 3-混合动力)
+     */
+    private Integer vehicleType;
+
+    /**
+     * 是否默认车辆(0-否 1-是)
+     */
+    private Integer isDefault;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 逻辑删除(0-未删除 1-已删除)
+     */
+    @TableLogic
+    private Integer isDeleted;
+}

+ 46 - 0
src/main/java/com/zsElectric/boot/business/model/form/UserVehicleForm.java

@@ -0,0 +1,46 @@
+package com.zsElectric.boot.business.model.form;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+/**
+ * 用户车辆表单对象
+ *
+ * @author zsElectric
+ * @since 2026-03-03
+ */
+@Schema(description = "用户车辆表单对象")
+@Data
+public class UserVehicleForm {
+
+    @Schema(description = "车辆ID")
+    private Long id;
+
+    @Schema(description = "用户ID")
+    @NotNull(message = "用户ID不能为空")
+    private Long userId;
+
+    @Schema(description = "车牌号")
+    @NotBlank(message = "车牌号不能为空")
+    private String licensePlate;
+
+    @Schema(description = "车辆品牌")
+    private String brand;
+
+    @Schema(description = "车辆型号")
+    private String model;
+
+    @Schema(description = "车辆颜色")
+    private String color;
+
+    @Schema(description = "车辆类型(1-新能源 2-燃油车 3-混合动力)")
+    private Integer vehicleType;
+
+    @Schema(description = "是否默认车辆(0-否 1-是)")
+    private Integer isDefault;
+
+    @Schema(description = "备注")
+    private String remark;
+}

+ 30 - 0
src/main/java/com/zsElectric/boot/business/model/query/UserVehicleQuery.java

@@ -0,0 +1,30 @@
+package com.zsElectric.boot.business.model.query;
+
+import com.zsElectric.boot.common.base.BasePageQuery;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 用户车辆查询对象
+ *
+ * @author zsElectric
+ * @since 2026-03-03
+ */
+@Schema(description = "用户车辆查询对象")
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class UserVehicleQuery extends BasePageQuery {
+
+    @Schema(description = "用户ID")
+    private Long userId;
+
+    @Schema(description = "车牌号")
+    private String licensePlate;
+
+    @Schema(description = "车辆品牌")
+    private String brand;
+
+    @Schema(description = "车辆类型(1-新能源 2-燃油车 3-混合动力)")
+    private Integer vehicleType;
+}

+ 49 - 0
src/main/java/com/zsElectric/boot/business/model/vo/UserVehicleVO.java

@@ -0,0 +1,49 @@
+package com.zsElectric.boot.business.model.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 用户车辆视图对象
+ *
+ * @author zsElectric
+ * @since 2026-03-03
+ */
+@Schema(description = "用户车辆视图对象")
+@Data
+public class UserVehicleVO {
+
+    @Schema(description = "车辆ID")
+    private Long id;
+
+    @Schema(description = "用户ID")
+    private Long userId;
+
+    @Schema(description = "车牌号")
+    private String licensePlate;
+
+    @Schema(description = "车辆品牌")
+    private String brand;
+
+    @Schema(description = "车辆型号")
+    private String model;
+
+    @Schema(description = "车辆颜色")
+    private String color;
+
+    @Schema(description = "车辆类型(1-新能源 2-燃油车 3-混合动力)")
+    private Integer vehicleType;
+
+    @Schema(description = "是否默认车辆(0-否 1-是)")
+    private Integer isDefault;
+
+    @Schema(description = "备注")
+    private String remark;
+
+    @Schema(description = "创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+}

+ 12 - 0
src/main/java/com/zsElectric/boot/business/service/UserRefundsOrderInfoService.java

@@ -2,11 +2,15 @@ package com.zsElectric.boot.business.service;
 
 import com.zsElectric.boot.business.model.entity.UserRefundsOrderInfo;
 import com.zsElectric.boot.business.model.form.UserRefundsOrderInfoForm;
+import com.zsElectric.boot.business.model.dto.UserRefundsOrderInfoExportDTO;
+import com.zsElectric.boot.business.model.query.UserRefundsOrderInfoExportQuery;
 import com.zsElectric.boot.business.model.query.UserRefundsOrderInfoQuery;
 import com.zsElectric.boot.business.model.vo.UserRefundsOrderInfoVO;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.List;
+
 /**
  * 退款订单服务类
  *
@@ -55,4 +59,12 @@ public interface UserRefundsOrderInfoService extends IService<UserRefundsOrderIn
      */
     boolean deleteUserRefundsOrderInfos(String ids);
 
+    /**
+     * 导出退款订单数据(success_time为空)
+     *
+     * @param queryParams 查询参数
+     * @return 退款订单导出列表
+     */
+    List<UserRefundsOrderInfoExportDTO> listExportUserRefundsOrderInfo(UserRefundsOrderInfoExportQuery queryParams);
+
 }

+ 85 - 0
src/main/java/com/zsElectric/boot/business/service/UserVehicleService.java

@@ -0,0 +1,85 @@
+package com.zsElectric.boot.business.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zsElectric.boot.business.model.entity.UserVehicle;
+import com.zsElectric.boot.business.model.form.UserVehicleForm;
+import com.zsElectric.boot.business.model.query.UserVehicleQuery;
+import com.zsElectric.boot.business.model.vo.UserVehicleVO;
+
+import java.util.List;
+
+/**
+ * 用户车辆信息服务类
+ *
+ * @author zsElectric
+ * @since 2026-03-03
+ */
+public interface UserVehicleService extends IService<UserVehicle> {
+
+    /**
+     * 用户车辆分页列表
+     *
+     * @param queryParams 查询参数
+     * @return {@link IPage<UserVehicleVO>} 用户车辆分页列表
+     */
+    IPage<UserVehicleVO> getUserVehiclePage(UserVehicleQuery queryParams);
+
+    /**
+     * 获取用户车辆表单数据
+     *
+     * @param id 车辆ID
+     * @return 车辆表单数据
+     */
+    UserVehicleForm getUserVehicleFormData(Long id);
+
+    /**
+     * 新增用户车辆
+     *
+     * @param formData 车辆表单对象
+     * @return 是否新增成功
+     */
+    boolean saveUserVehicle(UserVehicleForm formData);
+
+    /**
+     * 修改用户车辆
+     *
+     * @param id       车辆ID
+     * @param formData 车辆表单对象
+     * @return 是否修改成功
+     */
+    boolean updateUserVehicle(Long id, UserVehicleForm formData);
+
+    /**
+     * 删除用户车辆
+     *
+     * @param ids 车辆ID,多个以英文逗号(,)分割
+     * @return 是否删除成功
+     */
+    boolean deleteUserVehicles(String ids);
+
+    /**
+     * 获取用户的车辆列表
+     *
+     * @param userId 用户ID
+     * @return 车辆列表
+     */
+    List<UserVehicleVO> getUserVehicleList(Long userId);
+
+    /**
+     * 设置默认车辆
+     *
+     * @param userId    用户ID
+     * @param vehicleId 车辆ID
+     * @return 是否设置成功
+     */
+    boolean setDefaultVehicle(Long userId, Long vehicleId);
+
+    /**
+     * 获取用户默认车辆
+     *
+     * @param userId 用户ID
+     * @return 默认车辆信息
+     */
+    UserVehicleVO getDefaultVehicle(Long userId);
+}

+ 6 - 6
src/main/java/com/zsElectric/boot/business/service/WFTOrderService.java

@@ -800,7 +800,7 @@ public class WFTOrderService {
                 .eq(UserOrderInfo::getUserId, userId)
                 .in(UserOrderInfo::getOrderStatus, SystemConstants.STATUS_TWO, SystemConstants.STATUS_FIVE)
                 .between(UserOrderInfo::getCreateTime, LocalDateTime.now().minusYears(1), LocalDateTime.now())
-                .orderByAsc(UserOrderInfo::getCreateTime) // 按创建时间升序,优先退早期订单
+                .orderByDesc(UserOrderInfo::getCreateTime) // 按创建时间降序,优先退近期订单
         );
 
         if (CollUtil.isEmpty(userOrderInfoList)) {
@@ -1143,12 +1143,12 @@ public class WFTOrderService {
     public static void main(String[] args) throws IOException {
         SortedMap<String, String> params = new TreeMap<>();
         SwiftpassConfig swiftpassConfig = new SwiftpassConfig();
-//        params.put("transaction_id", "2301202601162014907802");//商户订单号
-        params.put("out_trade_no", "ZSWL20251127000000019417");//商户订单号
-        params.put("out_refund_no", "TK20251127000000019417");//商户退款单号
+        params.put("transaction_id", "2301202603032024626904");//商户订单号
+//        params.put("out_trade_no", "ZSWL20251127000000019417");//商户订单号
+        params.put("out_refund_no", "TK2301202603032024626904");//商户退款单号
         params.put("attach", "");//退款原因
-        params.put("total_fee", "10000");//原订单金额
-        params.put("refund_fee", "3118");//退款金额
+        params.put("total_fee", "5000");//原订单金额
+        params.put("refund_fee", "2737");//退款金额
         params.put("sign_type", "RSA_1_256");
         PayUtill payUtill = new PayUtill();
         swiftpassConfig.setKey("f5131b3f07acb965a59041b690a29911");

+ 13 - 0
src/main/java/com/zsElectric/boot/business/service/impl/UserRefundsOrderInfoServiceImpl.java

@@ -9,6 +9,8 @@ import com.zsElectric.boot.business.mapper.UserRefundsOrderInfoMapper;
 import com.zsElectric.boot.business.service.UserRefundsOrderInfoService;
 import com.zsElectric.boot.business.model.entity.UserRefundsOrderInfo;
 import com.zsElectric.boot.business.model.form.UserRefundsOrderInfoForm;
+import com.zsElectric.boot.business.model.dto.UserRefundsOrderInfoExportDTO;
+import com.zsElectric.boot.business.model.query.UserRefundsOrderInfoExportQuery;
 import com.zsElectric.boot.business.model.query.UserRefundsOrderInfoQuery;
 import com.zsElectric.boot.business.model.vo.UserRefundsOrderInfoVO;
 import com.zsElectric.boot.business.converter.UserRefundsOrderInfoConverter;
@@ -99,4 +101,15 @@ public class UserRefundsOrderInfoServiceImpl extends ServiceImpl<UserRefundsOrde
         return this.removeByIds(idList);
     }
 
+    /**
+     * 导出退款订单数据(success_time为空)
+     *
+     * @param queryParams 查询参数
+     * @return 退款订单导出列表
+     */
+    @Override
+    public List<UserRefundsOrderInfoExportDTO> listExportUserRefundsOrderInfo(UserRefundsOrderInfoExportQuery queryParams) {
+        return this.baseMapper.listExportUserRefundsOrderInfo(queryParams);
+    }
+
 }

+ 188 - 0
src/main/java/com/zsElectric/boot/business/service/impl/UserVehicleServiceImpl.java

@@ -0,0 +1,188 @@
+package com.zsElectric.boot.business.service.impl;
+
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zsElectric.boot.business.converter.UserVehicleConverter;
+import com.zsElectric.boot.business.mapper.UserVehicleMapper;
+import com.zsElectric.boot.business.model.entity.UserVehicle;
+import com.zsElectric.boot.business.model.form.UserVehicleForm;
+import com.zsElectric.boot.business.model.query.UserVehicleQuery;
+import com.zsElectric.boot.business.model.vo.UserVehicleVO;
+import com.zsElectric.boot.business.service.UserVehicleService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 用户车辆信息服务实现类
+ *
+ * @author zsElectric
+ * @since 2026-03-03
+ */
+@Service
+@RequiredArgsConstructor
+public class UserVehicleServiceImpl extends ServiceImpl<UserVehicleMapper, UserVehicle> implements UserVehicleService {
+
+    private final UserVehicleConverter userVehicleConverter;
+
+    /**
+     * 获取用户车辆分页列表
+     *
+     * @param queryParams 查询参数
+     * @return {@link IPage<UserVehicleVO>} 用户车辆分页列表
+     */
+    @Override
+    public IPage<UserVehicleVO> getUserVehiclePage(UserVehicleQuery queryParams) {
+        LambdaQueryWrapper<UserVehicle> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(queryParams.getUserId() != null, UserVehicle::getUserId, queryParams.getUserId())
+                .like(StrUtil.isNotBlank(queryParams.getLicensePlate()), UserVehicle::getLicensePlate, queryParams.getLicensePlate())
+                .like(StrUtil.isNotBlank(queryParams.getBrand()), UserVehicle::getBrand, queryParams.getBrand())
+                .eq(queryParams.getVehicleType() != null, UserVehicle::getVehicleType, queryParams.getVehicleType())
+                .orderByDesc(UserVehicle::getIsDefault)
+                .orderByDesc(UserVehicle::getCreateTime);
+
+        Page<UserVehicle> page = this.page(new Page<>(queryParams.getPageNum(), queryParams.getPageSize()), queryWrapper);
+        
+        Page<UserVehicleVO> pageVO = new Page<>(page.getCurrent(), page.getSize(), page.getTotal());
+        pageVO.setRecords(userVehicleConverter.toVOList(page.getRecords()));
+        return pageVO;
+    }
+
+    /**
+     * 获取用户车辆表单数据
+     *
+     * @param id 车辆ID
+     * @return 车辆表单数据
+     */
+    @Override
+    public UserVehicleForm getUserVehicleFormData(Long id) {
+        UserVehicle entity = this.getById(id);
+        return userVehicleConverter.toForm(entity);
+    }
+
+    /**
+     * 新增用户车辆
+     *
+     * @param formData 车辆表单对象
+     * @return 是否新增成功
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean saveUserVehicle(UserVehicleForm formData) {
+        UserVehicle entity = userVehicleConverter.toEntity(formData);
+        
+        // 如果设置为默认车辆,先清除该用户其他车辆的默认状态
+        if (entity.getIsDefault() != null && entity.getIsDefault() == 1) {
+            this.baseMapper.clearUserDefaultVehicle(entity.getUserId());
+        }
+        
+        // 如果是用户的第一辆车,自动设为默认
+        long count = this.count(new LambdaQueryWrapper<UserVehicle>()
+                .eq(UserVehicle::getUserId, entity.getUserId()));
+        if (count == 0) {
+            entity.setIsDefault(1);
+        }
+        
+        return this.save(entity);
+    }
+
+    /**
+     * 更新用户车辆
+     *
+     * @param id       车辆ID
+     * @param formData 车辆表单对象
+     * @return 是否修改成功
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean updateUserVehicle(Long id, UserVehicleForm formData) {
+        UserVehicle entity = userVehicleConverter.toEntity(formData);
+        entity.setId(id);
+        
+        // 如果设置为默认车辆,先清除该用户其他车辆的默认状态
+        if (entity.getIsDefault() != null && entity.getIsDefault() == 1) {
+            UserVehicle existingVehicle = this.getById(id);
+            if (existingVehicle != null) {
+                this.baseMapper.clearUserDefaultVehicle(existingVehicle.getUserId());
+            }
+        }
+        
+        return this.updateById(entity);
+    }
+
+    /**
+     * 删除用户车辆
+     *
+     * @param ids 车辆ID,多个以英文逗号(,)分割
+     * @return 是否删除成功
+     */
+    @Override
+    public boolean deleteUserVehicles(String ids) {
+        Assert.isTrue(StrUtil.isNotBlank(ids), "删除的车辆数据为空");
+        List<Long> idList = Arrays.stream(ids.split(","))
+                .map(Long::parseLong)
+                .toList();
+        return this.removeByIds(idList);
+    }
+
+    /**
+     * 获取用户的车辆列表
+     *
+     * @param userId 用户ID
+     * @return 车辆列表
+     */
+    @Override
+    public List<UserVehicleVO> getUserVehicleList(Long userId) {
+        LambdaQueryWrapper<UserVehicle> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(UserVehicle::getUserId, userId)
+                .orderByDesc(UserVehicle::getIsDefault)
+                .orderByDesc(UserVehicle::getCreateTime);
+        List<UserVehicle> list = this.list(queryWrapper);
+        return userVehicleConverter.toVOList(list);
+    }
+
+    /**
+     * 设置默认车辆
+     *
+     * @param userId    用户ID
+     * @param vehicleId 车辆ID
+     * @return 是否设置成功
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean setDefaultVehicle(Long userId, Long vehicleId) {
+        // 验证车辆是否属于该用户
+        UserVehicle vehicle = this.getById(vehicleId);
+        Assert.isTrue(vehicle != null && vehicle.getUserId().equals(userId), "车辆不存在或不属于该用户");
+        
+        // 清除该用户所有车辆的默认状态
+        this.baseMapper.clearUserDefaultVehicle(userId);
+        
+        // 设置新的默认车辆
+        vehicle.setIsDefault(1);
+        return this.updateById(vehicle);
+    }
+
+    /**
+     * 获取用户默认车辆
+     *
+     * @param userId 用户ID
+     * @return 默认车辆信息
+     */
+    @Override
+    public UserVehicleVO getDefaultVehicle(Long userId) {
+        LambdaQueryWrapper<UserVehicle> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(UserVehicle::getUserId, userId)
+                .eq(UserVehicle::getIsDefault, 1)
+                .last("LIMIT 1");
+        UserVehicle vehicle = this.getOne(queryWrapper);
+        return vehicle != null ? userVehicleConverter.toVO(vehicle) : null;
+    }
+}

+ 29 - 0
src/main/resources/mapper/business/UserRefundsOrderInfoMapper.xml

@@ -40,4 +40,33 @@
         create_time DESC
     </select>
 
+    <!-- 导出退款订单数据(success_time为空) -->
+    <select id="listExportUserRefundsOrderInfo" resultType="com.zsElectric.boot.business.model.dto.UserRefundsOrderInfoExportDTO">
+        SELECT
+            order_no,
+            CASE type WHEN 1 THEN '主动退款' WHEN 2 THEN '用户申请退款' ELSE '未知' END AS type_name,
+            out_refund_no,
+            refund_id,
+            transaction_id,
+            reason,
+            accepted_time,
+            amount,
+            status,
+            create_time
+        FROM
+            c_user_refunds_order_info
+        <where>
+            is_deleted = 0
+            AND success_time IS NULL
+            <if test="queryParams.startTime != null">
+                AND create_time <![CDATA[  >=  ]]> #{queryParams.startTime,jdbcType=DATE}
+            </if>
+            <if test="queryParams.endTime != null">
+                AND create_time <![CDATA[  <=  ]]> #{queryParams.endTime,jdbcType=DATE}
+            </if>
+        </where>
+        ORDER BY
+        create_time DESC
+    </select>
+
 </mapper>