实验数据的计算ExamineResultController中增加了一个使用数学公式计算结果的方法ptExcelReview(),为其它计算做参考

dev
yitonglei 3 years ago
parent 1b0443e5d7
commit d97f0c0b98
  1. 22
      lab-service/lab-lims/pom.xml
  2. 270
      lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ExamineResultController.java

@ -130,7 +130,27 @@
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
</dependency>
<!-- <dependency>-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>QLExpress</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>QLExpress</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>QLExpress</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>QLExpress</artifactId>
<version>3.2.0</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>cn.afterturn</groupId>-->
<!-- <artifactId>easypoi-base</artifactId>-->
<!-- <version>3.2.0</version>-->

@ -14,18 +14,14 @@ import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.StringUtil;
import org.springblade.lims.entry.*;
import org.springblade.lims.excel.*;
import org.springblade.lims.service.*;
import org.springblade.system.feign.ISysClient;
import org.springblade.lims.utils.FormulaTool;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.*;
import java.util.stream.Collectors;
@ -98,6 +94,268 @@ public class ExamineResultController extends BladeController {
}
}
/** 普通Excel解析数据 review start **/
//获取单元格的值
private String getCode(List<ExamineExcel> list,Integer order){
String result;
ExamineExcel examineExcel = (order % 8 - 1 >= 0) ? list.get(order % 8 - 1) : list.get(list.size() - 1);
Integer re = order / 8 + 1;
switch (re){
case 1:
result = examineExcel.getCode1();
break;
case 2:
result = examineExcel.getCode2();
break;
case 3:
result = examineExcel.getCode3();
break;
case 4:
result = examineExcel.getCode4();
break;
case 5:
result = examineExcel.getCode5();
break;
case 6:
result = examineExcel.getCode6();
break;
case 7:
result = examineExcel.getCode7();
break;
case 8:
result = examineExcel.getCode8();
break;
case 9:
result = examineExcel.getCode9();
break;
case 10:
result = examineExcel.getCode10();
break;
case 11:
result = examineExcel.getCode11();
break;
case 12:
result = examineExcel.getCode12();
break;
default:
result = "0";
}
return result;
}
private R<Map<String, List<Map<String, Map<String, Object>>>>> ptExcelReview(
MultipartFile file,
String examineId,
Map<String,String> info, //变量对应的标版的孔位,一行行的逐渐递增
String reg //计算公式
) throws Exception{
try {
List<ExamineExcel> read = ExcelUtil.read(file, ExamineExcel.class);
Map<String, List<ExamineExcel>> map = new HashMap<>();
// int index = 0;
// 组数
int group = 0;
// 除9是否有余数
int size = (read.size() + 1) % 9;
if (size == 0) {
group = (read.size() + 1) / 9;
} else {
group = (read.size() + 1) / 9 + 1;
}
//将读取到的excel按照每一版分组
for (int i = 0; i < group; i++) {
List<ExamineExcel> excels = new ArrayList<>();
for (int j = i * 8 + i; j < (i + 1) * 8 + i; j++) {
ExamineExcel excel = read.get(j);
excels.add(excel);
}
map.put((i + 1) + "", excels);
}
Examine examine = examineService.getById(examineId);
String experieNum = examine.getExperieNum();
String[] split = experieNum.split(",");
List<Map<String, Object>> list = new ArrayList<>();
// 按照公式计算实验数据并返回
Map<String, List<Map<String, Map<String, Object>>>> map1 = new HashMap<>();
for (int i = 0; i < group; i++) {
List<Map<String, Map<String, Object>>> mapList = new ArrayList<>();
List<ExamineExcel> excels = map.get(i + 1 + "");
//解析info,确定参数x的值和其它相对不变的参数
Map<String,Object> params = new HashMap<>(); //存放解析出的参数
Integer xStart = 0;
Integer xEnd = 0;
//解析参数
Set<String> strings = info.keySet();
String x = "";
for(String s: strings){
String para = info.get(s);
if (para.split("-").length > 1){//可变参数
String[] xs = para.split("-");
xStart = Integer.parseInt(xs[0]);
xEnd = Integer.parseInt(xs[1]);
x = s;
}else{//相对固定的参数
Integer order = Integer.valueOf(para);
params.put(s,StringUtil.isBlank(getCode(excels,order)) ? "0" : getCode(excels,order));
}
}
//按照列循环每一版的数据
for (int m = 0; m < excels.size(); m++){
String a = "";
if (m == 0) {
a = "A";
}
if (m == 1) {
a = "B";
}
if (m == 2) {
a = "C";
}
if (m == 3) {
a = "D";
}
if (m == 4) {
a = "E";
}
if (m == 5) {
a = "F";
}
if (m == 6) {
a = "G";
}
if (m == 7) {
a = "H";
}
ExamineExcel examineExcel = excels.get(m);//取到一行记录
int filedsLength = examineExcel.getClass().getDeclaredFields().length - 1;
Map<String, Map<String, Object>> map2 = new HashMap<>();
for(int n = 1; n <= filedsLength; n++){
System.out.println(n);
String code;
switch (n){
case 1:
code = examineExcel.getCode1();
break;
case 2:
code = examineExcel.getCode2();
break;
case 3:
code = examineExcel.getCode3();
break;
case 4:
code = examineExcel.getCode4();
break;
case 5:
code = examineExcel.getCode5();
break;
case 6:
code = examineExcel.getCode6();
break;
case 7:
code = examineExcel.getCode7();
break;
case 8:
code = examineExcel.getCode8();
break;
case 9:
code = examineExcel.getCode9();
break;
case 10:
code = examineExcel.getCode10();
break;
case 11:
code = examineExcel.getCode11();
break;
case 12:
code = examineExcel.getCode12();
break;
default:
code = "0";
}
Map<String, Object> mapResult = new HashMap<>();
int index = (n -1) * 8 + m + 1; //n是列,m是行 ,我们定义index是一列列的定义
System.out.println("code的值==" + code + ",列n ==" + n+",行m="+m);
System.out.println("-------------------");
if (StringUtil.isNoneBlank(code)){
if(xStart <= index && index <= xEnd){
params.put(x,code);
String value = FormulaTool.getResult(reg, params);
mapResult.put("originResult", examineExcel.getCode1());
mapResult.put("value", "0E-10".equals(value) ? "0": value);
if (Double.parseDouble(value) >= 0.4) {
mapResult.put("result", "阳性");
} else {
mapResult.put("result", "阴性");
}
}
}else {
if(xStart <= index && index <= xEnd){
mapResult.put("originResult", "");
mapResult.put("num", "");
}
}
mapResult.put("order",index + i*96);
map2.put(a + n, mapResult);
list.add(mapResult);
mapList.add(map2);
}
map1.put("g" + (i + 1), mapList);
}
}
Collections.sort(list, new Comparator<Map<String, Object>>() {
@Override
public int compare(Map<String, Object> o1, Map<String, Object> o2) {
Integer id1 = (Integer) o1.get("order");
Integer id2 = (Integer) o2.get("order");
// 升序
return id1.compareTo(id2);
}
});
int numIndex = 0;
for (Map<String, Object> stringObjectMap : list) {
String num = (String) stringObjectMap.get("num");
if (num != null && !"".equals(num)) {
num = split[numIndex];
stringObjectMap.put("num", num);
numIndex++;
}
}
LambdaQueryWrapper<ExamineResult> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ExamineResult::getExamineId, examineId);
ExamineResult result = service.getOne(wrapper);
if (result != null) {
result.setOriginRecordData(JSON.toJSONString(map));
result.setOriginRecordResult(JSON.toJSONString(map1));
result.setExamineDataArr(JSON.toJSONString(list));
service.updateById(result);
} else {
ExamineResult examineResult = new ExamineResult();
examineResult.setExamineId(Long.valueOf(examineId));
examineResult.setOriginRecordData(JSON.toJSONString(map));
examineResult.setOriginRecordResult(JSON.toJSONString(map1));
examineResult.setExamineDataArr(JSON.toJSONString(list));
service.save(examineResult);
}
return R.data(map1);
} catch (ArrayIndexOutOfBoundsException e) {
throw new RuntimeException("分配样品数量与检测样品数量不一致!");
}catch(Exception e1){
throw new RuntimeException("算术异常,请检查实验数据!");
}
}
/** 普通Excel解析数据 review stop **/
/**
* 常规Excel解析数据
*/

Loading…
Cancel
Save