Browse Source

feat(order): 新增账户退款功能及相关订单管理模块

- 新增 ChargeOrderInfo 实体及对应控制器、服务、映射器和转换器
- 新增 UserRefundsOrderInfo 实体及对应控制器和服务
- 在 UserOrderInfoService 中添加 refundOrder 方法并实现退款逻辑
- 在 SystemConstants 中新增退款和补缴相关常量
- 在 AppletOrderController 中增加 refundOrder 接口和异常处理
- 实现订单超充金额的平账逻辑
- 添加退款订单和充电订单的完整前后端交互结构
- 完善充电订单信息的分页查询、表单获取、更新和删除接口
- 增加退款订单的管理接口支持分页列表和编辑操作
wzq 1 day ago
parent
commit
cb32b03751
24 changed files with 1486 additions and 11 deletions
  1. 76 0
      src/main/java/com/zsElectric/boot/business/UserRefundsOrderInfo.java
  2. 73 0
      src/main/java/com/zsElectric/boot/business/controller/ChargeOrderInfoController.java
  3. 73 0
      src/main/java/com/zsElectric/boot/business/controller/UserRefundsOrderInfoController.java
  4. 15 1
      src/main/java/com/zsElectric/boot/business/controller/applet/AppletOrderController.java
  5. 19 0
      src/main/java/com/zsElectric/boot/business/converter/ChargeOrderInfoConverter.java
  6. 19 0
      src/main/java/com/zsElectric/boot/business/converter/UserRefundsOrderInfoConverter.java
  7. 28 0
      src/main/java/com/zsElectric/boot/business/mapper/ChargeOrderInfoMapper.java
  8. 28 0
      src/main/java/com/zsElectric/boot/business/mapper/UserRefundsOrderInfoMapper.java
  9. 191 0
      src/main/java/com/zsElectric/boot/business/model/entity/ChargeOrderInfo.java
  10. 179 0
      src/main/java/com/zsElectric/boot/business/model/form/ChargeOrderInfoForm.java
  11. 90 0
      src/main/java/com/zsElectric/boot/business/model/form/UserRefundsOrderInfoForm.java
  12. 19 0
      src/main/java/com/zsElectric/boot/business/model/query/ChargeOrderInfoQuery.java
  13. 22 0
      src/main/java/com/zsElectric/boot/business/model/query/UserRefundsOrderInfoQuery.java
  14. 116 0
      src/main/java/com/zsElectric/boot/business/model/vo/ChargeOrderInfoVO.java
  15. 58 0
      src/main/java/com/zsElectric/boot/business/model/vo/UserRefundsOrderInfoVO.java
  16. 58 0
      src/main/java/com/zsElectric/boot/business/service/ChargeOrderInfoService.java
  17. 3 1
      src/main/java/com/zsElectric/boot/business/service/UserOrderInfoService.java
  18. 58 0
      src/main/java/com/zsElectric/boot/business/service/UserRefundsOrderInfoService.java
  19. 102 0
      src/main/java/com/zsElectric/boot/business/service/impl/ChargeOrderInfoServiceImpl.java
  20. 66 9
      src/main/java/com/zsElectric/boot/business/service/impl/UserOrderInfoServiceImpl.java
  21. 102 0
      src/main/java/com/zsElectric/boot/business/service/impl/UserRefundsOrderInfoServiceImpl.java
  22. 2 0
      src/main/java/com/zsElectric/boot/common/constant/SystemConstants.java
  23. 59 0
      src/main/resources/mapper/business/ChargeOrderInfoMapper.xml
  24. 30 0
      src/main/resources/mapper/business/UserRefundsOrderInfoMapper.xml

+ 76 - 0
src/main/java/com/zsElectric/boot/business/UserRefundsOrderInfo.java

@@ -0,0 +1,76 @@
+package com.zsElectric.boot.business;
+
+import com.zsElectric.boot.common.base.BaseEntity;
+import lombok.Getter;
+import lombok.Setter;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 退款订单实体对象
+ *
+ * @author zsElectric
+ * @since 2025-12-17 16:48
+ */
+@Getter
+@Setter
+@TableName("c_user_refunds_order_info")
+public class UserRefundsOrderInfo extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 订单ID
+     */
+    private String orderId;
+    /**
+     * 商户订单号
+     */
+    private String orderNo;
+    /**
+     * 退款类型:1-主动退款 2-用户申请退款
+     */
+    private Integer type;
+    /**
+     * 商户退款单号
+     */
+    private String outRefundNo;
+    /**
+     * 微信支付退款单号
+     */
+    private String refundId;
+    /**
+     * 微信支付订单号
+     */
+    private String transactionId;
+    /**
+     * 退款原因
+     */
+    private String reason;
+    /**
+     * 退款受理时间
+     */
+    private LocalDateTime acceptedTime;
+    /**
+     * 退款成功时间
+     */
+    private LocalDateTime successTime;
+    /**
+     * 退款金额(元)
+     */
+    private BigDecimal amount;
+    /**
+     * 微信退款回调参数
+     */
+    private String notifyRequest;
+    /**
+     * 退款状态
+     */
+    private String status;
+    /**
+     * 逻辑删除(0-未删除 1-已删除)
+     */
+    private Integer isDeleted;
+}

+ 73 - 0
src/main/java/com/zsElectric/boot/business/controller/ChargeOrderInfoController.java

@@ -0,0 +1,73 @@
+package com.zsElectric.boot.business.controller;
+
+import com.zsElectric.boot.business.service.ChargeOrderInfoService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.zsElectric.boot.business.model.form.ChargeOrderInfoForm;
+import com.zsElectric.boot.business.model.query.ChargeOrderInfoQuery;
+import com.zsElectric.boot.business.model.vo.ChargeOrderInfoVO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.zsElectric.boot.core.web.PageResult;
+import com.zsElectric.boot.core.web.Result;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import jakarta.validation.Valid;
+
+/**
+ * 充电订单信息前端控制层
+ *
+ * @author zsElectric
+ * @since 2025-12-17 19:13
+ */
+@Tag(name = "充电订单信息接口")
+@RestController
+@RequestMapping("/api/v1/charge-order-info")
+@RequiredArgsConstructor
+public class ChargeOrderInfoController  {
+
+    private final ChargeOrderInfoService chargeOrderInfoService;
+
+    @Operation(summary = "充电订单信息分页列表")
+    @GetMapping("/page")
+    @PreAuthorize("@ss.hasPerm('business:charge-order-info:query')")
+    public PageResult<ChargeOrderInfoVO> getChargeOrderInfoPage(ChargeOrderInfoQuery queryParams ) {
+        IPage<ChargeOrderInfoVO> result = chargeOrderInfoService.getChargeOrderInfoPage(queryParams);
+        return PageResult.success(result);
+    }
+
+    @Operation(summary = "获取充电订单信息表单数据")
+    @GetMapping("/{id}/form")
+    @PreAuthorize("@ss.hasPerm('business:charge-order-info:edit')")
+    public Result<ChargeOrderInfoForm> getChargeOrderInfoForm(
+        @Parameter(description = "充电订单信息ID") @PathVariable Long id
+    ) {
+        ChargeOrderInfoForm formData = chargeOrderInfoService.getChargeOrderInfoFormData(id);
+        return Result.success(formData);
+    }
+
+    @Operation(summary = "修改充电订单信息")
+    @PutMapping(value = "/{id}")
+    @PreAuthorize("@ss.hasPerm('business:charge-order-info:edit')")
+    public Result<Void> updateChargeOrderInfo(
+            @Parameter(description = "充电订单信息ID") @PathVariable Long id,
+            @RequestBody @Validated ChargeOrderInfoForm formData
+    ) {
+        boolean result = chargeOrderInfoService.updateChargeOrderInfo(id, formData);
+        return Result.judge(result);
+    }
+
+    @Operation(summary = "删除充电订单信息")
+    @DeleteMapping("/{ids}")
+    @PreAuthorize("@ss.hasPerm('business:charge-order-info:delete')")
+    public Result<Void> deleteChargeOrderInfos(
+        @Parameter(description = "充电订单信息ID,多个以英文逗号(,)分割") @PathVariable String ids
+    ) {
+        boolean result = chargeOrderInfoService.deleteChargeOrderInfos(ids);
+        return Result.judge(result);
+    }
+}

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

@@ -0,0 +1,73 @@
+package com.zsElectric.boot.business.controller;
+
+import com.zsElectric.boot.business.service.UserRefundsOrderInfoService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.zsElectric.boot.business.model.form.UserRefundsOrderInfoForm;
+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.zsElectric.boot.core.web.PageResult;
+import com.zsElectric.boot.core.web.Result;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import jakarta.validation.Valid;
+
+/**
+ * 退款订单前端控制层
+ *
+ * @author zsElectric
+ * @since 2025-12-17 16:48
+ */
+@Tag(name = "退款订单接口")
+@RestController
+@RequestMapping("/api/v1/user-refunds-order-info")
+@RequiredArgsConstructor
+public class UserRefundsOrderInfoController  {
+
+    private final UserRefundsOrderInfoService userRefundsOrderInfoService;
+
+    @Operation(summary = "退款订单分页列表")
+    @GetMapping("/page")
+    @PreAuthorize("@ss.hasPerm('business:user-refunds-order-info:query')")
+    public PageResult<UserRefundsOrderInfoVO> getUserRefundsOrderInfoPage(UserRefundsOrderInfoQuery queryParams ) {
+        IPage<UserRefundsOrderInfoVO> result = userRefundsOrderInfoService.getUserRefundsOrderInfoPage(queryParams);
+        return PageResult.success(result);
+    }
+
+    @Operation(summary = "获取退款订单表单数据")
+    @GetMapping("/{id}/form")
+    @PreAuthorize("@ss.hasPerm('business:user-refunds-order-info:edit')")
+    public Result<UserRefundsOrderInfoForm> getUserRefundsOrderInfoForm(
+        @Parameter(description = "退款订单ID") @PathVariable Long id
+    ) {
+        UserRefundsOrderInfoForm formData = userRefundsOrderInfoService.getUserRefundsOrderInfoFormData(id);
+        return Result.success(formData);
+    }
+
+    @Operation(summary = "修改退款订单")
+    @PutMapping(value = "/{id}")
+    @PreAuthorize("@ss.hasPerm('business:user-refunds-order-info:edit')")
+    public Result<Void> updateUserRefundsOrderInfo(
+            @Parameter(description = "退款订单ID") @PathVariable Long id,
+            @RequestBody @Validated UserRefundsOrderInfoForm formData
+    ) {
+        boolean result = userRefundsOrderInfoService.updateUserRefundsOrderInfo(id, formData);
+        return Result.judge(result);
+    }
+
+    @Operation(summary = "删除退款订单")
+    @DeleteMapping("/{ids}")
+    @PreAuthorize("@ss.hasPerm('business:user-refunds-order-info:delete')")
+    public Result<Void> deleteUserRefundsOrderInfos(
+        @Parameter(description = "退款订单ID,多个以英文逗号(,)分割") @PathVariable String ids
+    ) {
+        boolean result = userRefundsOrderInfoService.deleteUserRefundsOrderInfos(ids);
+        return Result.judge(result);
+    }
+}

+ 15 - 1
src/main/java/com/zsElectric/boot/business/controller/applet/AppletOrderController.java

@@ -6,17 +6,21 @@ import com.zsElectric.boot.business.model.form.applet.LevelOrderForm;
 import com.zsElectric.boot.business.model.form.applet.UserPayForm;
 import com.zsElectric.boot.business.service.RechargeLevelService;
 import com.zsElectric.boot.business.service.UserOrderInfoService;
+import com.zsElectric.boot.common.annotation.RepeatSubmit;
 import com.zsElectric.boot.common.constant.SystemConstants;
 import com.zsElectric.boot.core.web.Result;
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import java.io.IOException;
+import java.text.ParseException;
 import java.util.List;
 import java.util.Map;
 
@@ -88,7 +92,7 @@ public class AppletOrderController {
      */
     @Operation(summary = "订单支付是否成功查询")
     @GetMapping("/orderQuery/{orderNo}")
-    public Result<String> orderQuery(@PathVariable("orderNo") String orderNo) throws IOException {
+    public Result<String> orderQuery(@PathVariable("orderNo") String orderNo) throws Exception {
         return Result.success(userOrderInfoService.orderQuery(orderNo));
     }
 
@@ -103,4 +107,14 @@ public class AppletOrderController {
     public Result<String> cancelOrder(@PathVariable(name = "orderId") String orderId) {
         return Result.success(userOrderInfoService.cancelOrder(orderId));
     }
+
+    /**
+     * 账户退款
+     * @return
+     */
+    @Operation(summary = "账户退款")
+    @PutMapping("/refundOrder")
+    public Result<String> refundOrder() throws Exception {
+        return Result.success(userOrderInfoService.refundOrder());
+    }
 }

+ 19 - 0
src/main/java/com/zsElectric/boot/business/converter/ChargeOrderInfoConverter.java

@@ -0,0 +1,19 @@
+package com.zsElectric.boot.business.converter;
+
+import org.mapstruct.Mapper;
+import com.zsElectric.boot.business.model.entity.ChargeOrderInfo;
+import com.zsElectric.boot.business.model.form.ChargeOrderInfoForm;
+
+/**
+ * 充电订单信息对象转换器
+ *
+ * @author zsElectric
+ * @since 2025-12-17 19:13
+ */
+@Mapper(componentModel = "spring")
+public interface ChargeOrderInfoConverter{
+
+    ChargeOrderInfoForm toForm(ChargeOrderInfo entity);
+
+    ChargeOrderInfo toEntity(ChargeOrderInfoForm formData);
+}

+ 19 - 0
src/main/java/com/zsElectric/boot/business/converter/UserRefundsOrderInfoConverter.java

@@ -0,0 +1,19 @@
+package com.zsElectric.boot.business.converter;
+
+import org.mapstruct.Mapper;
+import com.zsElectric.boot.business.UserRefundsOrderInfo;
+import com.zsElectric.boot.business.model.form.UserRefundsOrderInfoForm;
+
+/**
+ * 退款订单对象转换器
+ *
+ * @author zsElectric
+ * @since 2025-12-17 16:48
+ */
+@Mapper(componentModel = "spring")
+public interface UserRefundsOrderInfoConverter{
+
+    UserRefundsOrderInfoForm toForm(UserRefundsOrderInfo entity);
+
+    UserRefundsOrderInfo toEntity(UserRefundsOrderInfoForm formData);
+}

+ 28 - 0
src/main/java/com/zsElectric/boot/business/mapper/ChargeOrderInfoMapper.java

@@ -0,0 +1,28 @@
+package com.zsElectric.boot.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zsElectric.boot.business.model.entity.ChargeOrderInfo;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zsElectric.boot.business.model.query.ChargeOrderInfoQuery;
+import com.zsElectric.boot.business.model.vo.ChargeOrderInfoVO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 充电订单信息Mapper接口
+ *
+ * @author zsElectric
+ * @since 2025-12-17 19:13
+ */
+@Mapper
+public interface ChargeOrderInfoMapper extends BaseMapper<ChargeOrderInfo> {
+
+    /**
+     * 获取充电订单信息分页数据
+     *
+     * @param page 分页对象
+     * @param queryParams 查询参数
+     * @return {@link Page<ChargeOrderInfoVO>} 充电订单信息分页列表
+     */
+    Page<ChargeOrderInfoVO> getChargeOrderInfoPage(Page<ChargeOrderInfoVO> page, ChargeOrderInfoQuery queryParams);
+
+}

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

@@ -0,0 +1,28 @@
+package com.zsElectric.boot.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zsElectric.boot.business.UserRefundsOrderInfo;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zsElectric.boot.business.model.query.UserRefundsOrderInfoQuery;
+import com.zsElectric.boot.business.model.vo.UserRefundsOrderInfoVO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 退款订单Mapper接口
+ *
+ * @author zsElectric
+ * @since 2025-12-17 16:48
+ */
+@Mapper
+public interface UserRefundsOrderInfoMapper extends BaseMapper<UserRefundsOrderInfo> {
+
+    /**
+     * 获取退款订单分页数据
+     *
+     * @param page 分页对象
+     * @param queryParams 查询参数
+     * @return {@link Page<UserRefundsOrderInfoVO>} 退款订单分页列表
+     */
+    Page<UserRefundsOrderInfoVO> getUserRefundsOrderInfoPage(Page<UserRefundsOrderInfoVO> page, UserRefundsOrderInfoQuery queryParams);
+
+}

+ 191 - 0
src/main/java/com/zsElectric/boot/business/model/entity/ChargeOrderInfo.java

@@ -0,0 +1,191 @@
+package com.zsElectric.boot.business.model.entity;
+
+import com.zsElectric.boot.common.base.BaseEntity;
+import lombok.Getter;
+import lombok.Setter;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.math.BigDecimal;
+
+/**
+ * 充电订单信息实体对象
+ *
+ * @author zsElectric
+ * @since 2025-12-17 19:13
+ */
+@Getter
+@Setter
+@TableName("c_charge_order_info")
+public class ChargeOrderInfo extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+    /**
+     * 订单类型 1 个人订单 2 集团订单
+     */
+    private Integer orderType;
+    /**
+     * 集团订单所属当前集团编号
+     */
+    private Integer ecId;
+    /**
+     * 充电桩编号
+     */
+    private String equipmentId;
+    /**
+     * 第三方充电订单号
+     */
+    private String chargeOrderNo;
+    /**
+     * 充电开始时间
+     */
+    private String startTime;
+    /**
+     * 充电结束时间
+     */
+    private String endTime;
+    /**
+     * 充电时间:秒
+     */
+    private Integer chargeTime;
+    /**
+     * 状态0待启动 1 充电中 2 结算中 3 已完成, 5未成功充电
+     */
+    private Integer status;
+    /**
+     * 第三方充电消费总额
+     */
+    private BigDecimal thirdPartyTotalCost;
+    /**
+     * 第三方充电服务费
+     */
+    private BigDecimal thirdPartyServerfee;
+    /**
+     * 第三方充电金额
+     */
+    private BigDecimal thirdPartyElecfee;
+    /**
+     * 实际充电度数(单位:0.001 kw/h)
+     */
+    private BigDecimal totalCharge;
+    /**
+     * 平台实际收取金额
+     */
+    private BigDecimal realCost;
+    /**
+     * 平台总服务费
+     */
+    private BigDecimal realServiceCost;
+    /**
+     * 1 主动停止 2 充满停止 3 余额不足停止, 4电桩按钮停止
+     */
+    private Integer stopType;
+    /**
+     * 请求启动充电的手机号
+     */
+    private String phoneNum;
+    /**
+     * 车牌号( 停车减免必传,格式确保正确)
+     */
+    private String plateNum;
+    /**
+     * 充电结束原因
+     */
+    private String stopReason;
+    /**
+     * 推送:充电明细信息
+     */
+    private String chargeDetails;
+    /**
+     * 第三方充电站id
+     */
+    private String thirdPartyStationId;
+    /**
+     * 预充值金额
+     */
+    private BigDecimal preAmt;
+    /**
+     * 平台预扣服务费
+     */
+    private BigDecimal realPredictServiceCost;
+    /**
+     * 补缴金额(智停)
+     */
+    private BigDecimal maspAmount;
+    /**
+     * 平台补缴金额
+     */
+    private BigDecimal maspRealAmount;
+    /**
+     * 需要补缴的总金额
+     */
+    private BigDecimal totalMaspMoney;
+    /**
+     * 补缴状态  0.无需补缴  1.待补缴  2.已补缴
+     */
+    private Integer maspStatus;
+    /**
+     * 补缴时间
+     */
+    private String maspTime;
+    /**
+     * 补缴描述(默认:系统扣除)
+     */
+    private String maspDesc;
+    /**
+     * 优惠金额
+     */
+    private BigDecimal discountMoney;
+    /**
+     * 优惠描述(前端展示为优惠描述+优惠金额)
+     */
+    private String discountDesc;
+    /**
+     * 优惠活动ID
+     */
+    private Long discountInfoId;
+    /**
+     * 按平台计费规则,实际第三方收取的服务费
+     */
+    private BigDecimal realThirdCost;
+    /**
+     * 企业id
+     */
+    private Long firmId;
+    /**
+     * 企业专享优惠价
+     */
+    private BigDecimal firmPrice;
+    /**
+     * 优惠券金额
+     */
+    private BigDecimal couponPrice;
+    /**
+     * 优惠卷ID
+     */
+    private Long couponId;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 创建人
+     */
+    private Long createBy;
+    /**
+     * 更新人
+     */
+    private Long updateBy;
+    /**
+     * 乐观锁
+     */
+    private Integer version;
+    /**
+     * 逻辑删除(0-未删除 1-已删除)
+     */
+    private Integer isDeleted;
+}

+ 179 - 0
src/main/java/com/zsElectric/boot/business/model/form/ChargeOrderInfoForm.java

@@ -0,0 +1,179 @@
+package com.zsElectric.boot.business.model.form;
+
+import java.io.Serial;
+import java.io.Serializable;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import java.time.LocalDateTime;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.math.BigDecimal;
+import jakarta.validation.constraints.*;
+
+/**
+ * 充电订单信息表单对象
+ *
+ * @author zsElectric
+ * @since 2025-12-17 19:13
+ */
+@Getter
+@Setter
+@Schema(description = "充电订单信息表单对象")
+public class ChargeOrderInfoForm implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "主键ID")
+    @NotNull(message = "主键ID不能为空")
+    private Long id;
+
+    @Schema(description = "用户ID")
+    private Long userId;
+
+    @Schema(description = "订单类型 1 个人订单 2 集团订单")
+    private Integer orderType;
+
+    @Schema(description = "集团订单所属当前集团编号")
+    private Integer ecId;
+
+    @Schema(description = "充电桩编号")
+    @Size(max=255, message="充电桩编号长度不能超过255个字符")
+    private String equipmentId;
+
+    @Schema(description = "第三方充电订单号")
+    @Size(max=100, message="第三方充电订单号长度不能超过100个字符")
+    private String chargeOrderNo;
+
+    @Schema(description = "充电开始时间")
+    @Size(max=30, message="充电开始时间长度不能超过30个字符")
+    private String startTime;
+
+    @Schema(description = "充电结束时间")
+    @Size(max=30, message="充电结束时间长度不能超过30个字符")
+    private String endTime;
+
+    @Schema(description = "充电时间:秒")
+    private Integer chargeTime;
+
+    @Schema(description = "状态0待启动 1 充电中 2 结算中 3 已完成, 5未成功充电")
+    private Integer status;
+
+    @Schema(description = "第三方充电消费总额")
+    private BigDecimal thirdPartyTotalCost;
+
+    @Schema(description = "第三方充电服务费")
+    private BigDecimal thirdPartyServerfee;
+
+    @Schema(description = "第三方充电金额")
+    private BigDecimal thirdPartyElecfee;
+
+    @Schema(description = "实际充电度数(单位:0.001 kw/h)")
+    private BigDecimal totalCharge;
+
+    @Schema(description = "平台实际收取金额")
+    private BigDecimal realCost;
+
+    @Schema(description = "平台总服务费")
+    private BigDecimal realServiceCost;
+
+    @Schema(description = "1 主动停止 2 充满停止 3 余额不足停止, 4电桩按钮停止")
+    private Integer stopType;
+
+    @Schema(description = "请求启动充电的手机号")
+    @Size(max=50, message="请求启动充电的手机号长度不能超过50个字符")
+    private String phoneNum;
+
+    @Schema(description = "车牌号( 停车减免必传,格式确保正确)")
+    @Size(max=50, message="车牌号( 停车减免必传,格式确保正确)长度不能超过50个字符")
+    private String plateNum;
+
+    @Schema(description = "充电结束原因")
+    @Size(max=100, message="充电结束原因长度不能超过100个字符")
+    private String stopReason;
+
+    @Schema(description = "推送:充电明细信息")
+    @Size(max=65535, message="推送:充电明细信息长度不能超过65535个字符")
+    private String chargeDetails;
+
+    @Schema(description = "第三方充电站id")
+    @Size(max=50, message="第三方充电站id长度不能超过50个字符")
+    private String thirdPartyStationId;
+
+    @Schema(description = "预充值金额")
+    private BigDecimal preAmt;
+
+    @Schema(description = "平台预扣服务费")
+    private BigDecimal realPredictServiceCost;
+
+    @Schema(description = "补缴金额(智停)")
+    private BigDecimal maspAmount;
+
+    @Schema(description = "平台补缴金额")
+    private BigDecimal maspRealAmount;
+
+    @Schema(description = "需要补缴的总金额")
+    private BigDecimal totalMaspMoney;
+
+    @Schema(description = "补缴状态  0.无需补缴  1.待补缴  2.已补缴")
+    private Integer maspStatus;
+
+    @Schema(description = "补缴时间")
+    @Size(max=30, message="补缴时间长度不能超过30个字符")
+    private String maspTime;
+
+    @Schema(description = "补缴描述(默认:系统扣除)")
+    @Size(max=255, message="补缴描述(默认:系统扣除)长度不能超过255个字符")
+    private String maspDesc;
+
+    @Schema(description = "优惠金额")
+    private BigDecimal discountMoney;
+
+    @Schema(description = "优惠描述(前端展示为优惠描述+优惠金额)")
+    @Size(max=255, message="优惠描述(前端展示为优惠描述+优惠金额)长度不能超过255个字符")
+    private String discountDesc;
+
+    @Schema(description = "优惠活动ID")
+    private Long discountInfoId;
+
+    @Schema(description = "按平台计费规则,实际第三方收取的服务费")
+    private BigDecimal realThirdCost;
+
+    @Schema(description = "企业id")
+    private Long firmId;
+
+    @Schema(description = "企业专享优惠价")
+    private BigDecimal firmPrice;
+
+    @Schema(description = "优惠券金额")
+    private BigDecimal couponPrice;
+
+    @Schema(description = "优惠卷ID")
+    private Long couponId;
+
+    @Schema(description = "备注")
+    @Size(max=1000, message="备注长度不能超过1000个字符")
+    private String remark;
+
+    @Schema(description = "创建人")
+    private Long createBy;
+
+    @Schema(description = "创建时间")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    @Schema(description = "更新人")
+    private Long updateBy;
+
+    @Schema(description = "更新时间")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+    @Schema(description = "乐观锁")
+    private Integer version;
+
+    @Schema(description = "逻辑删除(0-未删除 1-已删除)")
+    private Integer isDeleted;
+
+
+}

+ 90 - 0
src/main/java/com/zsElectric/boot/business/model/form/UserRefundsOrderInfoForm.java

@@ -0,0 +1,90 @@
+package com.zsElectric.boot.business.model.form;
+
+import java.io.Serial;
+import java.io.Serializable;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import java.time.LocalDateTime;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.math.BigDecimal;
+import jakarta.validation.constraints.*;
+
+/**
+ * 退款订单表单对象
+ *
+ * @author zsElectric
+ * @since 2025-12-17 16:48
+ */
+@Getter
+@Setter
+@Schema(description = "退款订单表单对象")
+public class UserRefundsOrderInfoForm implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "主键ID")
+    @NotBlank(message = "主键ID不能为空")
+    @Size(max=64, message="主键ID长度不能超过64个字符")
+    private String id;
+
+    @Schema(description = "订单ID")
+    @Size(max=64, message="订单ID长度不能超过64个字符")
+    private String orderId;
+
+    @Schema(description = "商户订单号")
+    @Size(max=64, message="商户订单号长度不能超过64个字符")
+    private String orderNo;
+
+    @Schema(description = "退款类型:1-主动退款 2-用户申请退款")
+    private Integer type;
+
+    @Schema(description = "商户退款单号")
+    @Size(max=64, message="商户退款单号长度不能超过64个字符")
+    private String outRefundNo;
+
+    @Schema(description = "微信支付退款单号")
+    @Size(max=64, message="微信支付退款单号长度不能超过64个字符")
+    private String refundId;
+
+    @Schema(description = "微信支付订单号")
+    @Size(max=64, message="微信支付订单号长度不能超过64个字符")
+    private String transactionId;
+
+    @Schema(description = "退款原因")
+    @Size(max=255, message="退款原因长度不能超过255个字符")
+    private String reason;
+
+    @Schema(description = "退款受理时间")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime acceptedTime;
+
+    @Schema(description = "退款成功时间")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime successTime;
+
+    @Schema(description = "退款金额(元)")
+    private BigDecimal amount;
+
+    @Schema(description = "微信退款回调参数")
+    @Size(max=65535, message="微信退款回调参数长度不能超过65535个字符")
+    private String notifyRequest;
+
+    @Schema(description = "退款状态")
+    @Size(max=255, message="退款状态长度不能超过255个字符")
+    private String status;
+
+    @Schema(description = "创建时间")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    @Schema(description = "修改时间")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+    @Schema(description = "逻辑删除(0-未删除 1-已删除)")
+    private Integer isDeleted;
+
+
+}

+ 19 - 0
src/main/java/com/zsElectric/boot/business/model/query/ChargeOrderInfoQuery.java

@@ -0,0 +1,19 @@
+package com.zsElectric.boot.business.model.query;
+
+import com.zsElectric.boot.common.base.BasePageQuery;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 充电订单信息分页查询对象
+ *
+ * @author zsElectric
+ * @since 2025-12-17 19:13
+ */
+@Schema(description ="充电订单信息查询对象")
+@Getter
+@Setter
+public class ChargeOrderInfoQuery extends BasePageQuery {
+
+}

+ 22 - 0
src/main/java/com/zsElectric/boot/business/model/query/UserRefundsOrderInfoQuery.java

@@ -0,0 +1,22 @@
+package com.zsElectric.boot.business.model.query;
+
+import com.zsElectric.boot.common.base.BasePageQuery;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.math.BigDecimal;
+
+/**
+ * 退款订单分页查询对象
+ *
+ * @author zsElectric
+ * @since 2025-12-17 16:48
+ */
+@Schema(description ="退款订单查询对象")
+@Getter
+@Setter
+public class UserRefundsOrderInfoQuery extends BasePageQuery {
+
+}

+ 116 - 0
src/main/java/com/zsElectric/boot/business/model/vo/ChargeOrderInfoVO.java

@@ -0,0 +1,116 @@
+package com.zsElectric.boot.business.model.vo;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 充电订单信息视图对象
+ *
+ * @author zsElectric
+ * @since 2025-12-17 19:13
+ */
+@Getter
+@Setter
+@Schema( description = "充电订单信息视图对象")
+public class ChargeOrderInfoVO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "主键ID")
+    private Long id;
+    @Schema(description = "用户ID")
+    private Long userId;
+    @Schema(description = "订单类型 1 个人订单 2 集团订单")
+    private Integer orderType;
+    @Schema(description = "集团订单所属当前集团编号")
+    private Integer ecId;
+    @Schema(description = "充电桩编号")
+    private String equipmentId;
+    @Schema(description = "第三方充电订单号")
+    private String chargeOrderNo;
+    @Schema(description = "充电开始时间")
+    private String startTime;
+    @Schema(description = "充电结束时间")
+    private String endTime;
+    @Schema(description = "充电时间:秒")
+    private Integer chargeTime;
+    @Schema(description = "状态0待启动 1 充电中 2 结算中 3 已完成, 5未成功充电")
+    private Integer status;
+    @Schema(description = "第三方充电消费总额")
+    private BigDecimal thirdPartyTotalCost;
+    @Schema(description = "第三方充电服务费")
+    private BigDecimal thirdPartyServerfee;
+    @Schema(description = "第三方充电金额")
+    private BigDecimal thirdPartyElecfee;
+    @Schema(description = "实际充电度数(单位:0.001 kw/h)")
+    private BigDecimal totalCharge;
+    @Schema(description = "平台实际收取金额")
+    private BigDecimal realCost;
+    @Schema(description = "平台总服务费")
+    private BigDecimal realServiceCost;
+    @Schema(description = "1 主动停止 2 充满停止 3 余额不足停止, 4电桩按钮停止")
+    private Integer stopType;
+    @Schema(description = "请求启动充电的手机号")
+    private String phoneNum;
+    @Schema(description = "车牌号( 停车减免必传,格式确保正确)")
+    private String plateNum;
+    @Schema(description = "充电结束原因")
+    private String stopReason;
+    @Schema(description = "推送:充电明细信息")
+    private String chargeDetails;
+    @Schema(description = "第三方充电站id")
+    private String thirdPartyStationId;
+    @Schema(description = "预充值金额")
+    private BigDecimal preAmt;
+    @Schema(description = "平台预扣服务费")
+    private BigDecimal realPredictServiceCost;
+    @Schema(description = "补缴金额(智停)")
+    private BigDecimal maspAmount;
+    @Schema(description = "平台补缴金额")
+    private BigDecimal maspRealAmount;
+    @Schema(description = "需要补缴的总金额")
+    private BigDecimal totalMaspMoney;
+    @Schema(description = "补缴状态  0.无需补缴  1.待补缴  2.已补缴")
+    private Integer maspStatus;
+    @Schema(description = "补缴时间")
+    private String maspTime;
+    @Schema(description = "补缴描述(默认:系统扣除)")
+    private String maspDesc;
+    @Schema(description = "优惠金额")
+    private BigDecimal discountMoney;
+    @Schema(description = "优惠描述(前端展示为优惠描述+优惠金额)")
+    private String discountDesc;
+    @Schema(description = "优惠活动ID")
+    private Long discountInfoId;
+    @Schema(description = "按平台计费规则,实际第三方收取的服务费")
+    private BigDecimal realThirdCost;
+    @Schema(description = "企业id")
+    private Long firmId;
+    @Schema(description = "企业专享优惠价")
+    private BigDecimal firmPrice;
+    @Schema(description = "优惠券金额")
+    private BigDecimal couponPrice;
+    @Schema(description = "优惠卷ID")
+    private Long couponId;
+    @Schema(description = "备注")
+    private String remark;
+    @Schema(description = "创建人")
+    private Long createBy;
+    @Schema(description = "创建时间")
+    private LocalDateTime createTime;
+    @Schema(description = "更新人")
+    private Long updateBy;
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+    @Schema(description = "乐观锁")
+    private Integer version;
+    @Schema(description = "逻辑删除(0-未删除 1-已删除)")
+    private Integer isDeleted;
+}

+ 58 - 0
src/main/java/com/zsElectric/boot/business/model/vo/UserRefundsOrderInfoVO.java

@@ -0,0 +1,58 @@
+package com.zsElectric.boot.business.model.vo;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+
+/**
+ * 退款订单视图对象
+ *
+ * @author zsElectric
+ * @since 2025-12-17 16:48
+ */
+@Getter
+@Setter
+@Schema( description = "退款订单视图对象")
+public class UserRefundsOrderInfoVO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "主键ID")
+    private String id;
+    @Schema(description = "订单ID")
+    private String orderId;
+    @Schema(description = "商户订单号")
+    private String orderNo;
+    @Schema(description = "退款类型:1-主动退款 2-用户申请退款")
+    private Integer type;
+    @Schema(description = "商户退款单号")
+    private String outRefundNo;
+    @Schema(description = "微信支付退款单号")
+    private String refundId;
+    @Schema(description = "微信支付订单号")
+    private String transactionId;
+    @Schema(description = "退款原因")
+    private String reason;
+    @Schema(description = "退款受理时间")
+    private LocalDateTime acceptedTime;
+    @Schema(description = "退款成功时间")
+    private LocalDateTime successTime;
+    @Schema(description = "退款金额(元)")
+    private BigDecimal amount;
+    @Schema(description = "微信退款回调参数")
+    private String notifyRequest;
+    @Schema(description = "退款状态")
+    private String status;
+    @Schema(description = "创建时间")
+    private LocalDateTime createTime;
+    @Schema(description = "修改时间")
+    private LocalDateTime updateTime;
+    @Schema(description = "逻辑删除(0-未删除 1-已删除)")
+    private Integer isDeleted;
+}

+ 58 - 0
src/main/java/com/zsElectric/boot/business/service/ChargeOrderInfoService.java

@@ -0,0 +1,58 @@
+package com.zsElectric.boot.business.service;
+
+import com.zsElectric.boot.business.model.entity.ChargeOrderInfo;
+import com.zsElectric.boot.business.model.form.ChargeOrderInfoForm;
+import com.zsElectric.boot.business.model.query.ChargeOrderInfoQuery;
+import com.zsElectric.boot.business.model.vo.ChargeOrderInfoVO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * 充电订单信息服务类
+ *
+ * @author zsElectric
+ * @since 2025-12-17 19:13
+ */
+public interface ChargeOrderInfoService extends IService<ChargeOrderInfo> {
+
+    /**
+     *充电订单信息分页列表
+     *
+     * @return {@link IPage<ChargeOrderInfoVO>} 充电订单信息分页列表
+     */
+    IPage<ChargeOrderInfoVO> getChargeOrderInfoPage(ChargeOrderInfoQuery queryParams);
+
+    /**
+     * 获取充电订单信息表单数据
+     *
+     * @param id 充电订单信息ID
+     * @return 充电订单信息表单数据
+     */
+     ChargeOrderInfoForm getChargeOrderInfoFormData(Long id);
+
+    /**
+     * 新增充电订单信息
+     *
+     * @param formData 充电订单信息表单对象
+     * @return 是否新增成功
+     */
+    boolean saveChargeOrderInfo(ChargeOrderInfoForm formData);
+
+    /**
+     * 修改充电订单信息
+     *
+     * @param id   充电订单信息ID
+     * @param formData 充电订单信息表单对象
+     * @return 是否修改成功
+     */
+    boolean updateChargeOrderInfo(Long id, ChargeOrderInfoForm formData);
+
+    /**
+     * 删除充电订单信息
+     *
+     * @param ids 充电订单信息ID,多个以英文逗号(,)分割
+     * @return 是否删除成功
+     */
+    boolean deleteChargeOrderInfos(String ids);
+
+}

+ 3 - 1
src/main/java/com/zsElectric/boot/business/service/UserOrderInfoService.java

@@ -65,9 +65,11 @@ public interface UserOrderInfoService extends IService<UserOrderInfo> {
 
     UserPayForm payOrder(String orderId);
 
-    String orderQuery(String orderNo);
+    String orderQuery(String orderNo) throws Exception;
 
     Map<String, String> wechatPayNotify(HttpServletRequest request, HttpServletResponse response);
 
     String cancelOrder(String orderId);
+
+    String refundOrder() throws Exception;
 }

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

@@ -0,0 +1,58 @@
+package com.zsElectric.boot.business.service;
+
+import com.zsElectric.boot.business.UserRefundsOrderInfo;
+import com.zsElectric.boot.business.model.form.UserRefundsOrderInfoForm;
+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;
+
+/**
+ * 退款订单服务类
+ *
+ * @author zsElectric
+ * @since 2025-12-17 16:48
+ */
+public interface UserRefundsOrderInfoService extends IService<UserRefundsOrderInfo> {
+
+    /**
+     *退款订单分页列表
+     *
+     * @return {@link IPage<UserRefundsOrderInfoVO>} 退款订单分页列表
+     */
+    IPage<UserRefundsOrderInfoVO> getUserRefundsOrderInfoPage(UserRefundsOrderInfoQuery queryParams);
+
+    /**
+     * 获取退款订单表单数据
+     *
+     * @param id 退款订单ID
+     * @return 退款订单表单数据
+     */
+     UserRefundsOrderInfoForm getUserRefundsOrderInfoFormData(Long id);
+
+    /**
+     * 新增退款订单
+     *
+     * @param formData 退款订单表单对象
+     * @return 是否新增成功
+     */
+    boolean saveUserRefundsOrderInfo(UserRefundsOrderInfoForm formData);
+
+    /**
+     * 修改退款订单
+     *
+     * @param id   退款订单ID
+     * @param formData 退款订单表单对象
+     * @return 是否修改成功
+     */
+    boolean updateUserRefundsOrderInfo(Long id, UserRefundsOrderInfoForm formData);
+
+    /**
+     * 删除退款订单
+     *
+     * @param ids 退款订单ID,多个以英文逗号(,)分割
+     * @return 是否删除成功
+     */
+    boolean deleteUserRefundsOrderInfos(String ids);
+
+}

+ 102 - 0
src/main/java/com/zsElectric/boot/business/service/impl/ChargeOrderInfoServiceImpl.java

@@ -0,0 +1,102 @@
+package com.zsElectric.boot.business.service.impl;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+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.mapper.ChargeOrderInfoMapper;
+import com.zsElectric.boot.business.service.ChargeOrderInfoService;
+import com.zsElectric.boot.business.model.entity.ChargeOrderInfo;
+import com.zsElectric.boot.business.model.form.ChargeOrderInfoForm;
+import com.zsElectric.boot.business.model.query.ChargeOrderInfoQuery;
+import com.zsElectric.boot.business.model.vo.ChargeOrderInfoVO;
+import com.zsElectric.boot.business.converter.ChargeOrderInfoConverter;
+
+import java.util.Arrays;
+import java.util.List;
+
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.StrUtil;
+
+/**
+ * 充电订单信息服务实现类
+ *
+ * @author zsElectric
+ * @since 2025-12-17 19:13
+ */
+@Service
+@RequiredArgsConstructor
+public class ChargeOrderInfoServiceImpl extends ServiceImpl<ChargeOrderInfoMapper, ChargeOrderInfo> implements ChargeOrderInfoService {
+
+    private final ChargeOrderInfoConverter chargeOrderInfoConverter;
+
+    /**
+    * 获取充电订单信息分页列表
+    *
+    * @param queryParams 查询参数
+    * @return {@link IPage<ChargeOrderInfoVO>} 充电订单信息分页列表
+    */
+    @Override
+    public IPage<ChargeOrderInfoVO> getChargeOrderInfoPage(ChargeOrderInfoQuery queryParams) {
+        Page<ChargeOrderInfoVO> pageVO = this.baseMapper.getChargeOrderInfoPage(
+                new Page<>(queryParams.getPageNum(), queryParams.getPageSize()),
+                queryParams
+        );
+        return pageVO;
+    }
+    
+    /**
+     * 获取充电订单信息表单数据
+     *
+     * @param id 充电订单信息ID
+     * @return 充电订单信息表单数据
+     */
+    @Override
+    public ChargeOrderInfoForm getChargeOrderInfoFormData(Long id) {
+        ChargeOrderInfo entity = this.getById(id);
+        return chargeOrderInfoConverter.toForm(entity);
+    }
+    
+    /**
+     * 新增充电订单信息
+     *
+     * @param formData 充电订单信息表单对象
+     * @return 是否新增成功
+     */
+    @Override
+    public boolean saveChargeOrderInfo(ChargeOrderInfoForm formData) {
+        ChargeOrderInfo entity = chargeOrderInfoConverter.toEntity(formData);
+        return this.save(entity);
+    }
+    
+    /**
+     * 更新充电订单信息
+     *
+     * @param id   充电订单信息ID
+     * @param formData 充电订单信息表单对象
+     * @return 是否修改成功
+     */
+    @Override
+    public boolean updateChargeOrderInfo(Long id,ChargeOrderInfoForm formData) {
+        ChargeOrderInfo entity = chargeOrderInfoConverter.toEntity(formData);
+        return this.updateById(entity);
+    }
+    
+    /**
+     * 删除充电订单信息
+     *
+     * @param ids 充电订单信息ID,多个以英文逗号(,)分割
+     * @return 是否删除成功
+     */
+    @Override
+    public boolean deleteChargeOrderInfos(String ids) {
+        Assert.isTrue(StrUtil.isNotBlank(ids), "删除的充电订单信息数据为空");
+        // 逻辑删除
+        List<Long> idList = Arrays.stream(ids.split(","))
+                .map(Long::parseLong)
+                .toList();
+        return this.removeByIds(idList);
+    }
+
+}

+ 66 - 9
src/main/java/com/zsElectric/boot/business/service/impl/UserOrderInfoServiceImpl.java

@@ -1,19 +1,19 @@
 package com.zsElectric.boot.business.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.google.gson.JsonObject;
 import com.zsElectric.boot.business.mapper.*;
-import com.zsElectric.boot.business.model.entity.RechargeLevel;
-import com.zsElectric.boot.business.model.entity.UserAccount;
-import com.zsElectric.boot.business.model.entity.UserAccountLog;
+import com.zsElectric.boot.business.model.entity.*;
 import com.zsElectric.boot.business.model.form.applet.LevelOrderForm;
 import com.zsElectric.boot.business.model.form.applet.UserPayForm;
 import com.zsElectric.boot.business.model.vo.UserInfoVO;
 import com.zsElectric.boot.business.service.*;
 import com.zsElectric.boot.common.constant.SystemConstants;
+import com.zsElectric.boot.core.exception.BusinessException;
 import com.zsElectric.boot.core.pay.WXPayUtility;
 import com.zsElectric.boot.core.pay.WechatConstants;
 import com.zsElectric.boot.core.pay.WechatPayV3Utils;
@@ -27,7 +27,6 @@ import org.springframework.stereotype.Service;
 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.model.entity.UserOrderInfo;
 import com.zsElectric.boot.business.model.form.UserOrderInfoForm;
 import com.zsElectric.boot.business.model.query.UserOrderInfoQuery;
 import com.zsElectric.boot.business.model.vo.UserOrderInfoVO;
@@ -70,6 +69,8 @@ public class UserOrderInfoServiceImpl extends ServiceImpl<UserOrderInfoMapper, U
 
     private final WechatPayV3Utils wechatPayV3Utils;
 
+    private final ChargeOrderInfoMapper chargeOrderInfoMapper;
+
     // 声明一个可重入锁
     private final ReentrantLock lock = new ReentrantLock();
 
@@ -198,7 +199,7 @@ public class UserOrderInfoServiceImpl extends ServiceImpl<UserOrderInfoMapper, U
      * @return
      */
     @Override
-    public String orderQuery(String orderNo) {
+    public String orderQuery(String orderNo) throws Exception {
         //查询订单
         UserOrderInfo orderInfo = this.getById(Wrappers.<UserOrderInfo>lambdaQuery().eq(UserOrderInfo::getOrderNo, orderNo).last("limit 1"));
         if (ObjectUtil.isEmpty(orderInfo)) {
@@ -210,10 +211,12 @@ public class UserOrderInfoServiceImpl extends ServiceImpl<UserOrderInfoMapper, U
 //        String s = "SUCCESS";
         if ("SUCCESS".equals(s)) {
             if (ObjectUtil.isNotEmpty(orderInfo) && Objects.equals(orderInfo.getOrderStatus(), SystemConstants.STATUS_ONE)) {
-                orderInfo.setOrderStatus(SystemConstants.STATUS_TWO);
-                orderInfo.setPayTime(LocalDateTime.now());
-                orderInfo.setOutTradeNo(res.get("transaction_id").getAsString());
-                this.updateById(orderInfo);
+                String transactionId = res.get("transaction_id").getAsString();
+                LocalDateTime payTime = LocalDateTime.now();
+                BigDecimal payMoney = new BigDecimal(res.get("amount").getAsJsonObject().get("total").getAsString());
+
+                //执行业务操作
+                this.successPayOrder(orderInfo, transactionId, payTime, payMoney);
             }
             return "100001";//支付成功
         }
@@ -322,6 +325,27 @@ public class UserOrderInfoServiceImpl extends ServiceImpl<UserOrderInfoMapper, U
         accountLog.setAccountType(SystemConstants.ACCOUNT_TYPE_PERSONAL);
         accountLog.setChangeBalance(finalBalance);
         userAccountLogMapper.insert(accountLog);
+
+        //平订单超充金额
+        orderBackTax(userAccount);
+    }
+
+    private void orderBackTax(UserAccount userAccount) {
+        Long userId = SecurityUtils.getUserId();
+        //查询超充订单
+        List<ChargeOrderInfo> chargeOrderInfoList = chargeOrderInfoMapper.selectList(Wrappers.<ChargeOrderInfo>lambdaQuery()
+                .eq(ChargeOrderInfo::getUserId, userId)
+                .eq(ChargeOrderInfo::getMaspStatus, SystemConstants.STATUS_ONE)
+                .orderByAsc(ChargeOrderInfo::getCreateTime)
+        );
+        if (CollUtil.isNotEmpty(chargeOrderInfoList)) {
+            BigDecimal balance = userAccount.getBalance();
+            for (ChargeOrderInfo chargeOrderInfo : chargeOrderInfoList) {
+                balance = balance.subtract(chargeOrderInfo.getTotalMaspMoney());
+                //todo
+            }
+        }
+
     }
 
     /**
@@ -343,6 +367,39 @@ public class UserOrderInfoServiceImpl extends ServiceImpl<UserOrderInfoMapper, U
         return "取消失败,请刷新后重试!";
     }
 
+    /**
+     * 账户退款
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String refundOrder() throws Exception {
+
+        //查询账户余额
+        UserAccount userAccount = userAccountMapper.selectOne(Wrappers.<UserAccount>lambdaQuery().eq(UserAccount::getUserId, SecurityUtils.getUserId()).last("limit 1"));
+        if(userAccount.getBalance().compareTo(BigDecimal.ZERO) == 0){
+            throw new BusinessException("账户余额为 0");
+        }
+        BigDecimal refundMoney = userAccount.getBalance();
+
+        //账户变动及日志记录
+        UserAccountLog accountLog = new UserAccountLog();
+        accountLog.setBeforeBalance(userAccount.getBalance());
+        //账户余额清空
+        userAccount.setBalance(BigDecimal.ZERO);
+        userAccountMapper.updateById(userAccount);
+        //日志
+        accountLog.setUserId(SecurityUtils.getUserId());
+        accountLog.setChangeType(SystemConstants.CHANGE_TYPE_REDUCE);
+        accountLog.setChangeNote(SystemConstants.ACCOUNT_LOG_REFUND_NOTE);
+        //accountLog.setChangeId();
+        accountLog.setAccountType(SystemConstants.ACCOUNT_TYPE_PERSONAL);
+        accountLog.setChangeBalance(BigDecimal.ZERO);
+        userAccountLogMapper.insert(accountLog);
+
+        return "";
+    }
+
     /**
      * 通过商户订单号查询订单在微信侧支付状态
      *

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

@@ -0,0 +1,102 @@
+package com.zsElectric.boot.business.service.impl;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+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.mapper.UserRefundsOrderInfoMapper;
+import com.zsElectric.boot.business.service.UserRefundsOrderInfoService;
+import com.zsElectric.boot.business.UserRefundsOrderInfo;
+import com.zsElectric.boot.business.model.form.UserRefundsOrderInfoForm;
+import com.zsElectric.boot.business.model.query.UserRefundsOrderInfoQuery;
+import com.zsElectric.boot.business.model.vo.UserRefundsOrderInfoVO;
+import com.zsElectric.boot.business.converter.UserRefundsOrderInfoConverter;
+
+import java.util.Arrays;
+import java.util.List;
+
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.StrUtil;
+
+/**
+ * 退款订单服务实现类
+ *
+ * @author zsElectric
+ * @since 2025-12-17 16:48
+ */
+@Service
+@RequiredArgsConstructor
+public class UserRefundsOrderInfoServiceImpl extends ServiceImpl<UserRefundsOrderInfoMapper, UserRefundsOrderInfo> implements UserRefundsOrderInfoService {
+
+    private final UserRefundsOrderInfoConverter userRefundsOrderInfoConverter;
+
+    /**
+    * 获取退款订单分页列表
+    *
+    * @param queryParams 查询参数
+    * @return {@link IPage<UserRefundsOrderInfoVO>} 退款订单分页列表
+    */
+    @Override
+    public IPage<UserRefundsOrderInfoVO> getUserRefundsOrderInfoPage(UserRefundsOrderInfoQuery queryParams) {
+        Page<UserRefundsOrderInfoVO> pageVO = this.baseMapper.getUserRefundsOrderInfoPage(
+                new Page<>(queryParams.getPageNum(), queryParams.getPageSize()),
+                queryParams
+        );
+        return pageVO;
+    }
+    
+    /**
+     * 获取退款订单表单数据
+     *
+     * @param id 退款订单ID
+     * @return 退款订单表单数据
+     */
+    @Override
+    public UserRefundsOrderInfoForm getUserRefundsOrderInfoFormData(Long id) {
+        UserRefundsOrderInfo entity = this.getById(id);
+        return userRefundsOrderInfoConverter.toForm(entity);
+    }
+    
+    /**
+     * 新增退款订单
+     *
+     * @param formData 退款订单表单对象
+     * @return 是否新增成功
+     */
+    @Override
+    public boolean saveUserRefundsOrderInfo(UserRefundsOrderInfoForm formData) {
+        UserRefundsOrderInfo entity = userRefundsOrderInfoConverter.toEntity(formData);
+        return this.save(entity);
+    }
+    
+    /**
+     * 更新退款订单
+     *
+     * @param id   退款订单ID
+     * @param formData 退款订单表单对象
+     * @return 是否修改成功
+     */
+    @Override
+    public boolean updateUserRefundsOrderInfo(Long id,UserRefundsOrderInfoForm formData) {
+        UserRefundsOrderInfo entity = userRefundsOrderInfoConverter.toEntity(formData);
+        return this.updateById(entity);
+    }
+    
+    /**
+     * 删除退款订单
+     *
+     * @param ids 退款订单ID,多个以英文逗号(,)分割
+     * @return 是否删除成功
+     */
+    @Override
+    public boolean deleteUserRefundsOrderInfos(String ids) {
+        Assert.isTrue(StrUtil.isNotBlank(ids), "删除的退款订单数据为空");
+        // 逻辑删除
+        List<Long> idList = Arrays.stream(ids.split(","))
+                .map(Long::parseLong)
+                .toList();
+        return this.removeByIds(idList);
+    }
+
+}

+ 2 - 0
src/main/java/com/zsElectric/boot/common/constant/SystemConstants.java

@@ -44,6 +44,8 @@ public interface SystemConstants {
      * 充值记录描述
      */
     String ACCOUNT_LOG_PAY_NOTE = "购买充点券";
+    String ACCOUNT_LOG_REFUND_NOTE = "账户退款";
+    String ACCOUNT_LOG_BACK_TAX_NOTE = "补缴欠费";
 
     /**
      * 变更记录类型  1-增加 2-减少

+ 59 - 0
src/main/resources/mapper/business/ChargeOrderInfoMapper.xml

@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zsElectric.boot.business.mapper.ChargeOrderInfoMapper">
+
+    <!-- 获取充电订单信息分页列表 -->
+    <select id="getChargeOrderInfoPage" resultType="com.zsElectric.boot.business.model.vo.ChargeOrderInfoVO">
+        SELECT
+                id,
+                user_id,
+                order_type,
+                ec_id,
+                equipment_id,
+                charge_order_no,
+                start_time,
+                end_time,
+                charge_time,
+                status,
+                third_party_total_cost,
+                third_party_serverfee,
+                third_party_elecfee,
+                total_charge,
+                real_cost,
+                real_service_cost,
+                stop_type,
+                phone_num,
+                plate_num,
+                stop_reason,
+                charge_details,
+                third_party_station_id,
+                pre_amt,
+                real_predict_service_cost,
+                masp_amount,
+                masp_real_amount,
+                total_masp_money,
+                masp_status,
+                masp_time,
+                masp_desc,
+                discount_money,
+                discount_desc,
+                discount_info_id,
+                real_third_cost,
+                firm_id,
+                firm_price,
+                coupon_price,
+                coupon_id,
+                remark,
+                create_by,
+                create_time,
+                update_by,
+                update_time,
+                version,
+                is_deleted
+        FROM
+            c_charge_order_info
+        <where>
+        </where>
+    </select>
+
+</mapper>

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

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zsElectric.boot.business.mapper.UserRefundsOrderInfoMapper">
+
+    <!-- 获取退款订单分页列表 -->
+    <select id="getUserRefundsOrderInfoPage" resultType="com.zsElectric.boot.business.model.vo.UserRefundsOrderInfoVO">
+        SELECT
+                id,
+                order_id,
+                order_no,
+                type,
+                out_refund_no,
+                refund_id,
+                transaction_id,
+                reason,
+                accepted_time,
+                success_time,
+                amount,
+                notify_request,
+                status,
+                create_time,
+                update_time,
+                is_deleted
+        FROM
+            c_user_refunds_order_info
+        <where>
+        </where>
+    </select>
+
+</mapper>