检测计划-检测中、检测完成不能修改脚本、误差体系,数据分析微调

This commit is contained in:
caozehui
2025-02-24 16:31:22 +08:00
parent 837ea9e369
commit cbbf2db4eb
2 changed files with 87 additions and 21 deletions

View File

@@ -11,7 +11,9 @@ public enum PlanResponseEnum {
PLAN_REPEATED("A003014", "当前模式下,该计划已存在"),
PLAN_NOT_EXIST("A003015", "该计划不存在"),
SCRIPT_RELATE_DICT_NOT_EXIST("A003016","脚本关联的字典不存在"),
NOT_CHECKED_PLAN_CANNOT_ANALYSE("A003017","只有检测状态为检测完成的计划才能进行统计分析" );
NOT_CHECKED_PLAN_CANNOT_ANALYSE("A003017","只有检测状态为检测完成的计划才能进行统计分析" ),
CANNOT_CHANGE_SCRIPT_WHEN_CHECKING("A003018","只有检测状态为未检时,才能修改检测脚本" ),
CANNOT_CHANGE_ERROR_SYS_WHEN_CHECKING("A003019","只有检测状态为未检时,才能修改误差体系" );
private final String message;
private final String code;

View File

@@ -20,6 +20,7 @@ import com.njcn.gather.device.pojo.param.PqDevParam;
import com.njcn.gather.device.pojo.po.PqDev;
import com.njcn.gather.device.pojo.vo.CNDevExcel;
import com.njcn.gather.device.service.IPqDevService;
import com.njcn.gather.err.pojo.po.PqErrSys;
import com.njcn.gather.err.service.IPqErrSysService;
import com.njcn.gather.plan.mapper.AdPlanMapper;
import com.njcn.gather.plan.pojo.enums.DataSourceEnum;
@@ -159,17 +160,24 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
@Transactional(rollbackFor = {Exception.class})
public boolean updateAdPlan(AdPlanParam.UpdateParam param) {
this.checkRepeat(param, true);
AdPlan adPlan = new AdPlan();
BeanUtil.copyProperties(param, adPlan);
adPlan.setDatasourceId(String.join(StrUtil.COMMA, param.getDatasourceIds()));
AdPlan plan1 = this.getById(param.getId());
AdPlan plan2 = new AdPlan();
if (plan1.getTestState() != CheckStateEnum.UNCHECKED.getValue()) {
if (!plan1.getScriptId().equals(param.getScriptId())){
throw new BusinessException(PlanResponseEnum.CANNOT_CHANGE_SCRIPT_WHEN_CHECKING);
}
if (!plan1.getErrorSysId().equals(param.getErrorSysId())) {
throw new BusinessException(PlanResponseEnum.CANNOT_CHANGE_ERROR_SYS_WHEN_CHECKING);
}
}
BeanUtil.copyProperties(param, plan2);
plan2.setDatasourceId(String.join(StrUtil.COMMA, param.getDatasourceIds()));
// 修改检测计划、检测源关联
adPlanSourceService.updateAdPlanSource(param.getId(), param.getSourceIds());
plan2.setTestState(pqDevService.bind(param.getId(), param.getDevIds()));
adPlan.setTestState(pqDevService.bind(param.getId(), param.getDevIds()));
return this.updateById(adPlan);
return this.updateById(plan2);
}
@Override
@@ -432,9 +440,19 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
}
});
Map<String, List<String[]>> sheets = new HashMap<>();
Map<String, List<String[]>> sheets = new TreeMap<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if (o1.equals("概览")) {
return -1;
} else {
return o1.compareTo(o2);
}
}
});
if (planList.size() > 1) {
StringBuffer allNote = new StringBuffer();
List<PqDev> allDevList = new ArrayList<>();
for (AdPlan plan : planList) {
PqDevParam.QueryParam queryParam = new PqDevParam.QueryParam();
@@ -442,22 +460,58 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
List<PqDev> devList = pqDevService.listByPlanId(queryParam);
devList = devList.stream().filter(x -> !x.getCheckResult().equals(CheckResultEnum.UNCHECKED.getValue())).collect(Collectors.toList());
allDevList.addAll(devList);
sheets.put(plan.getName(), getRows(plan.getName(), devList, maxTime));
allNote.append(plan.getName() + "计划" + devList.size() + "台,");
if (plan.getName().equals("概览")) {
sheets.put(plan.getName() + "检测计划", getRows(plan.getName(), devList, maxTime, getNote(plan, devList)));
} else {
sheets.put(plan.getName(), getRows(plan.getName(), devList, maxTime, getNote(plan, devList)));
}
}
sheets.put("All", getRows("数据分析结果-所有计划", allDevList, maxTime));
allNote.insert(0, "说明:总计" + allDevList.size() + "台设备,");
allNote.replace(allNote.length() - 1, allNote.length(), "");
sheets.put("概览", getRows("数据分析结果-所有计划", allDevList, maxTime, allNote.toString()));
} else {
AdPlan plan = planList.get(0);
PqDevParam.QueryParam queryParam = new PqDevParam.QueryParam();
queryParam.setPlanId(plan.getId());
List<PqDev> devList = pqDevService.listByPlanId(queryParam);
devList = devList.stream().filter(x -> !x.getCheckResult().equals(CheckResultEnum.UNCHECKED.getValue())).collect(Collectors.toList());
sheets.put(plan.getName(), getRows(plan.getName(), devList, maxTime));
sheets.put(plan.getName(), getRows(plan.getName(), devList, maxTime, getNote(plan, devList)));
}
exportPassRateExcel("数据分析结果.xlsx", maxTime, sheets);
}
}
/**
* 获取备注信息
*
* @param plan 检测计划
* @param devList 设备列表
* @return 备注信息
*/
private String getNote(AdPlan plan, List<PqDev> devList) {
StringBuffer note = new StringBuffer();
note.append("说明:本计划共有" + devList.size() + "台设备,");
Map<String, List<PqDev>> devTypeMap = devList.stream().collect(Collectors.groupingBy(PqDev::getDevType, Collectors.toList()));
devTypeMap.forEach((key, value) -> {
DevType devType = devTypeService.getById(key);
if (ObjectUtil.isNotNull(devType)) {
note.append(devType.getName() + "型号" + value.size() + "台,");
}
});
PqErrSys errSys = pqErrSysService.getById(plan.getErrorSysId());
SysTestConfig config1 = sysTestConfigService.getConfig();
if (ObjectUtil.isNotNull(config1)) {
DictData dictData = dictDataService.getDictDataById(config1.getDataRule());
if (ObjectUtil.isNotNull(errSys) && ObjectUtil.isNotNull(dictData)) {
note.append("测试结果采用\"" + errSys.getName() + "\"误差体系结合\"" + dictData.getName() + "\"数据原则计算得出。");
}
}
return note.toString();
}
/**
* 获取行数据
@@ -465,9 +519,10 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
* @param header 表头
* @param devList 设备列表
* @param maxTime 最大复检次数
* @param note 备注
* @return
*/
private List<String[]> getRows(String header, List<PqDev> devList, Integer maxTime) {
private List<String[]> getRows(String header, List<PqDev> devList, Integer maxTime, String note) {
List<String[]> rows = new ArrayList<>();
String[] row1 = new String[]{header};
@@ -476,9 +531,11 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
String[] row3 = new String[maxTime + 1];
row3[0] = "合格数量";
String[] row4 = new String[maxTime + 1];
row4[0] = "已检数量";
row4[0] = "数量";
String[] row5 = new String[maxTime + 1];
row5[0] = "合格率";
String[] row6 = new String[maxTime + 1];
row6[0] = note;
long total = devList.size();
@@ -501,6 +558,7 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
rows.add(row3);
rows.add(row4);
rows.add(row5);
rows.add(row6);
return rows;
}
@@ -591,17 +649,14 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
Cell row0Cell0 = row0.createCell(0);
row0Cell0.setCellStyle(cellStyle);
row0Cell0.setCellValue(rows.get(0)[0]);
for (int i = 1; i < maxTime + 1; i++) {
row0.createCell(i);
}
CellRangeAddress mergedRegion = new CellRangeAddress(0, 0, 0, maxTime);
CellRangeAddress mergedRegion = new CellRangeAddress(0, 0, 0, 2 * maxTime + 1);
sheet.addMergedRegion(mergedRegion);
CellStyle commoncellStyle = wb.createCellStyle();
commoncellStyle.setAlignment(HorizontalAlignment.CENTER);
commoncellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
for (int i = 1; i < rows.size(); i++) {
for (int i = 1; i < rows.size() - 1; i++) {
String[] row = rows.get(i);
Row createRow = sheet.createRow(i);
for (int j = 0; j < row.length; j++) {
@@ -638,11 +693,20 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
}
}
Row note = sheet.createRow(rows.size() - 1);
Cell noteCell0 = note.createCell(0);
commoncellStyle.setWrapText(true);
noteCell0.setCellStyle(commoncellStyle);
noteCell0.setCellValue(rows.get(rows.size() - 1)[0]);
mergedRegion = new CellRangeAddress(rows.size() - 1, rows.size() + 2, 0, maxTime);
sheet.addMergedRegion(mergedRegion);
// 条形图
XSSFDrawing drawing = sheet.createDrawingPatriarch();
// 前四个默认0[0,5]从0列5行开始;[6,16]:到6列16行结束
// 默认宽度(14-8)*12
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, maxTime + 1, 25);
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, maxTime + 1, 1, 2 * maxTime + 2, 25);
// 创建一个chart对象
XSSFChart chart = drawing.createChart(anchor);
// 标题
@@ -663,7 +727,7 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
// 分类轴标(X轴)数据,单元格范围位置[1, 1]到[1, maxTime]
XDDFDataSource<String> checkTimes = XDDFDataSourcesFactory.fromStringCellRange(sheet, new CellRangeAddress(1, 1, 1, maxTime));
// 数据
String[] rateStrArr = rows.get(rows.size() - 1);
String[] rateStrArr = rows.get(rows.size() - 2);
Double[] rateArr = new Double[maxTime];
for (int i = 1; i < rateStrArr.length; i++) {
if ("/".equals(rateStrArr[i])) {