From 83cf1ee2cac8df2680e690c738c19be1bcb353b7 Mon Sep 17 00:00:00 2001 From: chenpei Date: Wed, 8 Jul 2026 19:37:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=80=83=E6=A0=B8=E8=B0=83?= =?UTF-8?q?=E7=A0=94=E8=AF=84=E4=BB=B7=E4=BA=BA=E9=80=89=E6=8B=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/performance-survey/[[...path]]/page.tsx | 190 +++++++++++++++++--- lib/performance-survey-service.ts | 91 +--------- 2 files changed, 164 insertions(+), 117 deletions(-) diff --git a/app/performance-survey/[[...path]]/page.tsx b/app/performance-survey/[[...path]]/page.tsx index f3948ad..c9256f3 100644 --- a/app/performance-survey/[[...path]]/page.tsx +++ b/app/performance-survey/[[...path]]/page.tsx @@ -150,6 +150,16 @@ function matchesPickerSearch(keyword: string, values: unknown[]) { return values.some((value) => pickerSearchVariants(value).some((variant) => variant.includes(normalizedKeyword))) } +function mergeEmployeesById(...groups: Employee[][]) { + const byId = new Map() + for (const group of groups) { + for (const employee of group) { + if (!byId.has(employee.id)) byId.set(employee.id, employee) + } + } + return Array.from(byId.values()) +} + async function apiRequest(path: string, options?: RequestInit): Promise { const dingtalkToken = getStoredDingtalkPerformanceToken() const response = await fetch(`${API_BASE}${path}`, { @@ -962,8 +972,9 @@ function CreateSurveyForm({ const [dueAt, setDueAt] = useState('') const [openNow, setOpenNow] = useState(true) const [targetEmployees, setTargetEmployees] = useState([]) - const [evaluatorEmployees, setEvaluatorEmployees] = useState([]) - const [evaluatorDepartments, setEvaluatorDepartments] = useState([]) + const [manualEvaluatorEmployees, setManualEvaluatorEmployees] = useState([]) + const [evaluatorDepartmentValues, setEvaluatorDepartmentValues] = useState([]) + const [evaluatorDepartmentEmployees, setEvaluatorDepartmentEmployees] = useState>({}) const [itemName, setItemName] = useState('') const [targetItems, setTargetItems] = useState>([]) const [createdSurvey, setCreatedSurvey] = useState(null) @@ -973,6 +984,22 @@ function CreateSurveyForm({ const selectedTemplate = templateCode || templates[0]?.code || '' const selectedTemplateInfo = templates.find((template) => template.code === selectedTemplate) const surveyKind = selectedTemplateInfo?.surveyType || 'person_period' + const evaluatorEmployees = useMemo( + () => mergeEmployeesById(manualEvaluatorEmployees, ...Object.values(evaluatorDepartmentEmployees)), + [manualEvaluatorEmployees, evaluatorDepartmentEmployees], + ) + + const removeEvaluatorEmployee = (id: string) => { + setManualEvaluatorEmployees((current) => current.filter((employee) => employee.id !== id)) + setEvaluatorDepartmentEmployees((current) => { + const next: Record = {} + for (const [department, employees] of Object.entries(current)) { + const filtered = employees.filter((employee) => employee.id !== id) + if (filtered.length > 0) next[department] = filtered + } + return next + }) + } const submit = async () => { setSaving(true) @@ -1002,14 +1029,14 @@ function CreateSurveyForm({ targetEmployeeIds: targetEmployees.map((employee) => employee.id), targetItems: targetItemsToSubmit, evaluatorEmployeeIds: evaluatorEmployees.map((employee) => employee.id), - evaluatorDepartmentNames: evaluatorDepartments, }), }) setTitle('') setDescription('') setTargetEmployees([]) - setEvaluatorEmployees([]) - setEvaluatorDepartments([]) + setManualEvaluatorEmployees([]) + setEvaluatorDepartmentValues([]) + setEvaluatorDepartmentEmployees({}) setTargetItems([]) setItemName('') setCreatedSurvey(created) @@ -1045,16 +1072,18 @@ function CreateSurveyForm({ ))} - {surveyKind === 'person_period' ? ( - + <> + + + ) : (
{selectedTemplateInfo?.itemName || '调研事项'}
@@ -1082,14 +1111,40 @@ function CreateSurveyForm({ items={targetItems.map((item) => ({ id: item.name, label: item.name }))} onRemove={(id) => setTargetItems((current) => current.filter((item) => item.name !== id))} /> +
+ +
)} - + setManualEvaluatorEmployees((current) => mergeEmployeesById(current, [employee]))} + onRemoveEmployee={removeEvaluatorEmployee} + /> { + setEvaluatorDepartmentEmployees((current) => { + const next = { ...current } + if (checked) { + next[department] = employees + } else { + delete next[department] + } + return next + }) + }} />