package cn.iocoder.yudao.module.pay.dal.dataobject.channel; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.module.pay.enums.PayChannelEnum; import cn.iocoder.yudao.module.pay.framework.pay.core.client.PayClientConfig; import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO; import cn.iocoder.yudao.module.pay.dal.dataobject.app.PayAppDO; import cn.iocoder.yudao.module.pay.framework.pay.core.client.impl.NonePayClientConfig; import cn.iocoder.yudao.module.pay.framework.pay.core.client.impl.alipay.AlipayPayClientConfig; import cn.iocoder.yudao.module.pay.framework.pay.core.client.impl.weixin.WxPayClientConfig; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler; import tools.jackson.core.type.TypeReference; import lombok.*; import java.lang.reflect.Field; /** * 支付渠道 DO * 一个应用下,会有多种支付渠道,例如说微信支付、支付宝支付等等 * * 即 PayAppDO : PayChannelDO = 1 : n * * @author 芋道源码 */ @TableName(value = "pay_channel", autoResultMap = true) @KeySequence("pay_channel_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @Builder @NoArgsConstructor @AllArgsConstructor public class PayChannelDO extends TenantBaseDO { /** * 渠道编号,数据库自增 */ private Long id; /** * 渠道编码 * * 枚举 {@link PayChannelEnum} */ private String code; /** * 状态 * * 枚举 {@link CommonStatusEnum} */ private Integer status; /** * 渠道费率,单位:百分比 */ private Double feeRate; /** * 备注 */ private String remark; /** * 应用编号 * * 关联 {@link PayAppDO#getId()} */ private Long appId; /** * 支付渠道配置 */ @TableField(typeHandler = PayClientConfigTypeHandler.class) private PayClientConfig config; public static class PayClientConfigTypeHandler extends AbstractJsonTypeHandler { public PayClientConfigTypeHandler(Class type) { super(type); } public PayClientConfigTypeHandler(Class type, Field field) { super(type, field); } @Override public Object parse(String json) { PayClientConfig config = JsonUtils.parseObjectQuietly(json, new TypeReference<>() {}); if (config != null) { return config; } // 兼容老版本的包路径 String className = JsonUtils.parseObject(json, "@class", String.class); className = StrUtil.subAfter(className, ".", true); switch (className) { case "AlipayPayClientConfig": return JsonUtils.parseObject2(json, AlipayPayClientConfig.class); case "WxPayClientConfig": return JsonUtils.parseObject2(json, WxPayClientConfig.class); case "NonePayClientConfig": return JsonUtils.parseObject2(json, NonePayClientConfig.class); default: throw new IllegalArgumentException("未知的 PayClientConfig 类型:" + json); } } @Override public String toJson(Object obj) { return JsonUtils.toJsonString(obj); } } }