igl 6 months ago
parent
commit
bb30925c91
37 changed files with 1068 additions and 325 deletions
  1. 10 6
      vehicle-client/src/main/java/com/chelvc/cloud/vehicle/client/AssetClient.java
  2. 18 0
      vehicle-client/src/main/java/com/chelvc/cloud/vehicle/client/OmsOrderClient.java
  3. 8 4
      vehicle-client/src/main/java/com/chelvc/cloud/vehicle/client/constant/TradeConstant.java
  4. 9 1
      vehicle-client/src/main/java/com/chelvc/cloud/vehicle/client/dto/BalanceDetailDTO.java
  5. 78 0
      vehicle-client/src/main/java/com/chelvc/cloud/vehicle/client/dto/BalanceRecordDTO.java
  6. 30 0
      vehicle-client/src/main/java/com/chelvc/cloud/vehicle/client/param/OrderRefundParam.java
  7. 30 0
      vehicle-client/src/main/java/com/chelvc/cloud/vehicle/client/param/TransferParam.java
  8. 13 8
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/controller/AssetController.java
  9. 21 6
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/controller/OmsOrderController.java
  10. 13 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/AssetMapper.java
  11. 8 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/BalanceDetailMapper.java
  12. 2 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/GoodsAssessMapper.java
  13. 1 1
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/OmsOrderMapper.java
  14. 2 3
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/OmsOrderRefundMapper.java
  15. 10 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/OmsTransferWithdrawMapper.java
  16. 13 1
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/BalanceDetail.java
  17. 4 1
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/OmsOrder.java
  18. 39 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/OmsOrderRefund.java
  19. 6 7
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/OmsTransferWithdraw.java
  20. 2 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/handle/CustomConfig.java
  21. 28 3
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/AssetService.java
  22. 19 4
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/BalanceDetailService.java
  23. 16 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/OmsOrderRefundService.java
  24. 6 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/OmsOrderService.java
  25. 19 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/OmsTransferWithdrawService.java
  26. 0 15
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/OmsWithdrawService.java
  27. 1 2
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/OnlinePayService.java
  28. 225 119
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/AssetServiceImpl.java
  29. 88 8
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/BalanceDetailServiceImpl.java
  30. 29 14
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/OderHandleServiceImpl.java
  31. 64 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/OmsOrderRefundServiceImpl.java
  32. 100 17
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/OmsOrderServiceImpl.java
  33. 86 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/OmsTransferWithdrawServiceImpl.java
  34. 0 62
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/OmsWithdrawServiceImpl.java
  35. 39 40
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/OnlinePayServiceImpl.java
  36. 13 0
      vehicle-server/src/main/resources/mapper/BalanceDetailMapper.xml
  37. 18 3
      vehicle-server/src/main/resources/mapper/OmsOrderMapper.xml

+ 10 - 6
vehicle-client/src/main/java/com/chelvc/cloud/vehicle/client/AssetClient.java

@@ -1,9 +1,7 @@
 package com.chelvc.cloud.vehicle.client;
 
 import com.chelvc.cloud.vehicle.client.dto.MerchantAssetDTO;
-import com.chelvc.cloud.vehicle.client.param.TransferNotifyParam;
-import com.chelvc.cloud.vehicle.client.param.WithdrawNotifyParam;
-import com.chelvc.cloud.vehicle.client.param.WithdrawParam;
+import com.chelvc.cloud.vehicle.client.param.*;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.cloud.openfeign.SpringQueryMap;
 import org.springframework.http.MediaType;
@@ -16,11 +14,17 @@ public interface AssetClient {
     MerchantAssetDTO getMerchantAsset(@RequestParam("merchantId") Long merchantId);
 
     @PutMapping(value = "/asset/withdraw")
-    void withdraw(@RequestBody WithdrawParam param);
+    void withdrawApply(@RequestBody WithdrawParam param);
 
     @PostMapping(value = "/asset/withdraw/notify")
-    void withdrawNotify(@RequestBody WithdrawNotifyParam param);
+    void withdrawNotify(@RequestBody SxyNotifyParam param);
 
     @PostMapping(value = "/asset/transfer/notify")
-    void transferNotify(@RequestBody TransferNotifyParam param);
+    void transferNotify(@RequestBody SxyNotifyParam param);
+
+    /**
+     * 手动转账接口
+     */
+    @PostMapping("/asset/transfer")
+    void transfer(@RequestBody TransferParam param);
 }

+ 18 - 0
vehicle-client/src/main/java/com/chelvc/cloud/vehicle/client/OmsOrderClient.java

@@ -5,12 +5,16 @@ import com.chelvc.cloud.vehicle.client.dto.OmsOrderDTO;
 import com.chelvc.cloud.vehicle.client.dto.OmsOrderDetailDTO;
 import com.chelvc.cloud.vehicle.client.param.OmsOrderModifyParam;
 import com.chelvc.cloud.vehicle.client.param.OrderPagingParam;
+import com.chelvc.cloud.vehicle.client.param.OrderRefundParam;
 import com.chelvc.cloud.vehicle.client.param.SxyNotifyParam;
 import com.chelvc.framework.common.model.Pagination;
 import com.chelvc.framework.wechat.WechatUnifiedOrder;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.cloud.openfeign.SpringQueryMap;
 import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.constraints.NotNull;
 import java.util.Map;
 
 /**
@@ -133,4 +137,18 @@ public interface OmsOrderClient {
      */
     @PostMapping("/order/notify")
     void orderNotify(@RequestBody SxyNotifyParam param);
+
+    /**
+     * 退款申请
+     * @param param 查询参数
+     * @return
+     */
+    @PostMapping("/order/refund")
+    void orderRefund(@RequestBody OrderRefundParam param);
+
+    /**
+     * 退款申请回调
+     */
+    @PostMapping("/order/refund/notify")
+    void orderRefundNotify(@RequestBody SxyNotifyParam param);
 }

+ 8 - 4
vehicle-client/src/main/java/com/chelvc/cloud/vehicle/client/constant/TradeConstant.java

@@ -23,7 +23,7 @@ public interface TradeConstant {
     /**
      * 提现回调通知地址
      */
-    static final String WITHDRAW_NOTIFY_URL = "https://demo.5upay.com/sdk/onlinepay/notify";
+    static final String WITHDRAW_NOTIFY_URL = "http://igl611.a1.luyouxia.net:20487/maintain/asset/withdraw/notify";
 
     /**
      * 商户入网回调地址
@@ -38,7 +38,7 @@ public interface TradeConstant {
     /**
      * 转账回调地址
      */
-    static final String TRANSFER_NOTIFY_URL = "";
+    static final String TRANSFER_NOTIFY_URL = "http://igl611.a1.luyouxia.net:20487/maintain/asset/transfer/notify";
 
     /**
      * 转账地址
@@ -48,11 +48,15 @@ public interface TradeConstant {
     /**
      * 下单通知地址
      */
-    static final String ORDER_NOTIFY_URL = "http://igl611.a1.luyouxia.net:20487";
+    static final String ORDER_NOTIFY_URL = "http://igl611.a1.luyouxia.net:20487/maintain/order/notify";
     /**
      * 下单回调地址
      */
-    static final String ORDER_CALLBACKURL = "http://igl611.a1.luyouxia.net:20487/maintain/order/notify";
+    static final String ORDER_CALLBACK_URL = "http://igl611.a1.luyouxia.net:20487/maintain/order/notify";
+    /**
+     * 退款回调地址
+     */
+    static final String ORDER_REFUND_URL = "http://igl611.a1.luyouxia.net:20487/maintain/order/refund/notify";
     /**
      * (直连) 	微信小程序
      */

+ 9 - 1
vehicle-client/src/main/java/com/chelvc/cloud/vehicle/client/dto/BalanceDetailDTO.java

@@ -27,13 +27,21 @@ public class BalanceDetailDTO implements Serializable {
      */
     private Integer type;
     /**
-     * 操作类型:1-订单收益;2-提现
+     * 操作类型:0-商品出售;1-用户分佣;2-商户分佣;3-平台分佣;4-提现
      */
     private Integer operateType;
     /**
      * 操作金额
      */
     private BigDecimal operateAmount;
+    /**
+     * 扣除金额:提现-手续费;分佣扣税
+     */
+    private BigDecimal deduct;
+    /**
+     * 实际金额
+     */
+    private BigDecimal realityAmount;
     /**
      * 剩余金额
      */

+ 78 - 0
vehicle-client/src/main/java/com/chelvc/cloud/vehicle/client/dto/BalanceRecordDTO.java

@@ -0,0 +1,78 @@
+package com.chelvc.cloud.vehicle.client.dto;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 收益流水记录表数据模型
+ *
+ * @author liude
+ * @date 2024/03/15
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+public class BalanceRecordDTO implements Serializable {
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 用户id
+     */
+    private Long userId;
+
+    /**
+     * 类型:0-平台;1-用户;2-商户
+     */
+    private Integer type;
+
+    /**
+     * 账单类型:0-收入;1-支出
+     */
+    private Integer currencyType;
+
+    /**
+     * 订单标识
+     */
+    private Long orderId;
+
+    /**
+     * 来源用户
+     */
+    private Long sourceUserId;
+
+    /**
+     * 类型:-1-提现;0-商品出售;1-用户分佣;2-商户分佣;3-平台分佣;4-商家所得
+     */
+    private Integer sourceType;
+    /**
+     * 操作金额
+     */
+    private BigDecimal amount;
+    /**
+     * 扣除金额:提现-手续费;分佣扣税
+     */
+    private BigDecimal deduct;
+    /**
+     * 实际金额
+     */
+    private BigDecimal realityAmount;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+
+}

+ 30 - 0
vehicle-client/src/main/java/com/chelvc/cloud/vehicle/client/param/OrderRefundParam.java

@@ -0,0 +1,30 @@
+package com.chelvc.cloud.vehicle.client.param;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+public class OrderRefundParam {
+    /**
+     * 订单id
+     */
+    @NotNull(message = "订单不能为空")
+    private Long orderId;
+
+    /**
+     * 退款原因
+     */
+    private String reason;
+
+    /**
+     * 凭证图片,以逗号隔开
+     */
+    private String proofPics;
+}

+ 30 - 0
vehicle-client/src/main/java/com/chelvc/cloud/vehicle/client/param/TransferParam.java

@@ -0,0 +1,30 @@
+package com.chelvc.cloud.vehicle.client.param;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 转账参数接口
+ */
+@Data
+public class TransferParam implements Serializable {
+
+    private static final long serialVersionUID = 36825608564571605L;
+
+    /**
+     * 目标id: 用户-userId; 商户-merchantId
+     */
+    private Long targetUserId;
+
+    /**
+     * 类型:1-用户;2-商户
+     */
+    private Integer type;
+
+    /**
+     * 转账金额
+     */
+    private BigDecimal amount;
+}

+ 13 - 8
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/controller/AssetController.java

@@ -1,11 +1,8 @@
 package com.chelvc.cloud.vehicle.server.controller;
 
 import com.chelvc.cloud.vehicle.client.dto.MerchantAssetDTO;
-import com.chelvc.cloud.vehicle.client.param.TransferNotifyParam;
-import com.chelvc.cloud.vehicle.client.param.WithdrawNotifyParam;
-import com.chelvc.cloud.vehicle.client.param.WithdrawParam;
+import com.chelvc.cloud.vehicle.client.param.*;
 import com.chelvc.cloud.vehicle.server.service.AssetService;
-import com.chelvc.framework.base.context.SessionContextHolder;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -27,8 +24,8 @@ public class AssetController {
      * @param param
      */
     @PutMapping("/asset/withdraw")
-    public void withdraw(@RequestBody WithdrawParam param) {
-        this.assetService.withdraw(param);
+    public void withdrawApply(@RequestBody WithdrawParam param) {
+        this.assetService.withdrawApply(param);
     }
 
     /**
@@ -37,7 +34,7 @@ public class AssetController {
      * @param param
      */
     @PostMapping("/asset/withdraw/notify")
-    public void withdrawNotify(@RequestBody WithdrawNotifyParam param) {
+    public void withdrawNotify(@RequestBody SxyNotifyParam param) {
         this.assetService.withdrawNotify(param);
     }
 
@@ -46,7 +43,15 @@ public class AssetController {
      *
      */
     @PostMapping("/asset/transfer/notify")
-    public void transferNotify(@RequestBody TransferNotifyParam param) {
+    public void transferNotify(@RequestBody SxyNotifyParam param) {
         this.assetService.transferNotify(param);
     }
+
+    /**
+     * 手动转账接口
+     */
+    @PostMapping("/asset/transfer")
+    public void transfer(@RequestBody TransferParam param){
+        this.assetService.transfer(0L, param.getTargetUserId(), param.getType(), param.getAmount());
+    }
 }

+ 21 - 6
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/controller/OmsOrderController.java

@@ -7,20 +7,17 @@ import com.chelvc.cloud.vehicle.client.dto.OmsOrderDTO;
 import com.chelvc.cloud.vehicle.client.dto.OmsOrderDetailDTO;
 import com.chelvc.cloud.vehicle.client.param.OmsOrderModifyParam;
 import com.chelvc.cloud.vehicle.client.param.OrderPagingParam;
+import com.chelvc.cloud.vehicle.client.param.OrderRefundParam;
 import com.chelvc.cloud.vehicle.client.param.SxyNotifyParam;
 import com.chelvc.cloud.vehicle.server.service.OmsOrderService;
 import com.chelvc.framework.common.model.Pagination;
 import com.chelvc.framework.wechat.WechatUnifiedOrder;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.validation.constraints.NotNull;
 
 /**
  * 订单Service接口
@@ -176,4 +173,22 @@ public class OmsOrderController {
     public void orderNotify(@RequestBody SxyNotifyParam param){
         omsOrderService.orderNotify(param);
     }
+
+    /**
+     * 退款申请
+     * @param param 参数
+     * @return
+     */
+    @PostMapping("/order/refund")
+    public void orderRefund(@RequestBody OrderRefundParam param) {
+        omsOrderService.orderRefund(param);
+    }
+
+    /**
+     * 退款申请回调
+     */
+    @PostMapping("/order/refund/notify")
+    public void orderRefundNotify(@RequestBody SxyNotifyParam param){
+        omsOrderService.orderRefundNotify(param);
+    }
 }

+ 13 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/AssetMapper.java

@@ -3,6 +3,7 @@ package com.chelvc.cloud.vehicle.server.dao;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.chelvc.cloud.vehicle.server.entity.Asset;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
 
 import java.math.BigDecimal;
@@ -22,4 +23,16 @@ public interface AssetMapper extends BaseMapper<Asset> {
 
     @Update("update asset set frozen = frozen - #{amount}, update_time = #{now} where user_id = #{userId} and type = #{type}")
     int deductFrozen(BigDecimal amount, Long userId, Integer type, LocalDateTime now);
+
+    @Update("update asset set total = total + #{amount}, update_time = #{now} where user_id = #{userId} and type = #{type}")
+    int addAmount(Long userId, Integer type, BigDecimal amount, LocalDateTime now);
+
+    @Update("update asset set total = total - #{amount}, update_time = #{now} where user_id = #{userId} and type = #{type}")
+    int reduceAmount(Long userId, Integer type, BigDecimal amount, LocalDateTime now);
+
+    @Update("update asset set frozen = frozen - #{payAmount} where user_id = #{userId} and type = #{type}")
+    int reduceFrozenAsset(BigDecimal payAmount, Long userId, Integer type);
+
+    @Select("select total from asset where user_id = #{userId} and type = #{type}")
+    BigDecimal queryTotal(Long userId, Integer type);
 }

+ 8 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/BalanceDetailMapper.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.chelvc.cloud.vehicle.client.dto.BalanceDetailDTO;
+import com.chelvc.cloud.vehicle.client.dto.EarningsDTO;
 import com.chelvc.cloud.vehicle.client.dto.WalletDTO;
 import com.chelvc.cloud.vehicle.server.entity.BalanceDetail;
 import org.apache.ibatis.annotations.Mapper;
@@ -22,4 +23,11 @@ public interface BalanceDetailMapper extends BaseMapper<BalanceDetail> {
     IPage<BalanceDetailDTO> queryByUserId(@Param("page") Page<BalanceDetailDTO> page, @Param(Constants.WRAPPER) QueryWrapper<BalanceDetail> queryWrapper);
 
     WalletDTO getMerchantAsset(@Param("merchantId") Long merchantId);
+
+    /**
+     * 获取7天收益、总收益、一个月得收益
+     * @param userId
+     * @return
+     */
+    EarningsDTO getBalanceRecord(@Param("userId")Long userId, @Param("type")Integer type);
 }

+ 2 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/GoodsAssessMapper.java

@@ -45,4 +45,6 @@ public interface GoodsAssessMapper extends BaseMapper<GoodsAssess> {
 
     @Select("select * from employee where id = #{id}")
     EmployeeDTO queryEmployeeInfo(@Param("id") Long id);
+
+    int addAmount(Long userId, Integer type, BigDecimal amount);
 }

+ 1 - 1
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/OmsOrderMapper.java

@@ -128,5 +128,5 @@ public interface OmsOrderMapper extends EnhanceMapper<OmsOrder>
 
     Integer countReservationByOrderId(@Param("orderId") Long orderId);
 
-    void updateStatus(@Param("id")Long id, @Param("status")Integer status, @Param("updateTime")Date updateTime);
+    void updateStatus(@Param("id")Long id, @Param("status")Integer status, @Param("feeAmount")BigDecimal feeAmount, @Param("updateTime")Date updateTime);
 }

+ 2 - 3
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/OmsWithdrawMapper.java → vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/OmsOrderRefundMapper.java

@@ -1,10 +1,9 @@
 package com.chelvc.cloud.vehicle.server.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.chelvc.cloud.vehicle.server.entity.OmsWithdraw;
+import com.chelvc.cloud.vehicle.server.entity.OmsOrderRefund;
 import org.apache.ibatis.annotations.Mapper;
 
 @Mapper
-public interface OmsWithdrawMapper extends BaseMapper<OmsWithdraw> {
-
+public interface OmsOrderRefundMapper extends BaseMapper<OmsOrderRefund> {
 }

+ 10 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/OmsTransferWithdrawMapper.java

@@ -0,0 +1,10 @@
+package com.chelvc.cloud.vehicle.server.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.chelvc.cloud.vehicle.server.entity.OmsTransferWithdraw;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface OmsTransferWithdrawMapper extends BaseMapper<OmsTransferWithdraw> {
+
+}

+ 13 - 1
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/BalanceDetail.java

@@ -12,6 +12,7 @@ import lombok.experimental.SuperBuilder;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.util.Date;
 
 @Data
 @SuperBuilder
@@ -28,9 +29,20 @@ public class BalanceDetail implements Entity<Long> {
     private Long orderId;
     private Integer flowType;
     private Long sourceId;
+    /**
+     * 类型:0-商品出售;1-用户分佣;2-商户分佣;3-平台分佣;4-提现
+     */
     private Integer operateType;
     private BigDecimal operateAmount;
+    /**
+     * 扣除金额:提现-手续费;分佣扣税
+     */
+    private BigDecimal deduct;
+    /**
+     * 实际金额
+     */
+    private BigDecimal realityAmount;
     private BigDecimal surplusAmount;
-    private LocalDateTime createTime;
+    private Date createTime;
     private String remark;
 }

+ 4 - 1
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/OmsOrder.java

@@ -49,6 +49,9 @@ public class OmsOrder extends ModifyEntity<Long>
     /** 应付金额(实际支付金额) */
     private BigDecimal payAmount;
 
+    /** 手续费 */
+    private BigDecimal feeAmount;
+
     /** 运费金额 */
     private BigDecimal freightAmount;
 
@@ -70,7 +73,7 @@ public class OmsOrder extends ModifyEntity<Long>
     /** 订单来源:0->PC订单;1->app订单 */
     private Integer sourceType;
 
-    /** 订单状态:0->待付款;1-已付款;2->待发货;3->已发货;4->已完成;5->已关闭;6->无效订单;7->已取消;8->支付失败 */
+    /** 订单状态:0->待付款;1-已付款;2->待发货;3->已发货;4->已完成;5->已关闭;6->无效订单;7->已取消;8->支付失败;9->已退款 */
     private Integer status;
 
     /** 订单类型:0->正常订单;1->秒杀订单 */

+ 39 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/OmsOrderRefund.java

@@ -0,0 +1,39 @@
+package com.chelvc.cloud.vehicle.server.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+import lombok.experimental.SuperBuilder;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString(callSuper = true)
+@TableName(autoResultMap = true)
+
+public class OmsOrderRefund implements Serializable {
+
+    private static final long serialVersionUID = 172335824454121398L;
+
+    @TableId(type = IdType.ASSIGN_ID)
+    private Long id;
+    private Long orderId;
+    private Long userId;
+    private Long merchantId;
+    private BigDecimal refundAmount;
+    //退款状态:0-申请中;1-退款中;2-已退款;3-退款失败
+    private Integer status;
+    private String reason;
+    private String proofPics;
+    private String handleMan;
+    private String handleNote;
+    private Date handleTime;
+    private String serialNumber;
+    private Date createTime;
+}

+ 6 - 7
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/OmsWithdraw.java → vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/OmsTransferWithdraw.java

@@ -3,10 +3,10 @@ package com.chelvc.cloud.vehicle.server.entity;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.chelvc.framework.database.entity.ModifyEntity;
 import lombok.*;
 import lombok.experimental.SuperBuilder;
 
+import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
 
@@ -21,9 +21,8 @@ import java.util.Date;
 @NoArgsConstructor
 @AllArgsConstructor
 @ToString(callSuper = true)
-@EqualsAndHashCode(callSuper = true)
 @TableName(autoResultMap = true)
-public class OmsWithdraw extends ModifyEntity<Long>
+public class OmsTransferWithdraw implements Serializable
 {
     private static final long serialVersionUID = 1L;
 
@@ -49,14 +48,14 @@ public class OmsWithdraw extends ModifyEntity<Long>
     /** 提现金额 */
     private BigDecimal amount;
 
-    /** 应付金额(实际支付金额) */
-    private BigDecimal payAmount;
+    /** 手续费 */
+    private BigDecimal procedureAmount;
 
-    /** 状态:0-体现中;1-成功;2-失败;3-拒绝 */
+    /** 状态:0-体现中;1-成功;2-失败;3-取消;4-拒绝 */
     private Integer status;
 
     /**
-     * 提现时间
+     * 操作时间
      */
     private Date createTime;
 

+ 2 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/handle/CustomConfig.java

@@ -18,8 +18,10 @@ public class CustomConfig {
         map.put("http.content.type.v3", "application/vnd.5upay-v3.0+json");
         map.put("http.content.type.v4", "application/vnd.5upay-v4.0+json");
         map.put("893951545.client.private.key.path", "F:/workspace/after/car/vehicle/vehicle-server/src/main/webapp/cfca/client.pfx");
+        //map.put("893951545.client.private.key.path", "/home/chelvc/cfca/client.pfx");
         map.put("893951545.client.private.key.password", "123456");
         map.put("onlinepay.order.url", "https://apis.5upay.com/onlinePay/order");
+        map.put("transferAccount.order.url", "https://apis.5upay.com/transferAccount/order");
         map.put("onlinepay.query.url", "https://apis.5upay.com/onlinePay/query");
         map.put("ehking.sdk.net.client.defaultConnectTimeout", "30000");
         map.put("ehking.sdk.net.client.defaultReadTimeout", "30000");

+ 28 - 3
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/AssetService.java

@@ -1,6 +1,7 @@
 package com.chelvc.cloud.vehicle.server.service;
 
 import com.chelvc.cloud.vehicle.client.dto.MerchantAssetDTO;
+import com.chelvc.cloud.vehicle.client.param.SxyNotifyParam;
 import com.chelvc.cloud.vehicle.client.param.TransferNotifyParam;
 import com.chelvc.cloud.vehicle.client.param.WithdrawNotifyParam;
 import com.chelvc.cloud.vehicle.client.param.WithdrawParam;
@@ -32,11 +33,35 @@ public interface AssetService {
 
     MerchantAssetDTO getMerchantAsset(Long merchantId);
 
-    void withdraw(WithdrawParam param);
 
-    void withdrawNotify(WithdrawNotifyParam param);
+    void withdrawNotify(SxyNotifyParam param);
 
-    void transferNotify(TransferNotifyParam param);
+    void transferNotify(SxyNotifyParam param);
+    void withdraw(Long userId, Integer type, BigDecimal amount);
 
     void transfer(Long sourceUserId, Long targetUserId, Integer type, BigDecimal amount);
+
+    /**
+     *
+     * @param userId 用户/商户id; 0-平台
+     * @param type 类型:0-平台;1-用户;2-商户
+     * @param operate 0-增加;1-减少
+     * @param amount 金额
+     */
+    int updateAmount(Long userId, Integer type, Integer operate, BigDecimal amount);
+
+    void withdrawApply(WithdrawParam param);
+
+    void reduceFrozenAsset(BigDecimal payAmount, Long userId, Integer type);
+
+    /**
+     * 冻结金额
+     * @param amount
+     * @param userId
+     * @param type
+     * @return
+     */
+    int frozenAmount(BigDecimal amount, Long userId, Integer type);
+
+    BigDecimal queryTotal(Long userId, Integer type);
 }

+ 19 - 4
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/BalanceDetailService.java

@@ -1,12 +1,12 @@
 package com.chelvc.cloud.vehicle.server.service;
 
-import com.chelvc.cloud.vehicle.client.dto.BalanceDetailDTO;
-import com.chelvc.cloud.vehicle.client.dto.WalletDTO;
+import com.chelvc.cloud.vehicle.client.dto.*;
 import com.chelvc.cloud.vehicle.client.param.QueryMerchantBalanceParam;
 import com.chelvc.framework.common.model.Pagination;
 import org.apache.ibatis.annotations.Param;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 public interface BalanceDetailService {
     /**
@@ -15,16 +15,31 @@ public interface BalanceDetailService {
      * @param type 类型:0-平台;1-用户;2-商户
      * @param userId 用户id
      * @param operateAmount 操作金额
+     * @param deduct 扣除金额:提现-手续费;分佣扣税
+     * @param realityAmount 实际金额
      * @param surplusAmount 当前余额
      * @param flowType 流水类型:0-收入;1-支出
-     * @param operateType 操作类型:1-订单收益;2-提现
+     * @param operateType 操作类型:0-商品出售;1-用户分佣;2-商户分佣;3-平台分佣;4-提现;5-用户支付;6-用户核销;7-转账;8-退款
      * @param sourceId 来源id
      */
-    void recordFlow(Long orderId, Integer type,  Long userId, BigDecimal operateAmount, BigDecimal surplusAmount,
+    void recordFlow(Long orderId, Integer type,  Long userId, BigDecimal operateAmount, BigDecimal deduct,
+                    BigDecimal realityAmount, BigDecimal surplusAmount,
                     Integer flowType, Integer operateType, Long sourceId);
 
     Pagination<BalanceDetailDTO> queryByMerchantId(QueryMerchantBalanceParam param, Integer pageNum,
                                                    Integer pageSize, Integer type);
 
     WalletDTO getMerchantAsset(@Param("merchantId") Long merchantId);
+
+    /**
+     * 收益流水记录
+     * @return 收益流水记录列表
+     */
+    List<BalanceRecordDTO> listBalanceRecord(Integer type, Long date);
+
+    /**
+     * 获取用户得总收益、本周收益、本月收益、可提现金额
+     * @return
+     */
+    EarningsDTO getBalanceRecord(Integer type);
 }

+ 16 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/OmsOrderRefundService.java

@@ -0,0 +1,16 @@
+package com.chelvc.cloud.vehicle.server.service;
+
+import com.chelvc.cloud.vehicle.client.param.OrderRefundParam;
+import com.chelvc.cloud.vehicle.server.entity.OmsOrder;
+import com.chelvc.cloud.vehicle.server.entity.OmsOrderRefund;
+
+public interface OmsOrderRefundService {
+
+    Long insert(OmsOrder omsOrder, OrderRefundParam param);
+
+    int updateStatus(Long refundId, Integer status, String cause);
+
+    int updateStatus(Long refundId, Integer status, String cause, String serialNumber);
+
+    OmsOrderRefund queryById(Long id);
+}

+ 6 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/OmsOrderService.java

@@ -4,12 +4,14 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.chelvc.cloud.vehicle.client.dto.*;
 import com.chelvc.cloud.vehicle.client.param.OmsOrderModifyParam;
 import com.chelvc.cloud.vehicle.client.param.OrderPagingParam;
+import com.chelvc.cloud.vehicle.client.param.OrderRefundParam;
 import com.chelvc.cloud.vehicle.client.param.SxyNotifyParam;
 import com.chelvc.cloud.vehicle.server.entity.OmsOrder;
 import com.chelvc.framework.common.model.Pagination;
 import com.chelvc.framework.database.support.EnhanceService;
 import com.chelvc.framework.wechat.WechatUnifiedOrder;
 import com.upay.sdk.onlinepay.builder.OrderResponse;
+import org.springframework.web.bind.annotation.RequestBody;
 
 import java.math.BigDecimal;
 import java.util.Map;
@@ -144,4 +146,8 @@ public interface OmsOrderService extends EnhanceService<OmsOrder>
     void orderCallBacl(OrderResponse orderResponse);
 
     void orderNotify(SxyNotifyParam param);
+
+    void orderRefund(@RequestBody OrderRefundParam param);
+
+    void orderRefundNotify(SxyNotifyParam param);
 }

+ 19 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/OmsTransferWithdrawService.java

@@ -0,0 +1,19 @@
+package com.chelvc.cloud.vehicle.server.service;
+
+import com.chelvc.cloud.vehicle.server.entity.OmsTransferWithdraw;
+
+import java.math.BigDecimal;
+
+public interface OmsTransferWithdrawService {
+    Long createTransferWithdraw(Long userId, Integer type, BigDecimal amount, Integer channel, Integer flag);
+
+    int updateStatusById(Long id, Integer status);
+
+    int updateStatusById(Long id, Integer status, String remark);
+
+    OmsTransferWithdraw queryById(Long id);
+
+    int updateByNotify(Long id, String outOrderId, Integer status, String remark);
+
+    int updateByNotify(Long id, String outOrderId, Integer status, String remark, BigDecimal procedureAmount);
+}

+ 0 - 15
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/OmsWithdrawService.java

@@ -1,15 +0,0 @@
-package com.chelvc.cloud.vehicle.server.service;
-
-import com.chelvc.cloud.vehicle.server.entity.OmsWithdraw;
-
-import java.math.BigDecimal;
-
-public interface OmsWithdrawService {
-    Long createWithdraw(Long userId, Integer type, BigDecimal amount, Integer channel, Integer flag);
-
-    int updateStatusById(Long id, Integer status);
-
-    OmsWithdraw queryById(Long id);
-
-    int updateByNotify(Long id, String outOrderId, Integer status);
-}

+ 1 - 2
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/OnlinePayService.java

@@ -30,9 +30,8 @@ public interface OnlinePayService{
     /**
      * 提交退款申请接口用于商户端通过应用接口程序,实现提交退款申请的业务处理,
      * 首信易支付平台通过JSON格式方式返回退款申请提交的结果响应。其操作功能与现有首信易支付商户后台输入退款申请功能相同。
-     * @param param
      */
-    String refund(OrderReturnApplyModifyParam param);
+    void refund(OmsOrder omsOrder, Long refundId);
 
     /**
      * 商户通过退款订单查询接口查询首信易支付平台的订单退款交易明细。

+ 225 - 119
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/AssetServiceImpl.java

@@ -6,31 +6,41 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.chelvc.cloud.vehicle.client.constant.PlatformConstant;
-import com.chelvc.cloud.vehicle.client.constant.ReserveStatus;
 import com.chelvc.cloud.vehicle.client.constant.TradeConstant;
 import com.chelvc.cloud.vehicle.client.dto.*;
+import com.chelvc.cloud.vehicle.client.param.SxyNotifyParam;
 import com.chelvc.cloud.vehicle.client.param.TransferNotifyParam;
 import com.chelvc.cloud.vehicle.client.param.WithdrawNotifyParam;
 import com.chelvc.cloud.vehicle.client.param.WithdrawParam;
 import com.chelvc.cloud.vehicle.server.dao.AssetMapper;
 import com.chelvc.cloud.vehicle.server.entity.Asset;
 import com.chelvc.cloud.vehicle.server.entity.MerchantRelation;
-import com.chelvc.cloud.vehicle.server.entity.OmsWithdraw;
+import com.chelvc.cloud.vehicle.server.entity.OmsTransferWithdraw;
 import com.chelvc.cloud.vehicle.server.handle.TradeHandle;
 import com.chelvc.cloud.vehicle.server.service.*;
 import com.chelvc.framework.base.context.SessionContextHolder;
 import com.chelvc.framework.common.exception.ResourceUnavailableException;
 import com.chelvc.framework.common.function.Executor;
 import com.chelvc.framework.database.context.DatabaseContextHolder;
+import com.upay.sdk.exception.HmacVerifyException;
+import com.upay.sdk.exception.RequestException;
+import com.upay.sdk.exception.ResponseException;
+import com.upay.sdk.exception.UnknownException;
+import com.upay.sdk.executer.ResultListenerAdpater;
+import com.upay.sdk.transferaccount.builder.OrderBuilder;
+import com.upay.sdk.transferaccount.executer.TransferAccountOrderExecuter;
+import com.upay.sdk.wallet.builder.WithdrawBuilder;
+import com.upay.sdk.wallet.executer.WithdrawExecuter;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.io.IOException;
+import java.io.PrintWriter;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
-import java.util.Date;
 import java.util.HashMap;
 
 @Service
@@ -40,7 +50,7 @@ public class AssetServiceImpl extends ServiceImpl<AssetMapper, Asset> implements
     private final OmsOrderService orderService;
     private final MerchantService merchantService;
     private final MerchantRelationService merchantRelationService;
-    private final OmsWithdrawService withdrawService;
+    private final OmsTransferWithdrawService transferWithdrawService;
 
     @Override
     public Asset queryAsset(Long userId, Integer type) {
@@ -129,7 +139,7 @@ public class AssetServiceImpl extends ServiceImpl<AssetMapper, Asset> implements
     }
 
     @Override
-    public void withdraw(WithdrawParam param) {
+    public void withdrawApply(WithdrawParam param) {
         Integer type = param.getType();
         BigDecimal amount = param.getAmount();
         Long userId = SessionContextHolder.getId();
@@ -137,7 +147,7 @@ public class AssetServiceImpl extends ServiceImpl<AssetMapper, Asset> implements
             throw new ResourceUnavailableException("提现类型错误");
         }
         if(type == 2){
-            //商家
+            //商家
             Long merchantId = param.getMerchantId();
             MerchantDTO merchantDTO = merchantService.queryCheck(merchantId, userId);
             if(merchantDTO == null){
@@ -157,56 +167,85 @@ public class AssetServiceImpl extends ServiceImpl<AssetMapper, Asset> implements
         }
         Long finalUserId = userId;
         DatabaseContextHolder.transactional((Executor) () -> {
-            Long withdrawId = null;
-            JSONObject json = null;
             //生成提现订单
             if(type == 2){
-                withdrawId = withdrawService.createWithdraw(finalUserId, type, amount, 1, 0);
-                //商户提现操作
-                String sxyMerchantId = merchantRelation.getSxyMerchantId();
-                //生成提现参数
-                HashMap<String, Object> map = new HashMap<>();
-                map.put("merchantId", sxyMerchantId);
-                map.put("requestId", withdrawId);
-                map.put("withdrawAmount", amount.multiply(new BigDecimal("100")));
-                map.put("notifyUrl", TradeConstant.WITHDRAW_NOTIFY_URL);
-                map.put("remark", "");
-                Gson gson = new Gson();
-                json = TradeHandle.handle(gson.toJson(map),
-                        TradeConstant.WITHDRAW_URL, sxyMerchantId, TradeConstant.PARTNER_ID);
+                //商户直接提现
+                withdraw(finalUserId, type, amount);
             } else {
                 //用户先转账后提现
-                withdrawId = withdrawService.createWithdraw(finalUserId, 1, amount, 1, 1);
-                MerchantRelation relation = merchantRelationService.queryByUserIdAndType(finalUserId, 1);
-                //生成转账参数
-                HashMap<String, Object> map = new HashMap<>();
-                map.put("merchantId", TradeConstant.PARTNER_ID);
-                map.put("requestId", withdrawId);
-                map.put("receiverId", relation.getSxyMerchantId());
-                map.put("receiverType", "MERCHANT_ACC");
-                map.put("amount", amount.multiply(new BigDecimal("100")));
-                map.put("currency", "CNY");
-                map.put("notifyUrl", TradeConstant.TRANSFER_NOTIFY_URL);
-                map.put("deputeMark", "NOT_DO_DEPUTE");
-                Gson gson = new Gson();
-                json = TradeHandle.handle(gson.toJson(map),
-                        TradeConstant.TRANSFER_URL, relation.getSxyMerchantId(), TradeConstant.PARTNER_ID);
-            }
-            String status = json.getString("status");
-            if(!"SUCCESS".equals(status)){
-                //提现申请失败
-                withdrawService.updateStatusById(withdrawId, 2);
-                return;
-            }
-            //冻结金额
-            int i = baseMapper.updateFrozenAmount(amount, LocalDateTime.now(), finalUserId, type);
-            if(i != 1){
-                withdrawService.updateStatusById(withdrawId, 2);
-                throw new ResourceUnavailableException("提现申请失败");
+                transfer(0L, finalUserId, type, amount);
             }
         });
     }
 
+    @Override
+    public void reduceFrozenAsset(BigDecimal payAmount, Long userId, Integer type) {
+        baseMapper.reduceFrozenAsset(payAmount, userId, type);
+    }
+
+    /**
+     * 提现
+     */
+    @Override
+    public void withdraw(Long userId, Integer type, BigDecimal amount) {
+        Long withdrawId = transferWithdrawService.createTransferWithdraw(userId, type, amount, 1, 0);
+        //查询首信易商户号
+        MerchantRelation relation = merchantRelationService.queryByUserIdAndType(userId, type);
+        if(relation == null){
+            throw new ResourceUnavailableException("请联系管理员开通商户号");
+        }
+        String sxyMerchantId = relation.getSxyMerchantId();
+        //生成提现参数
+        WithdrawBuilder builder = new WithdrawBuilder(sxyMerchantId);
+        builder.setRequestId(String.valueOf(withdrawId))
+                .setPartnerId(TradeConstant.PARTNER_ID)
+                .setWithdrawAmount(String.valueOf(amount.multiply(new BigDecimal("100")).longValue()))
+                .setNotifyUrl(TradeConstant.WITHDRAW_NOTIFY_URL);
+        WithdrawExecuter executer = new WithdrawExecuter();
+        String cause = "";
+        try {
+            executer.bothWithdraw(builder, new ResultListenerAdpater() {
+                @Override
+                public void success(JSONObject jsonObject) {
+                    //冻结金额
+                    int i = frozenAmount(amount, userId, type);
+                    if(i != 1){
+                        transferWithdrawService.updateStatusById(withdrawId, 2, "冻结金额失败");
+                        throw new ResourceUnavailableException("提现申请失败");
+                    }
+                }
+            });
+            return;
+        } catch (ResponseException e) {
+            JSONObject responseData = e.getResponseData();
+            cause = responseData.getString("cause");
+            log.error("transfer order error:", e);
+        } catch (HmacVerifyException e) {
+            cause = "签名验证异常";
+            log.error("transfer order error:", e);
+        } catch (RequestException e) {
+            JSONObject responseData = e.getResponseData();
+            cause = responseData.getString("cause");
+            log.error("transfer order error:", e);
+        } catch (UnknownException e) {
+            cause = "未知异常";
+            log.error("transfer order error:", e);
+        }
+        transferWithdrawService.updateStatusById(withdrawId, 2, cause);
+    }
+
+    public int frozenAmount(BigDecimal amount, Long userId, Integer type) {
+        Asset asset = queryAsset(userId, type);
+        BigDecimal total = asset.getTotal();
+        if(amount.compareTo(total) >= 0){
+            throw new ResourceUnavailableException("余额不足");
+        }
+        asset.setTotal(asset.getTotal().subtract(amount));
+        asset.setFrozen(asset.getFrozen().add(amount));
+        asset.setUpdateTime(LocalDateTime.now());
+        return baseMapper.updateById(asset);
+    }
+
     /**
      * 转账
      * @param sourceUserId
@@ -216,118 +255,185 @@ public class AssetServiceImpl extends ServiceImpl<AssetMapper, Asset> implements
      */
     @Override
     public void transfer(Long sourceUserId, Long targetUserId, Integer type, BigDecimal amount){
-        Long withdrawId = withdrawService.createWithdraw(targetUserId, type, amount, 1, 1);
+        Long transferId = transferWithdrawService.createTransferWithdraw(targetUserId, type, amount, 1, 1);
+        //查询首信易商户号
         MerchantRelation relation = merchantRelationService.queryByUserIdAndType(targetUserId, type);
+        if(relation == null){
+            throw new ResourceUnavailableException("请联系管理员开通商户号");
+        }
         //生成转账参数
-        HashMap<String, Object> map = new HashMap<>();
-        map.put("merchantId", TradeConstant.PARTNER_ID);
-        map.put("requestId", withdrawId);
-        map.put("receiverId", relation.getSxyMerchantId());
-        map.put("receiverType", "MERCHANT_ACC");
-        map.put("amount", amount.multiply(new BigDecimal("100")));
-        map.put("currency", "CNY");
-        map.put("notifyUrl", TradeConstant.TRANSFER_NOTIFY_URL);
-        map.put("deputeMark", "NOT_DO_DEPUTE");
-        Gson gson = new Gson();
-        JSONObject json = TradeHandle.handle(gson.toJson(map),
-                TradeConstant.TRANSFER_URL, relation.getSxyMerchantId(), TradeConstant.PARTNER_ID);
-        String status = json.getString("status");
-        if(!"SUCCESS".equals(status)){
-            //转账申请失败
-            withdrawService.updateStatusById(withdrawId, 2);
+        OrderBuilder builder = new OrderBuilder(TradeConstant.PARTNER_ID);
+        builder.setRequestId(String.valueOf(transferId))
+                .setAmount(String.valueOf(amount.multiply(new BigDecimal("100")).longValue()))
+                .setNotifyUrl(TradeConstant.TRANSFER_NOTIFY_URL)
+                .setCurrency("CNY")
+                .setReceiverId(relation.getSxyMerchantId())
+                .setReceiverType("MERCHANT_ACC")
+                .setDeputeMark("NOT_DO_DEPUTE");
+        TransferAccountOrderExecuter executer = new TransferAccountOrderExecuter();
+        String cause = "";
+        try {
+            executer.bothOrder(builder, new ResultListenerAdpater() {
+                /**
+                 * 提交成功,不代表支付成功
+                 */
+                @Override
+                public void success(JSONObject jsonObject) {
+                    //冻结金额
+                    int i = frozenAmount(amount, 0L, 0);
+                    if(i != 1){
+                        transferWithdrawService.updateStatusById(transferId, 2, "冻结金额失败");
+                        throw new ResourceUnavailableException("转账失败");
+                    }
+                }
+            });
             return;
+        } catch (ResponseException e) {
+            JSONObject responseData = e.getResponseData();
+            cause = responseData.getString("cause");
+            log.error("transfer order error:", e);
+        } catch (HmacVerifyException e) {
+            cause = "签名验证异常";
+            log.error("transfer order error:", e);
+        } catch (RequestException e) {
+            JSONObject responseData = e.getResponseData();
+            cause = responseData.getString("cause");
+            log.error("transfer order error:", e);
+        } catch (UnknownException e) {
+            cause = "未知异常";
+            log.error("transfer order error:", e);
         }
-        //冻结金额
-        int i = baseMapper.updateFrozenAmount(amount, LocalDateTime.now(), sourceUserId, type);
-        if(i != 1){
-            withdrawService.updateStatusById(withdrawId, 2);
-            throw new ResourceUnavailableException("提现申请失败");
+        transferWithdrawService.updateStatusById(transferId, 2, cause);
+    }
+
+    @Override
+    public int updateAmount(Long userId, Integer type, Integer operate, BigDecimal amount) {
+        Asset asset = queryAsset(userId, type);
+        if(operate == 0){
+            return baseMapper.addAmount(userId, type, amount, LocalDateTime.now());
+        } else if(operate == 1){
+            BigDecimal total = asset.getTotal();
+            if(total.compareTo(amount) < 0){
+                throw new ResourceUnavailableException("账户余额不足");
+            }
+            return baseMapper.reduceAmount(userId, type, amount, LocalDateTime.now());
         }
+        return 0;
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
-    public void withdrawNotify(WithdrawNotifyParam param) {
-        String requestId = param.getRequestId();
+    public void withdrawNotify(SxyNotifyParam param) {
+        JSONObject responseData = TradeHandle.decrypt(param);
+        if(responseData == null){
+            return;
+        }
+        String requestId = responseData.getString("requestId");
         Long id = Long.parseLong(requestId);
-        OmsWithdraw withdraw = withdrawService.queryById(id);
+        OmsTransferWithdraw withdraw = transferWithdrawService.queryById(id);
         if(withdraw == null){
             return;
         }
-        String withdrawAmount = param.getWithdrawAmount();
+        Integer transferStatus = withdraw.getStatus();
+        if(transferStatus != 0){
+            return;
+        }
+        String withdrawAmount = responseData.getString("withdrawAmount");
         BigDecimal amount = withdraw.getAmount();
-        if(amount.compareTo(new BigDecimal(withdrawAmount)) != 0){
+        if(amount.multiply(new BigDecimal("100")).compareTo(new BigDecimal(withdrawAmount)) != 0){
             //金额不一致
             return;
         }
-        String withdrawStatus = param.getWithdrawStatus();
-        int status = 2;
+        String withdrawStatus = responseData.getString("withdrawStatus");
+        BigDecimal procedureAmount = BigDecimal.ZERO;
         if("SUCCESS".equals(withdrawStatus)){
-            status = 1;
+            transferStatus = 1;
+            String receivedAmount = responseData.getString("receivedAmount");
+            procedureAmount = amount.subtract(new BigDecimal(receivedAmount));
+        } else if("FAIL".equals(withdrawStatus)){
+            transferStatus = 2;
+        } else {
+            return;
         }
+        String errorMessage = responseData.getString("errorMessage");
         //更新提现订单状态和外部订单号
-        int i = withdrawService.updateByNotify(id, param.getOrderId(), status);
+        int i = transferWithdrawService.updateByNotify(id, "", transferStatus, errorMessage, procedureAmount);
         if(i == 1){
-            if(status == 2){
+            if(transferStatus == 2){
                 //失败解冻金额
                 baseMapper.backFrozen(amount, withdraw.getUserId(), withdraw.getType(), LocalDateTime.now());
             } else {
-                baseMapper.deductFrozen(amount, withdraw.getUserId(),withdraw.getType(), LocalDateTime.now());
+                baseMapper.deductFrozen(amount, withdraw.getUserId(), withdraw.getType(), LocalDateTime.now());
+                BigDecimal total = queryTotal(withdraw.getUserId(), withdraw.getType());
+                //记录平台抽成余额明细
+                balanceDetailService.recordFlow(id, withdraw.getType(), withdraw.getUserId(), amount, BigDecimal.ZERO,
+                        amount, total, 1, 4, withdraw.getUserId());
             }
         }
     }
 
     @Override
-    public void transferNotify(TransferNotifyParam param) {
-        String requestId = param.getRequestId();
+    public BigDecimal queryTotal(Long userId, Integer type){
+        return baseMapper.queryTotal(userId, type);
+    }
+
+    @Override
+    public void transferNotify(SxyNotifyParam param) {
+        JSONObject responseData = TradeHandle.decrypt(param);
+        if(responseData == null){
+            return;
+        }
+        String requestId = responseData.getString("requestId");
         Long id = Long.parseLong(requestId);
-        OmsWithdraw withdraw = withdrawService.queryById(id);
-        if(withdraw == null){
+        OmsTransferWithdraw transfer = transferWithdrawService.queryById(id);
+        if(transfer == null){
             return;
         }
-        String withdrawAmount = param.getAmount();
-        BigDecimal amount = withdraw.getAmount();
-        if(amount.compareTo(new BigDecimal(withdrawAmount)) != 0){
+        Integer transferStatus = transfer.getStatus();
+        if(transferStatus != 0){
+            return;
+        }
+        String transferAmount = responseData.getString("amount");
+        BigDecimal amount = transfer.getAmount();
+        if(amount.multiply(new BigDecimal("100")).compareTo(new BigDecimal(transferAmount)) != 0){
             //金额不一致
             return;
         }
-        String transferStatus = param.getStatus();
-        int status = 2;
-        if("SUCCESS".equals(transferStatus)){
-            status = 1;
+        String transferResultStatus = responseData.getString("status");
+        if("SUCCESS".equals(transferResultStatus)){
+            transferStatus = 1;
+        } else if("CANCEL".equals(transferResultStatus)){
+            transferStatus = 3;
+        } else if("FAILED".equals(transferResultStatus)){
+            transferStatus = 2;
+        } else {
+            return;
         }
+        String errorMessage = responseData.getString("errorMessage");
         //更新转账订单状态和外部订单号
-        int i = withdrawService.updateByNotify(id, null, status);
+        int i = transferWithdrawService.updateByNotify(id, null, transferStatus, errorMessage, BigDecimal.ZERO);
         if(i == 1){
-            if(status == 2){
-                //失败解冻金额
-                baseMapper.backFrozen(amount, withdraw.getUserId(), withdraw.getType(), LocalDateTime.now());
+            if(transferStatus == 2){
+                //失败平台解冻金额
+                baseMapper.backFrozen(amount, 0L, 0, LocalDateTime.now());
             } else {
-                Integer type = withdraw.getType();
+                Integer type = transfer.getType();
+                //平台扣除冻结金额
+                baseMapper.deductFrozen(amount, 0L, 0, LocalDateTime.now());
+                BigDecimal platformTotal = queryTotal(0L, 0);
+                //记录平台转账余额明细
+                balanceDetailService.recordFlow(id, 0, 0L, amount, BigDecimal.ZERO,
+                        amount, platformTotal, 1, 7, transfer.getUserId());
                 if(type == 2){
-                    //商家转账-更新余额
-                    baseMapper.deductFrozen(amount, withdraw.getUserId(), withdraw.getType(), LocalDateTime.now());
+                    //商户转账-更新余额
+                    baseMapper.addAmount(transfer.getUserId(), transfer.getType(), amount, LocalDateTime.now());
+                    BigDecimal merchantTotal = queryTotal(transfer.getUserId(), transfer.getType());
+                    //记录平台转账余额明细
+                    balanceDetailService.recordFlow(id, 0, 0L, amount, BigDecimal.ZERO,
+                            amount, merchantTotal, 0, 7, 0L);
                 } else {
+                    //用户不需要添加金额
                     //用户转账-继续提现操作
-                    //用户提现
-                    Long withdrawId = withdrawService.createWithdraw(withdraw.getUserId(), 1, amount, 1, 0);
-                    //商户提现操作
-                    String sxyMerchantId = param.getReceiverId();
-                    //生成提现参数
-                    HashMap<String, Object> map = new HashMap<>();
-                    map.put("merchantId", sxyMerchantId);
-                    map.put("requestId", withdrawId);
-                    map.put("withdrawAmount", amount.multiply(new BigDecimal("100")));
-                    map.put("notifyUrl", TradeConstant.WITHDRAW_NOTIFY_URL);
-                    map.put("remark", "");
-                    Gson gson = new Gson();
-                    JSONObject json = TradeHandle.handle(gson.toJson(map),
-                            TradeConstant.WITHDRAW_URL, sxyMerchantId, TradeConstant.PARTNER_ID);
-                    String result = json.getString("status");
-                    if(!"SUCCESS".equals(result)){
-                        //提现申请失败
-                        withdrawService.updateStatusById(withdrawId, 2);
-                    }
+                    withdraw(transfer.getUserId(), transfer.getType(), amount);
                 }
             }
         }

+ 88 - 8
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/BalanceDetailServiceImpl.java

@@ -5,30 +5,39 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.chelvc.cloud.vehicle.client.dto.BalanceDetailDTO;
-import com.chelvc.cloud.vehicle.client.dto.WalletDTO;
+import com.chelvc.cloud.vehicle.client.dto.*;
 import com.chelvc.cloud.vehicle.client.param.QueryMerchantBalanceParam;
 import com.chelvc.cloud.vehicle.server.dao.BalanceDetailMapper;
+import com.chelvc.cloud.vehicle.server.entity.Asset;
 import com.chelvc.cloud.vehicle.server.entity.BalanceDetail;
+import com.chelvc.cloud.vehicle.server.service.AssetService;
 import com.chelvc.cloud.vehicle.server.service.BalanceDetailService;
+import com.chelvc.cloud.vehicle.server.service.MerchantService;
+import com.chelvc.framework.base.context.SessionContextHolder;
 import com.chelvc.framework.common.model.Pagination;
+import com.chelvc.framework.common.util.DateUtils;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
 
 @Service
 @RequiredArgsConstructor(onConstructor = @__(@Autowired))
 public class BalanceDetailServiceImpl extends ServiceImpl<BalanceDetailMapper, BalanceDetail>
         implements BalanceDetailService{
-
     private final BalanceDetailMapper merchantBalanceDetailMapper;
+    private final MerchantService merchantService;
+    private final AssetService assetService;
     @Override
-    public void recordFlow(Long orderId, Integer type, Long targetId, BigDecimal operateAmount, BigDecimal surplusAmount,
+    public void recordFlow(Long orderId, Integer type, Long targetId, BigDecimal operateAmount, BigDecimal deduct,
+                           BigDecimal realityAmount, BigDecimal surplusAmount,
                            Integer flowType, Integer operateType, Long sourceId) {
         BalanceDetail detail = new BalanceDetail();
         detail.setType(type);
@@ -36,8 +45,10 @@ public class BalanceDetailServiceImpl extends ServiceImpl<BalanceDetailMapper, B
         detail.setOperateType(operateType);
         detail.setOrderId(orderId);
         detail.setTargetId(targetId);
-        detail.setCreateTime(LocalDateTime.now());
+        detail.setCreateTime(new Date());
         detail.setOperateAmount(operateAmount);
+        detail.setDeduct(deduct);
+        detail.setRealityAmount(realityAmount);
         detail.setSurplusAmount(surplusAmount);
         detail.setSourceId(sourceId);
         baseMapper.insert(detail);
@@ -66,6 +77,54 @@ public class BalanceDetailServiceImpl extends ServiceImpl<BalanceDetailMapper, B
         return merchantBalanceDetailMapper.getMerchantAsset(merchantId);
     }
 
+    @Override
+    public List<BalanceRecordDTO> listBalanceRecord(Integer type, Long date) {
+        Date localDate = new Date(date);
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+        Long userId = SessionContextHolder.getId();
+        if (2 == type){
+            List<Long> merchantIds = this.merchantService.getMerchantIdsByUserId(userId);
+            if (CollectionUtils.isEmpty(merchantIds)){
+                return new ArrayList<>();
+            }
+            List<BalanceDetail> balanceDetails = this.lambdaQuery()
+                    .eq(BalanceDetail::getTargetId,merchantIds.get(0))
+                    .eq(BalanceDetail::getType, type)
+                    .orderByDesc(BalanceDetail::getCreateTime)
+                    .list();
+            List<BalanceRecordDTO> list = convert(balanceDetails);
+            return list.stream()
+                    .filter(item -> sdf.format(item.getCreateTime()).equals(sdf.format(localDate)))
+                    .collect(Collectors.toList());
+        }else{
+            List<BalanceDetail> balanceDetails = this.lambdaQuery()
+                    .eq(BalanceDetail::getTargetId,userId)
+                    .eq(BalanceDetail::getType, type)
+                    .orderByDesc(BalanceDetail::getCreateTime)
+                    .list();
+            List<BalanceRecordDTO> list = convert(balanceDetails);
+            return list.stream()
+                    .filter(item -> !DateUtils.format(item.getCreateTime()).equals(DateUtils.format(localDate)))
+                    .collect(Collectors.toList());
+        }
+    }
+
+    @Override
+    public EarningsDTO getBalanceRecord(Integer type) {
+        Long userId = SessionContextHolder.getId();
+        EarningsDTO balanceRecord = this.baseMapper.getBalanceRecord(userId, type);
+        if(balanceRecord == null){
+            balanceRecord = new EarningsDTO();
+        }
+        Asset asset = assetService.queryAsset(userId, type);
+        if(asset == null){
+            balanceRecord.setWithdrawAmount(BigDecimal.ZERO);
+        } else {
+            balanceRecord.setWithdrawAmount(asset.getTotal());
+        }
+        return balanceRecord;
+    }
+
     public QueryWrapper<BalanceDetail> queryWrapper(QueryMerchantBalanceParam param, Long merchantId, Integer type) {
         QueryWrapper<BalanceDetail> lqw = Wrappers.query();
         lqw.eq("t1.type", type);
@@ -85,4 +144,25 @@ public class BalanceDetailServiceImpl extends ServiceImpl<BalanceDetailMapper, B
         lqw.orderByDesc("t1.create_time");
         return lqw;
     }
+
+    public List<BalanceRecordDTO> convert(List<BalanceDetail> balanceDetails){
+        List<BalanceRecordDTO> list = new ArrayList<BalanceRecordDTO>( balanceDetails.size() );
+        for (BalanceDetail balanceDetail : balanceDetails) {
+            BalanceRecordDTO dto = new BalanceRecordDTO();
+            dto.setId(balanceDetail.getId());
+            dto.setDeduct(balanceDetail.getDeduct());
+            dto.setAmount(balanceDetail.getOperateAmount());
+            dto.setCurrencyType(balanceDetail.getFlowType());
+            dto.setRemark(balanceDetail.getRemark());
+            dto.setRealityAmount(balanceDetail.getRealityAmount());
+            dto.setSourceType(balanceDetail.getOperateType());
+            dto.setCreateTime(balanceDetail.getCreateTime());
+            dto.setUserId(balanceDetail.getTargetId());
+            dto.setOrderId(balanceDetail.getOrderId());
+            dto.setType(balanceDetail.getType());
+            dto.setSourceUserId(balanceDetail.getSourceId());
+            list.add(dto);
+        }
+        return list;
+    }
 }

+ 29 - 14
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/OderHandleServiceImpl.java

@@ -35,7 +35,6 @@ public class OderHandleServiceImpl implements OrderHandleService {
     private final PlatformProfitRatioService platformProfitRatioService;
     private final AssetService assetService;
     private final BalanceDetailService balanceDetailService;
-    private final CurrencyRecordService currencyRecordService;
     private final OmsOrderOperateHistoryService omsOrderOperateHistoryService;
 
     @Override
@@ -85,6 +84,11 @@ public class OderHandleServiceImpl implements OrderHandleService {
         Long merchantId = omsOrder.getMerchantId();
         BigDecimal userAmount = BigDecimal.ZERO;
         BigDecimal merchantAmount = BigDecimal.ZERO;
+        BigDecimal operate = payAmount.subtract(omsOrder.getFeeAmount());
+        //平台金额扣除商品金额
+        BigDecimal bigDecimal = assetService.updateAsset(1, operate, 0L, 0, 1);
+        balanceDetailService.recordFlow(orderId, 0, 0L, operate, BigDecimal.ZERO,
+                operate, bigDecimal, 1, 6, userId);
         //平台抽佣
         int platformRatio = platformProfitRatioService.queryRatio(merchantId);
         //平台抽佣金额----向上取整保留2位小数
@@ -117,9 +121,10 @@ public class OderHandleServiceImpl implements OrderHandleService {
         BigDecimal merchantDeduct = BigDecimal.ZERO;  //扣税
         BigDecimal merchantRealityAmount = operateAmount.subtract(merchantDeduct);
         BigDecimal surplusAmount = assetService.updateAsset(0, merchantRealityAmount, merchantId, 2, 1);
-        currencyRecordService.recordFlow(merchantId, 2, 0, orderId, userId, 0, operateAmount, merchantDeduct, merchantRealityAmount);
-        //记录商家余额明细
-        balanceDetailService.recordFlow(omsOrder.getId(), 2, merchantId, operateAmount, surplusAmount, 0, 1, userId);
+        //currencyRecordService.recordFlow(merchantId, 2, 0, orderId, userId, 0, operateAmount, merchantDeduct, merchantRealityAmount);
+        //商品出售商家记录余额明细
+        balanceDetailService.recordFlow(orderId, 2, merchantId, operateAmount, merchantDeduct,
+                merchantRealityAmount, surplusAmount, 0, 0, userId);
         //给商家转账
         assetService.transfer(0L, merchantId, 2, merchantRealityAmount);
         //邀请用户---分得佣金
@@ -128,19 +133,29 @@ public class OderHandleServiceImpl implements OrderHandleService {
             BigDecimal deduct = BigDecimal.ZERO;  //扣税
             BigDecimal realityAmount = userAmount.subtract(deduct);
             //更新用户资产
-            assetService.updateAsset(0, realityAmount, inviteUserId, 1, 1);
-            //邀请用户流水
-            currencyRecordService.recordFlow(inviteUserId, 1, 0, orderId, userId, 1, userAmount, deduct, realityAmount);
+            BigDecimal userTotal = assetService.updateAsset(0, realityAmount, inviteUserId, 1, 1);
+            //邀请用户余额明细
+            balanceDetailService.recordFlow(orderId, 1, inviteUserId, userAmount, deduct,
+                    realityAmount, userTotal, 0, 1, userId);
+            //currencyRecordService.recordFlow(inviteUserId, 1, 0, orderId, userId, 1, userAmount, deduct, realityAmount);
+            //用户资产记录到平台名下
+            BigDecimal platformTotal = assetService.updateAsset(0, realityAmount, 0L, 0, 1);
+            //用户佣金记录到平台余额名下
+            balanceDetailService.recordFlow(orderId, 0, 0L, userAmount, deduct,
+                    realityAmount, platformTotal, 0, 1, userId);
         }
         //邀请商家---分得佣金
         if (merchantAmount.compareTo(BigDecimal.ZERO) > 0) {
             platformAmount = platformAmount.subtract(merchantAmount);
             BigDecimal deduct = BigDecimal.ZERO;  //扣税
             BigDecimal realityAmount = merchantAmount.subtract(deduct);
-            //更新用户资产
-            assetService.updateAsset(0, realityAmount, inviteMerchantId, 1, 1);
+            //更新商家资产
+            BigDecimal merchantTotal = assetService.updateAsset(0, realityAmount, inviteMerchantId, 1, 1);
+            //记录商户分佣余额明细
+            balanceDetailService.recordFlow(omsOrder.getId(), 2, inviteMerchantId, merchantAmount, deduct,
+                    realityAmount, merchantTotal, 0, 2, userId);
             //邀请商家流水
-            currencyRecordService.recordFlow(inviteMerchantId, 1, 0, orderId, userId, 2, merchantAmount, deduct, realityAmount);
+            //currencyRecordService.recordFlow(inviteMerchantId, 1, 0, orderId, userId, 2, merchantAmount, deduct, realityAmount);
             //商家佣金转账
             assetService.transfer(0L, inviteMerchantId, 2, realityAmount);
         }
@@ -148,12 +163,12 @@ public class OderHandleServiceImpl implements OrderHandleService {
         BigDecimal deduct = BigDecimal.ZERO;  //扣税
         BigDecimal platformRealityAmount = platformAmount.subtract(deduct);
         //更新平台资产
-        assetService.updatePlatformAsset(platformRealityAmount, payAmount);
-        //平台流水
-        currencyRecordService.recordFlow(PlatformConstant.PLATFORM_ID, 0, 0, orderId, userId, 3, platformAmount, deduct, platformRealityAmount);
+        BigDecimal platformTotal = assetService.updateAsset(0, platformRealityAmount, 0L, 0, 1);
+        //记录平台抽成余额明细
+        balanceDetailService.recordFlow(omsOrder.getId(), 0, 0L, platformAmount, deduct,
+                platformRealityAmount, platformTotal, 0, 2, userId);
 
         omsOrderOperateHistoryService.insertOmsOrderOperateHistory(omsOrder.getId(), userId, omsOrder.getStatus());
-
         //以下注释为以前逻辑,先不用管
         /*BigDecimal platformSurplusAmount = assetService.updateAsset(1, operateAmount, 0L, 0);
         balanceDetailService.recordFlow(omsOrder.getId(), 0, 0L, operateAmount, platformSurplusAmount, 1, 1,

+ 64 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/OmsOrderRefundServiceImpl.java

@@ -0,0 +1,64 @@
+package com.chelvc.cloud.vehicle.server.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.chelvc.cloud.vehicle.client.param.OrderRefundParam;
+import com.chelvc.cloud.vehicle.server.dao.OmsOrderRefundMapper;
+import com.chelvc.cloud.vehicle.server.entity.OmsOrder;
+import com.chelvc.cloud.vehicle.server.entity.OmsOrderRefund;
+import com.chelvc.cloud.vehicle.server.service.OmsOrderRefundService;
+import com.chelvc.framework.common.exception.ResourceUnavailableException;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+
+@Service
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class OmsOrderRefundServiceImpl extends ServiceImpl<OmsOrderRefundMapper, OmsOrderRefund> implements OmsOrderRefundService {
+
+    @Override
+    public Long insert(OmsOrder omsOrder, OrderRefundParam param) {
+        OmsOrderRefund refund = new OmsOrderRefund();
+        refund.setOrderId(omsOrder.getId());
+        refund.setRefundAmount(omsOrder.getPayAmount());
+        refund.setMerchantId(omsOrder.getMerchantId());
+        refund.setUserId(omsOrder.getUserId());
+        refund.setReason(param.getReason());
+        refund.setProofPics(param.getProofPics());
+        refund.setStatus(0);
+        refund.setCreateTime(new Date());
+        refund.setHandleTime(new Date());
+        int i = baseMapper.insert(refund);
+        if(i != 1){
+            throw new ResourceUnavailableException("退款失败,请稍后重试");
+        }
+        return refund.getId();
+    }
+
+    @Override
+    public int updateStatus(Long refundId, Integer status, String cause) {
+        UpdateWrapper<OmsOrderRefund> update = Wrappers.update();
+        update.set("status", status);
+        update.set("handle_note", cause);
+        update.eq("id", refundId);
+        return baseMapper.update(null, update);
+    }
+
+    @Override
+    public int updateStatus(Long refundId, Integer status, String cause, String serialNumber) {
+        UpdateWrapper<OmsOrderRefund> update = Wrappers.update();
+        update.set("status", status);
+        update.set("handle_note", cause);
+        update.set("serial_number", serialNumber);
+        update.eq("id", refundId);
+        return baseMapper.update(null, update);
+    }
+
+    @Override
+    public OmsOrderRefund queryById(Long id) {
+        return baseMapper.selectById(id);
+    }
+}

+ 100 - 17
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/OmsOrderServiceImpl.java

@@ -1,6 +1,8 @@
 package com.chelvc.cloud.vehicle.server.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.chelvc.cloud.user.client.UserClient;
@@ -10,6 +12,7 @@ import com.chelvc.cloud.vehicle.client.constant.ReserveStatus;
 import com.chelvc.cloud.vehicle.client.dto.*;
 import com.chelvc.cloud.vehicle.client.param.OmsOrderModifyParam;
 import com.chelvc.cloud.vehicle.client.param.OrderPagingParam;
+import com.chelvc.cloud.vehicle.client.param.OrderRefundParam;
 import com.chelvc.cloud.vehicle.client.param.SxyNotifyParam;
 import com.chelvc.cloud.vehicle.client.util.DateTimeUtils;
 import com.chelvc.cloud.vehicle.server.copier.MerchantCopier;
@@ -27,8 +30,6 @@ import com.chelvc.framework.common.util.ObjectUtils;
 import com.chelvc.framework.common.util.StringUtils;
 import com.chelvc.framework.database.context.DatabaseContextHolder;
 import com.chelvc.framework.redis.context.RedisContextHolder;
-import com.chelvc.framework.wechat.WechatPayRequest;
-import com.chelvc.framework.wechat.WechatPaymentHandler;
 import com.chelvc.framework.wechat.WechatUnifiedOrder;
 import com.upay.sdk.onlinepay.builder.OrderResponse;
 import io.netty.util.HashedWheelTimer;
@@ -36,11 +37,13 @@ import io.netty.util.Timeout;
 import io.netty.util.Timer;
 import io.netty.util.TimerTask;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.http.util.Asserts;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.RequestBody;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
@@ -56,33 +59,24 @@ import java.util.concurrent.TimeUnit;
  * @date 2023-11-08
  */
 @Service
+@Slf4j
 @RequiredArgsConstructor(onConstructor = @__(@Autowired))
 public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> implements OmsOrderService{
-
     private final OmsOrderMapper omsOrderMapper;
     private final OmsCartItemService omsCartItemService;
-
     private final OmsOrderSettingService orderSettingService;
-
     private final OmsOrderItemService omsOrderItemService;
-
     private final UserCouponService userCouponService;
-
     private final MerchantService merchantService;
-
-
     private final OrderHandleService orderHandleService;
     private final OmsOrderOperateHistoryService omsOrderOperateHistoryService;
-
     private final AssessService assessService;
-
+    private final AssetService assetService;
     private final UserClient userService;
-
     private final UserReceiveAddressService userReceiveAddressService;
-
     private final ReservationService reservationService;
-
-    private final WechatPaymentHandler wechatPaymentHandler;
+    private final BalanceDetailService balanceDetailService;
+    private final OmsOrderRefundService orderRefundService;
 
     // 定义字符池
     private static final String LOWER_CASE = "abcdefghijklmnopqrstuvwxyz";
@@ -126,6 +120,7 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
 
     @Override
     public WechatUnifiedOrder generateOrder(OmsOrderModifyParam orderParam) {
+        log.info("订单参数:{}", orderParam);
         List<OmsOrderItem> orderItemList = new ArrayList<>();
         //获取购物车及优惠信息
         Long userId = SessionContextHolder.getId();
@@ -234,7 +229,9 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
             order.setIntegration(orderParam.getUseIntegration());
             order.setIntegrationAmount(calcIntegrationAmount(orderItemList));
         }
+        log.info("订单order:{}", order);
         order.setPayAmount(calcPayAmount(order));
+        log.info("订单金额amount:{}", order.getPayAmount());
         //转化为订单信息并插入数据库
         order.setUserId(userId);
         order.setCreateTime(new Date());
@@ -1021,12 +1018,19 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
     @Override
     public void orderNotify(SxyNotifyParam param) {
         JSONObject responseData = TradeHandle.decrypt(param);
+        if(responseData == null){
+            return;
+        }
         String requestId = responseData.getString("requestId");
         OmsOrder omsOrder = baseMapper.selectById(requestId);
         if(omsOrder == null){
             //订单不存在
             return;
         }
+        Integer orderStatus = omsOrder.getStatus();
+        if(orderStatus != 0){
+            return;
+        }
         BigDecimal payAmount = omsOrder.getPayAmount();
         String orderAmount = responseData.getString("orderAmount");
         if(payAmount.multiply(new BigDecimal("100")).compareTo(new BigDecimal(orderAmount)) != 0){
@@ -1034,14 +1038,93 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
             return;
         }
         String status = responseData.getString("status");
-        Integer orderStatus = 0;
+        BigDecimal feeAmount = BigDecimal.ZERO;
         if("SUCCESS".equals(status)){
             orderStatus = 1;
+            String fee = responseData.getString("feeAmount");
+            feeAmount = new BigDecimal(fee);
+            BigDecimal realityAmount = payAmount.subtract(feeAmount);
+            //平台资产变更-添加冻结金额
+            BigDecimal totalAmount = assetService.updateAsset(0, realityAmount, 0L, 0, 1);
+            balanceDetailService.recordFlow(omsOrder.getId(), 0, 0L, payAmount, feeAmount,
+                    realityAmount, totalAmount, 0, 5, omsOrder.getUserId());
         } else if("FAILED".equals(status)){
             orderStatus = 8;
         } else if("CANCEL".equals(status)){
             orderStatus = 7;
         }
-        baseMapper.updateStatus(omsOrder.getId(), orderStatus, new Date());
+        baseMapper.updateStatus(omsOrder.getId(), orderStatus, feeAmount, new Date());
+        omsOrderOperateHistoryService.insertOmsOrderOperateHistory(omsOrder.getId(), omsOrder.getUserId(), omsOrder.getStatus());
+    }
+
+    @Override
+    public void orderRefund(OrderRefundParam param) {
+        Long orderId = param.getOrderId();
+        OmsOrder omsOrder = baseMapper.selectById(orderId);
+        if(omsOrder == null){
+            throw new ResourceUnavailableException("订单不存在");
+        }
+        Long userId = SessionContextHolder.getId();
+        Long orderUserId = omsOrder.getUserId();
+        if(userId == null || !userId.equals(orderUserId)){
+            throw new ResourceUnavailableException("暂无权限");
+        }
+        Integer status = omsOrder.getStatus();
+        if(status != 1){
+            throw new ResourceUnavailableException("该订单状态不支持退款");
+        }
+        Long refundId = orderRefundService.insert(omsOrder, param);
+        onlinePayService.refund(omsOrder, refundId);
+    }
+
+    @Override
+    public void orderRefundNotify(SxyNotifyParam param) {
+        JSONObject responseData = TradeHandle.decrypt(param);
+        if(responseData == null){
+            return;
+        }
+        String requestId = responseData.getString("requestId");
+        String amount = responseData.getString("amount");
+        OmsOrderRefund refund = orderRefundService.queryById(Long.valueOf(requestId));
+        Integer refundStatus = refund.getStatus();
+        if(refundStatus != 1){
+            return;
+        }
+        OmsOrder omsOrder = baseMapper.selectById(refund.getOrderId());
+        BigDecimal refundAmount = refund.getRefundAmount();
+        if(refundAmount.multiply(new BigDecimal("100")).compareTo(new BigDecimal(amount)) != 0){
+            //订单金额不一样
+            orderRefundService.updateStatus(Long.valueOf(requestId), 3, "退款金额不一致");
+            return;
+        }
+        String status = responseData.getString("status");
+        String serialNumber = responseData.getString("serialNumber");
+        BigDecimal payAmount = omsOrder.getPayAmount();
+        BigDecimal feeAmount = omsOrder.getFeeAmount();
+        BigDecimal realAmount = payAmount.subtract(feeAmount);
+        if("SUCCESS".equals(status)){
+            orderRefundService.updateStatus(Long.valueOf(requestId), 2, "", serialNumber);
+            //减掉平台冻结金额
+            assetService.reduceFrozenAsset(realAmount, 0L, 0);
+            BigDecimal totalAmount = assetService.queryTotal(0L, 0);
+            //记录余额明细
+            balanceDetailService.recordFlow(omsOrder.getId(), 0, 0L,
+                    payAmount, feeAmount, realAmount, totalAmount, 1, 8, omsOrder.getUserId());
+            //更改订单状态
+            updateStatusById(omsOrder.getId(), 9);
+            omsOrderOperateHistoryService.insertOmsOrderOperateHistory(omsOrder.getId(), omsOrder.getUserId(), omsOrder.getStatus());
+        } else if("FAILED".equals(status)){
+            String errorMessage = responseData.getString("errorMessage");
+            orderRefundService.updateStatus(Long.valueOf(requestId), 3, errorMessage, serialNumber);
+            //解除冻结
+            assetService.reduceFrozenAsset(realAmount, 0L, 0);
+        }
+    }
+
+    private int updateStatusById(Long id, Integer status) {
+        UpdateWrapper<OmsOrder> update = Wrappers.update();
+        update.set("status", status);
+        update.eq("id", id);
+        return baseMapper.update(null, update);
     }
 }

+ 86 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/OmsTransferWithdrawServiceImpl.java

@@ -0,0 +1,86 @@
+package com.chelvc.cloud.vehicle.server.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.chelvc.cloud.vehicle.server.dao.OmsTransferWithdrawMapper;
+import com.chelvc.cloud.vehicle.server.entity.OmsTransferWithdraw;
+import com.chelvc.cloud.vehicle.server.service.OmsTransferWithdrawService;
+import com.chelvc.framework.common.exception.ResourceUnavailableException;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Service
+@RequiredArgsConstructor(onConstructor = @__({@Autowired,@Lazy}))
+public class OmsTransferWithdrawServiceImpl extends ServiceImpl<OmsTransferWithdrawMapper,
+        OmsTransferWithdraw> implements OmsTransferWithdrawService {
+
+    @Override
+    public Long createTransferWithdraw(Long userId, Integer type, BigDecimal amount, Integer channel, Integer flag) {
+        OmsTransferWithdraw transferWithdraw = new OmsTransferWithdraw();
+        transferWithdraw.setAmount(amount);
+        transferWithdraw.setProcedureAmount(BigDecimal.ZERO);
+        transferWithdraw.setChannel(channel);
+        transferWithdraw.setStatus(0);
+        transferWithdraw.setUserId(userId);
+        transferWithdraw.setType(type);
+        transferWithdraw.setFlag(flag);
+        transferWithdraw.setCreateTime(new Date());
+        int i = baseMapper.insert(transferWithdraw);
+        if(i != 1){
+            throw new ResourceUnavailableException("提现申请失败");
+        }
+        return transferWithdraw.getId();
+    }
+
+    @Override
+    public int updateStatusById(Long id, Integer status) {
+        UpdateWrapper<OmsTransferWithdraw> update = Wrappers.update();
+        update.set("status", status);
+        update.eq("id", id);
+        return baseMapper.update(null, update);
+    }
+
+    @Override
+    public int updateStatusById(Long id, Integer status, String remark) {
+        UpdateWrapper<OmsTransferWithdraw> update = Wrappers.update();
+        update.set("status", status);
+        update.set("remark", remark);
+        update.set("update_time", new Date());
+        update.eq("id", id);
+        return baseMapper.update(null, update);
+    }
+
+    @Override
+    public OmsTransferWithdraw queryById(Long id) {
+        return baseMapper.selectById(id);
+    }
+
+    @Override
+    public int updateByNotify(Long id, String outOrderId, Integer status, String remark) {
+        UpdateWrapper<OmsTransferWithdraw> update = Wrappers.update();
+        update.set("status", status);
+        update.set("out_order_id", outOrderId);
+        update.set("update_time", new Date());
+        update.set("remark", remark);
+        update.eq("id", id);
+        return baseMapper.update(null, update);
+    }
+
+    @Override
+    public int updateByNotify(Long id, String outOrderId, Integer status, String remark, BigDecimal procedureAmount) {
+        UpdateWrapper<OmsTransferWithdraw> update = Wrappers.update();
+        update.set("status", status);
+        update.set("out_order_id", outOrderId);
+        update.set("update_time", new Date());
+        update.set("remark", remark);
+        update.set("procedure_amount", procedureAmount);
+        update.eq("id", id);
+        return baseMapper.update(null, update);
+    }
+}

+ 0 - 62
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/OmsWithdrawServiceImpl.java

@@ -1,62 +0,0 @@
-package com.chelvc.cloud.vehicle.server.service.impl;
-
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.chelvc.cloud.vehicle.server.dao.OmsWithdrawMapper;
-import com.chelvc.cloud.vehicle.server.entity.OmsWithdraw;
-import com.chelvc.cloud.vehicle.server.service.OmsWithdrawService;
-import com.chelvc.framework.common.exception.ResourceUnavailableException;
-import lombok.RequiredArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.stereotype.Service;
-
-import java.math.BigDecimal;
-import java.util.Date;
-
-@Service
-@RequiredArgsConstructor(onConstructor = @__({@Autowired,@Lazy}))
-public class OmsWithdrawServiceImpl extends ServiceImpl<OmsWithdrawMapper,
-        OmsWithdraw> implements OmsWithdrawService {
-
-    @Override
-    public Long createWithdraw(Long userId, Integer type, BigDecimal amount, Integer channel, Integer flag) {
-        OmsWithdraw withdraw = new OmsWithdraw();
-        withdraw.setAmount(amount);
-        withdraw.setChannel(channel);
-        withdraw.setStatus(0);
-        withdraw.setUserId(userId);
-        withdraw.setType(type);
-        withdraw.setFlag(flag);
-        withdraw.setCreateTime(new Date());
-        int i = baseMapper.insert(withdraw);
-        if(i != 1){
-            throw new ResourceUnavailableException("提现申请失败");
-        }
-        return withdraw.getId();
-    }
-
-    @Override
-    public int updateStatusById(Long id, Integer status) {
-        UpdateWrapper<OmsWithdraw> update = Wrappers.update();
-        update.set("status", status);
-        update.eq("id", id);
-        return baseMapper.update(null, update);
-    }
-
-    @Override
-    public OmsWithdraw queryById(Long id) {
-        return baseMapper.selectById(id);
-    }
-
-    @Override
-    public int updateByNotify(Long id, String outOrderId, Integer status) {
-        UpdateWrapper<OmsWithdraw> update = Wrappers.update();
-        update.set("status", status);
-        update.set("out_order_id", outOrderId);
-        update.set("update_time", new Date());
-        update.eq("id", id);
-        return baseMapper.update(null, update);
-    }
-}

+ 39 - 40
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/OnlinePayServiceImpl.java

@@ -7,8 +7,11 @@ import com.chelvc.cloud.vehicle.client.param.OmsOrderModifyParam;
 import com.chelvc.cloud.vehicle.client.param.OrderReturnApplyModifyParam;
 import com.chelvc.cloud.vehicle.server.entity.OmsOrder;
 import com.chelvc.cloud.vehicle.server.entity.OmsOrderItem;
+import com.chelvc.cloud.vehicle.server.service.AssetService;
+import com.chelvc.cloud.vehicle.server.service.OmsOrderRefundService;
 import com.chelvc.cloud.vehicle.server.service.OnlinePayService;
 import com.chelvc.framework.base.context.SessionContextHolder;
+import com.chelvc.framework.common.exception.ResourceUnavailableException;
 import com.chelvc.framework.wechat.PayChannel;
 import com.chelvc.framework.wechat.PayMode;
 import com.chelvc.framework.wechat.WechatUnifiedOrder;
@@ -25,6 +28,7 @@ import com.upay.sdk.onlinepay.builder.QueryBuilder;
 import com.upay.sdk.onlinepay.builder.RefundBuilder;
 import com.upay.sdk.onlinepay.executer.OnlinePayOrderExecuter;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -38,20 +42,23 @@ import java.util.List;
  * @author liude
  * @date 2025/1/6
  */
+@Slf4j
 @Service
 @RequiredArgsConstructor(onConstructor = @__(@Autowired))
 public class OnlinePayServiceImpl  implements OnlinePayService {
-
     private final UserClient userService;
+    private final OmsOrderRefundService omsOrderRefundService;
+    private final AssetService assetService;
 
     @Override
     public WechatUnifiedOrder order(OmsOrder omsOrder, List<OmsOrderItem> orderItemList, OmsOrderModifyParam orderParam){
         OrderBuilder builder = new OrderBuilder(TradeConstant.PARTNER_ID);
+        Long orderAmount = omsOrder.getPayAmount().multiply(new BigDecimal("100")).longValue();
         builder.setRequestId(omsOrder.getId().toString())
-                .setOrderAmount(String.valueOf(omsOrder.getPayAmount().multiply(new BigDecimal("100")))) //单位:分
+                .setOrderAmount(String.valueOf(orderAmount)) //单位:分
                 .setOrderCurrency("CNY")
                 .setNotifyUrl(TradeConstant.ORDER_NOTIFY_URL)
-                .setCallbackUrl(TradeConstant.ORDER_CALLBACKURL)
+                .setCallbackUrl(TradeConstant.ORDER_CALLBACK_URL)
                 .setRemark(omsOrder.getNote())
                 .setPaymentModeCode(TradeConstant.MINIAPPS_WEIXIN_PAY_P2P)
                 //.setAuthCode("")
@@ -78,7 +85,7 @@ public class OnlinePayServiceImpl  implements OnlinePayService {
         for (OmsOrderItem omsOrderItem : orderItemList) {
             ProductDetail productDetail = new ProductDetail();
             productDetail.setName(omsOrderItem.getGoodsName());
-            productDetail.setAmount(Long.valueOf(omsOrderItem.getGoodsPrice().toString()));
+            productDetail.setAmount(omsOrderItem.getGoodsPrice().multiply(new BigDecimal("100")).longValue());
             productDetail.setQuantity(Long.valueOf(omsOrderItem.getGoodsQuantity()));
             builder.addProductDetail(productDetail);
         }
@@ -218,54 +225,46 @@ public class OnlinePayServiceImpl  implements OnlinePayService {
         return "";
     }
     @Override
-    public String refund(OrderReturnApplyModifyParam param){
-        RefundBuilder builder = new RefundBuilder(param.getMerchantId().toString());
-        builder.setRequestId(param.getOrderId().toString())
-                .setAmount(param.getReturnAmount().toString())
-                .setOrderId(param.getOrderId().toString())
-                .setRemark(param.getDescription())
-                .setNotifyUrl(TradeConstant.WITHDRAW_NOTIFY_URL);
-//        builder.setRefundSubsidy(refundSubsidy);
-//        builder.setSubsidyMoney(subsidyMoney);
+    public void refund(OmsOrder omsOrder, Long refundId){
+        RefundBuilder builder = new RefundBuilder(TradeConstant.PARTNER_ID);
+        builder.setRequestId(String.valueOf(refundId))
+                .setAmount(String.valueOf(omsOrder.getPayAmount()))
+                .setOrderId(String.valueOf(omsOrder.getId()))
+                .setNotifyUrl(TradeConstant.ORDER_REFUND_URL);
         OnlinePayOrderExecuter executer = new OnlinePayOrderExecuter();
+        String cause = "";
         try {
             executer.bothRefund(builder, new ResultListenerAdpater()  {
                 @Override
                 public void success(JSONObject jsonObject) {
-                    System.out.println("处理成功!<br/>");
-                    String result = jsonObject.toJSONString();
-                    System.out.print(result);
-                }
-
-                @Override
-                public void failure(JSONObject jsonObject) {
-                    System.out.println("处理失败!<br/>");
-                    String result = jsonObject.toJSONString();
-                    System.out.print(result);
-                }
-
-                @Override
-                public void pending(JSONObject jsonObject) {
-                    System.out.println("待处理!<br/>");
-                    String result = jsonObject.toJSONString();
-                    System.out.print(result);
+                    //冻结平台金额
+                    BigDecimal payAmount = omsOrder.getPayAmount();
+                    BigDecimal feeAmount = omsOrder.getFeeAmount();
+                    BigDecimal realAmount = payAmount.subtract(feeAmount);
+                    int i = assetService.frozenAmount(realAmount, 0L, 0);
+                    if(i != 1){
+                        omsOrderRefundService.updateStatus(refundId, 3, "冻结金额失败");
+                        throw new ResourceUnavailableException("退款申请失败");
+                    }
                 }
             });
+            return;
         } catch (ResponseException e) {
-            System.out.println("响应异常</br>");
-            System.out.println(e.toString());
+            JSONObject responseData = e.getResponseData();
+            cause = responseData.getString("cause");
+            log.error("transfer order error:", e);
         } catch (HmacVerifyException e) {
-            System.out.println("签名验证异常</br>");
-            System.out.println(e.toString());
+            cause = "签名验证异常";
+            log.error("transfer order error:", e);
         } catch (RequestException e) {
-            System.out.println("请求异常</br>");
-            System.out.println(e.toString());
+            JSONObject responseData = e.getResponseData();
+            cause = responseData.getString("cause");
+            log.error("transfer order error:", e);
         } catch (UnknownException e) {
-            System.out.println("未知异常</br>");
-            System.out.println(e.toString());
+            cause = "未知异常";
+            log.error("transfer order error:", e);
         }
-        return "";
-
+        omsOrderRefundService.updateStatus(refundId, 3, cause);
     }
     @Override
     public String refundQuery(OmsOrder omsOrder){

+ 13 - 0
vehicle-server/src/main/resources/mapper/BalanceDetailMapper.xml

@@ -23,4 +23,17 @@
             balance_detail t1
             ${ew.getCustomSqlSegment}
     </select>
+
+    <select id="getBalanceRecord" resultType="com.chelvc.cloud.vehicle.client.dto.EarningsDTO">
+        SELECT
+            SUM(reality_amount) AS totalAmount, -- 总数据
+            SUM(CASE WHEN DATE_FORMAT(create_time, '%Y-%m') = DATE_FORMAT(CURDATE(), '%Y-%m') THEN reality_amount ELSE 0 END) AS monthAmount, -- 本月数据
+            SUM(CASE WHEN DATE_FORMAT(create_time, '%Y-%m-%d') >= DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY) AND DATE_FORMAT(create_time, '%Y-%m-%d') <![CDATA[ >=]]> DATE_ADD(DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY), INTERVAL 7 DAY) THEN reality_amount ELSE 0 END) AS weekAmount -- 本周数据
+        FROM
+            balance_detail
+        WHERE
+            target_id = #{userId}
+          and flow_type = 0
+          and type = #{type}
+    </select>
 </mapper>

+ 18 - 3
vehicle-server/src/main/resources/mapper/OmsOrderMapper.xml

@@ -13,6 +13,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="memberUsername"    column="member_username"    />
         <result property="totalAmount"    column="total_amount"    />
         <result property="payAmount"    column="pay_amount"    />
+        <result property="feeAmount"    column="fee_amount"    />
         <result property="freightAmount"    column="freight_amount"    />
         <result property="promotionAmount"    column="promotion_amount"    />
         <result property="integrationAmount"    column="integration_amount"    />
@@ -51,7 +52,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 
     <sql id="selectOmsOrderVo">
-        select id, user_id, coupon_id, order_sn, create_time, member_username, total_amount, pay_amount, freight_amount, promotion_amount, integration_amount, coupon_amount, discount_amount, pay_type, source_type, status, order_type, delivery_company, delivery_sn, auto_confirm_day, integration, growth, promotion_info, bill_type, bill_header, bill_content, bill_receiver_phone, bill_receiver_email, receiver_name, receiver_phone, receiver_post_code, receiver_province, receiver_city, receiver_region, receiver_detail_address, note, confirm_status, delete_status, use_integration, payment_time, delivery_time, receive_time, comment_time from oms_order
+        select id, user_id, coupon_id, order_sn, create_time, member_username, total_amount, pay_amount, fee_amount, freight_amount, promotion_amount, integration_amount, coupon_amount, discount_amount, pay_type, source_type, status, order_type, delivery_company, delivery_sn, auto_confirm_day, integration, growth, promotion_info, bill_type, bill_header, bill_content, bill_receiver_phone, bill_receiver_email, receiver_name, receiver_phone, receiver_post_code, receiver_province, receiver_city, receiver_region, receiver_detail_address, note, confirm_status, delete_status, use_integration, payment_time, delivery_time, receive_time, comment_time from oms_order
     </sql>
 
     <select id="selectOmsOrderList" parameterType="com.chelvc.cloud.vehicle.server.entity.OmsOrder" resultMap="OmsOrderResult">
@@ -63,6 +64,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="memberUsername != null  and memberUsername != ''"> and member_username like concat('%', #{memberUsername}, '%')</if>
             <if test="totalAmount != null "> and total_amount = #{totalAmount}</if>
             <if test="payAmount != null "> and pay_amount = #{payAmount}</if>
+            <if test="feeAmount != null "> and fee_amount = #{feeAmount}</if>
             <if test="freightAmount != null "> and freight_amount = #{freightAmount}</if>
             <if test="promotionAmount != null "> and promotion_amount = #{promotionAmount}</if>
             <if test="integrationAmount != null "> and integration_amount = #{integrationAmount}</if>
@@ -117,6 +119,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="memberUsername != null">member_username,</if>
             <if test="totalAmount != null">total_amount,</if>
             <if test="payAmount != null">pay_amount,</if>
+            <if test="feeAmount != null">fee_amount,</if>
             <if test="freightAmount != null">freight_amount,</if>
             <if test="promotionAmount != null">promotion_amount,</if>
             <if test="integrationAmount != null">integration_amount,</if>
@@ -162,6 +165,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="memberUsername != null">#{memberUsername},</if>
             <if test="totalAmount != null">#{totalAmount},</if>
             <if test="payAmount != null">#{payAmount},</if>
+            <if test="feeAmount != null">#{feeAmount},</if>
             <if test="freightAmount != null">#{freightAmount},</if>
             <if test="promotionAmount != null">#{promotionAmount},</if>
             <if test="integrationAmount != null">#{integrationAmount},</if>
@@ -211,6 +215,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="memberUsername != null">member_username = #{memberUsername},</if>
             <if test="totalAmount != null">total_amount = #{totalAmount},</if>
             <if test="payAmount != null">pay_amount = #{payAmount},</if>
+            <if test="feeAmount != null">fee_amount = #{feeAmount},</if>
             <if test="freightAmount != null">freight_amount = #{freightAmount},</if>
             <if test="promotionAmount != null">promotion_amount = #{promotionAmount},</if>
             <if test="integrationAmount != null">integration_amount = #{integrationAmount},</if>
@@ -341,6 +346,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="payAmount != null">
                 pay_amount,
             </if>
+            <if test="feeAmount != null">
+                fee_amount,
+            </if>
             <if test="freightAmount != null">
                 freight_amount,
             </if>
@@ -472,6 +480,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="payAmount != null">
                 #{payAmount,jdbcType=DECIMAL},
             </if>
+            <if test="feeAmount != null">
+                #{feeAmount,jdbcType=DECIMAL},
+            </if>
             <if test="freightAmount != null">
                 #{freightAmount,jdbcType=DECIMAL},
             </if>
@@ -584,7 +595,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </insert>
 
     <sql id="Base_Column_List">
-        id, member_id, coupon_id, order_sn, create_time, member_username, total_amount, pay_amount,
+        id, member_id, coupon_id, order_sn, create_time, member_username, total_amount, pay_amount, fee_amount
     freight_amount, promotion_amount, integration_amount, coupon_amount, discount_amount,
     pay_type, source_type, status, order_type, delivery_company, delivery_sn, auto_confirm_day,
     integration, growth, promotion_info, bill_type, bill_header, bill_content, bill_receiver_phone,
@@ -635,6 +646,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="record.payAmount != null">
                 pay_amount = #{record.payAmount,jdbcType=DECIMAL},
             </if>
+            <if test="record.feeAmount != null">
+                fee_amount = #{record.feeAmount,jdbcType=DECIMAL},
+            </if>
             <if test="record.freightAmount != null">
                 freight_amount = #{record.freightAmount,jdbcType=DECIMAL},
             </if>
@@ -789,6 +803,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         member_username = #{record.memberUsername,jdbcType=VARCHAR},
         total_amount = #{record.totalAmount,jdbcType=DECIMAL},
         pay_amount = #{record.payAmount,jdbcType=DECIMAL},
+        fee_amount = #{record.feeAmount,jdbcType=DECIMAL},
         freight_amount = #{record.freightAmount,jdbcType=DECIMAL},
         promotion_amount = #{record.promotionAmount,jdbcType=DECIMAL},
         integration_amount = #{record.integrationAmount,jdbcType=DECIMAL},
@@ -908,7 +923,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <update id="updateStatus">
         update oms_order
-        set status = #{status}, update_time = #{updateTime}
+        set status = #{status}, fee_amount = #{feeAmount}, update_time = #{updateTime}
         where id = #{id}
     </update>