package com.iailab.module.infra.dal.dataobject.file; import cn.hutool.core.util.StrUtil; import com.iailab.framework.common.util.json.JsonUtils; import com.iailab.framework.mybatis.core.dataobject.BaseDO; import com.iailab.module.infra.framework.file.core.client.FileClientConfig; import com.iailab.module.infra.framework.file.core.client.db.DBFileClientConfig; import com.iailab.module.infra.framework.file.core.client.ftp.FtpFileClientConfig; import com.iailab.module.infra.framework.file.core.client.local.LocalFileClientConfig; import com.iailab.module.infra.framework.file.core.client.s3.S3FileClientConfig; import com.iailab.module.infra.framework.file.core.client.sftp.SftpFileClientConfig; import com.iailab.module.infra.framework.file.core.enums.FileStorageEnum; 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 com.fasterxml.jackson.core.type.TypeReference; import lombok.*; import java.lang.reflect.Field; /** * 文件配置表 * * @author iailab */ @TableName(value = "infra_file_config", autoResultMap = true) @KeySequence("infra_file_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @Builder @NoArgsConstructor @AllArgsConstructor public class FileConfigDO extends BaseDO { /** * 配置编号,数据库自增 */ private Long id; /** * 配置名 */ private String name; /** * 存储器 * * 枚举 {@link FileStorageEnum} */ private Integer storage; /** * 备注 */ private String remark; /** * 是否为主配置 * * 由于我们可以配置多个文件配置,默认情况下,使用主配置进行文件的上传 */ private Boolean master; /** * 支付渠道配置 */ @TableField(typeHandler = FileClientConfigTypeHandler.class) private FileClientConfig config; public static class FileClientConfigTypeHandler extends AbstractJsonTypeHandler { public FileClientConfigTypeHandler(Class type) { super(type); } public FileClientConfigTypeHandler(Class type, Field field) { super(type, field); } @Override public Object parse(String json) { FileClientConfig 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 "DBFileClientConfig": return JsonUtils.parseObject2(json, DBFileClientConfig.class); case "FtpFileClientConfig": return JsonUtils.parseObject2(json, FtpFileClientConfig.class); case "LocalFileClientConfig": return JsonUtils.parseObject2(json, LocalFileClientConfig.class); case "SftpFileClientConfig": return JsonUtils.parseObject2(json, SftpFileClientConfig.class); case "S3FileClientConfig": return JsonUtils.parseObject2(json, S3FileClientConfig.class); default: throw new IllegalArgumentException("未知的 FileClientConfig 类型:" + json); } } @Override public String toJson(Object obj) { return JsonUtils.toJsonString(obj); } } }