add
This commit is contained in:
parent
db0d27114a
commit
c57d77b4b2
|
@ -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<string, string>);
|
||||
|
||||
// 创建工作簿和工作表
|
||||
// 创建示例数据行
|
||||
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<string, string>);
|
||||
|
||||
// 创建工作簿和工作表,包含示例行和空白行
|
||||
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 (
|
||||
<div className="ag-theme-alpine w-full h-[calc(100vh-100px)]"
|
||||
style={{
|
||||
|
|
Loading…
Reference in New Issue