zhouli 6 months ago
parent
commit
38d81b6965
32 changed files with 676 additions and 320 deletions
  1. BIN
      doc/xls导入模板/研发项目管理/预算编制/其他费用.xls
  2. BIN
      doc/xls导入模板/研发项目管理/预算编制/委托外部研究开发费.xls
  3. BIN
      doc/xls导入模板/研发项目管理/预算编制/装备调试费用与试验费用.xls
  4. BIN
      doc/xls导入模板/研发项目管理/预算编制/设计费用.xls
  5. 16 15
      kd-service-api/kd-scientific-api/src/main/java/org/sky/scientific/pojo/entity/XmEntity.java
  6. 8 4
      kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/YsQtfyExcel.java
  7. 12 7
      kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/YsRyrgfyExcel.java
  8. 6 4
      kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/YsSjfyExcel.java
  9. 10 5
      kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/YsWtwbyjkffyExcel.java
  10. 8 4
      kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/YsWxzctxfyExcel.java
  11. 8 4
      kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/YsZbtsysyfyExcel.java
  12. 11 11
      kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/YsZjfyycqdtfyExcel.java
  13. 12 10
      kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/YsZjtrfyExcel.java
  14. 56 0
      kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/listener/YsQtfyImportListener.java
  15. 66 0
      kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/listener/YsRyrgfyImportListener.java
  16. 34 44
      kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/listener/YsSjfyImportListener.java
  17. 57 0
      kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/listener/YsWtwbyjkffyImportListener.java
  18. 53 0
      kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/listener/YsWxzctxfyImportListener.java
  19. 56 0
      kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/listener/YsZbtsysyfyImportListener.java
  20. 65 0
      kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/listener/YsZjfyycqdtfyImportListener.java
  21. 58 120
      kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/listener/YsZjtrfyImportListener.java
  22. 3 2
      kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/XmBgrzMapper.xml
  23. 28 25
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmServiceImpl.java
  24. 13 9
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/YsQtfyServiceImpl.java
  25. 11 3
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/YsRyrgfyServiceImpl.java
  26. 13 8
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/YsSjfyServiceImpl.java
  27. 14 10
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/YsWtwbyjkffyServiceImpl.java
  28. 13 4
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/YsWxzctxfyServiceImpl.java
  29. 20 15
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/YsZbtsysyfyServiceImpl.java
  30. 13 5
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/YsZjfyycqdtfyServiceImpl.java
  31. 11 11
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/YsZjtrfyServiceImpl.java
  32. 1 0
      kd-service/kd-scientific/src/main/java/org/sky/scientific/utils/ValidationUtils.java

BIN
doc/xls导入模板/研发项目管理/预算编制/其他费用.xls


BIN
doc/xls导入模板/研发项目管理/预算编制/委托外部研究开发费.xls


BIN
doc/xls导入模板/研发项目管理/预算编制/装备调试费用与试验费用.xls


BIN
doc/xls导入模板/研发项目管理/预算编制/设计费用.xls


+ 16 - 15
kd-service-api/kd-scientific-api/src/main/java/org/sky/scientific/pojo/entity/XmEntity.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.sky.core.tenant.mp.TenantEntity;
@@ -39,7 +40,8 @@ public class XmEntity extends TenantEntity {
 	@Schema(description = "研发项目名称")
 	private String xmmc;
 
- 	@Schema(description = "项目负责人id,kd_technician的主键")
+	@Schema(description = "项目负责人id,kd_technician的主键")
+	@NotNull(message = "请选择项目负责人")
 	private Long xmfzr;
 
 	@Schema(description = "项目负责人姓名")
@@ -47,57 +49,56 @@ public class XmEntity extends TenantEntity {
 	private String xmfzrxm;
 
 	@Schema(description = "项目申请单位id")
-	//	@NotBlank(message = "项目申请单位不能为空")
+	@NotNull(message = "请选择项目申请单位")
 	private Long xmsqdwid;
 
 	@Schema(description = "项目申请单位")
 	@TableField(exist = false)
 	private String xmsqdw;
 
-	//	@NotBlank(message = "请选择研究类型")
+	@NotBlank(message = "请选择研究类型")
 	@Schema(description = "研究类型")
 	private String yjlx;
 
-	//	@NotNull(message = "请选择研发开始时间")
-	@Schema(description = "研发开始时间")
+ 	@Schema(description = "研发开始时间")
 	@DateTimeFormat(pattern = DateUtil.PATTERN_DATE)
 	@JsonFormat(pattern = DateUtil.PATTERN_DATE)
+	@NotNull(message = "请选择研发开始时间")
 	private Date xmkssj;
 
-	//	@NotNull(message = "请选择研发结束时间")
 	@Schema(description = "研发结束时间")
 	@DateTimeFormat(pattern = DateUtil.PATTERN_DATE)
 	@JsonFormat(pattern = DateUtil.PATTERN_DATE)
+	@NotNull(message = "请选择研发结束时间")
 	private Date xmjssj;
 
-	//	@NotBlank(message = "请选择项目来源")
+	@NotBlank(message = "请选择项目来源")
 	@Schema(description = "项目来源")
 	private String xmly;
 
-	//	@NotNull(message = "请选择项目开展形式")
+	@NotNull(message = "请选择项目开展形式")
 	@Schema(description = "项目开展形式")
 	private String xmkzxs;
 
-	//	@NotBlank(message = "请选择预期成果形式")
+	@NotBlank(message = "请选择预期成果形式")
 	@Schema(description = "预期成果形式")
 	private String yqcgxs;
 
-	//	@NotBlank(message = "请填写项目技术经济目标")
+	@NotBlank(message = "请填写项目技术经济目标")
 	@Schema(description = "项目技术经济目标")
 	private String xmjsjjmb;
 
 	@Schema(description = "项目预算总额(万元)")
-	private BigDecimal xmysze;
+ 	private BigDecimal xmysze;
 
 	@Schema(description = "项目预算明细")
+	@NotNull(message = "请填写项目预算")
 	private String xmyszemx;
 
-	@NotBlank(message = "请上传立项批文")
-	@Schema(description = "立项批文")
+ 	@Schema(description = "立项批文")
 	private String lxpw;
 
-	@NotBlank(message = "请上传立项报告")
-	@Schema(description = "立项报告")
+ 	@Schema(description = "立项报告")
 	private String lxbg;
 
 	@Schema(description = "其他资料")

+ 8 - 4
kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/YsQtfyExcel.java

@@ -2,7 +2,9 @@
 package org.sky.scientific.excel;
 
 
-import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 
 import java.io.Serial;
@@ -21,13 +23,15 @@ public class YsQtfyExcel implements Serializable {
 	@Serial
 	private static final long serialVersionUID = 1L;
 
-	@ExcelProperty(index = 0, value = "序号")
+ 	@Schema(description = "序号")
 	private String xh;
 
-	@ExcelProperty(index = 1, value = "费用内容")
+ 	@Schema(description = "费用内容")
+	@NotBlank(message = "费用内容不能为空")
 	private String fynr;
 
-	@ExcelProperty(index = 4, value = "预算金额/万元")
+ 	@NotNull(message = "预算金额/万元不能为空")
+	@Schema(description = "预算金额/万元")
 	private Double ysje;
 
 }

+ 12 - 7
kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/YsRyrgfyExcel.java

@@ -2,7 +2,9 @@
 package org.sky.scientific.excel;
 
 
-import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 
 import java.io.Serial;
@@ -21,17 +23,20 @@ public class YsRyrgfyExcel implements Serializable {
 	@Serial
 	private static final long serialVersionUID = 1L;
 
-	@ExcelProperty(index = 0, value = "序号")
+	@Schema(description = "序号")
 	private String xh;
-	@ExcelProperty(index = 1, value = "姓名")
+ 	@Schema(description = "姓名")
+	@NotBlank(message = "姓名不能为空")
 	private String name;
-	@ExcelProperty(index = 2, value = "工号")
+ 	@Schema(description = "工号")
 	private String number;
-	@ExcelProperty(index = 3, value = "身份证号")
+ 	@Schema(description = "身份证号")
 	private String idCard;
-	@ExcelProperty(index = 4, value = "在项目中的工作时长(月)")
+ 	@Schema(description = "在项目中的工作时长(月)")
+	@NotNull(message = "在项目中的工作时长(月)不能为空")
 	private Integer zzsc;
-	@ExcelProperty(index = 5, value = "月平均人工费用/元")
+ 	@Schema(description = "月平均人工费用/万元")
+	@NotNull(message = "月平均人工费用/万元不能为空")
 	private Double pjrgfy;
 
 }

+ 6 - 4
kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/YsSjfyExcel.java

@@ -2,7 +2,8 @@
 package org.sky.scientific.excel;
 
 
-import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
 import lombok.Data;
 
 import java.io.Serial;
@@ -21,13 +22,14 @@ public class YsSjfyExcel implements Serializable {
 	@Serial
 	private static final long serialVersionUID = 1L;
 
- 	@ExcelProperty(index = 0,value = "序号")
+ 	@Schema(description = "序号")
 	private String xh;
 
-	@ExcelProperty(index = 1, value = "设计内容或详情")
+ 	@Schema(description = "设计内容或详情")
+	@NotBlank(message = "设计内容或详情不能为空")
 	private String sjnr;
 
-	@ExcelProperty(index = 3, value = "预算金额/万元")
+ 	@Schema(description = "预算金额/万元不能为空")
 	private Double ysje;
 
 }

+ 10 - 5
kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/YsWtwbyjkffyExcel.java

@@ -2,7 +2,9 @@
 package org.sky.scientific.excel;
 
 
-import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 
 import java.io.Serial;
@@ -21,16 +23,19 @@ public class YsWtwbyjkffyExcel implements Serializable {
 	@Serial
 	private static final long serialVersionUID = 1L;
 
-	@ExcelProperty(index = 0,value = "序号")
+ 	@Schema(description = "序号")
 	private String xh;
 
- 	@ExcelProperty(index = 1, value = "受托单位名称")
+ 	@Schema(description = "受托单位名称")
+	@NotBlank(message = "受托单位名称不能为空")
 	private String stdwmc;
 
- 	@ExcelProperty(index = 3, value = "工作内容")
+ 	@Schema(description = "工作内容")
+	@NotBlank(message = "工作内容不能为空")
 	private String zznr;
 
- 	@ExcelProperty(index = 4, value ="委外费用/万元")
+ 	@Schema(description = "委外费用/万元")
+	@NotNull(message = "委外费用/万元不能为空")
 	private Double wwfy;
 
 }

+ 8 - 4
kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/YsWxzctxfyExcel.java

@@ -2,7 +2,9 @@
 package org.sky.scientific.excel;
 
 
-import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 
 import java.io.Serial;
@@ -21,13 +23,15 @@ public class YsWxzctxfyExcel implements Serializable {
 	@Serial
 	private static final long serialVersionUID = 1L;
 
-	@ExcelProperty(index = 0, value = "序号")
+ 	@Schema(description = "序号")
 	private String xh;
 
-	@ExcelProperty(index = 1, value = "资产名称")
+ 	@Schema(description = "资产名称")
+	@NotBlank(message = "资产名称不能为空")
 	private String zcmc;
 
-	@ExcelProperty(index = 2, value = "在项目中的工作时长(月)")
+ 	@Schema(description = "在项目中的工作时长(月)")
+	@NotNull(message = "在项目中的工作时长(月)不能为空")
 	private Integer zzsc;
 
 }

+ 8 - 4
kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/YsZbtsysyfyExcel.java

@@ -2,7 +2,9 @@
 package org.sky.scientific.excel;
 
 
-import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 
 import java.io.Serial;
@@ -21,12 +23,14 @@ public class YsZbtsysyfyExcel implements Serializable {
 	@Serial
 	private static final long serialVersionUID = 1L;
 
-	@ExcelProperty(index = 0, value = "序号")
+ 	@Schema(description = "序号")
 	private String xh;
 
-	@ExcelProperty(index = 1, value = "费用内容")
+ 	@Schema(description = "费用内容")
+	@NotBlank(message = "费用内容不能为空")
 	private String fyje;
 
- 	@ExcelProperty(index = 3, value = "预算金额/万元")
+ 	@Schema(description = "预算金额/万元")
+	@NotNull(message = "预算金额/万元不能为空")
 	private Double ysje;
 }

+ 11 - 11
kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/YsZjfyycqdtfyExcel.java

@@ -2,7 +2,8 @@
 package org.sky.scientific.excel;
 
 
-import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 
 import java.io.Serial;
@@ -21,25 +22,24 @@ public class YsZjfyycqdtfyExcel implements Serializable {
 	@Serial
 	private static final long serialVersionUID = 1L;
 
-	@ExcelProperty(index = 0, value = "序号")
-	public int xh;
+ 	@Schema(description = "序号")
+	public String xh;
 
-	@ExcelProperty(index = 1, value = "资产名称")
+ 	@Schema(description = "资产名称")
+	@NotNull(message = "资产名称不能为空")
 	private String zcmc;
 
-	@ExcelProperty(index = 2, value = "在项目中的工作时长(月)")
+ 	@Schema(description = "在项目中的工作时长(月)")
+	@NotNull(message = "在项目中的工作时长(月)不能为空")
 	private Integer zzsc;
 
-//	@ExcelProperty(index = 3, value = "月折旧额")
-//	private BigDecimal yzje;
-
-	@ExcelProperty(index = 4, value = "预算金额/万元")
+ 	@Schema(description = "预算金额/万元")
 	private Double ysje;
 
-	@ExcelProperty(index = 5, value = "长期待摊费用名称")
+ 	@Schema(description = "长期待摊费用名称")
 	private String cqdtfymc;
 
-	@ExcelProperty(index = 6, value = "预算金额")
+ 	@Schema(description = "预算金额")
 	private Double cqdtfyysje;
 
 }

+ 12 - 10
kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/YsZjtrfyExcel.java

@@ -2,7 +2,7 @@
 package org.sky.scientific.excel;
 
 
-import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotBlank;
 import lombok.Data;
 
@@ -22,28 +22,30 @@ public class YsZjtrfyExcel implements Serializable {
 	@Serial
 	private static final long serialVersionUID = 1L;
 
-	@ExcelProperty(index = 0, value = "序号")
-	private int xh;
+	@Schema(description = "序号")
+	private String xh;
 
- 	@ExcelProperty(index = 1, value = "1-物资名称")
 	@NotBlank(message = "1-物资名称不能为空")
 	private String wzmc;
 
- 	@ExcelProperty(index = 2, value = "用量")
+	@Schema(description = "用量")
 	private Integer yongLiang;
+//
+	@Schema(description = "计量单位")
+	private String unit;
 
- 	@ExcelProperty(index = 3, value = "单价")
+	@Schema(description = "单价(万元)")
 	private Double danJia;
 
- 	@ExcelProperty(index = 5, value = "2-仪器设备名称")
+	@Schema(description = "2-仪器设备名称")
 	private String yqsbmc;
 
- 	@ExcelProperty(index = 6, value = "预算金额")
+	@Schema(description = "预算金额(万元)")
 	private Double ysje;
 
- 	@ExcelProperty(index = 7, value ="3-固定资产名称(租赁)")
+	@Schema(description = "3-固定资产名称(租赁)")
 	private String gdzcmc;
 
- 	@ExcelProperty(index = 8, value = "租赁费用预算")
+	@Schema(description = "租赁费用预算(万元)")
 	private Double zlfyys;
 }

+ 56 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/listener/YsQtfyImportListener.java

@@ -0,0 +1,56 @@
+package org.sky.scientific.excel.listener;
+
+import com.alibaba.excel.context.AnalysisContext;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.sky.core.tool.utils.Func;
+import org.sky.scientific.excel.YsQtfyExcel;
+import org.sky.scientific.utils.ImportResult;
+import org.sky.scientific.utils.ValidationUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class YsQtfyImportListener extends BaseReadListener {
+
+	@Override
+	public void invoke(Map<Integer, String> map, AnalysisContext context) {
+		int rowIndex = context.readRowHolder().getRowIndex() + 1;
+
+		ImportResult<Object> result = convertAndValidate(map, rowIndex);
+		resultList.add(result);
+		if (result.isSuccess()) {
+			dataList.add(result.getData());
+			incrementSuccessCount();
+		} else {
+			incrementErrorCount();
+		}
+	}
+
+	private ImportResult<Object> convertAndValidate(Map<Integer, String> data, int rowIndex) {
+
+		List<String> errors = new ArrayList<>();
+
+		YsQtfyExcel excel = new YsQtfyExcel();
+		excel.setXh(data.get(0));
+		excel.setFynr(data.get(1));
+
+		String ysje = data.get(2);
+		if(Func.isNotBlank(ysje)){
+			excel.setYsje(ValidationUtils.safeParseDouble(ysje));
+			if (Func.isNull(excel.getYsje())) {
+				errors.add("预算金额/万元数据格式错误");
+			}else {
+				excel.setYsje(excel.getYsje() * 10000);
+			}
+		}
+		errors.addAll(ValidationUtils.validate(excel));
+		if (!errors.isEmpty()) {
+			return ImportResult.error(rowIndex, errors, data.toString());
+		}
+		return ImportResult.success(rowIndex, excel);
+	}
+}

+ 66 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/listener/YsRyrgfyImportListener.java

@@ -0,0 +1,66 @@
+package org.sky.scientific.excel.listener;
+
+import com.alibaba.excel.context.AnalysisContext;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.sky.core.tool.utils.Func;
+import org.sky.scientific.excel.YsRyrgfyExcel;
+import org.sky.scientific.utils.ImportResult;
+import org.sky.scientific.utils.ValidationUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class YsRyrgfyImportListener extends BaseReadListener {
+
+	@Override
+	public void invoke(Map<Integer, String> map, AnalysisContext context) {
+		int rowIndex = context.readRowHolder().getRowIndex() + 1;
+
+		ImportResult<Object> result = convertAndValidate(map, rowIndex);
+		resultList.add(result);
+		if (result.isSuccess()) {
+			dataList.add(result.getData());
+			incrementSuccessCount();
+		} else {
+			incrementErrorCount();
+		}
+	}
+
+	private ImportResult<Object> convertAndValidate(Map<Integer, String> data, int rowIndex) {
+
+		List<String> errors = new ArrayList<>();
+
+		YsRyrgfyExcel excel = new YsRyrgfyExcel();
+		excel.setXh(data.get(0));
+		excel.setName(data.get(1));
+		excel.setNumber(data.get(2));
+		excel.setIdCard(data.get(3));
+
+		String zzsc = data.get(4);
+		if(Func.isNotBlank(zzsc)){
+			excel.setZzsc(ValidationUtils.safeParseInteger(zzsc));
+			if (Func.isNull(excel.getZzsc())) {
+				errors.add("在项目中的工作时长(月)数据格式错误");
+			}
+		}
+
+		String pjrgfy = data.get(5);
+		if(Func.isNotBlank(pjrgfy)){
+			excel.setPjrgfy(ValidationUtils.safeParseDouble(pjrgfy));
+			if (Func.isNull(excel.getPjrgfy())) {
+				errors.add("月平均人工费用(元)数据格式错误");
+			}else {
+				excel.setPjrgfy(excel.getPjrgfy() * 10000);
+			}
+		}
+		errors.addAll(ValidationUtils.validate(excel));
+		if (!errors.isEmpty()) {
+			return ImportResult.error(rowIndex, errors, data.toString());
+		}
+		return ImportResult.success(rowIndex, excel);
+	}
+}

+ 34 - 44
kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/listener/YsSjfyImportListener.java

@@ -1,66 +1,56 @@
 package org.sky.scientific.excel.listener;
 
 import com.alibaba.excel.context.AnalysisContext;
-import com.alibaba.excel.event.AnalysisEventListener;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import org.sky.core.log.exception.ServiceException;
-import org.sky.core.tool.utils.BeanUtil;
 import org.sky.core.tool.utils.Func;
 import org.sky.scientific.excel.YsSjfyExcel;
-import org.sky.scientific.pojo.entity.YsSjfyEntity;
-import org.sky.scientific.service.IYsSjfyService;
+import org.sky.scientific.utils.ImportResult;
+import org.sky.scientific.utils.ValidationUtils;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
-
-@Data
 @EqualsAndHashCode(callSuper = true)
-public class YsSjfyImportListener extends AnalysisEventListener<YsSjfyExcel> {
-
-	private IYsSjfyService service;
-	private Long xmId;
-	private List<YsSjfyExcel> dataList = new ArrayList<>();
-
-	public YsSjfyImportListener(IYsSjfyService service, Long xmId) {
-		this.service = service;
-		this.xmId = xmId;
-	}
+@Data
+public class YsSjfyImportListener extends BaseReadListener {
 
 	@Override
-	public void invoke(YsSjfyExcel data, AnalysisContext analysisContext) {
-//		YsSjfyExcel data = new YsSjfyExcel();
-		// 1. 基本数据校验
-//		List<String> validationErrors = validateData(data, rowIndex);
-//		if (!validationErrors.isEmpty()) {
-//			errorMessages.addAll(validationErrors.stream().map(msg -> new ImportError(rowIndex, msg)).collect(Collectors.toList()));
-//			return;
-//		}
-		dataList.add(data);
+	public void invoke(Map<Integer, String> map, AnalysisContext context) {
+		int rowIndex = context.readRowHolder().getRowIndex() + 1;
+
+		ImportResult<Object> result = convertAndValidate(map, rowIndex);
+		resultList.add(result);
+		if (result.isSuccess()) {
+			dataList.add(result.getData());
+			incrementSuccessCount();
+		} else {
+			incrementErrorCount();
+		}
 	}
 
-	@Override
-	public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+	private ImportResult<Object> convertAndValidate(Map<Integer, String> data, int rowIndex) {
 
-		if (Func.isEmpty(dataList)) {
-			throw new ServiceException("无数据可导入");
-		}
-		List<YsSjfyEntity> insertList = new ArrayList<>();
-		List<YsSjfyEntity> dbList = service.list(Wrappers.<YsSjfyEntity>lambdaQuery().eq(YsSjfyEntity::getXmId, xmId));
-		int batchCount = 20;
-		for (YsSjfyExcel excel : dataList) {
-			YsSjfyEntity entity = new YsSjfyEntity();
-			entity.setXmId(xmId);
-			BeanUtil.copyProperties(excel, entity);
-			insertList.add(entity);
-			if (insertList.size() % batchCount == 0 && service.saveBatch(insertList)) {
-				insertList.clear();
+		List<String> errors = new ArrayList<>();
+
+		YsSjfyExcel excel = new YsSjfyExcel();
+		excel.setXh(data.get(0));
+		excel.setSjnr(data.get(1));
+
+		String ysje = data.get(2);
+		if(Func.isNotBlank(ysje)){
+			excel.setYsje(ValidationUtils.safeParseDouble(ysje));
+			if (Func.isNull(excel.getYsje())) {
+				errors.add("预算金额/万元数据格式错误");
+			}else {
+				excel.setYsje(excel.getYsje() * 10000);
 			}
 		}
-		if (Func.isNotEmpty(insertList)) {
-			service.saveBatch(insertList);
+		errors.addAll(ValidationUtils.validate(excel));
+		if (!errors.isEmpty()) {
+			return ImportResult.error(rowIndex, errors, data.toString());
 		}
+		return ImportResult.success(rowIndex, excel);
 	}
 }

+ 57 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/listener/YsWtwbyjkffyImportListener.java

@@ -0,0 +1,57 @@
+package org.sky.scientific.excel.listener;
+
+import com.alibaba.excel.context.AnalysisContext;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.sky.core.tool.utils.Func;
+import org.sky.scientific.excel.YsWtwbyjkffyExcel;
+import org.sky.scientific.utils.ImportResult;
+import org.sky.scientific.utils.ValidationUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class YsWtwbyjkffyImportListener extends BaseReadListener {
+
+	@Override
+	public void invoke(Map<Integer, String> map, AnalysisContext context) {
+		int rowIndex = context.readRowHolder().getRowIndex() + 1;
+
+		ImportResult<Object> result = convertAndValidate(map, rowIndex);
+		resultList.add(result);
+		if (result.isSuccess()) {
+			dataList.add(result.getData());
+			incrementSuccessCount();
+		} else {
+			incrementErrorCount();
+		}
+	}
+
+	private ImportResult<Object> convertAndValidate(Map<Integer, String> data, int rowIndex) {
+
+		List<String> errors = new ArrayList<>();
+
+		YsWtwbyjkffyExcel excel = new YsWtwbyjkffyExcel();
+		excel.setXh(data.get(0));
+		excel.setStdwmc(data.get(1));
+		excel.setZznr(data.get(2));
+
+		String wwfy = data.get(3);
+		if(Func.isNotBlank(wwfy)){
+			excel.setWwfy(ValidationUtils.safeParseDouble(wwfy));
+			if (Func.isNull(excel.getWwfy())) {
+				errors.add("委外费用/万元数据格式错误");
+			}else {
+				excel.setWwfy(excel.getWwfy() * 10000);
+			}
+		}
+		errors.addAll(ValidationUtils.validate(excel));
+		if (!errors.isEmpty()) {
+			return ImportResult.error(rowIndex, errors, data.toString());
+		}
+		return ImportResult.success(rowIndex, excel);
+	}
+}

+ 53 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/listener/YsWxzctxfyImportListener.java

@@ -0,0 +1,53 @@
+package org.sky.scientific.excel.listener;
+
+import com.alibaba.excel.context.AnalysisContext;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.sky.core.tool.utils.Func;
+import org.sky.scientific.excel.YsWxzctxfyExcel;
+import org.sky.scientific.utils.ImportResult;
+import org.sky.scientific.utils.ValidationUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class YsWxzctxfyImportListener extends BaseReadListener {
+
+	@Override
+	public void invoke(Map<Integer, String> map, AnalysisContext context) {
+		int rowIndex = context.readRowHolder().getRowIndex() + 1;
+
+		ImportResult<Object> result = convertAndValidate(map, rowIndex);
+		resultList.add(result);
+		if (result.isSuccess()) {
+			dataList.add(result.getData());
+			incrementSuccessCount();
+		} else {
+			incrementErrorCount();
+		}
+	}
+
+	private ImportResult<Object> convertAndValidate(Map<Integer, String> data, int rowIndex) {
+
+		List<String> errors = new ArrayList<>();
+
+		YsWxzctxfyExcel excel = new YsWxzctxfyExcel();
+		excel.setXh(data.get(0));
+		excel.setZcmc(data.get(1));
+		String zzsc = data.get(2);
+		if(Func.isNotBlank(zzsc)) {
+			excel.setZzsc(ValidationUtils.safeParseInteger(zzsc));
+			if (Func.isNull(excel.getZzsc())) {
+				errors.add("在项目中的工作时长(月)数据格式错误");
+			}
+		}
+		errors.addAll(ValidationUtils.validate(excel));
+		if (!errors.isEmpty()) {
+			return ImportResult.error(rowIndex, errors, data.toString());
+		}
+		return ImportResult.success(rowIndex, excel);
+	}
+}

+ 56 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/listener/YsZbtsysyfyImportListener.java

@@ -0,0 +1,56 @@
+package org.sky.scientific.excel.listener;
+
+import com.alibaba.excel.context.AnalysisContext;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.sky.core.tool.utils.Func;
+import org.sky.scientific.excel.YsZbtsysyfyExcel;
+import org.sky.scientific.utils.ImportResult;
+import org.sky.scientific.utils.ValidationUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class YsZbtsysyfyImportListener extends BaseReadListener {
+
+	@Override
+	public void invoke(Map<Integer, String> map, AnalysisContext context) {
+		int rowIndex = context.readRowHolder().getRowIndex() + 1;
+
+		ImportResult<Object> result = convertAndValidate(map, rowIndex);
+		resultList.add(result);
+		if (result.isSuccess()) {
+			dataList.add(result.getData());
+			incrementSuccessCount();
+		} else {
+			incrementErrorCount();
+		}
+	}
+
+	private ImportResult<Object> convertAndValidate(Map<Integer, String> data, int rowIndex) {
+
+		List<String> errors = new ArrayList<>();
+
+		YsZbtsysyfyExcel excel = new YsZbtsysyfyExcel();
+		excel.setXh(data.get(0));
+		excel.setFyje(data.get(1));
+		String ysje = data.get(2);
+		if(Func.isNotBlank(ysje)){
+			excel.setYsje(ValidationUtils.safeParseDouble(ysje));
+			if (Func.isNull(excel.getYsje())) {
+				errors.add("预算金额/万元数据格式错误");
+			}else {
+				excel.setYsje(excel.getYsje() * 10000);
+			}
+		}
+
+		errors.addAll(ValidationUtils.validate(excel));
+		if (!errors.isEmpty()) {
+			return ImportResult.error(rowIndex, errors, data.toString());
+		}
+		return ImportResult.success(rowIndex, excel);
+	}
+}

+ 65 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/listener/YsZjfyycqdtfyImportListener.java

@@ -0,0 +1,65 @@
+package org.sky.scientific.excel.listener;
+
+import com.alibaba.excel.context.AnalysisContext;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.sky.core.tool.utils.Func;
+import org.sky.scientific.excel.YsZjfyycqdtfyExcel;
+import org.sky.scientific.utils.ImportResult;
+import org.sky.scientific.utils.ValidationUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class YsZjfyycqdtfyImportListener extends BaseReadListener {
+
+	@Override
+	public void invoke(Map<Integer, String> map, AnalysisContext context) {
+		int rowIndex = context.readRowHolder().getRowIndex() + 1;
+
+		ImportResult<Object> result = convertAndValidate(map, rowIndex);
+		resultList.add(result);
+		if (result.isSuccess()) {
+			dataList.add(result.getData());
+			incrementSuccessCount();
+		} else {
+			incrementErrorCount();
+		}
+	}
+
+	private ImportResult<Object> convertAndValidate(Map<Integer, String> data, int rowIndex) {
+
+		List<String> errors = new ArrayList<>();
+
+		YsZjfyycqdtfyExcel excel = new YsZjfyycqdtfyExcel();
+		excel.setXh(data.get(0));
+		excel.setZcmc(data.get(1));
+
+		String zzsc = data.get(2);
+		if(Func.isNotBlank(zzsc)){
+			excel.setZzsc(ValidationUtils.safeParseInteger(zzsc));
+			if (Func.isNull(excel.getZzsc())) {
+				errors.add("在项目中的工作时长(月)数据格式错误");
+			}
+		}
+
+		excel.setCqdtfymc(data.get(5));
+ 		String cqdtfyysje = data.get(6);
+		if(Func.isNotBlank(cqdtfyysje)){
+			excel.setCqdtfyysje(ValidationUtils.safeParseDouble(cqdtfyysje));
+			if (Func.isNull(excel.getCqdtfyysje())) {
+				errors.add("长期待摊费用预算金额数据格式错误");
+			}else {
+				excel.setCqdtfyysje(excel.getCqdtfyysje() * 10000);
+			}
+		}
+		errors.addAll(ValidationUtils.validate(excel));
+		if (!errors.isEmpty()) {
+			return ImportResult.error(rowIndex, errors, data.toString());
+		}
+		return ImportResult.success(rowIndex, excel);
+	}
+}

+ 58 - 120
kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/listener/YsZjtrfyImportListener.java

@@ -1,148 +1,86 @@
 package org.sky.scientific.excel.listener;
 
 import com.alibaba.excel.context.AnalysisContext;
-import com.alibaba.excel.event.AnalysisEventListener;
-import jakarta.validation.ConstraintViolation;
-import jakarta.validation.Validation;
-import jakarta.validation.Validator;
-import jakarta.validation.ValidatorFactory;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.sky.core.tool.utils.Func;
 import org.sky.scientific.excel.YsZjtrfyExcel;
-import org.sky.scientific.service.IYsZjtrfyService;
-import org.sky.scientific.utils.ImportError;
+import org.sky.scientific.utils.ImportResult;
+import org.sky.scientific.utils.ValidationUtils;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Set;
+import java.util.Map;
 
 @EqualsAndHashCode(callSuper = true)
 @Data
- public class YsZjtrfyImportListener extends AnalysisEventListener<YsZjtrfyExcel> {
-
-  	private IYsZjtrfyService service;
-	private Long xmId;
-	private List<YsZjtrfyExcel> dataList = new ArrayList<>();
-	private static final int BATCH_COUNT = 100;
-	private List<YsZjtrfyExcel> cachedDataList = new ArrayList<>(BATCH_COUNT);
-	private List<ImportError> errorMessages = new ArrayList<>();
-	private Validator validator;
-
-	public YsZjtrfyImportListener(IYsZjtrfyService service, Long xmId) {
-		this.service = service;
-		this.xmId = xmId;
-		ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
-		this.validator = factory.getValidator();
-	}
+public class YsZjtrfyImportListener extends BaseReadListener {
 
 	@Override
- 	public void invoke(YsZjtrfyExcel data, AnalysisContext context) {
+	public void invoke(Map<Integer, String> map, AnalysisContext context) {
 		int rowIndex = context.readRowHolder().getRowIndex() + 1;
 
-		// 1. 基本数据校验
-		List<String> validationErrors = validateData(data, rowIndex);
-		if (!validationErrors.isEmpty()) {
-			errorMessages.addAll(validationErrors.stream()
-				.map(msg -> new ImportError(rowIndex, msg))
-				.toList());
-			return;
-		}
-
-		// 2. 内存重复检查
-		if (isDuplicateInMemory(data, rowIndex)) {
-			return;
+		ImportResult<Object> result = convertAndValidate(map, rowIndex);
+		resultList.add(result);
+		if (result.isSuccess()) {
+			dataList.add(result.getData());
+			incrementSuccessCount();
+		} else {
+			incrementErrorCount();
 		}
+	}
 
+	private ImportResult<Object> convertAndValidate(Map<Integer, String> data, int rowIndex) {
 
-
-		dataList.add(data);
- 	}
-
-	/**
-	 * 数据校验
-	 */
-	private List<String> validateData(YsZjtrfyExcel data, int rowIndex) {
 		List<String> errors = new ArrayList<>();
 
-		// 使用注解校验
-		Set<ConstraintViolation<YsZjtrfyExcel>> violations = validator.validate(data);
-		for (ConstraintViolation<YsZjtrfyExcel> violation : violations) {
-			errors.add(violation.getMessage());
+		YsZjtrfyExcel excel = new YsZjtrfyExcel();
+		excel.setXh(data.get(0));
+		excel.setWzmc(data.get(1));
+		String yongliang = data.get(2);
+		if(Func.isNotBlank(yongliang)){
+			excel.setYongLiang(ValidationUtils.safeParseInteger(yongliang));
+			if (Func.isNull(excel.getYongLiang())) {
+				errors.add("用量数据格式错误");
+			}
 		}
 
-//		// 自定义业务校验
-//		if (data.getAgeInt() != null && (data.getAgeInt() < 0 || data.getAgeInt() > 150)) {
-//			errors.add("年龄必须在0-150之间");
-//		}
-//
-//		if (data.getSalaryDecimal() != null && data.getSalaryDecimal().compareTo(BigDecimal.ZERO) < 0) {
-//			errors.add("薪资不能为负数");
-//		}
-//
-//		if (data.getStatusInt() != null && (data.getStatusInt() < 0 || data.getStatusInt() > 1)) {
-//			errors.add("状态只能是0或1");
-//		}
-//
-//		// 日期逻辑校验
-//		if (data.getBirthdayDate() != null && data.getHireDateDate() != null) {
-//			if (data.getBirthdayDate().after(data.getHireDateDate())) {
-//				errors.add("生日不能晚于入职日期");
-//			}
-//		}
-
-		return errors;
-	}
-
-	/**
-	 * 内存重复检查
-	 */
-	private boolean isDuplicateInMemory(YsZjtrfyExcel data, int rowIndex) {
-		boolean isDuplicate = false;
-
-//		if (tempUsernames.contains(data.getUsername())) {
-//			errorMessages.add(new ImportError(rowIndex, "用户名 " + data.getUsername() + " 在当前文件中重复"));
-//			isDuplicate = true;
-//		}
-//
-//		if (tempEmails.contains(data.getEmail())) {
-//			errorMessages.add(new ImportError(rowIndex, "邮箱 " + data.getEmail() + " 在当前文件中重复"));
-//			isDuplicate = true;
-//		}
-//
-//		if (!isDuplicate) {
-//			tempUsernames.add(data.getUsername());
-//			tempEmails.add(data.getEmail());
-//		}
-
-		return isDuplicate;
-	}
+		String danjia = data.get(3);
+		if(Func.isNotBlank(danjia)){
+			excel.setDanJia(ValidationUtils.safeParseDouble(danjia));
+			if (Func.isNull(excel.getDanJia())) {
+				errors.add("单价数据格式错误");
+			}else {
+				excel.setDanJia(excel.getDanJia() * 10000);
+			}
+		}
 
-	@Override
-	public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+ 		excel.setYqsbmc(data.get(5));
 
-//		if (Func.isEmpty(dataList)) {
-//			throw new ServiceException("无数据可导入");
-//		}
-//		List<YsZjtrfyEntity> insertList = new ArrayList<>();
-//		List<YsZjtrfyEntity> dbList = service.list(Wrappers.<YsZjtrfyEntity>lambdaQuery().eq(YsZjtrfyEntity::getXmId, xmId));
-//		int batchCount = 20;
-//		for (YsZjtrfyExcel excel : dataList) {
-//			YsZjtrfyEntity entity = new YsZjtrfyEntity();
-//			entity.setXmId(xmId);
-//			entity.setWzmc(excel.getWzmc());
-//			entity.setYongLiang(excel.getYongLiang());
-////			BeanUtil.copyProperties(excel, entity);
-//			insertList.add(entity);
-//			if (insertList.size() % batchCount == 0 && service.saveBatch(insertList)) {
-//				insertList.clear();
-//			}
-//		}
-//		if (Func.isNotEmpty(insertList)) {
-//			service.saveBatch(insertList);
-//		}
-	}
+		String ysje = data.get(6);
+		if(Func.isNotBlank(ysje)){
+			excel.setYsje(ValidationUtils.safeParseDouble(ysje));
+			if (Func.isNull(excel.getYsje())) {
+				errors.add("仪器设备的预算金额(万元)数据格式错误");
+			}else {
+				excel.setYsje(excel.getYsje() * 10000);
+			}
+		}
+		excel.setGdzcmc(data.get(7));
+		String zlfyys = data.get(8);
+		if(Func.isNotBlank(zlfyys)){
+			excel.setZlfyys(ValidationUtils.safeParseDouble(zlfyys));
+			if (Func.isNull(excel.getZlfyys())) {
+				errors.add("固定资产租赁预算金额(万元)数据格式错误");
+			}else {
+				excel.setZlfyys(excel.getZlfyys() * 10000);
+			}
+		}
 
-	public boolean hasErrors() {
-		return !errorMessages.isEmpty();
+		errors.addAll(ValidationUtils.validate(excel));
+		if (!errors.isEmpty()) {
+			return ImportResult.error(rowIndex, errors, data.toString());
+		}
+		return ImportResult.success(rowIndex, excel);
 	}
 }

+ 3 - 2
kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/XmBgrzMapper.xml

@@ -56,8 +56,9 @@
             FROM kd_xm m
         )xm on rz.xm_id = xm.id
         LEFT JOIN kd_technician t on t.id = xm.xmfzr
-        WHERE rz.is_deleted = 0 and rz.ZDMC != "STATUS" and rz.BGHDZ != 2
-        <if test="ew.xmId!=null">and rz.XM_ID = #{ew.xmId}</if>
+        <where>
+            <if test="ew.xmId!=null">and rz.XM_ID = #{ew.xmId}</if>
+        </where>
     </select>
 
 </mapper>

+ 28 - 25
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmServiceImpl.java

@@ -103,39 +103,42 @@ public class XmServiceImpl extends BaseServiceImpl<XmMapper, XmEntity> implement
 
 	@Override
 	public Long approval(XmDTO xm) {
-
 		if(Func.equals(xm.getStatus(), XmStatusEnum.暂存.getCode())){
+			//检查项目名称是否重复(xm);
+			Long xmIdByXmmc = baseMapper.getXmIdByXmmcOrXmbh(null, xm.getXmmc(), null);
+			if (xmIdByXmmc != null && !xmIdByXmmc.equals(xm.getId())) {
+				throw new ServiceException("研发项目名称已存在");
+			}
+		}else {
+			List<String> validate = ValidationUtils.validate(xm);
+			if (Func.isEmpty(validate)) {
+				throw new ServiceException(String.join(",", validate));
+			}
+			this.judgeXmmcAvailable(xm.getXmmc());
 
-		}
-		List<String> validate = ValidationUtils.validate(xm);
-		if (Func.isEmpty(validate)) {
-			throw new ServiceException(String.join(",", validate));
-		}
-		this.judgeXmmcAvailable(xm.getXmmc());
-
-		judgeXmIsOver(xm.getId(), true);
+			judgeXmIsOver(xm.getId(), true);
 
-		//检查项目名称是否重复(xm);
-		Long xmIdByXmmc = baseMapper.getXmIdByXmmcOrXmbh(null, xm.getXmmc(), null);
-		if (xmIdByXmmc != null && !xmIdByXmmc.equals(xm.getId())) {
-			throw new ServiceException("研发项目名称已存在");
-		}
+			//检查项目名称是否重复(xm);
+			Long xmIdByXmmc = baseMapper.getXmIdByXmmcOrXmbh(null, xm.getXmmc(), null);
+			if (xmIdByXmmc != null && !xmIdByXmmc.equals(xm.getId())) {
+				throw new ServiceException("研发项目名称已存在");
+			}
 
-		Long xmIdByXmbh = baseMapper.getXmIdByXmmcOrXmbh(null, null, xm.getXmbh());
-		if (xmIdByXmbh != null && !xmIdByXmbh.equals(xm.getId())) {
-			throw new ServiceException("研发项目编号已存在");
-		}
+			Long xmIdByXmbh = baseMapper.getXmIdByXmmcOrXmbh(null, null, xm.getXmbh());
+			if (xmIdByXmbh != null && !xmIdByXmbh.equals(xm.getId())) {
+				throw new ServiceException("研发项目编号已存在");
+			}
 
-		if (xm.getXmyszemx() != null) {
-			List<JSONObject> list = JSONObject.parseArray(xm.getXmyszemx(), JSONObject.class);
-			if (CollectionUtil.isNotEmpty(list)) {
-				double total = list.stream().mapToDouble(t -> t.getDouble("amount")).sum();
-				if (total != xm.getXmysze().doubleValue()) {
-					throw new ServiceException("项目预算总额明细不对");
+			if (xm.getXmyszemx() != null) {
+				List<JSONObject> list = JSONObject.parseArray(xm.getXmyszemx(), JSONObject.class);
+				if (CollectionUtil.isNotEmpty(list)) {
+					double total = list.stream().mapToDouble(t -> t.getDouble("amount")).sum();
+					if (total != xm.getXmysze().doubleValue()) {
+						throw new ServiceException("项目预算总额明细不对");
+					}
 				}
 			}
 		}
-
 		return this.saveOrUpdate(xm) ? xm.getId() : null;
 	}
 

+ 13 - 9
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/YsQtfyServiceImpl.java

@@ -10,13 +10,13 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
-import org.sky.core.excel.util.ExcelUtil;
 import org.sky.core.log.exception.ServiceException;
 import org.sky.core.mp.base.BaseServiceImpl;
 import org.sky.core.mp.support.Condition;
 import org.sky.core.mp.support.Query;
 import org.sky.core.tool.utils.Func;
 import org.sky.scientific.excel.YsQtfyExcel;
+import org.sky.scientific.excel.listener.YsQtfyImportListener;
 import org.sky.scientific.mapper.XmMapper;
 import org.sky.scientific.mapper.YsQtfyMapper;
 import org.sky.scientific.pojo.entity.YsQtfyEntity;
@@ -26,6 +26,7 @@ import org.sky.scientific.service.IYsQtfyService;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.BufferedInputStream;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.ArrayList;
@@ -64,6 +65,7 @@ public class YsQtfyServiceImpl extends BaseServiceImpl<YsQtfyMapper, YsQtfyEntit
 		return this.updateById(ysQtfy);
 	}
 
+	@SneakyThrows
 	@Override
 	public void importQtfy(MultipartFile file, Long xmId) {
 		if (Func.isNull(xmId)) {
@@ -73,23 +75,25 @@ public class YsQtfyServiceImpl extends BaseServiceImpl<YsQtfyMapper, YsQtfyEntit
 		if (Func.isNull(xmVO)) {
 			throw new ServiceException("研发项目不存在");
 		}
-
-		List<YsQtfyExcel> dataList = ExcelUtil.read(file, 0, 3, YsQtfyExcel.class);
-		if (Func.isEmpty(dataList)) {
+		YsQtfyImportListener listener = new YsQtfyImportListener();
+		EasyExcel.read(new BufferedInputStream(file.getInputStream()))
+			.registerReadListener(listener)
+			.sheet(0)
+			.headRowNumber(3) // 重要:设置表头行数(0-based)
+			.doRead();
+		List<Object> dataList = listener.getDataList();
+ 		if (Func.isEmpty(dataList)) {
 			throw new ServiceException("读取导入数据失败,请检查数据");
 		}
 
 		List<YsQtfyEntity> insertList = new ArrayList<>();
 		int batchCount = 20;
-		for (YsQtfyExcel excel : dataList) {
-
+		for (Object o : dataList) {
+			YsQtfyExcel excel = (YsQtfyExcel) o;
 			YsQtfyEntity entity = new YsQtfyEntity();
 			entity.setXmId(xmId);
 			entity.setFynr(excel.getFynr());
 			entity.setYsje(excel.getYsje());
-			if(excel.getYsje()!=null){
-				entity.setYsje(excel.getYsje()*10000);
-			}
 			insertList.add(entity);
 
 			if (insertList.size() % batchCount == 0 && this.saveBatch(insertList)) {

+ 11 - 3
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/YsRyrgfyServiceImpl.java

@@ -12,7 +12,6 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
-import org.sky.core.excel.util.ExcelUtil;
 import org.sky.core.log.exception.ServiceException;
 import org.sky.core.mp.base.BaseServiceImpl;
 import org.sky.core.mp.support.Condition;
@@ -20,6 +19,7 @@ import org.sky.core.mp.support.Query;
 import org.sky.core.tool.utils.DateUtil;
 import org.sky.core.tool.utils.Func;
 import org.sky.scientific.excel.YsRyrgfyExcel;
+import org.sky.scientific.excel.listener.YsRyrgfyImportListener;
 import org.sky.scientific.mapper.TechnicianMapper;
 import org.sky.scientific.mapper.XmMapper;
 import org.sky.scientific.mapper.YsRyrgfyMapper;
@@ -32,6 +32,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.BufferedInputStream;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.math.BigDecimal;
@@ -85,13 +86,20 @@ public class YsRyrgfyServiceImpl extends BaseServiceImpl<YsRyrgfyMapper, YsRyrgf
 			throw new ServiceException(xmVO.getXmkssj() + "花名册无数据");
 		}
 
-		List<YsRyrgfyExcel> dataList = ExcelUtil.read(file, 0, 3, YsRyrgfyExcel.class);
+		YsRyrgfyImportListener listener = new YsRyrgfyImportListener();
+		EasyExcel.read(new BufferedInputStream(file.getInputStream()))
+			.registerReadListener(listener)
+			.sheet(0)
+			.headRowNumber(3) // 重要:设置表头行数(0-based)
+			.doRead();
+		List<Object> dataList = listener.getDataList();
 
 		List<YsRyrgfyEntity> dbYsList = baseMapper.selectList(Wrappers.<YsRyrgfyEntity>lambdaQuery().eq(YsRyrgfyEntity::getXmId, xmId));
 
 		List<YsRyrgfyEntity> insertList = new ArrayList<>();
 		int batchCount = 20;
-		for (YsRyrgfyExcel excel : dataList) {
+		for (Object o : dataList) {
+			YsRyrgfyExcel excel = (YsRyrgfyExcel) o;
 			YsRyrgfyEntity entity = new YsRyrgfyEntity();
 
 			excel.setNumber(Func.isBlank(excel.getNumber()) ? null : excel.getNumber().trim());

+ 13 - 8
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/YsSjfyServiceImpl.java

@@ -10,13 +10,13 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
-import org.sky.core.excel.util.ExcelUtil;
 import org.sky.core.log.exception.ServiceException;
 import org.sky.core.mp.base.BaseServiceImpl;
 import org.sky.core.mp.support.Condition;
 import org.sky.core.mp.support.Query;
 import org.sky.core.tool.utils.Func;
 import org.sky.scientific.excel.YsSjfyExcel;
+import org.sky.scientific.excel.listener.YsSjfyImportListener;
 import org.sky.scientific.mapper.XmMapper;
 import org.sky.scientific.mapper.YsSjfyMapper;
 import org.sky.scientific.pojo.entity.YsSjfyEntity;
@@ -26,6 +26,7 @@ import org.sky.scientific.service.IYsSjfyService;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.BufferedInputStream;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.ArrayList;
@@ -64,6 +65,7 @@ public class YsSjfyServiceImpl extends BaseServiceImpl<YsSjfyMapper, YsSjfyEntit
 		return this.updateById(ysSjfy);
 	}
 
+	@SneakyThrows
 	@Override
 	public void importSjfy(MultipartFile file, Long xmId) {
 		if (Func.isNull(xmId)) {
@@ -74,22 +76,25 @@ public class YsSjfyServiceImpl extends BaseServiceImpl<YsSjfyMapper, YsSjfyEntit
 			throw new ServiceException("研发项目不存在");
 		}
 
-		List<YsSjfyExcel> dataList = ExcelUtil.read(file, 0, 3, YsSjfyExcel.class);
-		if (Func.isEmpty(dataList)) {
+		YsSjfyImportListener listener = new YsSjfyImportListener();
+		EasyExcel.read(new BufferedInputStream(file.getInputStream()))
+			.registerReadListener(listener)
+			.sheet(0)
+			.headRowNumber(3) // 重要:设置表头行数(0-based)
+			.doRead();
+		List<Object> dataList = listener.getDataList();
+ 		if (Func.isEmpty(dataList)) {
 			throw new ServiceException("读取导入数据失败,请检查数据");
 		}
 
 		List<YsSjfyEntity> insertList = new ArrayList<>();
 		int batchCount = 20;
-		for (YsSjfyExcel excel : dataList) {
-
+		for (Object o : dataList) {
+			YsSjfyExcel excel = (YsSjfyExcel) o;
 			YsSjfyEntity entity = new YsSjfyEntity();
 			entity.setXmId(xmId);
 			entity.setSjnr(excel.getSjnr());
 			entity.setYsje(excel.getYsje());
-			if(excel.getYsje()!=null){
-				entity.setYsje(excel.getYsje()*10000);
-			}
 
 			insertList.add(entity);
 

+ 14 - 10
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/YsWtwbyjkffyServiceImpl.java

@@ -10,7 +10,6 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
-import org.sky.core.excel.util.ExcelUtil;
 import org.sky.core.log.exception.ServiceException;
 import org.sky.core.mp.base.BaseServiceImpl;
 import org.sky.core.mp.support.Condition;
@@ -18,6 +17,7 @@ import org.sky.core.mp.support.Query;
 import org.sky.core.tool.utils.BeanUtil;
 import org.sky.core.tool.utils.Func;
 import org.sky.scientific.excel.YsWtwbyjkffyExcel;
+import org.sky.scientific.excel.listener.YsWtwbyjkffyImportListener;
 import org.sky.scientific.mapper.XmMapper;
 import org.sky.scientific.mapper.YsWtwbyjkffyMapper;
 import org.sky.scientific.pojo.entity.YsWtwbyjkffyEntity;
@@ -26,6 +26,7 @@ import org.sky.scientific.service.IYsWtwbyjkffyService;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.BufferedInputStream;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.ArrayList;
@@ -64,29 +65,32 @@ public class YsWtwbyjkffyServiceImpl extends BaseServiceImpl<YsWtwbyjkffyMapper,
 		return this.updateById(ysWtwbyjkffy);
 	}
 
+	@SneakyThrows
 	@Override
 	public void importWtwbyjkffy(MultipartFile file, Long xmId) {
 		if (Func.isNull(xmId)) {
 			throw new ServiceException("请选择研发项目");
 		}
-
-		List<YsWtwbyjkffyExcel> dataList = ExcelUtil.read(file, 0, 3, YsWtwbyjkffyExcel.class);
-		if (Func.isEmpty(dataList)) {
+		YsWtwbyjkffyImportListener listener = new YsWtwbyjkffyImportListener();
+		EasyExcel.read(new BufferedInputStream(file.getInputStream()))
+			.registerReadListener(listener)
+			.sheet(0)
+			.headRowNumber(3) // 重要:设置表头行数(0-based)
+			.doRead();
+		List<Object> dataList = listener.getDataList();
+ 		if (Func.isEmpty(dataList)) {
 			throw new ServiceException("读取导入数据失败,请检查数据");
 		}
 
 		List<YsWtwbyjkffyEntity> insertList = new ArrayList<>();
 		int batchCount = 20;
-		for (YsWtwbyjkffyExcel excel : dataList) {
-
+		for ( Object o: dataList) {
+			YsWtwbyjkffyExcel excel = (YsWtwbyjkffyExcel) o;
 			YsWtwbyjkffyEntity entity = new YsWtwbyjkffyEntity();
 			entity.setXmId(xmId);
 
 			BeanUtil.copyProperties(excel, entity);
-			if(entity.getWwfy()!=null){
-				entity.setWwfy(entity.getWwfy()*10000);
-			}
-			insertList.add(entity);
+  			insertList.add(entity);
 
 			if (insertList.size() % batchCount == 0 && this.saveBatch(insertList)) {
 				insertList.clear();

+ 13 - 4
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/YsWxzctxfyServiceImpl.java

@@ -11,7 +11,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
-import org.sky.core.excel.util.ExcelUtil;
 import org.sky.core.log.exception.ServiceException;
 import org.sky.core.mp.base.BaseServiceImpl;
 import org.sky.core.mp.support.Condition;
@@ -20,6 +19,7 @@ import org.sky.core.tool.utils.BeanUtil;
 import org.sky.core.tool.utils.DateUtil;
 import org.sky.core.tool.utils.Func;
 import org.sky.scientific.excel.YsWxzctxfyExcel;
+import org.sky.scientific.excel.listener.YsWxzctxfyImportListener;
 import org.sky.scientific.mapper.AssetMapper;
 import org.sky.scientific.mapper.XmMapper;
 import org.sky.scientific.mapper.YsWxzctxfyMapper;
@@ -31,6 +31,7 @@ import org.sky.scientific.service.IYsWxzctxfyService;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.BufferedInputStream;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.math.BigDecimal;
@@ -90,6 +91,7 @@ public class YsWxzctxfyServiceImpl extends BaseServiceImpl<YsWxzctxfyMapper, YsW
 		return this.saveOrUpdate(entity);
 	}
 
+	@SneakyThrows
 	@Override
 	public void importWxzctxfy(MultipartFile file, Long xmId) {
 		if (Func.isNull(xmId)) {
@@ -107,7 +109,14 @@ public class YsWxzctxfyServiceImpl extends BaseServiceImpl<YsWxzctxfyMapper, YsW
 			throw new ServiceException(xmVO.getXmkssj() + "资产清单无数据");
 		}
 
-		List<YsWxzctxfyExcel> dataList = ExcelUtil.read(file, 0, 3, YsWxzctxfyExcel.class);
+
+		YsWxzctxfyImportListener listener = new YsWxzctxfyImportListener();
+		EasyExcel.read(new BufferedInputStream(file.getInputStream()))
+			.registerReadListener(listener)
+			.sheet(0)
+			.headRowNumber(3) // 重要:设置表头行数(0-based)
+			.doRead();
+		List<Object> dataList = listener.getDataList();
 		if (Func.isEmpty(dataList)) {
 			throw new ServiceException("读取导入数据失败,请检查数据");
 		}
@@ -115,8 +124,8 @@ public class YsWxzctxfyServiceImpl extends BaseServiceImpl<YsWxzctxfyMapper, YsW
 
 		List<YsWxzctxfyEntity> insertList = new ArrayList<>();
 		int batchCount = 20;
-		for (YsWxzctxfyExcel excel : dataList) {
-
+		for (Object o : dataList) {
+			YsWxzctxfyExcel excel = (YsWxzctxfyExcel) o;
 			if (Func.isBlank(excel.getZcmc())) {
 				throw new ServiceException("序号[" + excel.getXh() + "]的资产名称为空");
 			}

+ 20 - 15
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/YsZbtsysyfyServiceImpl.java

@@ -10,13 +10,13 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
-import org.sky.core.excel.util.ExcelUtil;
 import org.sky.core.log.exception.ServiceException;
 import org.sky.core.mp.base.BaseServiceImpl;
 import org.sky.core.mp.support.Condition;
 import org.sky.core.mp.support.Query;
 import org.sky.core.tool.utils.Func;
 import org.sky.scientific.excel.YsZbtsysyfyExcel;
+import org.sky.scientific.excel.listener.YsZbtsysyfyImportListener;
 import org.sky.scientific.mapper.XmMapper;
 import org.sky.scientific.mapper.YsZbtsysyfyMapper;
 import org.sky.scientific.pojo.entity.YsZbtsysyfyEntity;
@@ -25,6 +25,7 @@ import org.sky.scientific.service.IYsZbtsysyfyService;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.BufferedInputStream;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.ArrayList;
@@ -50,40 +51,44 @@ public class YsZbtsysyfyServiceImpl extends BaseServiceImpl<YsZbtsysyfyMapper, Y
 		return page.setRecords(baseMapper.selectYsZbtsysyfyPage(page, ysZbtsysyfy));
 	}
 
-    @Override
-    public boolean physicalDeleteByIds(List<Long> ids) {
-        return baseMapper.physicalDeleteByIds(ids) > 0;
-    }
+	@Override
+	public boolean physicalDeleteByIds(List<Long> ids) {
+		return baseMapper.physicalDeleteByIds(ids) > 0;
+	}
 
 	@Override
 	public boolean updateZbtssyfy(YsZbtsysyfyEntity ysZbtsysyfy) {
-		if(ysZbtsysyfy.getXmId() == null){
+		if (ysZbtsysyfy.getXmId() == null) {
 			throw new ServiceException("请选择科研项目");
 		}
 		return this.updateById(ysZbtsysyfy);
 	}
 
+	@SneakyThrows
 	@Override
 	public void importZbtsysyfy(MultipartFile file, Long xmId) {
 		if (Func.isNull(xmId)) {
 			throw new ServiceException("请选择研发项目");
 		}
-
-		List<YsZbtsysyfyExcel> dataList = ExcelUtil.read(file, 0, 3, YsZbtsysyfyExcel.class);
+		YsZbtsysyfyImportListener listener = new YsZbtsysyfyImportListener();
+		EasyExcel.read(new BufferedInputStream(file.getInputStream()))
+			.registerReadListener(listener)
+			.sheet(0)
+			.headRowNumber(3) // 重要:设置表头行数(0-based)
+			.doRead();
+		List<Object> dataList = listener.getDataList();
 		if (Func.isEmpty(dataList)) {
 			throw new ServiceException("读取导入数据失败,请检查数据");
 		}
 
 		List<YsZbtsysyfyEntity> insertList = new ArrayList<>();
 		int batchCount = 20;
-		for (YsZbtsysyfyExcel excel : dataList) {
-
+		for (Object o : dataList) {
+			YsZbtsysyfyExcel excel = (YsZbtsysyfyExcel) o;
 			YsZbtsysyfyEntity entity = new YsZbtsysyfyEntity();
 			entity.setXmId(xmId);
 			entity.setFyje(excel.getFyje());
-			if(excel.getYsje()!=null){
-				entity.setYsje(excel.getYsje()*10000);
-			}
+			entity.setYsje(excel.getYsje());
 			insertList.add(entity);
 
 			if (insertList.size() % batchCount == 0 && this.saveBatch(insertList)) {
@@ -104,8 +109,8 @@ public class YsZbtsysyfyServiceImpl extends BaseServiceImpl<YsZbtsysyfyMapper, Y
 
 		for (YsZbtsysyfyVO temp : list) {
 			temp.setXh(index.getAndIncrement() + "");
-			if(temp.getYsje()!=null){
-				temp.setYsje(temp.getYsje()/10000);
+			if (temp.getYsje() != null) {
+				temp.setYsje(temp.getYsje() / 10000);
 			}
 		}
 		InputStream templateFileName = this.getClass().getClassLoader().getResourceAsStream("export-template/研发项目管理/预算编制/装备调试费用与试验费用.xls");

+ 13 - 5
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/YsZjfyycqdtfyServiceImpl.java

@@ -11,7 +11,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
-import org.sky.core.excel.util.ExcelUtil;
 import org.sky.core.log.exception.ServiceException;
 import org.sky.core.mp.base.BaseServiceImpl;
 import org.sky.core.mp.support.Condition;
@@ -21,6 +20,7 @@ import org.sky.core.tool.utils.DateUtil;
 import org.sky.core.tool.utils.Func;
 import org.sky.scientific.e.AssetStatusEnum;
 import org.sky.scientific.excel.YsZjfyycqdtfyExcel;
+import org.sky.scientific.excel.listener.YsZjfyycqdtfyImportListener;
 import org.sky.scientific.mapper.AssetMapper;
 import org.sky.scientific.mapper.XmMapper;
 import org.sky.scientific.mapper.YsZjfyycqdtfyMapper;
@@ -32,6 +32,7 @@ import org.sky.scientific.service.IYsZjfyycqdtfyService;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.BufferedInputStream;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.math.BigDecimal;
@@ -97,6 +98,7 @@ public class YsZjfyycqdtfyServiceImpl extends BaseServiceImpl<YsZjfyycqdtfyMappe
 		return this.saveOrUpdate(entity);
 	}
 
+	@SneakyThrows
 	@Override
 	public void importZjfyycqdtfy(MultipartFile file, Long xmId) {
 		if (Func.isNull(xmId)) {
@@ -106,9 +108,14 @@ public class YsZjfyycqdtfyServiceImpl extends BaseServiceImpl<YsZjfyycqdtfyMappe
 		if (Func.isNull(xmVO)) {
 			throw new ServiceException("研发项目不存在");
 		}
-
-		List<YsZjfyycqdtfyExcel> dataList = ExcelUtil.read(file, 0, 3, YsZjfyycqdtfyExcel.class);
-		if(Func.isEmpty(dataList)){
+		YsZjfyycqdtfyImportListener listener = new YsZjfyycqdtfyImportListener();
+		EasyExcel.read(new BufferedInputStream(file.getInputStream()))
+			.registerReadListener(listener)
+			.sheet(0)
+			.headRowNumber(3) // 重要:设置表头行数(0-based)
+			.doRead();
+		List<Object> dataList = listener.getDataList();
+ 		if(Func.isEmpty(dataList)){
 			throw new ServiceException("读取导入数据失败,请检查数据");
 		}
 
@@ -123,7 +130,8 @@ public class YsZjfyycqdtfyServiceImpl extends BaseServiceImpl<YsZjfyycqdtfyMappe
 
 		List<YsZjfyycqdtfyEntity> insertList = new ArrayList<>();
 		int batchCount = 20;
-		for (YsZjfyycqdtfyExcel excel : dataList) {
+		for (Object o : dataList) {
+			YsZjfyycqdtfyExcel excel = (YsZjfyycqdtfyExcel) o;
 			if(Func.isBlank(excel.getZcmc())){
 				throw new ServiceException("序号["+excel.getXh()+"]的资产名称为空");
 			}

+ 11 - 11
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/YsZjtrfyServiceImpl.java

@@ -1,6 +1,7 @@
 
 package org.sky.scientific.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.ExcelWriter;
 import com.alibaba.excel.support.ExcelTypeEnum;
@@ -11,14 +12,12 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
-import org.sky.core.excel.util.ExcelUtil;
 import org.sky.core.log.exception.ServiceException;
 import org.sky.core.mp.base.BaseServiceImpl;
 import org.sky.core.mp.support.Condition;
 import org.sky.core.mp.support.Query;
-import org.sky.core.tool.utils.BeanUtil;
 import org.sky.core.tool.utils.Func;
-import org.sky.scientific.excel.YsZjtrfyExcel;
+import org.sky.scientific.excel.listener.YsZjtrfyImportListener;
 import org.sky.scientific.mapper.XmMapper;
 import org.sky.scientific.mapper.YsZjtrfyMapper;
 import org.sky.scientific.pojo.entity.YsZjtrfyEntity;
@@ -28,6 +27,7 @@ import org.sky.scientific.service.IYsZjtrfyService;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.BufferedInputStream;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.math.BigDecimal;
@@ -85,11 +85,6 @@ public class YsZjtrfyServiceImpl extends BaseServiceImpl<YsZjtrfyMapper, YsZjtrf
 	@Override
 	public void importZjtrfy(MultipartFile file, Long xmId) {
 
-
-//		YsZjtrfyImportListener listener = new YsZjtrfyImportListener();
-//		ExcelUtil.getReaderBuilder(file, listener, YsZjtrfyExcel.class).headRowNumber(3).doReadAll();
-
-
 		if (Func.isNull(xmId)) {
 			throw new ServiceException("请选择研发项目");
 		}
@@ -97,12 +92,17 @@ public class YsZjtrfyServiceImpl extends BaseServiceImpl<YsZjtrfyMapper, YsZjtrf
 		if (Func.isNull(xmVO)) {
 			throw new ServiceException("研发项目不存在");
 		}
-
-		List<YsZjtrfyExcel> dataList = ExcelUtil.read(file, 0, 3, YsZjtrfyExcel.class);
+		YsZjtrfyImportListener listener = new YsZjtrfyImportListener();
+ 		EasyExcel.read(new BufferedInputStream(file.getInputStream()))
+			.registerReadListener(listener)
+			.sheet(0)
+			.headRowNumber(3) // 重要:设置表头行数(0-based)
+			.doRead();
+		List<Object> dataList = listener.getDataList();
 
 		List<YsZjtrfyEntity> insertList = new ArrayList<>();
 		int batchCount = 20;
-		for (YsZjtrfyExcel excel : dataList) {
+		for (Object excel : dataList) {
 			YsZjtrfyEntity entity = new YsZjtrfyEntity();
 			entity.setXmId(xmId);
 			BeanUtil.copyProperties(excel, entity);

+ 1 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/utils/ValidationUtils.java

@@ -65,6 +65,7 @@ public class ValidationUtils {
 		}
 	}
 
+
 	public static Double safeParseDouble(String numberStr) {
 		if (StringUtil.isBlank(numberStr)) {
 			return null;