Bläddra i källkod

服务费钱包接口开发

donglang 7 timmar sedan
förälder
incheckning
d47a51ee69
14 ändrade filer med 787 tillägg och 67 borttagningar
  1. 1 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/ParkingChangeStrategyController.java
  2. 38 48
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/ParkingWalletFeeController.java
  3. 5 5
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtParkingWalletFee.java
  4. 10 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtParkingWalletFeeBalance.java
  5. 61 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/ParkingWalletFeeSaveParam.java
  6. 34 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/ParkingWalletFeeTotalQueryParam.java
  7. 56 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/enuma/WalletTypEnum.java
  8. 75 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/ParkingWalletFeeBalanceQueryParam.java
  9. 96 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/ParkingWalletFeeBalanceResp.java
  10. 54 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/ParkingWalletFeeQueryParam.java
  11. 62 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/ParkingWalletFeeResp.java
  12. 23 11
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/ParkingChangeStrategyService.java
  13. 269 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/ParkingWalletFeeService.java
  14. 3 1
      sql/2026/01/2026_01_06_donglang_create.sql

+ 1 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/ParkingChangeStrategyController.java

@@ -33,7 +33,7 @@ public class ParkingChangeStrategyController {
     private final ParkingChangeStrategyService parkingChangeStrategyService;
 
     /**
-     * 分页查询门卫订单
+     * 分页查询收费策略
      *
      * @param param
      * @return

+ 38 - 48
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/ParkingWalletFeeController.java

@@ -3,21 +3,23 @@ package com.sckw.transport.controller;
 
 import com.sckw.core.web.response.BaseResult;
 import com.sckw.core.web.response.result.PageDataResult;
-import com.sckw.transport.model.ParkingChangeStrategySaveParam;
-import com.sckw.transport.model.param.ParkingChangeStrategyQueryParam;
-import com.sckw.transport.model.param.ParkingChangeStrategyResp;
-import com.sckw.transport.model.param.ParkingChangeStrategyUnitResp;
-import com.sckw.transport.model.param.ParkingChangeStrategyUnitSaveParam;
-import com.sckw.transport.service.ParkingChangeStrategyService;
+import com.sckw.transport.model.ParkingWalletFeeSaveParam;
+import com.sckw.transport.model.ParkingWalletFeeTotalQueryParam;
+import com.sckw.transport.model.param.ParkingWalletFeeBalanceQueryParam;
+import com.sckw.transport.model.param.ParkingWalletFeeBalanceResp;
+import com.sckw.transport.model.param.ParkingWalletFeeQueryParam;
+import com.sckw.transport.model.param.ParkingWalletFeeResp;
+import com.sckw.transport.service.ParkingWalletFeeService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
-import java.util.List;
-
-/**
+/**s
  * Author: donglang
  * Time: 2026-01-05
  * Des: 服务费
@@ -30,71 +32,59 @@ import java.util.List;
 @Tag(name = "服务费接口", description = "服务费接口")
 public class ParkingWalletFeeController {
 
-    private final ParkingChangeStrategyService parkingChangeStrategyService;
+    private final ParkingWalletFeeService parkingWalletFeeService;
+
 
     /**
-     * 分页查询门卫订单
+     * 查询服务费汇总
      *
      * @param param
      * @return
      */
-    @Operation(summary = "分页查询收费策略", description = "分页查询收费策略")
-    @PostMapping("/pageQueryChangeStrategy")
-    public BaseResult<PageDataResult<ParkingChangeStrategyResp>> pageQueryChangeStrategy(@RequestBody @Valid ParkingChangeStrategyQueryParam param){
-        PageDataResult<ParkingChangeStrategyResp> gatekeeperOrderList = parkingChangeStrategyService.pageQueryChangeStrategy(param);
-        return BaseResult.success(gatekeeperOrderList);
+    @Operation(summary = "查询服务费汇总", description = "查询服务费汇总")
+    @PostMapping("/queryTotalServerFee")
+    public BaseResult<ParkingWalletFeeResp> queryTotalServerFee(@RequestBody @Valid ParkingWalletFeeTotalQueryParam param){
+        ParkingWalletFeeResp gatekeeperOrder = parkingWalletFeeService.queryTotalServerFee(param);
+        return BaseResult.success(gatekeeperOrder);
     }
 
     /**
-     * 保存收费策略
+     * 分页查询服务费
      *
      * @param param
      * @return
      */
-    @Operation(summary = "保存收费策略", description = "保存收费策略")
-    @PostMapping("/saveChangeStrategy")
-    public BaseResult saveChangeStrategy(@RequestBody @Valid ParkingChangeStrategySaveParam param){
-        parkingChangeStrategyService.saveChangeStrategy(param);
-        return BaseResult.success();
+    @Operation(summary = "分页查询服务费", description = "分页查询服务费")
+    @PostMapping("/pageQueryServerFee")
+    public BaseResult<PageDataResult<ParkingWalletFeeResp>> pageQueryServerFee(@RequestBody @Valid ParkingWalletFeeQueryParam param){
+        PageDataResult<ParkingWalletFeeResp> gatekeeperOrderList = parkingWalletFeeService.pageQueryServerFee(param);
+        return BaseResult.success(gatekeeperOrderList);
     }
 
     /**
-     * 删除收费策略
+     * 保存服务费
      *
-     * @param id
+     * @param param
      * @return
      */
-    @Operation(summary = "删除收费策略", description = "删除收费策略")
-    @PostMapping("/deleteChangeStrategy")
-    public BaseResult deleteChangeStrategy(@RequestParam Long id){
-        parkingChangeStrategyService.deleteChangeStrategy(id);
+    @Operation(summary = "保存服务费", description = "保存服务费")
+    @PostMapping("/saveServerFee")
+    public BaseResult saveServerFee(@RequestBody @Valid ParkingWalletFeeSaveParam param){
+        parkingWalletFeeService.saveServerFee(param);
         return BaseResult.success();
     }
 
     /**
-     * 查询单位分配
-     *
-     * @param id
-     * @return
-     */
-    @Operation(summary = "查询单位分配", description = "查询单位分配")
-    @PostMapping("/queryChangeStrategyEnt")
-    public BaseResult<List<ParkingChangeStrategyUnitResp>> queryChangeStrategyEnt(@RequestParam Long id){
-        List<ParkingChangeStrategyUnitResp> changeStrategyUnitRespList = parkingChangeStrategyService.queryChangeStrategyEnt(id);
-        return BaseResult.success(changeStrategyUnitRespList);
-    }
-
-    /**
-     * 保存单位分配
+     * 分页查询服务费明细
      *
      * @param param
      * @return
      */
-    @Operation(summary = "保存单位分配", description = "保存单位分配")
-    @PostMapping("/saveChangeStrategyEnt")
-    public BaseResult saveChangeStrategyEnt(@RequestBody @Valid ParkingChangeStrategyUnitSaveParam param){
-        parkingChangeStrategyService.saveChangeStrategyEnt(param);
-        return BaseResult.success();
+    @Operation(summary = "分页查询服务费明细", description = "分页查询服务费明细")
+    @PostMapping("/pageQueryServerFeeDetails")
+    public BaseResult<PageDataResult<ParkingWalletFeeBalanceResp>> pageQueryServerFeeDetails(@RequestBody @Valid ParkingWalletFeeBalanceQueryParam param){
+        PageDataResult<ParkingWalletFeeBalanceResp> gatekeeperOrderList = parkingWalletFeeService.pageQueryServerFeeDetails(param);
+        return BaseResult.success(gatekeeperOrderList);
     }
 
 

+ 5 - 5
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtParkingWalletFee.java

@@ -26,6 +26,11 @@ public class KwtParkingWalletFee implements Serializable {
      */
     private Long proEntId;
 
+    /**
+     * 采购商企业id
+     */
+    private Long supEntId;
+
     /**
      * 服务费余额
      */
@@ -36,11 +41,6 @@ public class KwtParkingWalletFee implements Serializable {
      */
     private BigDecimal tradingAmount;
 
-    /**
-     * 凭证图片
-     */
-    private String voucherUrl;
-
     /**
      * 备注
      */

+ 10 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtParkingWalletFeeBalance.java

@@ -31,6 +31,11 @@ public class KwtParkingWalletFeeBalance implements Serializable {
      */
     private Long proEntId;
 
+    /**
+     * 供应商商企业id
+     */
+    private Long supEntId;
+
     /**
      * 交易类型 2-预付 3-收益 4-冻结 5-解冻 6-消费 9-人工录入
      */
@@ -51,6 +56,11 @@ public class KwtParkingWalletFeeBalance implements Serializable {
      */
     private BigDecimal tradingAmount;
 
+    /**
+     * 凭证图片
+     */
+    private String voucherUrl;
+
     /**
      * 备注
      */

+ 61 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/ParkingWalletFeeSaveParam.java

@@ -0,0 +1,61 @@
+package com.sckw.transport.model;
+
+import com.sckw.core.web.request.PageReq;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author :donglang
+ * @version :1.0
+ * @description : 收费策略
+ * @create :2026-01-05 08:59:00
+ */
+@Data
+public class ParkingWalletFeeSaveParam extends PageReq implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -5431003248533000828L;
+
+    /**
+     * 主键id
+     */
+    @NotNull(message = "主键id不能为空")
+    @Schema(description = "主键id")
+    private Long id;
+
+    /**
+     * 采购商企业id
+     */
+    @NotNull(message = "采购商企业id不能为空")
+    @Schema(description = "采购商企业id")
+    private Long entId;
+
+    /**
+     * 服务费余额
+     */
+    @NotNull(message = "服务费余额不能为空")
+    @Schema(description = "服务费余额")
+    private BigDecimal serviceFee;
+
+    /**
+     * 凭证图片
+     */
+    @NotBlank(message = "凭证图片不能为空")
+    @Schema(description = "凭证图片")
+    private String voucherUrl;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空")
+    @Schema(description = "备注")
+    private String remark;
+
+
+}

+ 34 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/ParkingWalletFeeTotalQueryParam.java

@@ -0,0 +1,34 @@
+package com.sckw.transport.model;
+
+import com.sckw.core.web.request.PageReq;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :donglang
+ * @version :1.0
+ * @description : 服务费
+ * @create :2026-01-05 08:59:00
+ */
+@Data
+public class ParkingWalletFeeTotalQueryParam extends PageReq implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -5431003248533000828L;
+
+    /**
+     * 平台企业id
+     */
+    @Schema(description = "平台企业id")
+    private Long supEntId;
+
+    /**
+     * 采购商企业id
+     */
+    @Schema(description = "采购商企业id")
+    private Long proEntId;
+
+}

+ 56 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/enuma/WalletTypEnum.java

@@ -0,0 +1,56 @@
+package com.sckw.transport.model.enuma;
+
+import lombok.Getter;
+
+@Getter
+public enum WalletTypEnum {
+
+    PREPAY(2, "预付"),
+    INCOME(3, "收益"),
+    FREEZE(4, "冻结"),
+    UNFREEZE(5, "解冻"),
+    CONSUME(6, "消费"),
+    MANUAL_ENTRY(9, "人工录入");
+    /**
+     * 数据库存储的编码值
+     */
+    private final Integer code;
+
+    /**
+     * 类型描述(用于页面展示)
+     */
+    private final String desc;
+
+    WalletTypEnum(Integer code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    /**
+     * 根据编码值获取枚举
+     * @param code 数据库存储的编码
+     * @return 对应的枚举对象,无匹配时返回 null
+     */
+    public static WalletTypEnum getByCode(Integer code) {
+        if (code == null) {
+            return null;
+        }
+        for (WalletTypEnum type : values()) {
+            if (type.code.equals(code)) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 根据编码值获取描述
+     * @param code 数据库存储的编码
+     * @return 描述文本,无匹配时返回"未知类型"
+     */
+    public static String getDescByCode(Integer code) {
+        WalletTypEnum type = getByCode(code);
+        return type != null ? type.desc : "未知类型";
+    }
+
+}

+ 75 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/ParkingWalletFeeBalanceQueryParam.java

@@ -0,0 +1,75 @@
+package com.sckw.transport.model.param;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.sckw.core.web.request.PageReq;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author :donglang
+ * @version :1.0
+ * @description : 服务费明细
+ * @create :2026-01-05 08:59:00
+ */
+@Data
+public class ParkingWalletFeeBalanceQueryParam extends PageReq implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -5431003248533000828L;
+
+    /**
+     * 主键id
+     */
+    @Schema(description = "主键id")
+    private Long id;
+
+    /**
+     * 订单号
+     */
+    private String orderNo;
+
+    /**
+     * 交易类型 2-预付 3-收益 4-冻结 5-解冻 6-消费 9-人工录入
+     */
+    private Integer tradeType;
+
+    /**
+     * 采购商企业id
+     */
+    private Long proEntId;
+
+    /**
+     * 供应商商企业id
+     */
+    private Long supEntId;
+
+    /**
+     * 最小服务费
+     */
+    @Schema(description = "最小服务费")
+    private BigDecimal minFee;
+
+    /**
+     * 最大服务费
+     */
+    @Schema(description = "最大服务费")
+    private BigDecimal maxFee;
+
+    /**
+     * 开始时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date startCreateTime;
+
+    /**
+     * 结束时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date endCreateTime;
+
+}

+ 96 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/ParkingWalletFeeBalanceResp.java

@@ -0,0 +1,96 @@
+package com.sckw.transport.model.param;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 服务费明细
+ * @create :2025-11-11 20:16:00
+ */
+@Data
+public class ParkingWalletFeeBalanceResp implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -6153312023002477484L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 关联订单编号
+     */
+    private String orderNo;
+
+    /**
+     * 采购商企业id
+     */
+    private Long proEntId;
+
+    /**
+     * 采购商企业名称
+     */
+    private String proEntName;
+
+    /**
+     * 供应商企业id
+     */
+    private Long supEntId;
+
+    /**
+     * 供应商企业名称
+     */
+    private String supEntName;
+
+    /**
+     * 交易类型 2-预付 3-收益 4-冻结 5-解冻 6-消费 9-人工录入
+     */
+    private Integer tradeType;
+
+    /**
+     * 交易类型描述
+     */
+    private String tradeTypeDesc;
+
+    /**
+     * 交易金额
+     */
+    private BigDecimal tradeAmount;
+
+    /**
+     * 服务费余额
+     */
+    private BigDecimal serviceFeeBalance;
+
+    /**
+     * 履约中金额
+     */
+    private BigDecimal tradingAmount;
+
+    /**
+     * 凭证图片
+     */
+    private String voucherUrl;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 创建人
+     */
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+}

+ 54 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/ParkingWalletFeeQueryParam.java

@@ -0,0 +1,54 @@
+package com.sckw.transport.model.param;
+
+import com.sckw.core.web.request.PageReq;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author :donglang
+ * @version :1.0
+ * @description : 服务费
+ * @create :2026-01-05 08:59:00
+ */
+@Data
+public class ParkingWalletFeeQueryParam extends PageReq implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -5431003248533000828L;
+
+//    /**
+//     * 类型
+//     */
+//    @NotNull(message = "类型不能为空")
+//    @Schema(description = "类型(1-平台,2-采购商)")
+//    private Integer type;
+
+    /**
+     * 平台企业id
+     */
+    @Schema(description = "平台企业id")
+    private Long supEntId;
+
+    /**
+     * 采购商企业id
+     */
+    @Schema(description = "采购商企业id")
+    private Long proEntId;
+
+    /**
+     * 最小服务费
+     */
+    @Schema(description = "最小服务费")
+    private BigDecimal minFee;
+
+    /**
+     * 最大服务费
+     */
+    @Schema(description = "最大服务费")
+    private BigDecimal maxFee;
+
+}

+ 62 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/ParkingWalletFeeResp.java

@@ -0,0 +1,62 @@
+package com.sckw.transport.model.param;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 服务费
+ * @create :2025-11-11 20:16:00
+ */
+@Data
+public class ParkingWalletFeeResp implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -6153312023002477484L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 采购商企业id
+     */
+    private Long proEntId;
+
+    /**
+     * 采购商企业名称
+     */
+    private Long proEntName;
+
+    /**
+     * 平台企业id
+     */
+    private Long supEntId;
+
+    /**
+     * 平台企业名称
+     */
+    private Long supEntName;
+
+    /**
+     * 服务费余额
+     */
+    private BigDecimal serviceFeeBalance;
+
+    /**
+     * 履约中金额
+     */
+    private BigDecimal tradingAmount;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+}

+ 23 - 11
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/ParkingChangeStrategyService.java

@@ -65,11 +65,10 @@ public class ParkingChangeStrategyService {
         //构建查询条件
         LambdaQueryWrapper<KwtParkingChargeStrategy> wrapper = buildAndExecuteQuery(param);
 
-        //查询门卫订单
         Page<KwtParkingChargeStrategy> pageByStatus = parkingChangeStrategyRepository.page(new Page<>(param.getPageNum(), param.getPageSize()), wrapper);
         List<KwtParkingChargeStrategy> records = pageByStatus.getRecords();
         if (CollectionUtils.isEmpty(records)) {
-            log.info("当前收费策略信息");
+            log.info("收费策略信息");
             return PageDataResult.empty(param.getPageNum(), param.getPageSize());
         }
         List<ParkingChangeStrategyResp> changeStrategyRespList = getChangeStrategyPageResult(records);
@@ -125,7 +124,7 @@ public class ParkingChangeStrategyService {
                     return resp;
                 }).collect(Collectors.toList());
 
-        log.info("收费策略查询结束,size:{}", JSON.toJSONString(changeStrategyList.size()));
+        log.info("收费策略查询结束,size:{}", changeStrategyList.size());
         return changeStrategyList;
 
     }
@@ -169,7 +168,7 @@ public class ParkingChangeStrategyService {
         log.info("删除收费策略,id:{}", id);
         // 新增
         if (id == null) {
-            throw new BusinessPlatfromException(ErrorCodeEnum.DRIVER_NOT_FOUND, "id不存在");
+            throw new BusinessPlatfromException(ErrorCodeEnum.DRIVER_NOT_FOUND, "id不能为空");
         }
         KwtParkingChargeStrategy changeStrategy = parkingChangeStrategyRepository.getById(id);
         if (changeStrategy == null) {
@@ -198,8 +197,7 @@ public class ParkingChangeStrategyService {
                     resp.setEntId(unit.getEntId());
 
                     // 查询企业名称
-                    EntCacheResDto entCacheResDto = remoteSystemService.queryEntDetails(unit.getEntId());
-                    resp.setEntName(entCacheResDto.getFirmName());
+                    resp.setEntName(getEntName(unit.getEntId()));
                     return resp;
                 }).collect(Collectors.toList());
     }
@@ -210,11 +208,12 @@ public class ParkingChangeStrategyService {
      */
     public void saveChangeStrategyEnt(ParkingChangeStrategyUnitSaveParam param) {
         log.info("保存单位分配,param:{}", JSON.toJSONString(param));
-        // 如果企业id为空,删除所以的单位关联关系
-        if (CollectionUtils.isEmpty(param.getEntIds())) {
-            parkingChangeStrategyUnitRepository.deleteByStrategyId(param.getStrategyId());
-        } else {
-            parkingChangeStrategyUnitRepository.deleteByStrategyId(param.getStrategyId());
+
+        // 先清空
+        parkingChangeStrategyUnitRepository.deleteByStrategyId(param.getStrategyId());
+
+        // 如果企业id不为空,构建新列表并批量插入
+        if (CollectionUtils.isNotEmpty(param.getEntIds())) {
             // 构建关联表实体列表
             List<KwtParkingChargeStrategyUnit> insertList = param.getEntIds().stream()
                     .map(entId -> {
@@ -230,4 +229,17 @@ public class ParkingChangeStrategyService {
         }
     }
 
+    /**
+     * 通过企业id查询企业名称
+     * @param entId
+     */
+    private String getEntName(Long entId) {
+        // 查询企业名称
+        EntCacheResDto entCacheResDto = remoteSystemService.queryEntDetails(entId);
+        if (entCacheResDto == null) {
+            return null;
+        }
+        return entCacheResDto.getFirmName();
+    }
+
 }

+ 269 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/ParkingWalletFeeService.java

@@ -1,13 +1,37 @@
 package com.sckw.transport.service;
 
 
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sckw.core.common.enums.enums.ErrorCodeEnum;
+import com.sckw.core.exception.BusinessPlatfromException;
+import com.sckw.core.utils.CollectionUtils;
+import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.system.api.RemoteSystemService;
+import com.sckw.system.api.model.dto.res.EntCacheResDto;
+import com.sckw.transport.model.KwtParkingWalletFee;
+import com.sckw.transport.model.KwtParkingWalletFeeBalance;
+import com.sckw.transport.model.ParkingWalletFeeSaveParam;
+import com.sckw.transport.model.ParkingWalletFeeTotalQueryParam;
+import com.sckw.transport.model.enuma.WalletTypEnum;
+import com.sckw.transport.model.param.ParkingWalletFeeBalanceQueryParam;
+import com.sckw.transport.model.param.ParkingWalletFeeBalanceResp;
+import com.sckw.transport.model.param.ParkingWalletFeeQueryParam;
+import com.sckw.transport.model.param.ParkingWalletFeeResp;
 import com.sckw.transport.repository.KwtParkingWalletFeeBalanceRepository;
 import com.sckw.transport.repository.KwtParkingWalletFeeRepository;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * Author: donglang
@@ -21,7 +45,6 @@ import org.springframework.stereotype.Service;
 @RequiredArgsConstructor
 public class ParkingWalletFeeService {
 
-
     private final KwtParkingWalletFeeRepository parkingWalletFeeRepository;
     private final KwtParkingWalletFeeBalanceRepository parkingWalletFeeBalanceRepository;
 
@@ -29,5 +52,250 @@ public class ParkingWalletFeeService {
    RemoteSystemService remoteSystemService;
 
 
+    /**
+     * 查询汇总服务费
+     * @param param
+     */
+    public ParkingWalletFeeResp queryTotalServerFee(ParkingWalletFeeTotalQueryParam param) {
+        log.info("查询汇总服务费:{}", JSON.toJSONString(param));
+        //构建查询条件
+        LambdaQueryWrapper<KwtParkingWalletFee> wrapper = buildAndExecuteQuery(param);
+
+        // 初始化
+        ParkingWalletFeeResp resp = new ParkingWalletFeeResp();
+        resp.setServiceFeeBalance(BigDecimal.ZERO);
+        resp.setTradingAmount(BigDecimal.ZERO);
+
+        List<KwtParkingWalletFee> records = parkingWalletFeeRepository.list(wrapper);
+        if (CollectionUtils.isEmpty(records)) {
+            log.info("汇总服务费信息为空");
+            return resp;
+        }
+        // 查询采购商汇总服务费
+        if (param.getProEntId() != null) {
+            return getProWalletFee(records.get(0));
+        }
+        // 查询平台汇总服务费
+        if (param.getSupEntId() != null) {
+            return getSupWalletFee(records);
+        }
+        return resp;
+    }
+
+    /**
+     * 构建查询条件并执行分页查询
+     */
+    private LambdaQueryWrapper<KwtParkingWalletFee> buildAndExecuteQuery(ParkingWalletFeeTotalQueryParam param) {
+        return  Wrappers.<KwtParkingWalletFee>lambdaQuery()
+                .eq(param.getProEntId() != null, KwtParkingWalletFee::getProEntId, param.getProEntId())
+                .eq(param.getSupEntId() != null, KwtParkingWalletFee::getSupEntId, param.getSupEntId())
+                .orderByDesc(KwtParkingWalletFee::getUpdateTime);
+    }
+
+    /**
+     * 获取采购商汇总服务费
+     * @param fee
+     */
+    private ParkingWalletFeeResp getProWalletFee(KwtParkingWalletFee fee) {
+        log.info("开始汇总采购商服务费,param:{}", JSON.toJSONString(fee));
+
+        ParkingWalletFeeResp resp = new ParkingWalletFeeResp();
+        resp.setServiceFeeBalance(fee.getServiceFeeBalance() != null ? fee.getServiceFeeBalance() : BigDecimal.ZERO);
+        resp.setTradingAmount(fee.getTradingAmount() != null ? fee.getTradingAmount() : BigDecimal.ZERO);
+        log.info("汇总采购商服务费结束,总余额:{}, 总履约中金额:{}", fee.getServiceFeeBalance(), fee.getTradingAmount());
+        return resp;
+
+    }
+
+    /**
+     * 获取平台汇总服务费
+     * @param feeList
+     */
+    private ParkingWalletFeeResp getSupWalletFee(List<KwtParkingWalletFee> feeList) {
+        log.info("开始汇总平台服务费, size:{}", CollectionUtils.isEmpty(feeList) ? 0 : feeList.size());
+        // 汇总余额
+        BigDecimal totalServiceFee  = feeList.stream()
+                .map(fee -> fee.getServiceFeeBalance() != null ? fee.getServiceFeeBalance() : BigDecimal.ZERO)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        // 汇总冻结金额
+        BigDecimal totalTradingAmount   = feeList.stream()
+                .map(fee -> fee.getTradingAmount() != null ? fee.getTradingAmount() : BigDecimal.ZERO)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        ParkingWalletFeeResp resp = new ParkingWalletFeeResp();
+        resp.setServiceFeeBalance(totalServiceFee);
+        resp.setTradingAmount(totalTradingAmount);
+        log.info("汇总平台服务费结束,总余额:{}, 总履约中金额:{}", totalServiceFee, totalTradingAmount);
+        return resp;
+    }
+
+
+    /**
+     * 分页查询服务费
+     * @param param
+     */
+    public PageDataResult<ParkingWalletFeeResp> pageQueryServerFee(ParkingWalletFeeQueryParam param) {
+        log.info("分页查询服务费:{}", JSON.toJSONString(param));
+
+        //构建查询条件
+        LambdaQueryWrapper<KwtParkingWalletFee> wrapper = buildAndExecuteQuery(param);
+
+        Page<KwtParkingWalletFee> pageByStatus = parkingWalletFeeRepository.page(new Page<>(param.getPageNum(), param.getPageSize()), wrapper);
+        List<KwtParkingWalletFee> records = pageByStatus.getRecords();
+        if (CollectionUtils.isEmpty(records)) {
+            log.info("服务费信息为空");
+            return PageDataResult.empty(param.getPageNum(), param.getPageSize());
+        }
+        List<ParkingWalletFeeResp> changeStrategyRespList = getWalletFeePageResult(records);
+        return PageDataResult.success(param.getPageNum(), param.getPageSize(), pageByStatus.getTotal(), changeStrategyRespList);
+    }
+
+
+    /**
+     * 构建查询条件并执行分页查询
+     */
+    private LambdaQueryWrapper<KwtParkingWalletFee> buildAndExecuteQuery(ParkingWalletFeeQueryParam param) {
+        return  Wrappers.<KwtParkingWalletFee>lambdaQuery()
+                .eq(param.getSupEntId() != null, KwtParkingWalletFee::getSupEntId, param.getSupEntId())
+                .eq(param.getProEntId() != null, KwtParkingWalletFee::getProEntId, param.getProEntId())
+                .orderByDesc(KwtParkingWalletFee::getUpdateTime);
+    }
+
+    /**
+     * 获取收费策略
+     * @param records
+     */
+    private List<ParkingWalletFeeResp> getWalletFeePageResult(List<KwtParkingWalletFee> records) {
+        log.info("组装服务费,param:{}", JSON.toJSONString(records));
+        if (CollectionUtils.isEmpty(records)) {
+            return Collections.emptyList();
+        }
+        List<ParkingWalletFeeResp> walletFeeList = records.stream()
+                .map(fee -> {
+                    ParkingWalletFeeResp resp = new ParkingWalletFeeResp();
+                    resp.setId(fee.getId());
+                    resp.setProEntId(fee.getProEntId());
+                    resp.setProEntName(null);
+                    resp.setSupEntId(fee.getSupEntId());
+                    resp.setSupEntName(null);
+                    resp.setServiceFeeBalance(fee.getServiceFeeBalance());
+                    resp.setTradingAmount(fee.getTradingAmount());
+                    resp.setUpdateTime(fee.getUpdateTime());
+                    return resp;
+                }).collect(Collectors.toList());
+
+        log.info("组装服务费结束,size:{}", JSON.toJSONString(walletFeeList.size()));
+        return walletFeeList;
+    }
+
+
+    /**
+     * 保存服务费
+     * @param param
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void saveServerFee(ParkingWalletFeeSaveParam param) {
+        log.info("保存服务费,param:{}", JSON.toJSONString(param));
+        KwtParkingWalletFee walletFee = parkingWalletFeeRepository.getById(param.getId());
+        if (walletFee == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.DRIVER_NOT_FOUND, "服务费信息不存在");
+        }
+        // 1. 先修改服务余额
+        walletFee.setServiceFeeBalance(walletFee.getServiceFeeBalance().add(param.getServiceFee()));
+        parkingWalletFeeRepository.updateById(walletFee);
+
+        // 2.新增明细
+        KwtParkingWalletFeeBalance feeBalance = new KwtParkingWalletFeeBalance();
+        feeBalance.setProEntId(param.getEntId());
+        feeBalance.setTradeType(9);
+        feeBalance.setTradeAmount(param.getServiceFee());
+        feeBalance.setServiceFeeBalance(walletFee.getServiceFeeBalance());
+        feeBalance.setTradingAmount(walletFee.getTradingAmount());
+        feeBalance.setVoucherUrl(param.getVoucherUrl());
+        feeBalance.setRemark(param.getRemark());
+        parkingWalletFeeBalanceRepository.save(feeBalance);
+    }
+
+    /**
+     * 分页查询服务费明细
+     * @param param
+     */
+    public PageDataResult<ParkingWalletFeeBalanceResp> pageQueryServerFeeDetails(ParkingWalletFeeBalanceQueryParam param) {
+        log.info("分页查询服务费明细:{}", JSON.toJSONString(param));
+
+        //构建查询条件
+        LambdaQueryWrapper<KwtParkingWalletFeeBalance> wrapper = buildAndExecuteQuery(param);
+
+        Page<KwtParkingWalletFeeBalance> pageByStatus = parkingWalletFeeBalanceRepository.page(new Page<>(param.getPageNum(), param.getPageSize()), wrapper);
+        List<KwtParkingWalletFeeBalance> records = pageByStatus.getRecords();
+        if (CollectionUtils.isEmpty(records)) {
+            log.info("分页查询服务费明细为空");
+            return PageDataResult.empty(param.getPageNum(), param.getPageSize());
+        }
+        List<ParkingWalletFeeBalanceResp> changeStrategyRespList = getWalletFeeBalancePageResult(records);
+        return PageDataResult.success(param.getPageNum(), param.getPageSize(), pageByStatus.getTotal(), changeStrategyRespList);
+    }
+
+
+    /**
+     * 构建查询条件并执行分页查询
+     */
+    private LambdaQueryWrapper<KwtParkingWalletFeeBalance> buildAndExecuteQuery(ParkingWalletFeeBalanceQueryParam param) {
+        return  Wrappers.<KwtParkingWalletFeeBalance>lambdaQuery()
+                .eq(param.getSupEntId() != null, KwtParkingWalletFeeBalance::getSupEntId, param.getSupEntId())
+                .eq(param.getProEntId() != null, KwtParkingWalletFeeBalance::getProEntId, param.getProEntId())
+                .eq(KwtParkingWalletFeeBalance::getOrderNo, param.getOrderNo())
+                .eq(KwtParkingWalletFeeBalance::getTradeType, param.getTradeType())
+                .ge(KwtParkingWalletFeeBalance::getTradeAmount, param.getMinFee())
+                .le(KwtParkingWalletFeeBalance::getTradeAmount, param.getMaxFee())
+                .ge(KwtParkingWalletFeeBalance::getCreateTime, param.getStartCreateTime())
+                .le(KwtParkingWalletFeeBalance::getCreateTime, param.getEndCreateTime())
+                .orderByDesc(KwtParkingWalletFeeBalance::getServiceFeeBalance);
+    }
+
+    /**
+     * 获取服务费明细
+     * @param records
+     */
+    private List<ParkingWalletFeeBalanceResp> getWalletFeeBalancePageResult(List<KwtParkingWalletFeeBalance> records) {
+        log.info("组装服务费明细,param:{}", JSON.toJSONString(records));
+        if (CollectionUtils.isEmpty(records)) {
+            return Collections.emptyList();
+        }
+        List<ParkingWalletFeeBalanceResp> walletFeeList = records.stream()
+                .map(feeBalance -> {
+                    ParkingWalletFeeBalanceResp resp = new ParkingWalletFeeBalanceResp();
+                    resp.setId(feeBalance.getId());
+                    resp.setOrderNo(feeBalance.getOrderNo());
+                    resp.setProEntId(feeBalance.getProEntId());
+                    resp.setProEntName(getEntName(feeBalance.getProEntId()));
+                    resp.setSupEntId(feeBalance.getSupEntId());
+                    resp.setSupEntName(getEntName(feeBalance.getSupEntId()));
+                    resp.setTradeType(feeBalance.getTradeType());
+                    resp.setTradeTypeDesc(WalletTypEnum.getDescByCode(feeBalance.getTradeType()));
+                    resp.setTradeAmount(feeBalance.getTradeAmount());
+                    resp.setServiceFeeBalance(feeBalance.getServiceFeeBalance());
+                    resp.setTradingAmount(feeBalance.getTradingAmount());
+                    resp.setVoucherUrl(feeBalance.getVoucherUrl());
+                    resp.setRemark(feeBalance.getRemark());
+                    resp.setCreateTime(feeBalance.getCreateTime());
+                    return resp;
+                }).collect(Collectors.toList());
+
+        log.info("组装服务费明细结束,size:{}", JSON.toJSONString(walletFeeList.size()));
+        return walletFeeList;
+    }
+
+    /**
+     * 通过企业id查询企业名称
+     * @param entId
+     */
+    private String getEntName(Long entId) {
+        // 查询企业名称
+        EntCacheResDto entCacheResDto = remoteSystemService.queryEntDetails(entId);
+        if (entCacheResDto == null) {
+            return null;
+        }
+        return entCacheResDto.getFirmName();
+    }
 
 }

+ 3 - 1
sql/2026/01/2026_01_06_donglang_create.sql

@@ -129,9 +129,9 @@ create table kwt_parking_charge_strategy_unit
 CREATE TABLE `kwt_parking_wallet_fee` (
                                   `id`                            bigint          NOT NULL AUTO_INCREMENT COMMENT '主键',
                                   `pro_ent_id`                    bigint          NOT NULL DEFAULT '-1' COMMENT '采购商企业id',
+                                  `sup_ent_id`                    bigint          NOT NULL DEFAULT '-1' COMMENT '供应商企业id',
                                   `service_fee_balance`           decimal(16,2)   NOT NULL DEFAULT '0.00' COMMENT '服务费余额',
                                   `trading_amount`                decimal(16,2)   NOT NULL DEFAULT '0.00' COMMENT '履约中金额',
-                                  `voucher_url`                   longtext        CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '凭证图片',
                                   `remark`                        varchar(20)     DEFAULT NULL DEFAULT '' COMMENT '备注',
                                   del_flag                        int             NOT NULL DEFAULT '0' COMMENT '是否删除(0未删除,1删除)',
                                   create_time                     datetime        NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
@@ -146,10 +146,12 @@ CREATE TABLE `kwt_parking_wallet_fee_balance` (
                                           `id`                            bigint          NOT NULL AUTO_INCREMENT COMMENT '主键',
                                           `order_no`                      varchar(32)     CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '关联订单编号',
                                           `pro_ent_id`                    bigint          NOT NULL DEFAULT '-1' COMMENT '采购商企业id',
+                                          `sup_ent_id`                    bigint          NOT NULL DEFAULT '-1' COMMENT '供应商企业id',
                                           `trade_type`                    int             NOT NULL DEFAULT '0' COMMENT '交易类型 2-预付 3-收益 4-冻结 5-解冻 6-消费 9-人工录入',
                                           `trade_amount`                  decimal(16,2)   NOT NULL DEFAULT '0.00' COMMENT '交易金额',
                                           `service_fee_balance`           decimal(16,2)   NOT NULL DEFAULT '0.00' COMMENT '服务费余额',
                                           `trading_amount`                decimal(16,2)   NOT NULL DEFAULT '0.00' COMMENT '履约中金额',
+                                          `voucher_url`                   longtext        CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '凭证图片',
                                           `remark`                        varchar(20)     DEFAULT NULL DEFAULT '' COMMENT '备注',
                                           del_flag                        int             NOT NULL DEFAULT '0' COMMENT '是否删除(0未删除,1删除)',
                                           create_time                     datetime        NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',