diff --git a/src/components/exam/ExamPrintPanel.tsx b/src/components/exam/ExamPrintPanel.tsx index 6958508..731eb39 100644 --- a/src/components/exam/ExamPrintPanel.tsx +++ b/src/components/exam/ExamPrintPanel.tsx @@ -2,6 +2,7 @@ import { useEffect, useRef, useState } from 'react'; import { submitDaojiandanSign } from '../../api'; import type { ExamClient } from '../../data/mockData'; +import { setExamActionRecord } from '../../utils/examActions'; import type { SignaturePadHandle } from '../ui'; import { Button, SignaturePad } from '../ui'; @@ -47,6 +48,8 @@ export const ExamPrintPanel = ({ client }: { client: ExamClient }) => { setSubmitMessage('签名提交成功,正在加载导检单...'); setSignatureSubmitted(true); setPdfUrl(res.Data.pdf_url); + // 记录打印导检单是否签名操作 + setExamActionRecord(examId, 'printSign', true); } else { setSubmitMessage(res.Message || '签名提交失败'); } diff --git a/src/components/exam/ExamSection.tsx b/src/components/exam/ExamSection.tsx index 726f5d6..bb41285 100644 --- a/src/components/exam/ExamSection.tsx +++ b/src/components/exam/ExamSection.tsx @@ -2,6 +2,7 @@ import { useEffect, useState } from 'react'; import type { ExamClient, ExamModalTab } from '../../data/mockData'; import { EXAM_TAGS } from '../../data/mockData'; import { getTodayExamProgress } from '../../api'; +import { isExamActionDone } from '../../utils/examActions'; import { Badge, Card, CardContent, CardHeader, InfoCard } from '../ui'; import { cls } from '../../utils/cls'; @@ -77,9 +78,13 @@ export const ExamSection = ({
{filteredClients.map((client) => { - const signDone = client.signStatus === '已登记' || client.checkedItems.includes('签到'); + // 检查操作记录:优先使用 localStorage 记录,如果没有则使用原有逻辑 + const idCardSignInDone = isExamActionDone(client.id, 'idCardSignIn'); + const printSignDone = isExamActionDone(client.id, 'printSign'); + + const signDone = idCardSignInDone || client.signStatus === '已登记' || client.checkedItems.includes('签到'); const addonCount = client.addonCount || 0; - const printDone = !!client.guidePrinted; + const printDone = printSignDone || !!client.guidePrinted; const openModal = (tab: ExamModalTab) => onOpenModal(client.id, tab); return ( diff --git a/src/components/exam/ExamSignPanel.tsx b/src/components/exam/ExamSignPanel.tsx index 78050a5..1ec4f89 100644 --- a/src/components/exam/ExamSignPanel.tsx +++ b/src/components/exam/ExamSignPanel.tsx @@ -2,6 +2,7 @@ import { useEffect, useRef, useState } from 'react'; import type { OutputTongyishuFileInfo } from '../../api'; import { getTongyishuPdf, signInMedicalExamCenter, submitTongyishuSign } from '../../api'; +import { setExamActionRecord } from '../../utils/examActions'; import type { SignaturePadHandle } from '../ui'; import { Button, SignaturePad } from '../ui'; @@ -123,7 +124,15 @@ export const ExamSignPanel = ({ examId, onBusyChange }: ExamSignPanelProps) => { try { const res = await signInMedicalExamCenter({ id_no_pic: idCardFile }); const ok = res.Status === 200 && res.Data?.is_success === 0; - setMessage(ok ? '签到成功' : res.Message || '签到失败'); + if (ok) { + setMessage('签到成功'); + // 记录身份证拍照与签到操作 + if (examId) { + setExamActionRecord(examId, 'idCardSignIn', true); + } + } else { + setMessage(res.Message || '签到失败'); + } } catch (err) { console.error(err); setMessage('签到请求失败,请稍后重试'); @@ -157,6 +166,10 @@ export const ExamSignPanel = ({ examId, onBusyChange }: ExamSignPanelProps) => { if (res.Status === 200) { setSubmitMessage('签名提交成功'); + // 记录体检知情同意书的签字操作 + if (examId) { + setExamActionRecord(examId, 'consentSign', true); + } setSignedCombinationCodes((prev) => { const code = Number(previewPdf.combination_code); if (!Number.isFinite(code)) return prev || []; diff --git a/src/utils/examActions.ts b/src/utils/examActions.ts new file mode 100644 index 0000000..d0ae63a --- /dev/null +++ b/src/utils/examActions.ts @@ -0,0 +1,88 @@ +/** + * 体检操作记录工具函数 + * 使用格式:yh_exam_actions_${today}_${examId} + * 存储内容:{ idCardSignIn: boolean, consentSign: boolean, printSign: boolean, timestamp: string } + */ + +/** + * 获取今天的日期字符串(YYYY-MM-DD) + */ +export const getTodayString = (): string => { + const today = new Date(); + const year = today.getFullYear(); + const month = String(today.getMonth() + 1).padStart(2, '0'); + const day = String(today.getDate()).padStart(2, '0'); + return `${year}-${month}-${day}`; +}; + +/** + * 获取操作记录的存储 key + */ +export const getExamActionKey = (examId: string | number): string => { + const today = getTodayString(); + return `yh_exam_actions_${today}_${examId}`; +}; + +/** + * 操作记录类型 + */ +export interface ExamActionRecord { + /** 身份证拍照与签到 */ + idCardSignIn?: boolean; + /** 体检知情同意书的签字 */ + consentSign?: boolean; + /** 打印导检单是否签名 */ + printSign?: boolean; + /** 记录时间戳 */ + timestamp?: string; +} + +/** + * 获取操作记录 + */ +export const getExamActionRecord = (examId: string | number): ExamActionRecord | null => { + if (typeof window === 'undefined') return null; + + const key = getExamActionKey(examId); + const raw = localStorage.getItem(key); + if (!raw) return null; + + try { + const parsed = JSON.parse(raw); + return parsed as ExamActionRecord; + } catch (err) { + console.warn('操作记录解析失败', err); + return null; + } +}; + +/** + * 设置操作记录 + */ +export const setExamActionRecord = ( + examId: string | number, + action: keyof ExamActionRecord, + value: boolean = true +): void => { + if (typeof window === 'undefined') return; + + const key = getExamActionKey(examId); + const existing = getExamActionRecord(examId) || {}; + + const updated: ExamActionRecord = { + ...existing, + [action]: value, + timestamp: new Date().toISOString(), + }; + + localStorage.setItem(key, JSON.stringify(updated)); +}; + +/** + * 检查操作是否已完成 + */ +export const isExamActionDone = (examId: string | number, action: keyof ExamActionRecord): boolean => { + const record = getExamActionRecord(examId); + return record?.[action] === true; +}; +