From aca76f9809ddc18c3c5ed45ee2089dafba6c385d Mon Sep 17 00:00:00 2001 From: 18650502300 <18650502300@163.com> Date: Fri, 24 May 2024 17:04:18 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=90=84=E4=B8=AA=E4=B8=9A=E5=8A=A1=E5=A4=84?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=B5=84=E9=87=91=E6=B5=81=E6=B0=B4=E8=AE=B0?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.yml | 39 ++++++++-- .../common/constant/ServiceConstants.java | 35 +++++++++ .../ruoyi/system/mapper/EtRefundMapper.java | 8 ++ .../system/service/IEtRefundService.java | 8 ++ .../service/impl/CallbackServiceImpl.java | 75 ++++++++++++++++++- .../service/impl/EtRefundServiceImpl.java | 12 +++ .../mapper/system/EtRefundMapper.xml | 7 +- 7 files changed, 173 insertions(+), 11 deletions(-) diff --git a/electripper-admin/src/main/resources/application.yml b/electripper-admin/src/main/resources/application.yml index 1c0cd4a..dd31e6f 100644 --- a/electripper-admin/src/main/resources/application.yml +++ b/electripper-admin/src/main/resources/application.yml @@ -155,23 +155,44 @@ qiniu: expireSeconds: 600 # 七牛云GET请求域名 domain: https://lxnapi.ccttiot.com +#wx: +# appid: wx4d178f8c80348214 +# appSecret: 37ef923d4d7cba2070c3956503fc90a3 +# # 微信支付配置 +# pay: +# # 微信小程序id +# appId: wx4d178f8c80348214 +# # 商户id 嵛山岛 1630064104 +# merchantId: 1630064104 +# # apiV3密钥 嵛山岛 yusandaowenlvyusandaowenlvyusand +# apiV3Key: yusandaowenlvyusandaowenlvyusand +# # 通知回调地址 +# notifyUrl: https://dianche.chuantewulian.cn/prod-api/payment/callback/wechat/ +# # 密钥所在位置 +# privateKeyPath: D:/wxpay/ysd/apiclient_key.pem +# # 证书序列号 7DDDDEED9A8DF3DD8363E49D636D3F551FFC8A19 +# merchantSerialNumber: 7A2C87FC5F19620271872A70B971FE60F734FB64 +# refund: +# # 退款回调地址 +# notifyUrl: https://dianche.chuantewulian.cn/prod-api/payment/callback/wechat/refund + wx: - appid: wx4d178f8c80348214 - appSecret: 37ef923d4d7cba2070c3956503fc90a3 + appid: wx3428c498d5061192 + appSecret: 398d2cd38583a33233eef897996cc7ca # 微信支付配置 pay: # 微信小程序id - appId: wx4d178f8c80348214 + appId: wx3428c498d5061192 # 商户id 嵛山岛 1630064104 - merchantId: 1630064104 + merchantId: 1656437344 # apiV3密钥 嵛山岛 yusandaowenlvyusandaowenlvyusand - apiV3Key: yusandaowenlvyusandaowenlvyusand + apiV3Key: 49819e0f0abdb2df3246f7b27f264d75 # 通知回调地址 notifyUrl: https://dianche.chuantewulian.cn/prod-api/payment/callback/wechat/ # 密钥所在位置 - privateKeyPath: D:/wxpay/ysd/apiclient_key.pem + privateKeyPath: D:/wxpay/apiclient_key.pem # 证书序列号 7DDDDEED9A8DF3DD8363E49D636D3F551FFC8A19 - merchantSerialNumber: 7A2C87FC5F19620271872A70B971FE60F734FB64 + merchantSerialNumber: 66910F800A60768020F07D39A56AE701574A16AE refund: # 退款回调地址 notifyUrl: https://dianche.chuantewulian.cn/prod-api/payment/callback/wechat/refund @@ -202,5 +223,7 @@ iot: # 推送消息token token: tVpNdGKrAFHfKZNgpIWQfZukrcYHNfFM geo: - # 高德地图key web服务 + # 高德地图key web服务 手续费 key: 834f1f029671d84272554528311ff0f1 +# 手续费 4/1000 千分之几 +handlingCharge: 4 diff --git a/electripper-common/src/main/java/com/ruoyi/common/constant/ServiceConstants.java b/electripper-common/src/main/java/com/ruoyi/common/constant/ServiceConstants.java index b06244b..18d81ad 100644 --- a/electripper-common/src/main/java/com/ruoyi/common/constant/ServiceConstants.java +++ b/electripper-common/src/main/java/com/ruoyi/common/constant/ServiceConstants.java @@ -25,6 +25,11 @@ public class ServiceConstants { */ public static final String ORDER_TYPE_DEPOSIT_REFUND = "3"; + /** + * 订单类型: 4-骑行订单退款(包含调度费、管理费等) + */ + public static final String ORDER_TYPE_RIDING_REFUND = "4"; + /**----------------------------订单类型end----------------------------*/ /**----------------------------支付场景start----------------------------*/ /** 支付场景: 1-骑行支付,2-取消预约支付,3-套餐支付,4-押金支付 */ @@ -92,6 +97,21 @@ public class ServiceConstants { public static final String ORDER_PAY_STATUS_PAID = "1"; /**----------------------------支付状态end----------------------------*/ + + /**----------------------------类型start----------------------------*/ + /** 支付方式:wx-微信,alipay-支付宝 */ + /** + * 支付方式: wx-微信 + */ + public static final String PAY_TYPE_WX = "wx"; + + /** + * 支付方式: alipay-支付宝 + */ + public static final String PAY_TYPE_ALIPAY = "alipay"; + + /**----------------------------支付类型end----------------------------*/ + /**----------------------------车辆状态start----------------------------*/ /** 车辆状态: 0 未上架,1-正常,2-预约中,3-骑行中,4-临时锁车,8-下线;9-废弃 */ /** @@ -407,4 +427,19 @@ public class ServiceConstants { /**----------------------------充值状态end----------------------------*/ + /**----------------------------收支类型start----------------------------*/ + /** 收支类型:1-收入;2-支出 */ + /** + * 充值状态:1-收入 + */ + public static final String FLOW_TYPE_INCOME = "1"; + + /** + * 充值状态:2-支出 + */ + public static final String FLOW_TYPE_DISBURSE = "2"; + + /**----------------------------收支类型end----------------------------*/ + + } diff --git a/electripper-system/src/main/java/com/ruoyi/system/mapper/EtRefundMapper.java b/electripper-system/src/main/java/com/ruoyi/system/mapper/EtRefundMapper.java index 8db64a2..9f77f18 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/mapper/EtRefundMapper.java +++ b/electripper-system/src/main/java/com/ruoyi/system/mapper/EtRefundMapper.java @@ -74,4 +74,12 @@ public interface EtRefundMapper * @return 退款订单 */ EtRefund selectEtRefundByOrderNo(String orderNo); + + /** + * 根据订单号查询退款订单对象 + * + * @param refundNo 退款订号 + * @return 退款订单 + */ + EtRefund selectEtRefundByRefundNo(String refundNo); } diff --git a/electripper-system/src/main/java/com/ruoyi/system/service/IEtRefundService.java b/electripper-system/src/main/java/com/ruoyi/system/service/IEtRefundService.java index e58048b..e12b57a 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/service/IEtRefundService.java +++ b/electripper-system/src/main/java/com/ruoyi/system/service/IEtRefundService.java @@ -27,6 +27,14 @@ public interface IEtRefundService */ public EtRefund selectEtRefundByOrderNo(String orderNo); + /** + * 根据退款单号查询退款订单对象 + * + * @param refundNo 订单号 + * @return 退款订单 + */ + public EtRefund selectEtRefundByRefundNo(String refundNo); + /** * 查询退款订单列表 * diff --git a/electripper-system/src/main/java/com/ruoyi/system/service/impl/CallbackServiceImpl.java b/electripper-system/src/main/java/com/ruoyi/system/service/impl/CallbackServiceImpl.java index dfe0d77..ff20144 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/service/impl/CallbackServiceImpl.java +++ b/electripper-system/src/main/java/com/ruoyi/system/service/impl/CallbackServiceImpl.java @@ -8,6 +8,7 @@ import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.ServiceConstants; import com.ruoyi.common.core.domain.entity.AsUser; +import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.pay.wx.domain.NotifyEventType; @@ -27,6 +28,7 @@ import com.wechat.pay.java.service.refund.model.Status; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.TransactionTemplate; @@ -71,6 +73,16 @@ public class CallbackServiceImpl implements CallbackService { @Autowired private IEtOperatingAreaService etOperatingAreaService; + @Autowired + private IEtCapitalFlowService etCapitalFlowService; + + @Value("${handlingCharge}") + private String handlingCharge; + + @Autowired + private ISysUserService sysUserService; + + /** * 微信支付回调 */ @@ -107,7 +119,7 @@ public class CallbackServiceImpl implements CallbackService { // 更新订单状态,pay_time、pay_type(默认是wx)、total_fee等于预约费+骑行费+管理费+调度费,状态改为4 订单结束,保存微信内部订单号 callbackVo.getOutTradeNo() order.setPaid("1"); order.setPayTime(DateUtils.getNowDate()); - order.setPayType("wx"); + order.setPayType(ServiceConstants.PAY_TYPE_WX); if(attachVo.getType().equals(ServiceConstants.BUSINESS_TYPE_RIDING)){ logger.info("【微信支付回调】骑行支付"); // 1-骑行支付 关锁 @@ -116,6 +128,9 @@ public class CallbackServiceImpl implements CallbackService { // deviceService.sendCommand(order.getSn(), token,"开锁命令","套餐开锁"); asDevice.setStatus(ServiceConstants.VEHICLE_STATUS_NORMAL);//还车后车辆正常运营 asDevice.setLockStatus(ServiceConstants.LOCK_STATUS_CLOSE); + + // 新增资金流水记录 + capitalFlowRecords(order,ServiceConstants.FLOW_TYPE_INCOME,ServiceConstants.ORDER_TYPE_RIDING); // 还车结算___小时后自动退押金---创建一个定时器TimerTask,计算出退还时间后,执行退款操作 EtFeeRule rule = etFeeRuleService.selectEtFeeRuleByRuleId(order.getRuleId()); Integer autoRefundDeposit = rule.getAutoRefundDeposit(); @@ -153,6 +168,9 @@ public class CallbackServiceImpl implements CallbackService { if(i>0){ logger.info("【自动退款】保存退款对象成功"); } + + // 新增资金流水记录 + capitalFlowRecords(newestOrder,ServiceConstants.FLOW_TYPE_DISBURSE,ServiceConstants.ORDER_TYPE_DEPOSIT_REFUND); } else { throw new ServiceException("没有找到押金充值记录"); } @@ -169,7 +187,7 @@ public class CallbackServiceImpl implements CallbackService { order.setMark("取消预约支付"); asDevice.setStatus(ServiceConstants.VEHICLE_STATUS_NORMAL);//取消预约支付后车辆正常运营 asDevice.setLockStatus(ServiceConstants.LOCK_STATUS_CLOSE); - }else if(attachVo.getType().equals(ServiceConstants.BUSINESS_TYPE_MEAL)){ + }else if(attachVo.getType().equals(ServiceConstants.BUSINESS_TYPE_MEAL)){//废弃 logger.info("【微信支付回调】套餐支付"); // 3-套餐支付 套餐支付中分为预约车辆和立即开锁骑行 if(attachVo.getIsAppointment()){//购买套餐后预约 @@ -206,6 +224,8 @@ public class CallbackServiceImpl implements CallbackService { asUser.setBalance(asUser.getBalance().add(order.getTotalFee())); order.setMark("押金支付"); + // 新增资金流水记录 + capitalFlowRecords(order,ServiceConstants.FLOW_TYPE_INCOME,ServiceConstants.ORDER_TYPE_DEPOSIT); // 删除用户缓存 String token = attachVo.getToken(); logger.info("【微信支付回调】删除用户缓存:"+token); @@ -237,6 +257,53 @@ public class CallbackServiceImpl implements CallbackService { } } + /** + * 资金流水记录 + * */ + private void capitalFlowRecords(EtOrder order,String type,String busType) { + EtCapitalFlow capitalFlow = new EtCapitalFlow(); + capitalFlow.setAreaId(order.getAreaId()); + capitalFlow.setOrderNo(order.getOrderNo()); + capitalFlow.setOutTradeNo(order.getOutTradeNo()); + capitalFlow.setType(type); + capitalFlow.setBusType(busType); + capitalFlow.setAmount(order.getTotalFee()); + if(busType.equals(ServiceConstants.ORDER_TYPE_DEPOSIT) || busType.equals(ServiceConstants.ORDER_TYPE_DEPOSIT_REFUND)){ + capitalFlow.setOperatorBalance(BigDecimal.ZERO); + capitalFlow.setOperatorDividend(BigDecimal.ZERO); + capitalFlow.setPartnerDividend(BigDecimal.ZERO); + }else{ + //获取所有合伙人列表 + SysUser sysUser = new SysUser(); + sysUser.setUserType("03"); + List sysUsers = sysUserService.selectUserList(sysUser); + double totalDividendProportion = sysUsers.stream() + .mapToDouble(SysUser::getDividendProportion) + .sum();//算出总的分成比例 + BigDecimal decimal = new BigDecimal(totalDividendProportion).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP); + BigDecimal partnerDividend = order.getTotalFee().multiply(decimal); + BigDecimal operatorDividend = order.getTotalFee().subtract(capitalFlow.getPartnerDividend()); + if(type.equals(ServiceConstants.FLOW_TYPE_INCOME)){ + capitalFlow.setPartnerDividend(partnerDividend); + capitalFlow.setOperatorDividend(operatorDividend); +// todo capitalFlow.setOperatorBalance(); + }else{ + capitalFlow.setPartnerDividend(partnerDividend.negate()); + capitalFlow.setOperatorDividend(operatorDividend.negate()); +// todo capitalFlow.setOperatorBalance(); + } + } + BigDecimal bigDecimal = new BigDecimal(handlingCharge); + capitalFlow.setHandlingCharge(bigDecimal.multiply(order.getTotalFee()));//手续费 + capitalFlow.setPayType(ServiceConstants.PAY_TYPE_WX); + capitalFlow.setCreateTime(DateUtils.getNowDate()); + + int i = etCapitalFlowService.insertEtCapitalFlow(capitalFlow); + if(i==0){ + throw new ServiceException("保存资金流水记录失败"); + } + } + /** * 微信退款回调 */ @@ -264,6 +331,10 @@ public class CallbackServiceImpl implements CallbackService { logger.error("【微信退款回调】更新退款单失败"); throw new ServiceException("【微信退款回调】更新退款单失败"); } + EtRefund refund = etRefundService.selectEtRefundByRefundNo(outRefundNo); + EtOrder order = orderService.selectEtOrderByOrderNo(refund.getOrderNo()); + // 新增资金流水记录 + capitalFlowRecords(order,ServiceConstants.FLOW_TYPE_DISBURSE,ServiceConstants.ORDER_TYPE_RIDING_REFUND); } } } diff --git a/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtRefundServiceImpl.java b/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtRefundServiceImpl.java index 214f158..57f3c73 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtRefundServiceImpl.java +++ b/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtRefundServiceImpl.java @@ -44,6 +44,18 @@ public class EtRefundServiceImpl implements IEtRefundService return etRefundMapper.selectEtRefundByOrderNo(orderNo); } + /** + * 根据退款单号查询退款订单对象 + * + * @param refundNo 退款订号 + * @return 退款订单 + */ + @Override + public EtRefund selectEtRefundByRefundNo(String refundNo) + { + return etRefundMapper.selectEtRefundByRefundNo(refundNo); + } + /** * 查询退款订单列表 diff --git a/electripper-system/src/main/resources/mapper/system/EtRefundMapper.xml b/electripper-system/src/main/resources/mapper/system/EtRefundMapper.xml index a1a8ef3..110f60c 100644 --- a/electripper-system/src/main/resources/mapper/system/EtRefundMapper.xml +++ b/electripper-system/src/main/resources/mapper/system/EtRefundMapper.xml @@ -46,6 +46,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where order_no = #{orderNo} + + insert into et_refund @@ -113,7 +118,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" item_desc = #{itemDesc}, refund_result = #{refundResult}, - where orderNo = #{orderNo} + where refund_no = #{refundNo}