feat(M08-B): 补联调收口签署

This commit is contained in:
Codex
2026-07-06 08:48:51 +08:00
parent 31aed4835e
commit 2e200842c9
6 changed files with 83 additions and 9 deletions
@@ -102,6 +102,27 @@
@change="persistSessionMeta"
/>
</el-form-item>
<el-form-item label="验收人">
<el-input
v-model="sessionMeta.acceptor"
placeholder="现场验收或交接确认人"
@change="persistSessionMeta"
/>
</el-form-item>
<el-form-item label="收口结论">
<el-input
v-model="sessionMeta.closeoutVerdict"
placeholder="例如 可收口 / 待补商户资料 / 待补硬件回包"
@change="persistSessionMeta"
/>
</el-form-item>
<el-form-item label="下一步">
<el-input
v-model="sessionMeta.nextAction"
placeholder="下一步负责人、动作和期限"
@change="persistSessionMeta"
/>
</el-form-item>
</el-form>
</section>
<section class="handoff-category-progress">
@@ -250,6 +271,9 @@ interface SessionMeta {
site: string;
coordinator: string;
executedAt: string;
acceptor: string;
closeoutVerdict: string;
nextAction: string;
updatedAt: string;
}
@@ -390,13 +414,29 @@ function readSessionMeta(): SessionMeta {
site: saved.site || '',
coordinator: saved.coordinator || '',
executedAt: saved.executedAt || '',
acceptor: saved.acceptor || '',
closeoutVerdict: saved.closeoutVerdict || '',
nextAction: saved.nextAction || '',
updatedAt: saved.updatedAt || ''
};
} catch {
return { batchNo: '', site: '', coordinator: '', executedAt: '', updatedAt: '' };
return createEmptySessionMeta();
}
}
function createEmptySessionMeta(): SessionMeta {
return {
batchNo: '',
site: '',
coordinator: '',
executedAt: '',
acceptor: '',
closeoutVerdict: '',
nextAction: '',
updatedAt: ''
};
}
function persistSessionMeta() {
touchSessionMeta();
localStorage.setItem(sessionStorageKey, JSON.stringify(sessionMeta));
@@ -429,6 +469,9 @@ async function copyBlockedSummary() {
`现场/门店:${sessionMeta.site || '未填写'}`,
`负责人:${sessionMeta.coordinator || '未填写'}`,
`执行时间:${sessionMeta.executedAt || '未填写'}`,
`验收人:${sessionMeta.acceptor || '未填写'}`,
`收口结论:${sessionMeta.closeoutVerdict || '未填写'}`,
`下一步:${sessionMeta.nextAction || '未填写'}`,
`最后更新:${sessionMeta.updatedAt || '未记录'}`
].join('\n');
const content = blockedItems.value.map((item) => {
@@ -450,6 +493,9 @@ async function copyEvidenceSummary() {
`现场/门店:${sessionMeta.site || '未填写'}`,
`负责人:${sessionMeta.coordinator || '未填写'}`,
`执行时间:${sessionMeta.executedAt || '未填写'}`,
`验收人:${sessionMeta.acceptor || '未填写'}`,
`收口结论:${sessionMeta.closeoutVerdict || '未填写'}`,
`下一步:${sessionMeta.nextAction || '未填写'}`,
`最后更新:${sessionMeta.updatedAt || '未记录'}`,
`待补证据:${evidenceMissingCount.value}`
].join('\n');
@@ -471,6 +517,9 @@ async function copyVerdict() {
`现场/门店:${sessionMeta.site || '未填写'}`,
`负责人:${sessionMeta.coordinator || '未填写'}`,
`执行时间:${sessionMeta.executedAt || '未填写'}`,
`验收人:${sessionMeta.acceptor || '未填写'}`,
`收口结论:${sessionMeta.closeoutVerdict || '未填写'}`,
`下一步:${sessionMeta.nextAction || '未填写'}`,
`最后更新:${sessionMeta.updatedAt || '未记录'}`,
`结论:${handoffReady.value ? '可进入现场验收收口' : '仍不可收口'}`,
`统计:通过 ${passedCount.value},阻断 ${blockedCount.value},待处理 ${pendingCount.value},证据 ${evidenceRecordedCount.value}/${checklist.length},待补证据 ${evidenceMissingCount.value}`
@@ -507,6 +556,9 @@ function buildHandoffReport() {
`现场/门店:${sessionMeta.site || '未填写'}`,
`负责人:${sessionMeta.coordinator || '未填写'}`,
`执行时间:${sessionMeta.executedAt || '未填写'}`,
`验收人:${sessionMeta.acceptor || '未填写'}`,
`收口结论:${sessionMeta.closeoutVerdict || '未填写'}`,
`下一步:${sessionMeta.nextAction || '未填写'}`,
`最后更新:${sessionMeta.updatedAt || '未记录'}`,
`结论:${handoffReady.value ? '可进入现场验收收口' : '仍不可收口'}`,
`汇总:总项 ${checklist.length},通过 ${passedCount.value},阻断 ${blockedCount.value},待处理 ${pendingCount.value},证据 ${evidenceRecordedCount.value}/${checklist.length},待补证据 ${evidenceMissingCount.value}`
@@ -567,6 +619,9 @@ function exportChecklist() {
['session', '现场/门店', sessionMeta.site, '', '', '', '', '', ''],
['session', '负责人', sessionMeta.coordinator, '', '', '', '', '', ''],
['session', '执行时间', sessionMeta.executedAt, '', '', '', '', '', ''],
['session', '验收人', sessionMeta.acceptor, '', '', '', '', '', ''],
['session', '收口结论', sessionMeta.closeoutVerdict, '', '', '', '', '', ''],
['session', '下一步', sessionMeta.nextAction, '', '', '', '', '', ''],
['session', '最后更新', sessionMeta.updatedAt, '', '', '', '', '', ''],
['session', '证据记录数', `${evidenceRecordedCount.value}/${checklist.length}`, '', '', '', '', '', ''],
['session', '待补证据数', String(evidenceMissingCount.value), '', '', '', '', '', ''],
@@ -622,6 +677,9 @@ async function importSnapshot(event: Event) {
site: payload.sessionMeta?.site || '',
coordinator: payload.sessionMeta?.coordinator || '',
executedAt: payload.sessionMeta?.executedAt || '',
acceptor: payload.sessionMeta?.acceptor || '',
closeoutVerdict: payload.sessionMeta?.closeoutVerdict || '',
nextAction: payload.sessionMeta?.nextAction || '',
updatedAt: payload.sessionMeta?.updatedAt || ''
});
for (const [id, value] of Object.entries(payload.draft)) {