feat(M08-B): 补联调收口签署
This commit is contained in:
@@ -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)) {
|
||||
|
||||
Reference in New Issue
Block a user