feat: initialize Spring Boot infrastructure project

This commit is contained in:
2026-03-15 19:54:06 +08:00
commit aa82db6b15
24 changed files with 1159 additions and 0 deletions

7
.gitignore vendored Normal file
View File

@@ -0,0 +1,7 @@
target/
.idea/
.classpath
.project
.settings/
*.log
data/

80
pom.xml Normal file
View File

@@ -0,0 +1,80 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.6</version>
<relativePath/>
</parent>
<groupId>com.music</groupId>
<artifactId>music-metadata-system</artifactId>
<version>1.0.0</version>
<name>music-metadata-system</name>
<description>Music metadata normalization and archiving infrastructure</description>
<properties>
<java.version>21</java.version>
<mybatis-plus.version>3.5.7</mybatis-plus.version>
<graalvm.native.buildtools.version>0.10.2</graalvm.native.buildtools.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.2.224</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<version>${graalvm.native.buildtools.version}</version>
<extensions>true</extensions>
<executions>
<execution>
<id>build-native</id>
<goals>
<goal>compile-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@@ -0,0 +1,14 @@
package com.music.metadata;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(proxyBeanMethods = false)
@MapperScan("com.music.metadata.infrastructure.mapper")
public class MusicMetadataSystemApplication {
public static void main(String[] args) {
SpringApplication.run(MusicMetadataSystemApplication.class, args);
}
}

View File

@@ -0,0 +1,59 @@
package com.music.metadata.common.api;
public class ApiResponse<T> {
private Integer code;
private String message;
private T data;
private Long timestamp;
public ApiResponse() {
}
public ApiResponse(Integer code, String message, T data, Long timestamp) {
this.code = code;
this.message = message;
this.data = data;
this.timestamp = timestamp;
}
public static <T> ApiResponse<T> success(T data) {
return new ApiResponse<>(200, "操作成功", data, System.currentTimeMillis());
}
public static <T> ApiResponse<T> fail(Integer code, String message) {
return new ApiResponse<>(code, message, null, System.currentTimeMillis());
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public Long getTimestamp() {
return timestamp;
}
public void setTimestamp(Long timestamp) {
this.timestamp = timestamp;
}
}

View File

@@ -0,0 +1,20 @@
package com.music.metadata.common.exception;
public class BusinessException extends RuntimeException {
private final Integer code;
public BusinessException(String message) {
super(message);
this.code = 400;
}
public BusinessException(Integer code, String message) {
super(message);
this.code = code;
}
public Integer getCode() {
return code;
}
}

View File

@@ -0,0 +1,25 @@
package com.music.metadata.common.handler;
import com.music.metadata.common.api.ApiResponse;
import com.music.metadata.common.exception.BusinessException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(BusinessException.class)
public ApiResponse<Void> handleBusinessException(BusinessException ex) {
return ApiResponse.fail(ex.getCode(), ex.getMessage());
}
@ExceptionHandler(Exception.class)
public ApiResponse<Void> handleException(Exception ex) {
LOGGER.error("System exception", ex);
return ApiResponse.fail(500, "系统异常,请稍后重试");
}
}

View File

@@ -0,0 +1,156 @@
package com.music.metadata.infrastructure.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
@TableName("t_fail_file")
public class FailFileEntity implements Serializable {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@TableField("file_process_id")
private Long fileProcessId;
@TableField("file_hash")
private String fileHash;
@TableField("source_file_path")
private String sourceFilePath;
@TableField("file_name")
private String fileName;
@TableField("fail_type")
private String failType;
@TableField("fail_detail")
private String failDetail;
@TableField("raw_metadata")
private String rawMetadata;
@TableField("edit_metadata")
private String editMetadata;
@TableField("status")
private String status;
@TableField("created_at")
private LocalDateTime createdAt;
@TableField("updated_at")
private LocalDateTime updatedAt;
@TableField("resolved_at")
private LocalDateTime resolvedAt;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getFileProcessId() {
return fileProcessId;
}
public void setFileProcessId(Long fileProcessId) {
this.fileProcessId = fileProcessId;
}
public String getFileHash() {
return fileHash;
}
public void setFileHash(String fileHash) {
this.fileHash = fileHash;
}
public String getSourceFilePath() {
return sourceFilePath;
}
public void setSourceFilePath(String sourceFilePath) {
this.sourceFilePath = sourceFilePath;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getFailType() {
return failType;
}
public void setFailType(String failType) {
this.failType = failType;
}
public String getFailDetail() {
return failDetail;
}
public void setFailDetail(String failDetail) {
this.failDetail = failDetail;
}
public String getRawMetadata() {
return rawMetadata;
}
public void setRawMetadata(String rawMetadata) {
this.rawMetadata = rawMetadata;
}
public String getEditMetadata() {
return editMetadata;
}
public void setEditMetadata(String editMetadata) {
this.editMetadata = editMetadata;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public LocalDateTime getCreatedAt() {
return createdAt;
}
public void setCreatedAt(LocalDateTime createdAt) {
this.createdAt = createdAt;
}
public LocalDateTime getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(LocalDateTime updatedAt) {
this.updatedAt = updatedAt;
}
public LocalDateTime getResolvedAt() {
return resolvedAt;
}
public void setResolvedAt(LocalDateTime resolvedAt) {
this.resolvedAt = resolvedAt;
}
}

View File

@@ -0,0 +1,167 @@
package com.music.metadata.infrastructure.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
@TableName("t_file_process")
public class FileProcessEntity implements Serializable {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@TableField("file_hash")
private String fileHash;
@TableField("source_file_path")
private String sourceFilePath;
@TableField("source_file_name")
private String sourceFileName;
@TableField("file_extension")
private String fileExtension;
@TableField("file_size")
private Long fileSize;
@TableField("audio_duration")
private Integer audioDuration;
@TableField("raw_metadata")
private String rawMetadata;
@TableField("process_status")
private String processStatus;
@TableField("fail_reason")
private String failReason;
@TableField("target_file_path")
private String targetFilePath;
@TableField("task_id")
private Long taskId;
@TableField("created_at")
private LocalDateTime createdAt;
@TableField("updated_at")
private LocalDateTime updatedAt;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFileHash() {
return fileHash;
}
public void setFileHash(String fileHash) {
this.fileHash = fileHash;
}
public String getSourceFilePath() {
return sourceFilePath;
}
public void setSourceFilePath(String sourceFilePath) {
this.sourceFilePath = sourceFilePath;
}
public String getSourceFileName() {
return sourceFileName;
}
public void setSourceFileName(String sourceFileName) {
this.sourceFileName = sourceFileName;
}
public String getFileExtension() {
return fileExtension;
}
public void setFileExtension(String fileExtension) {
this.fileExtension = fileExtension;
}
public Long getFileSize() {
return fileSize;
}
public void setFileSize(Long fileSize) {
this.fileSize = fileSize;
}
public Integer getAudioDuration() {
return audioDuration;
}
public void setAudioDuration(Integer audioDuration) {
this.audioDuration = audioDuration;
}
public String getRawMetadata() {
return rawMetadata;
}
public void setRawMetadata(String rawMetadata) {
this.rawMetadata = rawMetadata;
}
public String getProcessStatus() {
return processStatus;
}
public void setProcessStatus(String processStatus) {
this.processStatus = processStatus;
}
public String getFailReason() {
return failReason;
}
public void setFailReason(String failReason) {
this.failReason = failReason;
}
public String getTargetFilePath() {
return targetFilePath;
}
public void setTargetFilePath(String targetFilePath) {
this.targetFilePath = targetFilePath;
}
public Long getTaskId() {
return taskId;
}
public void setTaskId(Long taskId) {
this.taskId = taskId;
}
public LocalDateTime getCreatedAt() {
return createdAt;
}
public void setCreatedAt(LocalDateTime createdAt) {
this.createdAt = createdAt;
}
public LocalDateTime getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(LocalDateTime updatedAt) {
this.updatedAt = updatedAt;
}
}

View File

@@ -0,0 +1,167 @@
package com.music.metadata.infrastructure.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
@TableName("t_process_task")
public class ProcessTaskEntity implements Serializable {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@TableField("task_name")
private String taskName;
@TableField("task_type")
private String taskType;
@TableField("source_path")
private String sourcePath;
@TableField("total_file_count")
private Integer totalFileCount;
@TableField("processed_count")
private Integer processedCount;
@TableField("success_count")
private Integer successCount;
@TableField("fail_count")
private Integer failCount;
@TableField("duplicate_count")
private Integer duplicateCount;
@TableField("task_status")
private String taskStatus;
@TableField("start_time")
private LocalDateTime startTime;
@TableField("end_time")
private LocalDateTime endTime;
@TableField("created_by")
private String createdBy;
@TableField("remark")
private String remark;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTaskName() {
return taskName;
}
public void setTaskName(String taskName) {
this.taskName = taskName;
}
public String getTaskType() {
return taskType;
}
public void setTaskType(String taskType) {
this.taskType = taskType;
}
public String getSourcePath() {
return sourcePath;
}
public void setSourcePath(String sourcePath) {
this.sourcePath = sourcePath;
}
public Integer getTotalFileCount() {
return totalFileCount;
}
public void setTotalFileCount(Integer totalFileCount) {
this.totalFileCount = totalFileCount;
}
public Integer getProcessedCount() {
return processedCount;
}
public void setProcessedCount(Integer processedCount) {
this.processedCount = processedCount;
}
public Integer getSuccessCount() {
return successCount;
}
public void setSuccessCount(Integer successCount) {
this.successCount = successCount;
}
public Integer getFailCount() {
return failCount;
}
public void setFailCount(Integer failCount) {
this.failCount = failCount;
}
public Integer getDuplicateCount() {
return duplicateCount;
}
public void setDuplicateCount(Integer duplicateCount) {
this.duplicateCount = duplicateCount;
}
public String getTaskStatus() {
return taskStatus;
}
public void setTaskStatus(String taskStatus) {
this.taskStatus = taskStatus;
}
public LocalDateTime getStartTime() {
return startTime;
}
public void setStartTime(LocalDateTime startTime) {
this.startTime = startTime;
}
public LocalDateTime getEndTime() {
return endTime;
}
public void setEndTime(LocalDateTime endTime) {
this.endTime = endTime;
}
public String getCreatedBy() {
return createdBy;
}
public void setCreatedBy(String createdBy) {
this.createdBy = createdBy;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
}

View File

@@ -0,0 +1,101 @@
package com.music.metadata.infrastructure.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
@TableName("t_system_config")
public class SystemConfigEntity implements Serializable {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@TableField("config_key")
private String configKey;
@TableField("config_value")
private String configValue;
@TableField("config_name")
private String configName;
@TableField("config_desc")
private String configDesc;
@TableField("is_editable")
private Integer isEditable;
@TableField("created_at")
private LocalDateTime createdAt;
@TableField("updated_at")
private LocalDateTime updatedAt;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getConfigKey() {
return configKey;
}
public void setConfigKey(String configKey) {
this.configKey = configKey;
}
public String getConfigValue() {
return configValue;
}
public void setConfigValue(String configValue) {
this.configValue = configValue;
}
public String getConfigName() {
return configName;
}
public void setConfigName(String configName) {
this.configName = configName;
}
public String getConfigDesc() {
return configDesc;
}
public void setConfigDesc(String configDesc) {
this.configDesc = configDesc;
}
public Integer getIsEditable() {
return isEditable;
}
public void setIsEditable(Integer isEditable) {
this.isEditable = isEditable;
}
public LocalDateTime getCreatedAt() {
return createdAt;
}
public void setCreatedAt(LocalDateTime createdAt) {
this.createdAt = createdAt;
}
public LocalDateTime getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(LocalDateTime updatedAt) {
this.updatedAt = updatedAt;
}
}

View File

@@ -0,0 +1,9 @@
package com.music.metadata.infrastructure.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.music.metadata.infrastructure.entity.FailFileEntity;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface FailFileMapper extends BaseMapper<FailFileEntity> {
}

View File

@@ -0,0 +1,9 @@
package com.music.metadata.infrastructure.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.music.metadata.infrastructure.entity.FileProcessEntity;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface FileProcessMapper extends BaseMapper<FileProcessEntity> {
}

View File

@@ -0,0 +1,9 @@
package com.music.metadata.infrastructure.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.music.metadata.infrastructure.entity.ProcessTaskEntity;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface ProcessTaskMapper extends BaseMapper<ProcessTaskEntity> {
}

View File

@@ -0,0 +1,9 @@
package com.music.metadata.infrastructure.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.music.metadata.infrastructure.entity.SystemConfigEntity;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SystemConfigMapper extends BaseMapper<SystemConfigEntity> {
}

View File

@@ -0,0 +1,19 @@
package com.music.metadata.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.music.metadata.infrastructure.entity.FailFileEntity;
import java.util.List;
public interface FailFileService extends IService<FailFileEntity> {
boolean create(FailFileEntity entity);
boolean update(FailFileEntity entity);
boolean deleteById(Long id);
FailFileEntity findById(Long id);
List<FailFileEntity> findAll();
}

View File

@@ -0,0 +1,19 @@
package com.music.metadata.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.music.metadata.infrastructure.entity.FileProcessEntity;
import java.util.List;
public interface FileProcessService extends IService<FileProcessEntity> {
boolean create(FileProcessEntity entity);
boolean update(FileProcessEntity entity);
boolean deleteById(Long id);
FileProcessEntity findById(Long id);
List<FileProcessEntity> findAll();
}

View File

@@ -0,0 +1,19 @@
package com.music.metadata.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.music.metadata.infrastructure.entity.ProcessTaskEntity;
import java.util.List;
public interface ProcessTaskService extends IService<ProcessTaskEntity> {
boolean create(ProcessTaskEntity entity);
boolean update(ProcessTaskEntity entity);
boolean deleteById(Long id);
ProcessTaskEntity findById(Long id);
List<ProcessTaskEntity> findAll();
}

View File

@@ -0,0 +1,19 @@
package com.music.metadata.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.music.metadata.infrastructure.entity.SystemConfigEntity;
import java.util.List;
public interface SystemConfigService extends IService<SystemConfigEntity> {
boolean create(SystemConfigEntity entity);
boolean update(SystemConfigEntity entity);
boolean deleteById(Long id);
SystemConfigEntity findById(Long id);
List<SystemConfigEntity> findAll();
}

View File

@@ -0,0 +1,38 @@
package com.music.metadata.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.music.metadata.infrastructure.entity.FailFileEntity;
import com.music.metadata.infrastructure.mapper.FailFileMapper;
import com.music.metadata.service.FailFileService;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class FailFileServiceImpl extends ServiceImpl<FailFileMapper, FailFileEntity> implements FailFileService {
@Override
public boolean create(FailFileEntity entity) {
return this.save(entity);
}
@Override
public boolean update(FailFileEntity entity) {
return this.updateById(entity);
}
@Override
public boolean deleteById(Long id) {
return this.removeById(id);
}
@Override
public FailFileEntity findById(Long id) {
return this.getById(id);
}
@Override
public List<FailFileEntity> findAll() {
return this.list();
}
}

View File

@@ -0,0 +1,38 @@
package com.music.metadata.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.music.metadata.infrastructure.entity.FileProcessEntity;
import com.music.metadata.infrastructure.mapper.FileProcessMapper;
import com.music.metadata.service.FileProcessService;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class FileProcessServiceImpl extends ServiceImpl<FileProcessMapper, FileProcessEntity> implements FileProcessService {
@Override
public boolean create(FileProcessEntity entity) {
return this.save(entity);
}
@Override
public boolean update(FileProcessEntity entity) {
return this.updateById(entity);
}
@Override
public boolean deleteById(Long id) {
return this.removeById(id);
}
@Override
public FileProcessEntity findById(Long id) {
return this.getById(id);
}
@Override
public List<FileProcessEntity> findAll() {
return this.list();
}
}

View File

@@ -0,0 +1,38 @@
package com.music.metadata.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.music.metadata.infrastructure.entity.ProcessTaskEntity;
import com.music.metadata.infrastructure.mapper.ProcessTaskMapper;
import com.music.metadata.service.ProcessTaskService;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ProcessTaskServiceImpl extends ServiceImpl<ProcessTaskMapper, ProcessTaskEntity> implements ProcessTaskService {
@Override
public boolean create(ProcessTaskEntity entity) {
return this.save(entity);
}
@Override
public boolean update(ProcessTaskEntity entity) {
return this.updateById(entity);
}
@Override
public boolean deleteById(Long id) {
return this.removeById(id);
}
@Override
public ProcessTaskEntity findById(Long id) {
return this.getById(id);
}
@Override
public List<ProcessTaskEntity> findAll() {
return this.list();
}
}

View File

@@ -0,0 +1,38 @@
package com.music.metadata.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.music.metadata.infrastructure.entity.SystemConfigEntity;
import com.music.metadata.infrastructure.mapper.SystemConfigMapper;
import com.music.metadata.service.SystemConfigService;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class SystemConfigServiceImpl extends ServiceImpl<SystemConfigMapper, SystemConfigEntity> implements SystemConfigService {
@Override
public boolean create(SystemConfigEntity entity) {
return this.save(entity);
}
@Override
public boolean update(SystemConfigEntity entity) {
return this.updateById(entity);
}
@Override
public boolean deleteById(Long id) {
return this.removeById(id);
}
@Override
public SystemConfigEntity findById(Long id) {
return this.getById(id);
}
@Override
public List<SystemConfigEntity> findAll() {
return this.list();
}
}

View File

@@ -0,0 +1,34 @@
server:
port: 8080
spring:
application:
name: music-metadata-system
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:file:./data/music_metadata_db;MODE=MYSQL;AUTO_SERVER=TRUE;DATABASE_TO_LOWER=TRUE
username: sa
password:
h2:
console:
enabled: true
path: /h2-console
sql:
init:
mode: always
schema-locations: classpath:schema.sql
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
id-type: auto
logging:
level:
root: INFO
com.music.metadata: DEBUG
com.baomidou.mybatisplus: INFO
org.springframework.jdbc.datasource.init: INFO

View File

@@ -0,0 +1,65 @@
CREATE TABLE IF NOT EXISTS t_process_task (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
task_name VARCHAR(100) NOT NULL,
task_type VARCHAR(20) NOT NULL,
source_path VARCHAR(1000),
total_file_count INT NOT NULL,
processed_count INT NOT NULL,
success_count INT NOT NULL,
fail_count INT NOT NULL,
duplicate_count INT NOT NULL,
task_status VARCHAR(20) NOT NULL,
start_time DATETIME NOT NULL,
end_time DATETIME,
created_by VARCHAR(50) NOT NULL,
remark VARCHAR(500)
);
CREATE TABLE IF NOT EXISTS t_file_process (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
file_hash VARCHAR(64) NOT NULL,
source_file_path VARCHAR(1000) NOT NULL,
source_file_name VARCHAR(200) NOT NULL,
file_extension VARCHAR(10) NOT NULL,
file_size BIGINT NOT NULL,
audio_duration INT,
raw_metadata TEXT NOT NULL,
process_status VARCHAR(20) NOT NULL,
fail_reason TEXT,
target_file_path VARCHAR(1000),
task_id BIGINT NOT NULL,
created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL,
CONSTRAINT uk_t_file_process_file_hash UNIQUE (file_hash),
CONSTRAINT fk_t_file_process_task_id FOREIGN KEY (task_id) REFERENCES t_process_task (id)
);
CREATE TABLE IF NOT EXISTS t_fail_file (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
file_process_id BIGINT NOT NULL,
file_hash VARCHAR(64) NOT NULL,
source_file_path VARCHAR(1000) NOT NULL,
file_name VARCHAR(200) NOT NULL,
fail_type VARCHAR(50) NOT NULL,
fail_detail TEXT NOT NULL,
raw_metadata TEXT NOT NULL,
edit_metadata TEXT,
status VARCHAR(20) NOT NULL,
created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL,
resolved_at DATETIME,
CONSTRAINT uk_t_fail_file_file_hash UNIQUE (file_hash),
CONSTRAINT fk_t_fail_file_file_process_id FOREIGN KEY (file_process_id) REFERENCES t_file_process (id)
);
CREATE TABLE IF NOT EXISTS t_system_config (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
config_key VARCHAR(100) NOT NULL,
config_value TEXT,
config_name VARCHAR(100) NOT NULL,
config_desc VARCHAR(500),
is_editable TINYINT NOT NULL,
created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL,
CONSTRAINT uk_t_system_config_config_key UNIQUE (config_key)
);