feat(M08-B): 补联调期限记录

This commit is contained in:
Codex
2026-07-07 09:45:15 +08:00
parent 7e8fa275d5
commit bcc89addba
6 changed files with 49 additions and 14 deletions
@@ -54,6 +54,9 @@
<el-form-item label="负责人">
<el-input v-model="bulkForm.owner" placeholder="留空则不覆盖" />
</el-form-item>
<el-form-item label="期限">
<el-input v-model="bulkForm.deadline" placeholder="留空则不覆盖" />
</el-form-item>
<el-form-item label="结果记录">
<el-input v-model="bulkForm.note" placeholder="留空则不覆盖" />
</el-form-item>
@@ -242,6 +245,16 @@
/>
</template>
</el-table-column>
<el-table-column label="期限" width="150">
<template #default="{ row }">
<el-input
v-model="draft[row.id].deadline"
size="small"
placeholder="YYYY-MM-DD"
@change="persistDraft"
/>
</template>
</el-table-column>
<el-table-column label="结果记录" min-width="230">
<template #default="{ row }">
<el-input
@@ -286,6 +299,7 @@ interface HandoffItem {
interface HandoffDraft {
status: FieldStatus;
owner: string;
deadline: string;
note: string;
evidenceRef: string;
}
@@ -307,9 +321,10 @@ const category = ref<'全部' | HandoffItem['category']>('全部');
const statusFilter = ref<'ALL' | FieldStatus>('ALL');
const ownerFilter = ref('ALL');
const snapshotInput = ref<HTMLInputElement | null>(null);
const bulkForm = reactive<{ status: FieldStatus; owner: string; note: string }>({
const bulkForm = reactive<{ status: FieldStatus; owner: string; deadline: string; note: string }>({
status: 'PASS',
owner: '',
deadline: '',
note: ''
});
const checklist: HandoffItem[] = [
@@ -506,6 +521,7 @@ function applyBulkMark() {
for (const item of filteredChecklist.value) {
draft[item.id].status = bulkForm.status;
if (bulkForm.owner.trim()) draft[item.id].owner = bulkForm.owner.trim();
if (bulkForm.deadline.trim()) draft[item.id].deadline = bulkForm.deadline.trim();
if (bulkForm.note.trim()) draft[item.id].note = bulkForm.note.trim();
}
persistDraft();
@@ -524,8 +540,9 @@ async function copyBlockedSummary() {
].join('\n');
const content = blockedItems.value.map((item) => {
const itemDraft = draft[item.id];
const deadline = itemDraft.deadline ? ` - 期限:${itemDraft.deadline}` : '';
const evidence = itemDraft.evidenceRef ? ` - 证据:${itemDraft.evidenceRef}` : '';
return `[${item.category}] ${item.title} - ${itemDraft.owner || '未分派'} - ${itemDraft.note || item.expected}${evidence}`;
return `[${item.category}] ${item.title} - ${itemDraft.owner || '未分派'}${deadline} - ${itemDraft.note || item.expected}${evidence}`;
}).join('\n');
try {
await navigator.clipboard.writeText(`${header}\n\n${content}`);
@@ -549,7 +566,8 @@ async function copyEvidenceSummary() {
].join('\n');
const content = evidenceMissingItems.value.map((item) => {
const itemDraft = draft[item.id];
return `[${item.category}] ${item.title} - ${itemDraft.owner || '未分派'} - 应留证据${item.evidence}`;
const deadline = itemDraft.deadline ? ` - 期限${itemDraft.deadline}` : '';
return `[${item.category}] ${item.title} - ${itemDraft.owner || '未分派'}${deadline} - 应留证据:${item.evidence}`;
}).join('\n');
try {
await navigator.clipboard.writeText(`${header}\n\n${content}`);
@@ -661,6 +679,7 @@ function serializeHandoffItem(item: HandoffItem) {
status: itemDraft.status,
statusText: statusText(itemDraft.status),
owner: itemDraft.owner,
deadline: itemDraft.deadline,
note: itemDraft.note,
evidence: item.evidence,
evidenceRef: itemDraft.evidenceRef
@@ -715,6 +734,7 @@ function formatReportItem(item: HandoffItem) {
`- [${item.category}] ${item.title}`,
` 状态:${statusText(itemDraft.status)}`,
` 负责人:${itemDraft.owner || '未分派'}`,
` 期限:${itemDraft.deadline || '未填写'}`,
` 结果:${itemDraft.note || '未记录'}`,
` 应留证据:${item.evidence}`,
` 证据记录:${itemDraft.evidenceRef || '未记录'}`
@@ -745,7 +765,7 @@ function exportChecklist() {
['session', '归档门禁', closeoutReady.value ? '可归档' : `待补齐 ${missingCloseoutFields.value.join('、')}`, '', '', '', '', '', ''],
['session', '证据记录数', `${evidenceRecordedCount.value}/${checklist.length}`, '', '', '', '', '', ''],
['session', '待补证据数', String(evidenceMissingCount.value), '', '', '', '', '', ''],
['ID', '类别', '检查项', '期望', '状态', '负责人', '结果记录', '应留证据', '证据记录'],
['ID', '类别', '检查项', '期望', '状态', '负责人', '期限', '结果记录', '应留证据', '证据记录'],
...checklist.map((item) => [
item.id,
item.category,
@@ -753,6 +773,7 @@ function exportChecklist() {
item.expected,
draft[item.id].status,
draft[item.id].owner,
draft[item.id].deadline,
draft[item.id].note,
item.evidence,
draft[item.id].evidenceRef
@@ -769,7 +790,7 @@ function exportRiskRegister() {
['session', '执行时间', sessionMeta.executedAt, '', '', '', '', '', ''],
['session', '最后更新', sessionMeta.updatedAt, '', '', '', '', '', ''],
['session', '风险项数量', String(riskItems.value.length), '', '', '', '', '', ''],
['ID', '类别', '检查项', '状态', '负责人', '风险/缺口', '应留证据', '证据记录', '下一步'],
['ID', '类别', '检查项', '状态', '负责人', '期限', '风险/缺口', '应留证据', '证据记录', '下一步'],
...riskItems.value.map((item) => {
const itemDraft = draft[item.id];
const gaps = [
@@ -783,6 +804,7 @@ function exportRiskRegister() {
item.title,
statusText(itemDraft.status),
itemDraft.owner,
itemDraft.deadline,
gaps,
item.evidence,
itemDraft.evidenceRef,
@@ -840,6 +862,7 @@ async function importSnapshot(event: Event) {
draft[id] = {
status,
owner: value.owner || '',
deadline: value.deadline || '',
note: value.note || '',
evidenceRef: value.evidenceRef || ''
};
@@ -861,6 +884,7 @@ function normalizeDraft(value?: Partial<HandoffDraft>): HandoffDraft {
return {
status: isFieldStatus(value?.status) ? value.status : 'PENDING',
owner: value?.owner || '',
deadline: value?.deadline || '',
note: value?.note || '',
evidenceRef: value?.evidenceRef || ''
};