|
|
@@ -70,7 +70,7 @@ public class MesProductLeakagePointStatController extends BaseController {
|
|
|
@ResponseBody
|
|
|
public Page<MesProductLeakagePointStat> listData(String leakagePoint, String sn, Date startDate,
|
|
|
Date endDate, HttpServletRequest request, HttpServletResponse response) {
|
|
|
- List<MesProductLeakagePointStat> rows = buildStatistics(leakagePoint, sn, startDate, endDate);
|
|
|
+ List<MesProductLeakagePointStat> rows = buildStatistics(leakagePoint, sn, startDate, endDate, "all");
|
|
|
Page<MesProductLeakagePointStat> page = new Page<>(request, response);
|
|
|
page.setCount(rows.size());
|
|
|
int from = Math.max(0, (page.getPageNo() - 1) * page.getPageSize());
|
|
|
@@ -275,11 +275,13 @@ public class MesProductLeakagePointStatController extends BaseController {
|
|
|
|
|
|
@RequiresPermissions("mes:mesProductQm:view")
|
|
|
@RequestMapping(value = "chartExport")
|
|
|
- public void chartExport(String sn, Date startDate, Date endDate, HttpServletResponse response) throws Exception {
|
|
|
- List<MesProductLeakagePointStat> rows = buildStatistics("", sn, startDate, endDate);
|
|
|
- SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
+ public void chartExport(String sn, String dataType, Date startDate, Date endDate, HttpServletResponse response) throws Exception {
|
|
|
+ List<MesProductLeakagePointStat> rows = buildChartStatistics(sn, startDate, endDate, dataType);
|
|
|
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
|
|
|
String start = startDate == null ? "全部" : dateFormat.format(startDate);
|
|
|
String end = endDate == null ? "全部" : dateFormat.format(endDate);
|
|
|
+ String stationResult = dataTypeLabel(dataType);
|
|
|
+ String timeRange = start + " 至 " + end;
|
|
|
String fileName = "气密泄露点位汇总_" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".xlsx";
|
|
|
|
|
|
response.reset();
|
|
|
@@ -288,7 +290,7 @@ public class MesProductLeakagePointStatController extends BaseController {
|
|
|
+ URLEncoder.encode(fileName, "UTF-8").replace("+", "%20"));
|
|
|
try (Workbook workbook = new XSSFWorkbook(); ServletOutputStream output = response.getOutputStream()) {
|
|
|
Sheet sheet = workbook.createSheet("泄露点位汇总");
|
|
|
- int[] widths = {14, 34, 12, 22, 22};
|
|
|
+ int[] widths = {16, 38, 14, 36, 4, 22, 22};
|
|
|
for (int i = 0; i < widths.length; i++) sheet.setColumnWidth(i, widths[i] * 256);
|
|
|
|
|
|
CellStyle titleStyle = workbook.createCellStyle();
|
|
|
@@ -308,11 +310,11 @@ public class MesProductLeakagePointStatController extends BaseController {
|
|
|
Row titleRow = sheet.createRow(0);
|
|
|
titleRow.setHeightInPoints(24);
|
|
|
Cell titleCell = titleRow.createCell(0);
|
|
|
- titleCell.setCellValue("气密泄露点位汇总(统计范围:" + start + " 至 " + end + ")");
|
|
|
+ titleCell.setCellValue("气密泄露点位汇总(工位结果:" + stationResult + ";统计范围:" + timeRange + ")");
|
|
|
titleCell.setCellStyle(titleStyle);
|
|
|
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, widths.length - 1));
|
|
|
|
|
|
- String[] headers = {"泄露点位", "工件号", "出现次数", "首次上报时间", "最近上报时间"};
|
|
|
+ String[] headers = {"工位结果", "统计时间段", "泄露点位", "工件号", "出现次数", "首次上报时间", "最近上报时间"};
|
|
|
Row headerRow = sheet.createRow(2);
|
|
|
headerRow.setHeightInPoints(21);
|
|
|
for (int i = 0; i < headers.length; i++) {
|
|
|
@@ -324,7 +326,7 @@ public class MesProductLeakagePointStatController extends BaseController {
|
|
|
int rowIndex = 3;
|
|
|
for (MesProductLeakagePointStat stat : rows) {
|
|
|
Row row = sheet.createRow(rowIndex++);
|
|
|
- String[] values = {stat.getLeakagePoint(), stat.getSn(), String.valueOf(stat.getOccurrenceCount()),
|
|
|
+ String[] values = {stationResult, timeRange, stat.getLeakagePoint(), stat.getSn(), String.valueOf(stat.getOccurrenceCount()),
|
|
|
formatDateTime(stat.getFirstOccurrenceTime(), dateTimeFormat), formatDateTime(stat.getLastOccurrenceTime(), dateTimeFormat)};
|
|
|
for (int i = 0; i < values.length; i++) {
|
|
|
Cell cell = row.createCell(i);
|
|
|
@@ -343,9 +345,45 @@ public class MesProductLeakagePointStatController extends BaseController {
|
|
|
return date == null ? "" : format.format(date);
|
|
|
}
|
|
|
|
|
|
- private List<MesProductLeakagePointStat> buildStatistics(String leakagePoint, String sn, Date startDate, Date endDate) {
|
|
|
+ /** Uses the same NG leakage-point events as the chart and its workpiece details. */
|
|
|
+ @SuppressWarnings("unchecked")
|
|
|
+ private List<MesProductLeakagePointStat> buildChartStatistics(String sn, Date startDate, Date endDate, String dataType) {
|
|
|
+ List<MesProductHf> hfRecords = findRecords(sn, startDate, endDate, dataType);
|
|
|
+ Map<String, Object> qualityData = buildQualityData(hfRecords, startDate, endDate, dataType);
|
|
|
+ List<Map<String, Object>> occurrences = (List<Map<String, Object>>) qualityData.get("defectOccurrences");
|
|
|
Map<String, MesProductLeakagePointStat> statistics = new LinkedHashMap<>();
|
|
|
- for (MesProductHf record : findRecords(sn, startDate, endDate, "all")) {
|
|
|
+ for (Map<String, Object> occurrence : occurrences) {
|
|
|
+ String point = (String) occurrence.get("point");
|
|
|
+ String occurrenceSn = (String) occurrence.get("sn");
|
|
|
+ if (StringUtils.isBlank(point) || StringUtils.isBlank(occurrenceSn)) continue;
|
|
|
+ Date occurrenceTime = (Date) occurrence.get("time");
|
|
|
+ String key = point + "\u0000" + occurrenceSn;
|
|
|
+ MesProductLeakagePointStat stat = statistics.get(key);
|
|
|
+ if (stat == null) {
|
|
|
+ stat = new MesProductLeakagePointStat();
|
|
|
+ stat.setLeakagePoint(point);
|
|
|
+ stat.setSn(occurrenceSn);
|
|
|
+ stat.setFirstOccurrenceTime(occurrenceTime);
|
|
|
+ statistics.put(key, stat);
|
|
|
+ }
|
|
|
+ stat.setOccurrenceCount(stat.getOccurrenceCount() + 1);
|
|
|
+ if (occurrenceTime != null && (stat.getFirstOccurrenceTime() == null || occurrenceTime.before(stat.getFirstOccurrenceTime()))) {
|
|
|
+ stat.setFirstOccurrenceTime(occurrenceTime);
|
|
|
+ }
|
|
|
+ if (occurrenceTime != null && (stat.getLastOccurrenceTime() == null || occurrenceTime.after(stat.getLastOccurrenceTime()))) {
|
|
|
+ stat.setLastOccurrenceTime(occurrenceTime);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ List<MesProductLeakagePointStat> rows = new ArrayList<>(statistics.values());
|
|
|
+ rows.sort(Comparator.comparing(MesProductLeakagePointStat::getLeakagePoint)
|
|
|
+ .thenComparing(MesProductLeakagePointStat::getOccurrenceCount, Comparator.reverseOrder())
|
|
|
+ .thenComparing(MesProductLeakagePointStat::getSn));
|
|
|
+ return rows;
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<MesProductLeakagePointStat> buildStatistics(String leakagePoint, String sn, Date startDate, Date endDate, String dataType) {
|
|
|
+ Map<String, MesProductLeakagePointStat> statistics = new LinkedHashMap<>();
|
|
|
+ for (MesProductHf record : findRecords(sn, startDate, endDate, dataType)) {
|
|
|
if (StringUtils.isBlank(record.getSn()) || StringUtils.isBlank(record.getHfFlag())) continue;
|
|
|
for (String item : record.getHfFlag().split(",")) {
|
|
|
String point = normalizeLeakPoint(item);
|
|
|
@@ -403,6 +441,13 @@ public class MesProductLeakagePointStatController extends BaseController {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+ private String dataTypeLabel(String dataType) {
|
|
|
+ if ("framework".equals(dataType)) return "框架气密";
|
|
|
+ if ("semiFinished".equals(dataType)) return "半成品气密";
|
|
|
+ if ("finishedPackage".equals(dataType)) return "整包气密";
|
|
|
+ return "全部";
|
|
|
+ }
|
|
|
+
|
|
|
private String normalizeLeakPoint(String value) {
|
|
|
String point = value == null ? "" : value.trim();
|
|
|
if (!point.matches("\\d+")) return point;
|