保存体检操作记录
This commit is contained in:
@@ -2,6 +2,7 @@ import { useEffect, useRef, useState } from 'react';
|
|||||||
|
|
||||||
import { submitDaojiandanSign } from '../../api';
|
import { submitDaojiandanSign } from '../../api';
|
||||||
import type { ExamClient } from '../../data/mockData';
|
import type { ExamClient } from '../../data/mockData';
|
||||||
|
import { setExamActionRecord } from '../../utils/examActions';
|
||||||
import type { SignaturePadHandle } from '../ui';
|
import type { SignaturePadHandle } from '../ui';
|
||||||
import { Button, SignaturePad } from '../ui';
|
import { Button, SignaturePad } from '../ui';
|
||||||
|
|
||||||
@@ -47,6 +48,8 @@ export const ExamPrintPanel = ({ client }: { client: ExamClient }) => {
|
|||||||
setSubmitMessage('签名提交成功,正在加载导检单...');
|
setSubmitMessage('签名提交成功,正在加载导检单...');
|
||||||
setSignatureSubmitted(true);
|
setSignatureSubmitted(true);
|
||||||
setPdfUrl(res.Data.pdf_url);
|
setPdfUrl(res.Data.pdf_url);
|
||||||
|
// 记录打印导检单是否签名操作
|
||||||
|
setExamActionRecord(examId, 'printSign', true);
|
||||||
} else {
|
} else {
|
||||||
setSubmitMessage(res.Message || '签名提交失败');
|
setSubmitMessage(res.Message || '签名提交失败');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { useEffect, useState } from 'react';
|
|||||||
import type { ExamClient, ExamModalTab } from '../../data/mockData';
|
import type { ExamClient, ExamModalTab } from '../../data/mockData';
|
||||||
import { EXAM_TAGS } from '../../data/mockData';
|
import { EXAM_TAGS } from '../../data/mockData';
|
||||||
import { getTodayExamProgress } from '../../api';
|
import { getTodayExamProgress } from '../../api';
|
||||||
|
import { isExamActionDone } from '../../utils/examActions';
|
||||||
import { Badge, Card, CardContent, CardHeader, InfoCard } from '../ui';
|
import { Badge, Card, CardContent, CardHeader, InfoCard } from '../ui';
|
||||||
import { cls } from '../../utils/cls';
|
import { cls } from '../../utils/cls';
|
||||||
|
|
||||||
@@ -77,9 +78,13 @@ export const ExamSection = ({
|
|||||||
<CardContent>
|
<CardContent>
|
||||||
<div className='grid grid-cols-3 gap-3 text-sm'>
|
<div className='grid grid-cols-3 gap-3 text-sm'>
|
||||||
{filteredClients.map((client) => {
|
{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 addonCount = client.addonCount || 0;
|
||||||
const printDone = !!client.guidePrinted;
|
const printDone = printSignDone || !!client.guidePrinted;
|
||||||
const openModal = (tab: ExamModalTab) => onOpenModal(client.id, tab);
|
const openModal = (tab: ExamModalTab) => onOpenModal(client.id, tab);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { useEffect, useRef, useState } from 'react';
|
|||||||
|
|
||||||
import type { OutputTongyishuFileInfo } from '../../api';
|
import type { OutputTongyishuFileInfo } from '../../api';
|
||||||
import { getTongyishuPdf, signInMedicalExamCenter, submitTongyishuSign } from '../../api';
|
import { getTongyishuPdf, signInMedicalExamCenter, submitTongyishuSign } from '../../api';
|
||||||
|
import { setExamActionRecord } from '../../utils/examActions';
|
||||||
import type { SignaturePadHandle } from '../ui';
|
import type { SignaturePadHandle } from '../ui';
|
||||||
import { Button, SignaturePad } from '../ui';
|
import { Button, SignaturePad } from '../ui';
|
||||||
|
|
||||||
@@ -123,7 +124,15 @@ export const ExamSignPanel = ({ examId, onBusyChange }: ExamSignPanelProps) => {
|
|||||||
try {
|
try {
|
||||||
const res = await signInMedicalExamCenter({ id_no_pic: idCardFile });
|
const res = await signInMedicalExamCenter({ id_no_pic: idCardFile });
|
||||||
const ok = res.Status === 200 && res.Data?.is_success === 0;
|
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) {
|
} catch (err) {
|
||||||
console.error(err);
|
console.error(err);
|
||||||
setMessage('签到请求失败,请稍后重试');
|
setMessage('签到请求失败,请稍后重试');
|
||||||
@@ -157,6 +166,10 @@ export const ExamSignPanel = ({ examId, onBusyChange }: ExamSignPanelProps) => {
|
|||||||
|
|
||||||
if (res.Status === 200) {
|
if (res.Status === 200) {
|
||||||
setSubmitMessage('签名提交成功');
|
setSubmitMessage('签名提交成功');
|
||||||
|
// 记录体检知情同意书的签字操作
|
||||||
|
if (examId) {
|
||||||
|
setExamActionRecord(examId, 'consentSign', true);
|
||||||
|
}
|
||||||
setSignedCombinationCodes((prev) => {
|
setSignedCombinationCodes((prev) => {
|
||||||
const code = Number(previewPdf.combination_code);
|
const code = Number(previewPdf.combination_code);
|
||||||
if (!Number.isFinite(code)) return prev || [];
|
if (!Number.isFinite(code)) return prev || [];
|
||||||
|
|||||||
88
src/utils/examActions.ts
Normal file
88
src/utils/examActions.ts
Normal file
@@ -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;
|
||||||
|
};
|
||||||
|
|
||||||
Reference in New Issue
Block a user