:feat: 修改生成订单编号策略

This commit is contained in:
re-aoharu
2024-04-15 15:58:20 +08:00
parent 68904a40aa
commit 650505a6d4
26 changed files with 163 additions and 34 deletions

View File

@@ -133,5 +133,10 @@
<artifactId>lock4j-redis-template-spring-boot-starter</artifactId>
<version>${lock4j.version}</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>

View File

@@ -1,5 +1,6 @@
package cn.bootx.platform.daxpay.service.configuration;
import cn.bootx.platform.daxpay.util.OrderNoGenerateUtil;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -21,4 +22,11 @@ public class DaxPayProperties {
/** 前端地址(web) */
private String frontWebUrl;
private String machineNo;
public void setMachineNo(String machineNo) {
this.machineNo = machineNo;
OrderNoGenerateUtil.setMachineNo(machineNo);
}
}

View File

@@ -41,7 +41,7 @@ public class AliPayCloseService {
@Retryable(value = RetryableException.class)
public void close(PayOrder payOrder) {
AlipayTradeCloseModel model = new AlipayTradeCloseModel();
model.setOutTradeNo(String.valueOf(payOrder.getId()));
model.setOutTradeNo(payOrder.getOrderNo());
try {
AlipayTradeCloseResponse response = AliPayApi.tradeCloseToResponse(model);

View File

@@ -32,7 +32,7 @@ public class AliPayRefundService {
public void refund(RefundOrder refundOrder, int amount) {
RefundLocal refundInfo = PaymentContextLocal.get().getRefundInfo();
AlipayTradeRefundModel refundModel = new AlipayTradeRefundModel();
refundModel.setOutTradeNo(String.valueOf(refundOrder.getPaymentId()));
refundModel.setOutTradeNo(String.valueOf(refundOrder.getRefundNo()));
refundModel.setOutRequestNo(String.valueOf(refundOrder.getId()));
// 金额转换
String refundAmount = String.valueOf(amount*0.01);

View File

@@ -102,7 +102,7 @@ public class AliPayService {
NoticeLocal noticeInfo = PaymentContextLocal.get().getNoticeInfo();
AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
model.setSubject(payOrder.getTitle());
model.setOutTradeNo(String.valueOf(payOrder.getId()));
model.setOutTradeNo(payOrder.getOrderNo());
model.setTotalAmount(String.valueOf(amount*0.01));
// 过期时间
model.setTimeExpire(PayUtil.getAliTimeExpire(payOrder.getExpiredTime()));
@@ -136,7 +136,7 @@ public class AliPayService {
model.setSubject(payOrder.getTitle());
model.setProductCode(QUICK_MSECURITY_PAY);
model.setOutTradeNo(String.valueOf(payOrder.getId()));
model.setOutTradeNo(payOrder.getOrderNo());
// 过期时间
model.setTimeExpire(PayUtil.getAliTimeExpire(payOrder.getExpiredTime()));
model.setTotalAmount(String.valueOf(amount*0.01));
@@ -160,7 +160,7 @@ public class AliPayService {
AlipayTradePagePayModel model = new AlipayTradePagePayModel();
model.setSubject(payOrder.getTitle());
model.setOutTradeNo(String.valueOf(payOrder.getId()));
model.setOutTradeNo(payOrder.getOrderNo());
// 过期时间
model.setTimeExpire(PayUtil.getAliTimeExpire(payOrder.getExpiredTime()));
model.setTotalAmount(String.valueOf(amount*0.01));
@@ -190,7 +190,7 @@ public class AliPayService {
public String qrCodePay(int amount, PayOrder payOrder, AliPayConfig alipayConfig) {
AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
model.setSubject(payOrder.getTitle());
model.setOutTradeNo(String.valueOf(payOrder.getId()));
model.setOutTradeNo(payOrder.getOrderNo());
model.setTotalAmount(String.valueOf(amount*0.01));
// 过期时间
@@ -215,7 +215,7 @@ public class AliPayService {
AlipayTradePayModel model = new AlipayTradePayModel();
model.setSubject(payOrder.getTitle());
model.setOutTradeNo(String.valueOf(payOrder.getId()));
model.setOutTradeNo(payOrder.getOrderNo());
model.setScene(AliPayCode.BAR_CODE);
model.setAuthCode(aliPayParam.getAuthCode());

View File

@@ -48,7 +48,7 @@ public class AliPaySyncService {
// 查询
try {
AlipayTradeQueryModel queryModel = new AlipayTradeQueryModel();
queryModel.setOutTradeNo(String.valueOf(payOrder.getId()));
queryModel.setOutTradeNo(payOrder.getOrderNo());
AlipayTradeQueryResponse response = AliPayApi.tradeQueryToResponse(queryModel);
String tradeStatus = response.getTradeStatus();
syncResult.setSyncInfo(JSONUtil.toJsonStr(response));
@@ -103,7 +103,7 @@ public class AliPaySyncService {
// 退款请求号
queryModel.setOutRequestNo(String.valueOf(refundOrder.getId()));
// 商户订单号
queryModel.setOutTradeNo(String.valueOf(refundOrder.getPaymentId()));
queryModel.setOutTradeNo(String.valueOf(refundOrder.getRefundNo()));
// 设置返回退款完成时间
queryModel.setQueryOptions(Collections.singletonList(GMT_REFUND_PAY));
AlipayTradeFastpayRefundQueryResponse response = AliPayApi.tradeRefundQueryToResponse(queryModel);

View File

@@ -36,7 +36,7 @@ public class UnionPayRefundService {
BigDecimal orderAmount = BigDecimal.valueOf(channelOrder.getAmount() * 0.01);
UnionRefundOrder unionRefundOrder = new UnionRefundOrder();
unionRefundOrder.setRefundNo(String.valueOf(refundOrder.getId()));
unionRefundOrder.setRefundNo(refundOrder.getRefundNo());
unionRefundOrder.setTradeNo(String.valueOf(payOrder.getGatewayOrderNo()));
unionRefundOrder.setRefundAmount(refundAmount);
unionRefundOrder.setTotalAmount(orderAmount);

View File

@@ -103,7 +103,7 @@ public class UnionPayService {
Date expiredTime = DateUtil.date(payOrder.getExpiredTime());
UnionPayOrder unionPayOrder = new UnionPayOrder();
unionPayOrder.setOutTradeNo(String.valueOf(payOrder.getId()));
unionPayOrder.setOutTradeNo(payOrder.getOrderNo());
unionPayOrder.setSubject(payOrder.getTitle());
unionPayOrder.setPrice(amount);
unionPayOrder.setExpirationTime(expiredTime);
@@ -118,7 +118,7 @@ public class UnionPayService {
Date expiredTime = DateUtil.date(payOrder.getExpiredTime());
UnionPayOrder unionPayOrder = new UnionPayOrder();
unionPayOrder.setOutTradeNo(String.valueOf(payOrder.getId()));
unionPayOrder.setOutTradeNo(payOrder.getOrderNo());
unionPayOrder.setSubject(payOrder.getTitle());
unionPayOrder.setPrice(amount);
unionPayOrder.setExpirationTime(expiredTime);
@@ -135,7 +135,7 @@ public class UnionPayService {
UnionPayOrder unionPayOrder = new UnionPayOrder();
unionPayOrder.setOutTradeNo(String.valueOf(payOrder.getId()));
unionPayOrder.setOutTradeNo(payOrder.getOrderNo());
unionPayOrder.setSubject(payOrder.getTitle());
unionPayOrder.setPrice(amount);
unionPayOrder.setExpirationTime(expiredTime);
@@ -160,7 +160,7 @@ public class UnionPayService {
Date expiredTime = DateUtil.date(payOrder.getExpiredTime());
UnionPayOrder unionPayOrder = new UnionPayOrder();
unionPayOrder.setOutTradeNo(String.valueOf(payOrder.getId()));
unionPayOrder.setOutTradeNo(payOrder.getOrderNo());
unionPayOrder.setSubject(payOrder.getTitle());
unionPayOrder.setPrice(amount);
unionPayOrder.setExpirationTime(expiredTime);
@@ -175,7 +175,7 @@ public class UnionPayService {
UnionPayOrder unionPayOrder = new UnionPayOrder();
unionPayOrder.setAuthCode(authCode);
unionPayOrder.setOutTradeNo(String.valueOf(payOrder.getId()));
unionPayOrder.setOutTradeNo(payOrder.getOrderNo());
unionPayOrder.setSubject(payOrder.getTitle());
unionPayOrder.setPrice(amount);
unionPayOrder.setExpirationTime(expiredTime);

View File

@@ -37,7 +37,7 @@ public class WeChatPayCloseService {
Map<String, String> params = CloseOrderModel.builder()
.appid(weChatPayConfig.getWxAppId())
.mch_id(weChatPayConfig.getWxMchId())
.out_trade_no(String.valueOf(payOrder.getId()))
.out_trade_no(payOrder.getOrderNo())
.nonce_str(WxPayKit.generateStr())
.build()
.createSign(weChatPayConfig.getApiKeyV2(), SignType.HMACSHA256);

View File

@@ -240,7 +240,7 @@ public class WeChatPayService {
// 反正v2版本的超时时间无效
.time_expire(PayUtil.getWxExpiredTime(payOrder.getExpiredTime()))
.body(payOrder.getTitle())
.out_trade_no(String.valueOf(payOrder.getId()))
.out_trade_no(payOrder.getOrderNo())
.total_fee(amount)
.spbill_create_ip(NetUtil.getLocalhostStr())
.notify_url(weChatPayConfig.getNotifyUrl())

View File

@@ -46,7 +46,7 @@ public class WechatPayRefundService {
.appid(weChatPayConfig.getWxAppId())
.mch_id(weChatPayConfig.getWxMchId())
.notify_url(weChatPayConfig.getNotifyUrl())
.out_trade_no(String.valueOf(refundOrder.getPaymentId()))
.out_trade_no(String.valueOf(refundOrder.getRefundNo()))
.out_refund_no(String.valueOf(refundOrder.getId()))
.total_fee(totalFee)
.refund_fee(refundFee)

View File

@@ -13,6 +13,7 @@ import cn.bootx.platform.daxpay.service.common.local.PaymentContextLocal;
import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayChannelOrder;
import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayOrder;
import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayOrderExtra;
import cn.bootx.platform.daxpay.util.OrderNoGenerateUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
@@ -54,6 +55,7 @@ public class PayBuilder {
// 构建支付订单对象
return new PayOrder()
.setBusinessNo(payParam.getBusinessNo())
.setOrderNo(OrderNoGenerateUtil.trade())
.setTitle(payParam.getTitle())
.setStatus(PayStatusEnum.PROGRESS.getCode())
.setAmount(sumAmount)

View File

@@ -3,6 +3,9 @@ package cn.bootx.platform.daxpay.service.core.order.pay.dao;
import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayOrder;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 支付订单
@@ -11,4 +14,6 @@ import org.apache.ibatis.annotations.Mapper;
*/
@Mapper
public interface PayOrderMapper extends BaseMapper<PayOrder> {
int insertList(@Param("list")List<PayOrder> list);
}

View File

@@ -33,7 +33,7 @@ import java.time.LocalDateTime;
public class PayChannelOrder extends MpCreateEntity implements EntityBaseFunction<PayChannelOrderDto> {
@DbColumn(comment = "支付id")
private Long paymentId;
private String paymentId;
@DbColumn(comment = "异步支付方式")
private boolean async;

View File

@@ -36,6 +36,9 @@ public class PayOrder extends MpBaseEntity implements EntityBaseFunction<PayOrde
@DbColumn(comment = "关联的业务号")
private String businessNo;
@DbColumn(comment = "支付订单编号")
private String orderNo;
/** 标题 */
@DbColumn(comment = "标题")
private String title;

View File

@@ -73,7 +73,7 @@ public class PayChannelOrderService {
payChannelOrder = new PayChannelOrder();
// 替换原有的的支付通道信息
payChannelOrder.setPayWay(payChannelParam.getWay())
.setPaymentId(payOrder.getId())
.setPaymentId(payOrder.getOrderNo())
.setAsync(true)
.setChannel(payChannelParam.getChannel())
.setPayWay(payChannelParam.getWay())

View File

@@ -32,8 +32,9 @@ import java.time.LocalDateTime;
public class RefundOrder extends MpBaseEntity implements EntityBaseFunction<RefundOrderDto> {
/** 原支付id */
@DbColumn(comment = "原支付id")
private Long paymentId;
@DbColumn(comment = "原支付订单号")
private String orderNo;
/** 原支付业务号 */
@DbColumn(comment = "原支付业务号")
@@ -49,6 +50,8 @@ public class RefundOrder extends MpBaseEntity implements EntityBaseFunction<Refu
@DbColumn(comment = "退款号")
private String refundNo;
private String refundBusinessNo;
/** 退款时是否是含有异步通道 */
@DbColumn(comment = "是否含有异步通道")
private boolean asyncPay;

View File

@@ -21,6 +21,7 @@ import cn.bootx.platform.daxpay.service.core.order.refund.dao.RefundOrderManager
import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundChannelOrder;
import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundOrder;
import cn.bootx.platform.daxpay.service.core.order.refund.entity.RefundOrderExtra;
import cn.bootx.platform.daxpay.util.OrderNoGenerateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import lombok.RequiredArgsConstructor;
@@ -159,10 +160,11 @@ public class RefundAssistService {
// 生成退款订单
RefundOrder refundOrder = new RefundOrder()
.setPaymentId(payOrder.getId())
.setOrderNo(payOrder.getOrderNo())
.setStatus(RefundStatusEnum.PROGRESS.getCode())
.setBusinessNo(payOrder.getBusinessNo())
.setRefundNo(refundParam.getRefundNo())
.setRefundNo(OrderNoGenerateUtil.refund())
.setRefundBusinessNo(refundParam.getRefundNo())
.setOrderAmount(payOrder.getAmount())
.setAmount(amount)
.setRefundableBalance(refundableBalance)
@@ -183,10 +185,6 @@ public class RefundAssistService {
// 主键使用预先生成的ID, 如果有异步通道, 关联的退款号就是这个ID
refundOrder.setId(IdUtil.getSnowflakeNextId());
// 退款号, 如不传输, 使用ID作为退款号
if(StrUtil.isBlank(refundOrder.getRefundNo())){
refundOrder.setRefundNo(String.valueOf(refundOrder.getId()));
}
RefundOrderExtra refundOrderExtra = this.createRefundOrderExtra(refundParam, refundOrder.getId());
refundChannelOrders.forEach(r->r.setRefundId(refundOrder.getId()));

View File

@@ -247,7 +247,7 @@ public class RefundService {
// 构建策略
List<RefundChannelOrder> refundChannels = refundChannelOrderManager
.findAllByRefundId(refundOrder.getId());
PayOrder payOrder = payOrderService.findById(refundOrder.getPaymentId())
PayOrder payOrder = payOrderService.findById(refundOrder.getId())
.orElseThrow(() -> new DataNotExistException("未查找到支付订单"));
List<PayChannelOrder> payChannelOrders = payChannelOrderManager.findAllByPaymentId(payOrder.getId());
Map<String, PayChannelOrder> orderChannelMap = payChannelOrders.stream()

View File

@@ -73,10 +73,10 @@ public class RefundRepairService {
}
try {
// 获取关联支付单
PayOrder payOrder = payOrderQueryService.findById(refundOrder.getPaymentId())
PayOrder payOrder = payOrderQueryService.findById(refundOrder.getId())
.orElseThrow(() -> new RuntimeException("支付单不存在"));
// 关联支付通道支付单
Map<String, PayChannelOrder> payChannelOrderMap = payChannelOrderManager.findAllByPaymentId(refundOrder.getPaymentId())
Map<String, PayChannelOrder> payChannelOrderMap = payChannelOrderManager.findAllByPaymentId(refundOrder.getId())
.stream()
.collect(Collectors.toMap(PayChannelOrder::getChannel, Function.identity(), CollectorsFunction::retainLatest));
// 异步通道退款单

View File

@@ -55,7 +55,7 @@ public abstract class AbsPayStrategy implements PayStrategy{
*/
public void generateChannelOrder() {
PayChannelOrder payChannelOrder = PayBuilder.buildPayChannelOrder(this.getPayChannelParam());
payChannelOrder.setPaymentId(this.getOrder().getId());
payChannelOrder.setPaymentId(this.getOrder().getOrderNo());
this.channelOrder = payChannelOrder;
}

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.bootx.platform.daxpay.service.core.order.pay.dao.PayOrderMapper">
<insert id="insertList">
insert into pay_order (id,`status`,`version`,`deleted`)
values
<foreach collection="list" separator="," item="item" index="index">
(#{item.id,jdbcType=BIGINT},
#{item.status,jdbcType=VARCHAR},
#{item.version,jdbcType=INTEGER},
#{item.deleted,jdbcType=BIT})
</foreach>
</insert>
</mapper>