恢复点(restore point)。别人改崩后可 git reset --hard 回到此提交。 == 此快照内容 == - 后端 oa-backend: 734 控制器 / 711 实体 (Spring Boot 3.2.5 + SQLite, 端口8091) - 前端 modern-ui/app: Vue3+Vite, 约700页 (构建产物已在 oa-backend/src/main/resources/static) - 数据库 oa-backend/data/oa.db: 含全部演示数据 (强制入库, 6.6MB) - 交接文档 go.md + go-code-reference/endpoints/entities/database.md - 多代理建设脚本 .claude/wf-*.js == 状态 == - 对 凯迪科技ERP_20260507.xlsx 合规 MET ~73.3% (PARTIAL 75: 34可建+6种子/bug+35外部硬天花板) - 安全: 5轮红队+5轮复检, default-deny分级鉴权, 连续零可利用 - W3~W7 累计补完436缺口; W8末轮(40缺口)为半成品(源码树可编译但未集成) - 运行: cd oa-backend; java -jar build/libs/oa-backend-0.1.0.jar --server.port=8091; admin/123456 == 排除(gitignore, 可再生) == node_modules / oa-backend/build / .jdks / *.log / Backup-ERP-* / 弃用的OFBiz核心(只保留modern-ui) 完整文件夹备份见同目录 Backup-ERP-20260615-191517/ (含上述全部, 仅缺 node_modules) 时间戳: 20260615-191517 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
168 lines
4.0 KiB
Java
168 lines
4.0 KiB
Java
package com.kaidi.oa.domain;
|
|
|
|
import jakarta.persistence.Entity;
|
|
import jakarta.persistence.GeneratedValue;
|
|
import jakarta.persistence.GenerationType;
|
|
import jakarta.persistence.Id;
|
|
import jakarta.persistence.Table;
|
|
|
|
import java.time.Instant;
|
|
|
|
/**
|
|
* 资料室电子档案自动备份执行日志。
|
|
*
|
|
* 每次 @Scheduled 备份调度运行后追加一条记录(成功/失败/跳过),
|
|
* 作为「自动备份无真实调度执行」缺口的真实落地证明,
|
|
* 替代 ArchiveComplianceController.backup-config 仅返回静态配置的现状。
|
|
*
|
|
* 状态:运行中 / 成功 / 失败 / 跳过。
|
|
* backupType:增量 / 全量。
|
|
*/
|
|
@Entity
|
|
@Table(name = "archive_backup_log")
|
|
public class ArchiveBackupLog {
|
|
|
|
@Id
|
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
|
private Long id;
|
|
|
|
/** 备份类型:增量 / 全量。 */
|
|
private String backupType;
|
|
|
|
/** 备份状态:运行中 / 成功 / 失败 / 跳过。 */
|
|
private String backupStatus;
|
|
|
|
/** 触发方式:定时 / 手动。 */
|
|
private String triggerMode;
|
|
|
|
/** 备份开始时间(ISO 字符串,便于 SQLite 存储与前端展示)。 */
|
|
private String startedAt;
|
|
|
|
/** 备份完成时间。 */
|
|
private String finishedAt;
|
|
|
|
/** 耗时秒数(完成后填写)。 */
|
|
private Long durationSeconds;
|
|
|
|
/** 备份文件路径(本地快照路径或 S3 前缀)。 */
|
|
private String backupPath;
|
|
|
|
/** 备份文件大小(字节,-1 表示未知)。 */
|
|
private Long fileSizeBytes;
|
|
|
|
/** 备份档案条数(实际扫描档案总数)。 */
|
|
private Long archiveCount;
|
|
|
|
/** 操作结果详细说明(成功摘要 / 失败原因)。 */
|
|
private String resultMsg;
|
|
|
|
/** 执行节点(本机 hostname,多活场景区分节点)。 */
|
|
private String executorNode;
|
|
|
|
private Instant createdAt;
|
|
|
|
public Long getId() {
|
|
return id;
|
|
}
|
|
|
|
public void setId(Long id) {
|
|
this.id = id;
|
|
}
|
|
|
|
public String getBackupType() {
|
|
return backupType;
|
|
}
|
|
|
|
public void setBackupType(String backupType) {
|
|
this.backupType = backupType;
|
|
}
|
|
|
|
public String getBackupStatus() {
|
|
return backupStatus;
|
|
}
|
|
|
|
public void setBackupStatus(String backupStatus) {
|
|
this.backupStatus = backupStatus;
|
|
}
|
|
|
|
public String getTriggerMode() {
|
|
return triggerMode;
|
|
}
|
|
|
|
public void setTriggerMode(String triggerMode) {
|
|
this.triggerMode = triggerMode;
|
|
}
|
|
|
|
public String getStartedAt() {
|
|
return startedAt;
|
|
}
|
|
|
|
public void setStartedAt(String startedAt) {
|
|
this.startedAt = startedAt;
|
|
}
|
|
|
|
public String getFinishedAt() {
|
|
return finishedAt;
|
|
}
|
|
|
|
public void setFinishedAt(String finishedAt) {
|
|
this.finishedAt = finishedAt;
|
|
}
|
|
|
|
public Long getDurationSeconds() {
|
|
return durationSeconds;
|
|
}
|
|
|
|
public void setDurationSeconds(Long durationSeconds) {
|
|
this.durationSeconds = durationSeconds;
|
|
}
|
|
|
|
public String getBackupPath() {
|
|
return backupPath;
|
|
}
|
|
|
|
public void setBackupPath(String backupPath) {
|
|
this.backupPath = backupPath;
|
|
}
|
|
|
|
public Long getFileSizeBytes() {
|
|
return fileSizeBytes;
|
|
}
|
|
|
|
public void setFileSizeBytes(Long fileSizeBytes) {
|
|
this.fileSizeBytes = fileSizeBytes;
|
|
}
|
|
|
|
public Long getArchiveCount() {
|
|
return archiveCount;
|
|
}
|
|
|
|
public void setArchiveCount(Long archiveCount) {
|
|
this.archiveCount = archiveCount;
|
|
}
|
|
|
|
public String getResultMsg() {
|
|
return resultMsg;
|
|
}
|
|
|
|
public void setResultMsg(String resultMsg) {
|
|
this.resultMsg = resultMsg;
|
|
}
|
|
|
|
public String getExecutorNode() {
|
|
return executorNode;
|
|
}
|
|
|
|
public void setExecutorNode(String executorNode) {
|
|
this.executorNode = executorNode;
|
|
}
|
|
|
|
public Instant getCreatedAt() {
|
|
return createdAt;
|
|
}
|
|
|
|
public void setCreatedAt(Instant createdAt) {
|
|
this.createdAt = createdAt;
|
|
}
|
|
}
|