lazhaoqian 3 years ago
parent
commit
2dea7b2e9b

+ 11 - 0
blade-service/blade-client/src/main/java/org/springblade/client/school/controller/SchoolTeacherController.java

@@ -35,6 +35,7 @@ import org.springblade.client.entity.SchoolTeacherCause;
 import org.springblade.client.school.excel.SchoolTeacherExcel;
 import org.springblade.client.school.service.ISchoolTeacherCauseService;
 import org.springblade.client.school.service.ISchoolTeacherService;
+import org.springblade.client.school.util.ExcelCheck;
 import org.springblade.core.excel.util.ExcelUtil;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
@@ -196,6 +197,16 @@ public class SchoolTeacherController extends BladeController {
 	@ApiOperation(value = "导入教职工信息", notes = "传入excel")
 	public R importSupplierDesc(@RequestParam("file") MultipartFile file)
 	{
+		//校验模板
+		String excelPattern = null;
+		try {
+			excelPattern = ExcelCheck.checkExcelPattern(file, new SchoolTeacherExcel());
+		} catch (Exception e) {
+			throw new SecurityException("校验Excel失败");
+		}
+		if (StringUtils.isNotBlank(excelPattern)){
+			throw new SecurityException(excelPattern);
+		}
 		List<SchoolTeacherExcel> excelList = ExcelUtil.read(file, SchoolTeacherExcel.class);
 		if(CollectionUtils.isEmpty(excelList))
 		{

+ 4 - 0
blade-service/blade-client/src/main/java/org/springblade/client/school/service/impl/SchoolTeacherServiceImpl.java

@@ -497,6 +497,8 @@ public class SchoolTeacherServiceImpl extends ServiceImpl<SchoolTeacherMapper, S
 			SchoolConfigItem performance = schoolConfigItemMapper.getConfigMessage(schoolTeacher.getTenantId(), schoolTeacher.getInSection(), null, "学期绩效工资标准", schoolTeacher.getPerformanceGrade(), null,schoolTeacher.getClassType());
 			if (performance != null){
 				schoolTeacher.setTermPerformanceSalary(performance.getSalary());
+			}else {
+				schoolTeacher.setTermPerformanceSalary(new BigDecimal(BigInteger.ZERO));
 			}
 
 		}else {
@@ -511,6 +513,8 @@ public class SchoolTeacherServiceImpl extends ServiceImpl<SchoolTeacherMapper, S
 			SchoolConfigItem performance = schoolConfigItemMapper.getConfigMessage(schoolTeacher.getTenantId(), schoolTeacher.getInSection(), null, "学期绩效工资标准", schoolTeacher.getPerformanceGrade(), null,null);
 			if (performance != null){
 				schoolTeacher.setTermPerformanceSalary(performance.getSalary());
+			}else {
+				schoolTeacher.setTermPerformanceSalary(new BigDecimal(BigInteger.ZERO));
 			}
 		}
 		return schoolTeacher;

+ 154 - 0
blade-service/blade-client/src/main/java/org/springblade/client/school/util/ExcelCheck.java

@@ -0,0 +1,154 @@
+package org.springblade.client.school.util;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.nacos.api.utils.StringUtils;
+import org.apache.poi.ss.usermodel.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.BufferedInputStream;
+import java.lang.reflect.Field;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author: xxx
+ * @createTime: 2021/12/07 17:07
+ * @company: https://www.xxx.cn
+ * @description:
+ */
+public class ExcelCheck {
+
+	/**
+	 * 检验导入Excel的格式
+	 * @param excel
+	 * @return
+	 * @throws Exception
+	 */
+	public static String checkExcelPattern(MultipartFile excel,Object object) throws Exception {
+		if(excel == null || excel.isEmpty()){
+			throw new Exception("导入文件不能为空!");
+		}
+		//用于拼接校验结果
+		StringBuilder builder = new StringBuilder();
+		//大小校验
+        /*if((excel.getSize()/1048576)>2){
+            builder.append("上传文件仅支持2M以内的Excel文件;");
+        }*/
+		//校验文件格式,必须为excel文件
+        String fileName = excel.getOriginalFilename();
+        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
+        if (!"xlsx".equals(suffix)) {
+            builder.append("导入文件只支持xlsx类型后缀;");
+        }
+		//校验文件表头
+		BufferedInputStream fin = new BufferedInputStream(excel.getInputStream());
+		Workbook wb = null;
+		try{
+			wb = WorkbookFactory.create(fin);;
+		}catch(Exception e){
+			wb = WorkbookFactory.create(fin);;
+		}
+		//XSSFWorkbook wb = new XSSFWorkbook(fin);导致出现异常
+		//columnName = {"姓名", "性别", "年级", "班级","身份证号","学籍号","学工号","性格","家庭情况","操行等等","特长","标签"};
+		//获取注解当中的值
+		Map<String, List<String>> annotationValue = getAnnotationValue(object);
+		List<String> annotationName = annotationValue.get("annotationName");
+		//获取到的实体注解名称顺序要与excel表头顺序保持一样
+		String[] columnName = annotationName.toArray(new String[]{});
+		Sheet sheet = wb.getSheetAt(0);
+		Row row = sheet.getRow(0);
+		if (row != null && row.getLastCellNum() >= columnName.length) {
+			int lastCellNum = row.getLastCellNum();
+			for (int idx = 0; idx < lastCellNum; idx++) {
+				String value = getCellValue(row.getCell(idx)).trim();
+				if (idx <  columnName.length) {
+					if (StringUtils.isBlank(value) || !columnName[idx].equals(value)) {
+						builder.append("第" + (idx + 1) + "列表头应为" + columnName[idx]+"!");
+					}
+				} else {
+					if (idx ==  columnName.length) {
+						builder.append("导入文件只应该有:"+ columnName.length+"!");
+					}
+				}
+			}
+		} else {
+			builder.append("上传文件首行不能为空,且应与模板文件表头保持一致;");
+		}
+		if(builder.length()>0){
+			builder.append("请下载模板按照模板表头顺序进行上传!");
+			//builder.setCharAt(builder.length()-1, '!');
+		}
+		return builder.toString();
+	}
+
+
+	/**
+	 * 获取cell值
+	 *
+	 * @param cell
+	 * @return
+	 */
+	private static String getCellValue(Cell cell) {
+		String cellValue = "";
+		// 以下是判断数据的类型
+		switch (cell.getCellType()) {
+			case Cell.CELL_TYPE_NUMERIC: // 数字
+				if (DateUtil.isCellDateFormatted(cell)) {
+					SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+					cellValue = sdf.format(DateUtil.getJavaDate(cell.getNumericCellValue())).toString();
+				} else {
+					DataFormatter dataFormatter = new DataFormatter();
+					cellValue = dataFormatter.formatCellValue(cell);
+				}
+				break;
+			case Cell.CELL_TYPE_STRING: // 字符串
+				cellValue = cell.getStringCellValue();
+				break;
+			case Cell.CELL_TYPE_BOOLEAN: // Boolean
+				cellValue = cell.getBooleanCellValue() + "";
+				break;
+			case Cell.CELL_TYPE_FORMULA: // 公式
+				cellValue = cell.getCellFormula() + "";
+				break;
+			case Cell.CELL_TYPE_BLANK: // 空值
+				cellValue = "";
+				break;
+			case Cell.CELL_TYPE_ERROR: // 故障
+				cellValue = "非法字符";
+				break;
+			default:
+				cellValue = "未知类型";
+				break;
+		}
+		return cellValue;
+	}
+	/**
+	 * 获取该注解对象的属性值(字段名称和注解的value值)
+	 * @param object
+	 * @return
+	 */
+	public static Map<String,List<String>> getAnnotationValue(Object object) {
+		Map<String,List<String>>map=new HashMap<>();
+		List<String> fieldList=new ArrayList<>();
+		List<String> annotationList=new ArrayList<>();
+		//StudentVO studentVO = new StudentVO();
+		Field[] fields = object.getClass().getDeclaredFields();
+		for(int i = 0 ; i < fields.length ; i++) {
+			//设置是否允许访问,不是修改原来的访问权限修饰词。
+			fields[i].setAccessible(true);
+			ExcelProperty annotation = fields[i].getAnnotation(ExcelProperty.class);
+			String[] value = annotation.value();
+			for (String s : value) {
+				annotationList.add(s);
+			}
+			fieldList.add(fields[i].getName());
+		}
+		map.put("fieldName",fieldList);
+		map.put("annotationName",annotationList);
+		return map;
+	}
+
+}