SNAPSHOT W7 已部署稳定态 — 凯迪ERP+OA一体化平台 (MET 73.3%)

恢复点(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>
This commit is contained in:
Qiufeng
2026-06-15 19:19:15 +08:00
co-authored by Claude Opus 4.8
commit 5e51dc3f56
10584 changed files with 2501339 additions and 0 deletions
@@ -0,0 +1,481 @@
.erp-form {
display: grid;
gap: var(--erp-space-4);
}
.metrics-grid {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: var(--erp-space-3);
}
.metrics-grid--mini {
gap: var(--erp-space-2);
}
.erp-metric-card {
--erp-metric-color: var(--erp-color-primary);
--erp-metric-soft: var(--erp-color-primary-soft);
position: relative;
min-height: 104px;
padding: var(--erp-space-4);
background: var(--erp-color-surface);
border: 1px solid var(--erp-color-border-soft);
border-radius: var(--erp-radius-md);
}
.erp-metric-card.is-success {
--erp-metric-color: var(--erp-color-success);
--erp-metric-soft: var(--erp-color-success-soft);
}
.erp-metric-card.is-warning {
--erp-metric-color: var(--erp-color-warning);
--erp-metric-soft: var(--erp-color-warning-soft);
}
.erp-metric-card.is-danger {
--erp-metric-color: var(--erp-color-danger);
--erp-metric-soft: var(--erp-color-danger-soft);
}
.erp-metric-card__head {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--erp-space-3);
margin-bottom: var(--erp-space-3);
}
.erp-metric-card__head span {
color: var(--erp-color-text-muted);
font-size: var(--erp-font-size-xs);
font-weight: 700;
}
.erp-metric-card__head .el-icon {
color: var(--erp-metric-color);
}
.erp-metric-card strong {
display: block;
margin-bottom: var(--erp-space-1);
color: var(--erp-color-text);
font-size: 25px;
line-height: 1;
}
.erp-metric-card small {
color: var(--erp-color-text-muted);
font-size: var(--erp-font-size-xs);
font-weight: 700;
}
.erp-metric-card--small,
.erp-metric-card--outline {
border-color: color-mix(in srgb, var(--erp-metric-color) 44%, var(--erp-color-border-soft));
box-shadow: 0 1px 0 rgba(29, 36, 51, 0.03);
}
.erp-metric-card--large,
.erp-metric-card--quiet {
background: linear-gradient(180deg, var(--erp-metric-soft), #ffffff 66%);
border-color: color-mix(in srgb, var(--erp-metric-color) 18%, var(--erp-color-border-soft));
}
.erp-metric-card--mini,
.erp-metric-card--compact {
display: grid;
grid-template-columns: 1fr auto;
grid-template-areas:
"head value"
"delta value";
min-height: 74px;
align-items: center;
padding: var(--erp-space-3);
border-color: var(--erp-color-border-soft);
}
.erp-metric-card--mini .erp-metric-card__head,
.erp-metric-card--compact .erp-metric-card__head {
grid-area: head;
justify-content: flex-start;
margin-bottom: 2px;
}
.erp-metric-card--mini strong,
.erp-metric-card--compact strong {
grid-area: value;
margin-bottom: 0;
font-size: 22px;
text-align: right;
}
.erp-metric-card--mini small,
.erp-metric-card--compact small {
grid-area: delta;
color: var(--erp-metric-color);
}
.erp-table {
--erp-table-header-bg-color: #f2f5fa;
--erp-table-header-text-color: #344054;
--erp-table-row-hover-bg-color: #f5f8ff;
--erp-table-border-color: var(--erp-color-border-soft);
border: 1px solid var(--erp-color-border-soft);
border-radius: var(--erp-radius-md);
overflow: hidden;
}
.erp-table .el-table__cell {
padding: 7px 0;
}
.erp-table th.el-table__cell {
font-weight: 700;
}
.erp-virtual-table {
overflow: hidden;
border: 1px solid var(--erp-color-border-soft);
border-radius: var(--erp-radius-md);
}
.erp-dense-pagination {
--el-pagination-font-size: var(--erp-font-size-sm);
justify-content: flex-end;
}
.erp-field-control,
.erp-date-range,
.erp-entity-lookup,
.erp-tree-select {
width: 100%;
}
.erp-choice-group {
display: inline-flex;
flex-wrap: wrap;
gap: var(--erp-space-2);
}
.erp-side-menu {
border-right: 0;
}
.erp-side-menu .el-menu-item,
.erp-side-menu .el-sub-menu__title {
height: 38px;
color: #465066;
font-size: var(--erp-font-size-sm);
}
.erp-side-menu .el-menu-item.is-active {
color: var(--erp-color-primary);
background: var(--erp-color-primary-soft);
}
.erp-side-menu .el-sub-menu .el-menu-item {
min-width: 0;
padding-left: 44px;
}
.erp-breadcrumb {
font-size: var(--erp-font-size-sm);
}
.erp-breadcrumb .el-breadcrumb__inner {
color: var(--erp-color-text-muted);
font-weight: 650;
}
.erp-breadcrumb .el-breadcrumb__item:last-child .el-breadcrumb__inner {
color: var(--erp-color-text);
}
.erp-page-header {
padding-bottom: var(--erp-space-3);
border-bottom: 1px solid var(--erp-color-border-soft);
}
.erp-tabs .el-tabs__header {
margin-bottom: var(--erp-space-3);
}
.erp-tabs .el-tabs__item {
height: 36px;
}
.erp-action-button,
.erp-action-dropdown .el-button {
min-width: 86px;
}
.erp-status-tag,
.erp-status-badge {
font-weight: 700;
}
.erp-status-alert {
border-radius: var(--erp-radius-sm);
}
.erp-detail-descriptions .el-descriptions__cell {
padding: 9px 12px;
}
.erp-detail-descriptions .el-descriptions__label {
width: 96px;
color: #566176;
font-weight: 700;
background: #f5f7fb;
}
.erp-entity-card {
min-height: 112px;
padding: var(--erp-space-4);
background: #ffffff;
border: 1px solid var(--erp-color-border-soft);
border-radius: var(--erp-radius-md);
box-shadow: var(--erp-shadow-sm);
}
.erp-entity-card header {
margin-bottom: var(--erp-space-2);
color: var(--erp-color-text-muted);
font-size: var(--erp-font-size-xs);
font-weight: 800;
}
.erp-entity-card strong {
display: block;
color: var(--erp-color-text);
font-size: var(--erp-font-size-lg);
}
.erp-entity-card p {
margin: var(--erp-space-2) 0 0;
color: var(--erp-color-text-muted);
}
.erp-tree,
.erp-tree-select {
--el-tree-node-hover-bg-color: var(--erp-color-surface-muted);
}
.erp-upload .el-upload-dragger {
padding: var(--erp-space-5);
border-color: var(--erp-color-border);
border-radius: var(--erp-radius-md);
}
.erp-empty-state {
padding: var(--erp-space-5);
background: #ffffff;
border: 1px dashed var(--erp-color-border);
border-radius: var(--erp-radius-md);
}
.erp-progress {
--el-color-primary: var(--erp-color-primary);
}
.erp-skeleton {
padding: var(--erp-space-4);
background: #ffffff;
border: 1px solid var(--erp-color-border-soft);
border-radius: var(--erp-radius-md);
}
.erp-calendar {
overflow: hidden;
border: 1px solid var(--erp-color-border-soft);
border-radius: var(--erp-radius-md);
}
.erp-calendar .el-calendar__body {
padding: var(--erp-space-3);
}
.erp-calendar .el-calendar-table .el-calendar-day {
min-height: 44px;
height: 44px;
padding: 6px;
}
.erp-timeline {
padding: var(--erp-space-2) 0 0;
}
.erp-steps {
padding: var(--erp-space-4);
background: #ffffff;
border: 1px solid var(--erp-color-border-soft);
border-radius: var(--erp-radius-md);
}
.erp-collapse {
overflow: hidden;
background: #ffffff;
border: 1px solid var(--erp-color-border-soft);
border-radius: var(--erp-radius-md);
}
.erp-collapse .el-collapse-item__header,
.erp-collapse .el-collapse-item__content {
padding-right: var(--erp-space-4);
padding-left: var(--erp-space-4);
}
.erp-media-preview {
width: 220px;
height: 132px;
overflow: hidden;
border: 1px solid var(--erp-color-border-soft);
border-radius: var(--erp-radius-md);
}
.erp-carousel {
overflow: hidden;
border: 1px solid var(--erp-color-border-soft);
border-radius: var(--erp-radius-md);
}
.erp-inline-text,
.erp-inline-link {
font-size: var(--erp-font-size-sm);
font-weight: 650;
}
.erp-space {
padding: var(--erp-space-3);
background: #ffffff;
border: 1px solid var(--erp-color-border-soft);
border-radius: var(--erp-radius-md);
}
.erp-statistic {
min-width: 150px;
padding: var(--erp-space-4);
background: #ffffff;
border: 1px solid var(--erp-color-border-soft);
border-radius: var(--erp-radius-md);
}
.erp-switch,
.erp-slider,
.erp-rate,
.erp-color-picker {
max-width: 360px;
}
.erp-transfer {
max-width: 720px;
}
.erp-dialog,
.erp-drawer,
.erp-popconfirm,
.erp-tooltip {
font-size: var(--erp-font-size-sm);
}
.form-grid {
display: grid;
grid-template-columns: 1.15fr 0.85fr 1.2fr 0.85fr;
gap: var(--erp-space-4);
align-items: end;
}
.form-grid.secondary {
grid-template-columns: 1fr 1fr 1.2fr;
}
.table-search {
width: 270px;
}
.icon-cell {
display: inline-flex;
align-items: center;
gap: 6px;
color: #465066;
}
.risk-dot {
display: inline-flex;
align-items: center;
gap: 6px;
font-weight: 700;
}
.risk-dot::before {
width: 7px;
height: 7px;
content: "";
border-radius: 50%;
}
.risk-low::before {
background: var(--erp-color-success);
}
.risk-mid::before {
background: var(--erp-color-warning);
}
.risk-high::before {
background: var(--erp-color-danger);
}
.component-chip-list {
display: flex;
flex-wrap: wrap;
gap: 7px;
}
.component-chip {
display: inline-flex;
align-items: center;
gap: 6px;
min-height: 26px;
padding: 4px 8px;
color: #344054;
font-size: var(--erp-font-size-xs);
font-weight: 700;
background: #ffffff;
border: 1px solid var(--erp-color-border-soft);
border-radius: var(--erp-radius-xs);
}
.component-chip small {
display: inline-grid;
min-width: 16px;
height: 16px;
place-items: center;
padding: 0 4px;
color: var(--erp-color-text-muted);
font-size: 11px;
background: var(--erp-color-surface-muted);
border-radius: 999px;
}
.component-chip.priority-高 {
color: var(--erp-color-primary-strong);
border-color: #bdd0fb;
background: #f4f7ff;
}
.component-chip.priority-高 small {
color: #ffffff;
background: var(--erp-color-primary);
}
.component-chip.priority-中 {
color: #525f76;
}
.component-chip.priority-低 {
color: #7d8798;
background: #fafbfc;
}