From c57d77b4b205dafe5d234f2eeb638036148f3dd4 Mon Sep 17 00:00:00 2001 From: Li1304553726 <1304553726@qq.com> Date: Tue, 25 Mar 2025 12:56:50 +0800 Subject: [PATCH] add --- .../app/main/staffpage/stafftable/page.tsx | 199 ++++++++++++++++-- 1 file changed, 187 insertions(+), 12 deletions(-) diff --git a/apps/web/src/app/main/staffpage/stafftable/page.tsx b/apps/web/src/app/main/staffpage/stafftable/page.tsx index 780f308..11f0929 100644 --- a/apps/web/src/app/main/staffpage/stafftable/page.tsx +++ b/apps/web/src/app/main/staffpage/stafftable/page.tsx @@ -354,20 +354,89 @@ export default function StaffTable() { const handleExportTemplate = () => { const headerNames = extractHeaders(columnDefs); - // 创建一个对象,键为列名,值为空字符串 - const templateRow = headerNames.reduce((obj, header) => { + // 创建一个空白行对象,键为列名,值为空字符串 + const emptyRow = headerNames.reduce((obj, header) => { obj[header] = ''; return obj; }, {} as Record); - // 创建工作簿和工作表 + // 创建示例数据行 + const exampleRow = headerNames.reduce((obj, header) => { + // 根据不同的表头设置不同的示例值 + switch(header) { + // 基本信息示例 + case '姓名': obj[header] = '张三'; break; + case '身份证号': obj[header] = '110101199001011234'; break; + case '人员类型': obj[header] = '在职'; break; + case '警号': obj[header] = '012345'; break; + case '手机号': obj[header] = '13800138000'; break; + case '年龄': obj[header] = '30'; break; + case '性别': obj[header] = '男'; break; + case '血型': obj[header] = 'A型'; break; + case '籍贯': obj[header] = '北京市海淀区'; break; + case '来源': obj[header] = '社会招聘'; break; + + // 政治信息示例 + case '政治面貌': obj[header] = '党员'; break; + case '党内职务': obj[header] = '支部书记'; break; + + // 职务信息示例 + case '所属部门': obj[header] = '技术部'; break; + case '衔职级别': obj[header] = '三级警司'; break; + case '衔职时间': obj[header] = '2020-01-01'; break; + case '代理职务': obj[header] = '技术组长'; break; + case '岗位': obj[header] = '技术开发'; break; + + // 入职信息示例 + case '入职时间': obj[header] = '2015-07-01'; break; + case '工龄认定时间': obj[header] = '2015-07-01'; break; + case '来源类型': obj[header] = '招聘'; break; + case '是否二次入职': obj[header] = '否'; break; + case '是否延期服役': obj[header] = '否'; break; + case '现岗位开始时间': obj[header] = '2018-05-01'; break; + + // 教育背景示例 + case '学历': obj[header] = '本科'; break; + case '学历形式': obj[header] = '全日制'; break; + case '是否毕业': obj[header] = '是'; break; + case '专业': obj[header] = '计算机科学与技术'; break; + case '外语能力': obj[header] = '英语四级'; break; + + // 培训信息示例 + case '培训类型': obj[header] = '专业技能'; break; + case '培训机构': obj[header] = '公安大学'; break; + case '培训专业': obj[header] = '网络安全'; break; + case '是否参加培训': obj[header] = '是'; break; + + // 鉴定信息示例 + case '鉴定等级': obj[header] = '高级'; break; + case '鉴定工种': obj[header] = '信息安全'; break; + case '是否参加鉴定': obj[header] = '是'; break; + + // 工作信息示例 + case '操作维护装备': obj[header] = '服务器,网络设备,安全设备'; break; + case '演训任务经历': obj[header] = '2019年网络安全演习,2020年数据恢复演练'; break; + case '奖励信息': obj[header] = '2018年度优秀员工,2020年技术创新奖'; break; + case '处分信息': obj[header] = ''; break; + + default: obj[header] = `示例${header}`; break; + } + return obj; + }, {} as Record); + + // 创建工作簿和工作表,包含示例行和空白行 const wb = utils.book_new(); - const ws = utils.json_to_sheet([templateRow], { header: headerNames }); + const ws = utils.json_to_sheet([exampleRow, emptyRow], { header: headerNames }); // 设置列宽 const colWidth = headerNames.map(() => ({ wch: 20 })); ws['!cols'] = colWidth; + // 添加一些样式表示示例数据行 + // XLSX.js 不直接支持样式,但我们可以添加注释 + const note = { t: 's', v: '以上为示例数据,请在下方行填写实际数据' }; + ws['A3'] = note; + utils.book_append_sheet(wb, ws, "员工模板"); writeFile(wb, `员工数据模板_${new Date().toISOString().slice(0, 10)}.xlsx`); }; @@ -408,12 +477,8 @@ export default function StaffTable() { staff.departmentName = value; } } else { - // 性别特殊处理 - if (childCol.field === 'sex') { - staff[childCol.field] = value === '男' ? true : value === '女' ? false : null; - } else { - staff[childCol.field] = value; - } + // 根据字段类型进行处理 + processFieldValue(staff, childCol.field, value); } } } @@ -421,7 +486,7 @@ export default function StaffTable() { } else if ('field' in colDef && colDef.headerName) { const value = row[colDef.headerName]; if (value !== undefined) { - staff[colDef.field] = value; + processFieldValue(staff, colDef.field, value); } } }); @@ -434,7 +499,7 @@ export default function StaffTable() { // 逐个创建员工记录 staffData.forEach(staff => { createManyMutation.mutate({ - data: staff // 直接传递正确格式的员工数据对象 + data: staff }); }); @@ -444,6 +509,116 @@ export default function StaffTable() { } }; + // 字段值处理函数 + const processFieldValue = (staff: any, field: string, value: any) => { + // 跳过空值 + if (value === null || value === undefined || value === '') { + return; + } + + // 根据字段类型分别处理 + switch (field) { + // 字符串字段 - 确保转为字符串 + case 'idNumber': + case 'officerId': + case 'phoneNumber': + case 'username': + case 'password': + case 'showname': + case 'avatar': + case 'type': + case 'bloodType': + case 'birthplace': + case 'source': + case 'politicalStatus': + case 'partyPosition': + case 'rank': + case 'proxyPosition': + case 'post': + case 'sourceType': + case 'education': + case 'educationType': + case 'major': + case 'foreignLang': + case 'trainType': + case 'trainInstitute': + case 'trainMajor': + case 'certRank': + case 'certWork': + case 'equipment': + case 'projects': + case 'awards': + case 'punishments': + case 'domainId': + case 'deptId': + staff[field] = String(value); + break; + + // 布尔字段 - 转为布尔值 + case 'sex': + staff[field] = value === '男' ? true : value === '女' ? false : null; + break; + case 'enabled': + case 'isReentry': + case 'isExtended': + case 'isGraduated': + case 'hasTrain': + case 'hasCert': + if (typeof value === 'string') { + staff[field] = value === '是' || value === '√' || value === 'true' || value === '1'; + } else { + staff[field] = Boolean(value); + } + break; + + // 数值字段 - 转为数字 + case 'age': + staff[field] = parseInt(value, 10); + break; + case 'order': + staff[field] = parseFloat(value); + break; + + // 日期字段 - 转为日期格式 + case 'rankDate': + case 'hireDate': + case 'seniority': + case 'currentPositionDate': + // 尝试将日期字符串转换为日期对象 + try { + // Excel日期可能以不同格式导出 + let dateValue = value; + + // 如果是Excel序列号格式的日期 + if (typeof value === 'number') { + // Excel日期是从1900年1月1日开始的天数 + // 需要转换为JavaScript日期 + const excelEpoch = new Date(1899, 11, 30); + dateValue = new Date(excelEpoch.getTime() + value * 86400000); + } + // 如果是字符串格式的日期 + else if (typeof value === 'string') { + // 尝试解析常见日期格式 + dateValue = new Date(value); + } + + // 检查日期是否有效 + if (dateValue instanceof Date && !isNaN(dateValue.getTime())) { + staff[field] = dateValue.toISOString(); + } else { + console.warn(`无效的日期格式: ${field} = ${value}`); + } + } catch (e) { + console.error(`日期转换错误 (${field}): ${e}`); + } + break; + + // 默认情况下保持原值 + default: + staff[field] = value; + } + }; + return (