feat(qaops): 完成详情下拉与每周自动保存草稿
build / build (push) Successful in 1m7s

详情使用共享主表字典,稀疏修改所选字段并保留原始问答及旧复核审计。
月周统计提供文本和下拉双入口;每租户每周一份持久草稿,按技能六节双语模板真实预填。
加入幂等自动保存、冲突保留、未知响应重试、切周及离开保护和schema58非破坏降级保护。

验证:完整make verify、隔离PostgreSQL全mirror竞态回归、真实恢复库浏览器验收通过。
浏览器实测字段精确读回、月周双输入、模板预填、MD/CSV、自动保存、冲突、失败重试与API重启恢复。
未连接或改写DobotAI生产源库,未运行付费模型;提交时尚未部署。
This commit is contained in:
姚章浩
2026-10-20 05:41:57 +08:00
parent 154b0b62ad
commit 87f97a2f9b
47 changed files with 2587 additions and 180 deletions
+89
View File
@@ -0,0 +1,89 @@
.qa-period-input {
display: flex;
flex-direction: column;
gap: 6px;
min-width: 0;
max-width: 100%;
font-size: 13px;
}
.qa-period-combo {
display: flex;
align-items: stretch;
width: 240px;
max-width: 100%;
border: 1px solid #d7e0eb;
border-radius: 8px;
background: #fff;
overflow: hidden;
}
.qa-period-combo input {
min-width: 0;
width: 100%;
flex: 1;
border: 0 !important;
border-radius: 0 !important;
background: transparent;
padding: 8px 10px;
font: inherit;
}
.qa-period-combo select {
width: 74px;
min-width: 74px;
border: 0 !important;
border-left: 1px solid #e3e9f0 !important;
border-radius: 0 !important;
background: #f5f8fc;
padding: 7px 5px;
font: inherit;
cursor: pointer;
}
.qa-period-combo:focus-within {
outline: 2px solid #83b6f4;
outline-offset: 1px;
}
.qa-period-input small {
font-size: 12px;
color: #64748b;
max-width: 360px;
white-space: normal;
}
.qa-period-input small[role='alert'] {
color: #b42318;
}
.qa-period-combo input[aria-invalid='true'] {
background: #fff4f2;
}
.qa-inline-fields {
flex: none;
min-width: 0;
}
.qa-inline-fields .qa-detail-quality label {
display: flex;
flex-direction: column;
gap: 6px;
min-width: 0;
}
.qa-inline-fields .qa-detail-quality select {
min-width: 0;
width: 100%;
max-width: 100%;
border: 1px solid #d7e0eb;
border-radius: 6px;
padding: 6px 4px;
font: inherit;
font-weight: 600;
cursor: pointer;
}
.qa-inline-fields .qa-detail-quality select:disabled {
cursor: default;
opacity: 0.75;
}
.qa-inline-save {
margin: 2px 18px 6px;
font-size: 12px;
color: #35634c;
}
.qa-inline-fields > .error-banner {
margin: 4px 18px 8px;
font-size: 12px;
}