MallBizPayment.java 9.16 KB
package com.diligrp.cashier.mall.model;

import com.diligrp.cashier.mall.domain.rtmall.vo.OrderPaymentVO;
import com.diligrp.cashier.mall.property.RtMallDynamicProperty;
import com.diligrp.cashier.mall.type.OrderType;
import com.diligrp.cashier.mall.util.MallSnowflakeKeyManager;
import com.diligrp.cashier.shared.domain.BaseDO;
import com.diligrp.cashier.shared.spi.domain.PaymentResultBO;
import com.diligrp.cashier.shared.util.SpringContextUtils;
import com.diligrp.cashier.trade.type.SnowflakeKey;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * MallBizPayment
 *
 * @author dengwei
 */
public class MallBizPayment extends BaseDO {
    /**
     * 支付单号-系统生成
     */
    private String payTradeNo;

    /**
     * 订单id集合(mall_biz_order.id)
     */
    private String bizOrderId;

    /**
     * 业务侧订单号(多个)
     */
    private String orderId;

    /**
     * 业务侧支付单号(多个)
     */
    private String tradeId;

    /**
     * 用户code
     */
    private String userCode;

    /**
     * dili交易流水号
     */
    private String payTradeId;

    /**
     * 市场id
     */
    private Long firmId;

    /**
     * 商户code
     */
    private String mchId;

    /**
     * 支付卡号
     */
    private String cardNo;

    /**
     * 用户名
     */
    private String username;

    /**
     * 用户id
     */
    private Long userId;

    /**
     * 账户id
     */
    private Long accountId;

    /**
     * 资金账户id
     */
    private Long fundAccountId;

    /**
     * 第三方openid
     */
    private String openId;

    /**
     * 支付金额(分)
     */
    private Long payFee;

    /**
     * 支付状态
     * @see com.diligrp.cashier.pipeline.type.PaymentState
     */
    private Integer payState;

    /**
     * dili支付成功时间
     */
    private LocalDateTime payTime;

    /**
     * 支付渠道(微信 园区卡)
     * @see com.diligrp.cashier.mall.type.PaymentChanel
     * @see com.diligrp.cashier.pipeline.type.ChannelType
     */
    private Integer channelId;

    /**
     * 收银台url
     */
    private String cashierUrl;

    /**
     * 三方支付成功回调页面
     */
    private String cashierResultUrl;

    /**
     * 支付成功回调外部url
     */
    private String paymentCallback;

    /**
     * 扩展信息
     */
    private String ext;

    public MallBizPayment() {
    }

    public MallBizPayment(String orderId, String tradeId) {
        this.orderId = orderId;
        this.tradeId = tradeId;
    }

    /**
     * of
     */
    public static MallBizPayment of(final List<MallBizOrder> mallBizOrder) {
        MallSnowflakeKeyManager snowflakeKeyManager = SpringContextUtils.getBean(MallSnowflakeKeyManager.class);

        MallBizPayment mallBizPayment = new MallBizPayment();
        mallBizPayment.setId(snowflakeKeyManager.nextId(SnowflakeKey.MALL_BIZ_PAYMENT_ID));
        mallBizPayment.setPayTradeNo(snowflakeKeyManager.nextId(SnowflakeKey.MALL_BIZ_PAYMENT_ID).toString());
        mallBizPayment.setBizOrderId(mallBizOrder.stream().map(vo -> vo.getId().toString()).collect(Collectors.joining(",")));
        mallBizPayment.setOrderId(mallBizOrder.stream().map(MallBizOrder::getOrderId).collect(Collectors.joining(",")));
        mallBizPayment.setTradeId(mallBizOrder.stream().flatMap(vo -> vo.getMallBizPaymentOrders().stream().map(MallBizPaymentOrder::getTradeId)).collect(Collectors.joining(",")));
        mallBizPayment.setFirmId(mallBizOrder.getFirst().getFirmId());
        mallBizPayment.setMchId(mallBizOrder.getFirst().getMchId());
        mallBizPayment.setUserCode(mallBizOrder.getFirst().getUserCode());

        long sum = mallBizOrder.stream().flatMap(vo -> vo.getMallBizPaymentOrders().stream().map(MallBizPaymentOrder::getPayFee)).mapToLong(vo -> vo).sum();
        mallBizPayment.setPayFee(sum);

        // 完善payment_callback
        RtMallDynamicProperty rtMallDynamicProperty = SpringContextUtils.getBean(RtMallDynamicProperty.class);
        RtMallDynamicProperty.AppSecretDynamicProperty property = rtMallDynamicProperty.getBySourceAndType(mallBizOrder.getFirst().getSource(), mallBizOrder.getFirst().getOrderType());
        mallBizPayment.setPaymentCallback(property.getCallbackDomain());

        // 大润发只支持一个订单单独结算 后期如何支持多订单组合支付
        if (Objects.equals(mallBizOrder.getFirst().getOrderType(), OrderType.MINI_PROGRAM.code)) {
            mallBizPayment.setCashierResultUrl(String.format(property.getCashierResultUrl(), mallBizOrder.getFirst().getOrderId()));
        }

        // 完善mall_biz_payment_order
        List<MallBizPaymentOrder> bizPaymentOrders = mallBizOrder.stream()
                .flatMap(vo -> vo.getMallBizPaymentOrders().stream())
                .toList();
        bizPaymentOrders.forEach(vo -> {
            vo.setBizPaymentId(mallBizPayment.getId());
            vo.setPayTradeNo(mallBizPayment.getPayTradeNo());
        });
        return mallBizPayment;
    }

    public String getPayTradeNo() {
        return payTradeNo;
    }

    public void setPayTradeNo(String payTradeNo) {
        this.payTradeNo = payTradeNo;
    }

    public String getBizOrderId() {
        return bizOrderId;
    }

    public void setBizOrderId(String bizOrderId) {
        this.bizOrderId = bizOrderId;
    }

    public String getOrderId() {
        return orderId;
    }

    public void setOrderId(String orderId) {
        this.orderId = orderId;
    }

    public String getTradeId() {
        return tradeId;
    }

    public void setTradeId(String tradeId) {
        this.tradeId = tradeId;
    }

    public String getUserCode() {
        return userCode;
    }

    public void setUserCode(String userCode) {
        this.userCode = userCode;
    }

    public String getPayTradeId() {
        return payTradeId;
    }

    public void setPayTradeId(String payTradeId) {
        this.payTradeId = payTradeId;
    }

    public Long getFirmId() {
        return firmId;
    }

    public void setFirmId(Long firmId) {
        this.firmId = firmId;
    }

    public String getMchId() {
        return mchId;
    }

    public void setMchId(String mchId) {
        this.mchId = mchId;
    }

    public String getCardNo() {
        return cardNo;
    }

    public void setCardNo(String cardNo) {
        this.cardNo = cardNo;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public Long getAccountId() {
        return accountId;
    }

    public void setAccountId(Long accountId) {
        this.accountId = accountId;
    }

    public Long getFundAccountId() {
        return fundAccountId;
    }

    public void setFundAccountId(Long fundAccountId) {
        this.fundAccountId = fundAccountId;
    }

    public String getOpenId() {
        return openId;
    }

    public void setOpenId(String openId) {
        this.openId = openId;
    }

    public Long getPayFee() {
        return payFee;
    }

    public void setPayFee(Long payFee) {
        this.payFee = payFee;
    }

    public Integer getPayState() {
        return payState;
    }

    public void setPayState(Integer payState) {
        this.payState = payState;
    }

    public LocalDateTime getPayTime() {
        return payTime;
    }

    public void setPayTime(LocalDateTime payTime) {
        this.payTime = payTime;
    }

    public Integer getChannelId() {
        return channelId;
    }

    public void setChannelId(Integer channelId) {
        this.channelId = channelId;
    }

    public String getCashierUrl() {
        return cashierUrl;
    }

    public void setCashierUrl(String cashierUrl) {
        this.cashierUrl = cashierUrl;
    }

    public String getCashierResultUrl() {
        return cashierResultUrl;
    }

    public void setCashierResultUrl(String cashierResultUrl) {
        this.cashierResultUrl = cashierResultUrl;
    }

    public String getPaymentCallback() {
        return paymentCallback;
    }

    public void setPaymentCallback(String paymentCallback) {
        this.paymentCallback = paymentCallback;
    }

    public String getExt() {
        return ext;
    }

    public void setExt(String ext) {
        this.ext = ext;
    }

    /**
     * ofOrderPaymentVO
     *
     */
    public OrderPaymentVO ofOrderPaymentVO() {
        OrderPaymentVO orderPaymentVO = new OrderPaymentVO();
        orderPaymentVO.setOutTradeNo(payTradeNo);
        orderPaymentVO.setPayStatus(payState);
        orderPaymentVO.setPayFee(payFee);
        orderPaymentVO.setPayTime(payTime);
        orderPaymentVO.setTransactionId(payTradeId);
        return orderPaymentVO;
    }

    /**
     * payCallBack
     */
    public void payCallBack(PaymentResultBO event) {
        this.setPayState(event.getState());
        this.setPayTime(event.getWhen());
        // TODO 2026/1/6: 先固定
        this.setUsername("人工");
        this.setExt(event.getPayerId());
        this.setChannelId(event.getOutPayType());

        // TODO 2026/1/6: 其它信息
    }
}