ouyj 3 тижнів тому
батько
коміт
5b322fc350

+ 48 - 1
src/main/hr/com/yw/hr/salary/action/SalaryImportAction.java

@@ -235,7 +235,10 @@ public class SalaryImportAction extends ExcelImport {
 								value = getCellValue(cell);
 							}
 							if (j < headers.size()) {
-								dataMap.put(headers.get(j), value);
+								String headerName = headers.get(j);
+								// 应用字段别名映射
+								String mappedHeader = mapFieldAlias(headerName);
+								dataMap.put(mappedHeader, value);
 							}
 						}
 						
@@ -431,6 +434,50 @@ public class SalaryImportAction extends ExcelImport {
 		return importPageUrl;
 	}
 
+	/**
+	 * 字段别名映射:将不同的列名映射到统一的字段名
+	 * @param fieldName Excel中的列名
+	 * @return 映射后的标准字段名
+	 */
+	private String mapFieldAlias(String fieldName) {
+		if (fieldName == null || fieldName.isEmpty()) {
+			return fieldName;
+		}
+		
+		// 去除所有空白字符(包括换行、空格等)
+		String cleanName = fieldName.trim().replaceAll("\\s+", "");
+		
+		// 定义字段别名映射关系
+		Map<String, String> aliasMap = new HashMap<String, String>();
+		
+		// 实际出勤天数 / 实出勤天数 → actual_attend_days
+		aliasMap.put("实际出勤天数", "实际出勤天数");
+		aliasMap.put("实出勤天数", "实际出勤天数");
+		
+		// 节假日加班小时 / 节假日加班 → holiday_overtime_hours
+		aliasMap.put("节假日加班小时", "节假日加班小时");
+		aliasMap.put("节假日加班", "节假日加班小时");
+		
+		// 失业保险 / 失业险 → unemployment_insurance
+		aliasMap.put("失业保险", "失业保险");
+		aliasMap.put("失业险", "失业保险");
+		
+		// 基本医疗 / 医疗 → medical_insurance
+		aliasMap.put("基本医疗", "基本医疗");
+		aliasMap.put("医疗", "基本医疗");
+		
+		// 大病医疗 / 大病保险 → critical_illness
+		aliasMap.put("大病医疗", "大病医疗");
+		aliasMap.put("大病保险", "大病医疗");
+		
+		// 如果找到映射,返回标准字段名;否则返回原字段名
+		if (aliasMap.containsKey(cleanName)) {
+			return aliasMap.get(cleanName);
+		}
+		
+		return cleanName;
+	}
+
 	/**
 	 * 判断是否是完整的字段名(用于区分水平拆分和垂直拆分)
 	 */

+ 3 - 2
src/main/webapp/yw/hr/salary/salary_import/import_salary.jsp

@@ -126,10 +126,11 @@
 						<td class="form-content">
 							<div style="color: #666; line-height: 2;">
 								1. Excel文件第一行、第二行为表头,数据从第三行开始<br/>
-								2. 必须包含“姓名”和“身份证号”列<br/>
+								2. 必须包含"姓名"和"身份证号"列<br/>
 								3. 其他列会自动映射到对应字段<br/>
 								4. 系统会根据姓名和身份证号匹配员工<br/>
-								5. 支持的字段:序号、部门、姓名、岗位、身份证号、月工资、应出勤天数、实际出勤天数、粉尘/噪音补贴、月工资*、应出勤天数*、实际出勤天数*、轮休天数、病假天数、请假天数、公司放假天数、平时加班小时、周末加班小时、节假日加班小时、夜班天数、基本工资、岗位工资、工作绩效、安全绩效、全勤工资、夜中班津贴、平时加班工资、周末加班工资、节假日加班工资、放假补贴、病假工资、部门绩效奖金、其它、体检报销、全勤工资扣款、应发工资、养老保险、失业保险、基本医疗、大病医疗、小计、个人所得税、其他扣款、实发工资、备注
+								5. 支持的字段:序号、部门、姓名、岗位、身份证号、月工资、应出勤天数、实际出勤天数(或实出勤天数)、粉尘/噪音补贴、月工资*、应出勤天数*、实际出勤天数*、轮休天数、病假天数、请假天数、公司放假天数、平时加班小时、周末加班小时、节假日加班小时(或节假日加班)、夜班天数、基本工资、岗位工资、工作绩效、安全绩效、全勤工资、夜中班津贴、平时加班工资、周末加班工资、节假日加班工资、放假补贴、病假工资、部门绩效奖金、其它、体检报销、全勤工资扣款、应发工资、养老保险、失业保险(或失业险)、基本医疗(或医疗)、大病医疗(或大病保险)、小计、个人所得税、其他扣款、实发工资、备注<br/>
+								6. 部分字段支持别名:实出勤天数=实际出勤天数、节假日加班=节假日加班小时、失业险=失业保险、医疗=基本医疗、大病保险=大病医疗
 							</div>
 						</td>
 					</tr>

+ 3 - 2
src/main/webapp/yw/hr/salary/salary_import/upload_salary.jsp

@@ -154,10 +154,11 @@
                         <td class="l-table-edit-td" colspan="2">
                             <div style="color: #666; line-height: 2;">
                                 1. Excel文件第一行、第二行为表头,数据从第三行开始<br/>
-                                2. 必须包含“姓名”和“身份证号”列<br/>
+                                2. 必须包含"姓名"和"身份证号"列<br/>
                                 3. 其他列会自动映射到对应字段<br/>
                                 4. 系统会根据姓名和身份证号匹配员工<br/>
-                                5. 支持的字段:序号、部门、姓名、岗位、身份证号、月工资、应出勤天数、实际出勤天数、粉尘/噪音补贴、月工资*、应出勤天数*、实际出勤天数*、轮休天数、病假天数、请假天数、公司放假天数、平时加班小时、周末加班小时、节假日加班小时、夜班天数、基本工资、岗位工资、工作绩效、安全绩效、全勤工资、夜中班津贴、平时加班工资、周末加班工资、节假日加班工资、放假补贴、病假工资、部门绩效奖金、其它、体检报销、全勤工资扣款、应发工资、养老保险、失业保险、基本医疗、大病医疗、小计、个人所得税、其他扣款、实发工资、备注
+                                5. 支持的字段:序号、部门、姓名、岗位、身份证号、月工资、应出勤天数、实际出勤天数(或实出勤天数)、粉尘/噪音补贴、月工资*、应出勤天数*、实际出勤天数*、轮休天数、病假天数、请假天数、公司放假天数、平时加班小时、周末加班小时、节假日加班小时(或节假日加班)、夜班天数、基本工资、岗位工资、工作绩效、安全绩效、全勤工资、夜中班津贴、平时加班工资、周末加班工资、节假日加班工资、放假补贴、病假工资、部门绩效奖金、其它、体检报销、全勤工资扣款、应发工资、养老保险、失业保险(或失业险)、基本医疗(或医疗)、大病医疗(或大病保险)、小计、个人所得税、其他扣款、实发工资、备注<br/>
+                                6. 部分字段支持别名:实出勤天数=实际出勤天数、节假日加班=节假日加班小时、失业险=失业保险、医疗=基本医疗、大病保险=大病医疗
                             </div>
                         </td>
                     </tr>