qms报表管理

This commit is contained in:
yf001217 2026-06-08 16:29:36 +08:00
parent 1f6b89590f
commit 4c111ddd60
4 changed files with 635 additions and 0 deletions

View File

@ -0,0 +1,77 @@
package com.nflg.qms.admin.controller;
import com.nflg.qms.admin.service.QmdReportManagementControllerService;
import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.qo.QmdReportManagementQO;
import com.nflg.wms.common.pojo.vo.QmdReportManagementVO;
import com.nflg.wms.starter.BaseController;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* QMD报表管理
*/
@RestController
@RequestMapping("/qmd/report-management")
public class QmdReportManagementController extends BaseController {
@Resource
private QmdReportManagementControllerService reportManagementControllerService;
/**
* IQC报表查询
*/
@PostMapping("/iqc")
public ApiResult<List<QmdReportManagementVO.IqcReportItemVO>> searchIqc(
@Valid @RequestBody QmdReportManagementQO.IqcReportQO request) {
return ApiResult.success(reportManagementControllerService.searchIqc(request));
}
/**
* IQC版本号查询
*/
@PostMapping("/iqc/versions")
public ApiResult<List<String>> searchIqcVersions(
@Valid @RequestBody QmdReportManagementQO.IqcVersionQO request) {
return ApiResult.success(reportManagementControllerService.searchIqcVersions(request));
}
/**
* PDI报表查询
*/
@PostMapping("/pdi")
public ApiResult<List<QmdReportManagementVO.PdiReportItemVO>> searchPdi(
@Valid @RequestBody QmdReportManagementQO.PdiReportQO request) {
return ApiResult.success(reportManagementControllerService.searchPdi(request));
}
/**
* PDI版本号查询
*/
@PostMapping("/pdi/versions")
public ApiResult<List<String>> searchPdiVersions(
@Valid @RequestBody QmdReportManagementQO.PdiVersionQO request) {
return ApiResult.success(reportManagementControllerService.searchPdiVersions(request));
}
/**
* PQC报表查询
*/
@PostMapping("/pqc")
public ApiResult<List<QmdReportManagementVO.PqcReportItemVO>> searchPqc(
@Valid @RequestBody QmdReportManagementQO.PqcReportQO request) {
return ApiResult.success(reportManagementControllerService.searchPqc(request));
}
/**
* PQC版本号查询
*/
@PostMapping("/pqc/versions")
public ApiResult<List<String>> searchPqcVersions(
@Valid @RequestBody QmdReportManagementQO.PqcVersionQO request) {
return ApiResult.success(reportManagementControllerService.searchPqcVersions(request));
}
}

View File

@ -0,0 +1,349 @@
package com.nflg.qms.admin.service;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.nflg.wms.common.pojo.qo.QmdReportManagementQO;
import com.nflg.wms.common.pojo.vo.QmdReportManagementVO;
import com.nflg.wms.repository.entity.*;
import com.nflg.wms.repository.service.*;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* QMD报表管理 ControllerService
*/
@Service
@RequiredArgsConstructor
public class QmdReportManagementControllerService {
private final IQmsInspectionStandardService inspectionStandardService;
private final IQmsInspectionStandardItemService inspectionStandardItemService;
private final IQmsPdiDetectionRulesService pdiDetectionRulesService;
private final IQmsPdiDetectionRulesStatusItemService pdiStatusItemService;
private final IQmsPdiComponentAnagementService pdiComponentService;
private final IQmsPqcInspectionRuleService pqcInspectionRuleService;
private final IQmsPqcInspectionPointService pqcInspectionPointService;
private final IQmsPqcInspectionPointItemsService pqcInspectionPointItemsService;
/**
* IQC报表查询
*/
public List<QmdReportManagementVO.IqcReportItemVO> searchIqc(QmdReportManagementQO.IqcReportQO request) {
QmsInspectionStandard currentStandard = inspectionStandardService.lambdaQuery()
.eq(QmsInspectionStandard::getMaterialId, request.getMaterialId())
.eq(QmsInspectionStandard::getVersion, request.getVersion())
.last("LIMIT 1")
.one();
if (currentStandard == null) {
return Collections.emptyList();
}
List<QmsInspectionStandardItem> currentItems = inspectionStandardItemService.lambdaQuery()
.eq(QmsInspectionStandardItem::getInspectionStandardId, currentStandard.getId())
.orderByAsc(QmsInspectionStandardItem::getId)
.list();
if (CollectionUtil.isEmpty(currentItems)) {
return Collections.emptyList();
}
List<QmsInspectionStandard> allStandards = inspectionStandardService.lambdaQuery()
.eq(QmsInspectionStandard::getMaterialId, request.getMaterialId())
.list();
Map<Long, String> versionMap = allStandards.stream()
.collect(Collectors.toMap(QmsInspectionStandard::getId, QmsInspectionStandard::getVersion, (a, b) -> a));
Set<Long> standardIds = versionMap.keySet();
Map<String, Set<String>> itemVersionsMap = CollectionUtil.isEmpty(standardIds)
? Collections.emptyMap()
: inspectionStandardItemService.lambdaQuery()
.in(QmsInspectionStandardItem::getInspectionStandardId, standardIds)
.list()
.stream()
.collect(Collectors.groupingBy(
this::iqcItemKey,
Collectors.mapping(item -> versionMap.get(item.getInspectionStandardId()), Collectors.toCollection(LinkedHashSet::new))
));
return currentItems.stream()
.sorted(Comparator.comparing(QmsInspectionStandardItem::getId, Comparator.nullsLast(Long::compareTo)))
.map(item -> {
QmdReportManagementVO.IqcReportItemVO vo = new QmdReportManagementVO.IqcReportItemVO();
vo.setInspectionItemId(item.getId());
vo.setInspectionItemName(item.getName());
vo.setVersions(joinVersions(itemVersionsMap.get(iqcItemKey(item))));
return vo;
})
.toList();
}
/**
* IQC版本号查询
*/
public List<String> searchIqcVersions(QmdReportManagementQO.IqcVersionQO request) {
return inspectionStandardService.lambdaQuery()
.select(QmsInspectionStandard::getVersion)
.eq(QmsInspectionStandard::getMaterialId, request.getMaterialId())
.list()
.stream()
.map(QmsInspectionStandard::getVersion)
.filter(StrUtil::isNotBlank)
.distinct()
.sorted(this::compareVersion)
.toList();
}
/**
* PDI报表查询
*/
public List<QmdReportManagementVO.PdiReportItemVO> searchPdi(QmdReportManagementQO.PdiReportQO request) {
List<QmsPdiDetectionRules> currentRules = pdiDetectionRulesService.lambdaQuery()
.eq(QmsPdiDetectionRules::getModelNo, request.getModelNo())
.eq(QmsPdiDetectionRules::getInspectionVersion, request.getInspectionVersion())
.list();
if (CollectionUtil.isEmpty(currentRules)) {
return Collections.emptyList();
}
List<QmsPdiDetectionRules> allRules = pdiDetectionRulesService.lambdaQuery()
.eq(QmsPdiDetectionRules::getModelNo, request.getModelNo())
.list();
Map<Long, String> ruleVersionMap = allRules.stream()
.collect(Collectors.toMap(QmsPdiDetectionRules::getId, QmsPdiDetectionRules::getInspectionVersion, (a, b) -> a));
Set<Long> allRuleIds = ruleVersionMap.keySet();
List<QmsPdiDetectionRulesStatusItem> allItems = CollectionUtil.isEmpty(allRuleIds)
? Collections.emptyList()
: pdiStatusItemService.lambdaQuery()
.in(QmsPdiDetectionRulesStatusItem::getDetectionRulesId, allRuleIds)
.list();
Map<Long, QmsPdiComponentAnagement> componentMap = getPdiComponentMap(allItems);
Map<String, Set<String>> itemVersionsMap = allItems.stream()
.collect(Collectors.groupingBy(
item -> pdiItemKey(item, componentMap.get(item.getComponentsId())),
Collectors.mapping(item -> ruleVersionMap.get(item.getDetectionRulesId()), Collectors.toCollection(LinkedHashSet::new))
));
Set<Long> currentRuleIds = currentRules.stream().map(QmsPdiDetectionRules::getId).collect(Collectors.toSet());
return allItems.stream()
.filter(item -> currentRuleIds.contains(item.getDetectionRulesId()))
.sorted(Comparator
.comparingInt((QmsPdiDetectionRulesStatusItem item) -> pdiStatusSort(item.getStatus()))
.thenComparing(QmsPdiDetectionRulesStatusItem::getComponentsId, Comparator.nullsLast(Long::compareTo))
.thenComparing(QmsPdiDetectionRulesStatusItem::getId, Comparator.nullsLast(Long::compareTo)))
.map(item -> {
QmsPdiComponentAnagement component = componentMap.get(item.getComponentsId());
QmdReportManagementVO.PdiReportItemVO vo = new QmdReportManagementVO.PdiReportItemVO();
vo.setStatus(item.getStatus());
vo.setStatusName(pdiStatusName(item.getStatus()));
vo.setPdiComponentId(item.getComponentsId());
vo.setPdiComponentName(component == null ? null : component.getComponentName());
vo.setInspectionItemId(item.getId());
vo.setInspectionItemName(item.getInspectionContent());
vo.setVersions(joinVersions(itemVersionsMap.get(pdiItemKey(item, component))));
return vo;
})
.toList();
}
/**
* PDI版本号查询
*/
public List<String> searchPdiVersions(QmdReportManagementQO.PdiVersionQO request) {
return pdiDetectionRulesService.lambdaQuery()
.select(QmsPdiDetectionRules::getInspectionVersion)
.eq(QmsPdiDetectionRules::getModelNo, request.getModelNo())
.list()
.stream()
.map(QmsPdiDetectionRules::getInspectionVersion)
.filter(StrUtil::isNotBlank)
.distinct()
.sorted(this::compareVersion)
.toList();
}
/**
* PQC报表查询
*/
public List<QmdReportManagementVO.PqcReportItemVO> searchPqc(QmdReportManagementQO.PqcReportQO request) {
List<QmsPqcInspectionRule> currentRules = pqcInspectionRuleService.lambdaQuery()
.eq(QmsPqcInspectionRule::getModelNo, request.getModelNo())
.eq(QmsPqcInspectionRule::getRuleVersion, request.getRuleVersion())
.list();
if (CollectionUtil.isEmpty(currentRules)) {
return Collections.emptyList();
}
List<QmsPqcInspectionRule> allRules = pqcInspectionRuleService.lambdaQuery()
.eq(QmsPqcInspectionRule::getModelNo, request.getModelNo())
.list();
Map<Long, Integer> ruleVersionMap = allRules.stream()
.collect(Collectors.toMap(QmsPqcInspectionRule::getId, QmsPqcInspectionRule::getRuleVersion, (a, b) -> a));
Set<Long> allRuleIds = ruleVersionMap.keySet();
List<QmsPqcInspectionPoint> allPoints = CollectionUtil.isEmpty(allRuleIds)
? Collections.emptyList()
: pqcInspectionPointService.lambdaQuery()
.in(QmsPqcInspectionPoint::getPqcRuleId, allRuleIds)
.list();
if (CollectionUtil.isEmpty(allPoints)) {
return Collections.emptyList();
}
Map<Long, QmsPqcInspectionPoint> pointMap = allPoints.stream()
.collect(Collectors.toMap(QmsPqcInspectionPoint::getId, Function.identity(), (a, b) -> a));
List<QmsPqcInspectionPointItems> allItems = pqcInspectionPointItemsService.lambdaQuery()
.in(QmsPqcInspectionPointItems::getInspectionCodeId, pointMap.keySet())
.list();
Map<String, Set<String>> itemVersionsMap = allItems.stream()
.collect(Collectors.groupingBy(
item -> pqcItemKey(pointMap.get(item.getInspectionCodeId()), item),
Collectors.mapping(item -> formatPqcVersion(ruleVersionMap.get(pointMap.get(item.getInspectionCodeId()).getPqcRuleId())),
Collectors.toCollection(LinkedHashSet::new))
));
Set<Long> currentRuleIds = currentRules.stream().map(QmsPqcInspectionRule::getId).collect(Collectors.toSet());
Set<Long> currentPointIds = allPoints.stream()
.filter(point -> currentRuleIds.contains(point.getPqcRuleId()))
.map(QmsPqcInspectionPoint::getId)
.collect(Collectors.toSet());
return allItems.stream()
.filter(item -> currentPointIds.contains(item.getInspectionCodeId()))
.sorted(Comparator
.comparing((QmsPqcInspectionPointItems item) -> pointMap.get(item.getInspectionCodeId()).getStepDicItemId(),
Comparator.nullsLast(Long::compareTo))
.thenComparing(item -> pointMap.get(item.getInspectionCodeId()).getId(), Comparator.nullsLast(Long::compareTo))
.thenComparing(QmsPqcInspectionPointItems::getId, Comparator.nullsLast(Long::compareTo)))
.map(item -> {
QmsPqcInspectionPoint point = pointMap.get(item.getInspectionCodeId());
QmdReportManagementVO.PqcReportItemVO vo = new QmdReportManagementVO.PqcReportItemVO();
vo.setModelNo(request.getModelNo());
vo.setStepDicItemId(point.getStepDicItemId());
vo.setStepName(point.getStepName());
vo.setInspectionPointId(point.getId());
vo.setInspectionPointName(point.getInspectionPointName());
vo.setInspectionItemId(item.getId());
vo.setInspectionItemName(item.getInspectionContent());
vo.setVersions(joinVersions(itemVersionsMap.get(pqcItemKey(point, item))));
return vo;
})
.toList();
}
/**
* PQC版本号查询
*/
public List<String> searchPqcVersions(QmdReportManagementQO.PqcVersionQO request) {
return pqcInspectionRuleService.lambdaQuery()
.select(QmsPqcInspectionRule::getRuleVersion)
.eq(QmsPqcInspectionRule::getModelNo, request.getModelNo())
.list()
.stream()
.map(QmsPqcInspectionRule::getRuleVersion)
.filter(Objects::nonNull)
.distinct()
.sorted()
.map(this::formatPqcVersion)
.toList();
}
private Map<Long, QmsPdiComponentAnagement> getPdiComponentMap(List<QmsPdiDetectionRulesStatusItem> items) {
Set<Long> componentIds = items.stream()
.map(QmsPdiDetectionRulesStatusItem::getComponentsId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
if (CollectionUtil.isEmpty(componentIds)) {
return Collections.emptyMap();
}
return pdiComponentService.listByIds(componentIds).stream()
.collect(Collectors.toMap(QmsPdiComponentAnagement::getId, Function.identity(), (a, b) -> a));
}
private String iqcItemKey(QmsInspectionStandardItem item) {
return normalize(item.getName()) + "|" + item.getItemType() + "|" + item.getDetectionTypeDictItemId();
}
private String pdiItemKey(QmsPdiDetectionRulesStatusItem item, QmsPdiComponentAnagement component) {
String componentName = component == null ? "" : component.getComponentName();
return item.getStatus() + "|" + normalize(componentName) + "|" + normalize(item.getInspectionContent());
}
private String pqcItemKey(QmsPqcInspectionPoint point, QmsPqcInspectionPointItems item) {
String pointKey = StrUtil.isNotBlank(point.getInspectionPointCode())
? point.getInspectionPointCode()
: point.getInspectionPointName();
return point.getStepDicItemId() + "|" + normalize(pointKey) + "|" + normalize(item.getInspectionContent());
}
private String joinVersions(Collection<String> versions) {
if (CollectionUtil.isEmpty(versions)) {
return "";
}
return versions.stream()
.filter(StrUtil::isNotBlank)
.sorted(this::compareVersion)
.collect(Collectors.joining(","));
}
private String formatPqcVersion(Integer version) {
return version == null ? "" : "v" + version;
}
private int compareVersion(String a, String b) {
Integer aNum = parseVersionNumber(a);
Integer bNum = parseVersionNumber(b);
if (aNum != null && bNum != null) {
return aNum.compareTo(bNum);
}
return a.compareTo(b);
}
private Integer parseVersionNumber(String version) {
if (StrUtil.isBlank(version)) {
return null;
}
String text = version.trim();
if (text.startsWith("v") || text.startsWith("V")) {
text = text.substring(1);
}
try {
return Integer.parseInt(text);
} catch (NumberFormatException e) {
return null;
}
}
private int pdiStatusSort(Integer status) {
if (Objects.equals(status, 0)) {
return 0;
}
if (Objects.equals(status, 1)) {
return 1;
}
if (Objects.equals(status, 2)) {
return 2;
}
return 3;
}
private String pdiStatusName(Integer status) {
if (Objects.equals(status, 0)) {
return "静态";
}
if (Objects.equals(status, 1)) {
return "动态";
}
if (Objects.equals(status, 2)) {
return "特殊";
}
return "";
}
private String normalize(String value) {
return StrUtil.blankToDefault(value, "").trim();
}
}

View File

@ -0,0 +1,98 @@
package com.nflg.wms.common.pojo.qo;
import com.fasterxml.jackson.annotation.JsonAlias;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
* QMD报表管理查询参数
*/
public class QmdReportManagementQO {
@Data
public static class IqcReportQO {
/**
* 物料ID
*/
@JsonAlias("material_id")
@NotNull(message = "物料ID不能为空")
private Long materialId;
/**
* 版本号
*/
@NotBlank(message = "版本号不能为空")
private String version;
}
@Data
public static class IqcVersionQO {
/**
* 物料ID
*/
@JsonAlias("material_id")
@NotNull(message = "物料ID不能为空")
private Long materialId;
}
@Data
public static class PdiReportQO {
/**
* 机型编号
*/
@JsonAlias("model_no")
@NotBlank(message = "机型编号不能为空")
private String modelNo;
/**
* 检测版本
*/
@JsonAlias("inspection_version")
@NotBlank(message = "检测版本不能为空")
private String inspectionVersion;
}
@Data
public static class PdiVersionQO {
/**
* 机型编号
*/
@JsonAlias("model_no")
@NotBlank(message = "机型编号不能为空")
private String modelNo;
}
@Data
public static class PqcReportQO {
/**
* 机型编号
*/
@JsonAlias("model_no")
@NotBlank(message = "机型编号不能为空")
private String modelNo;
/**
* 规则版本
*/
@JsonAlias("rule_version")
@NotNull(message = "规则版本不能为空")
private Integer ruleVersion;
}
@Data
public static class PqcVersionQO {
/**
* 机型编号
*/
@JsonAlias("model_no")
@NotBlank(message = "机型编号不能为空")
private String modelNo;
}
}

View File

@ -0,0 +1,111 @@
package com.nflg.wms.common.pojo.vo;
import lombok.Data;
/**
* QMD报表管理返回值
*/
public class QmdReportManagementVO {
@Data
public static class IqcReportItemVO {
/**
* 检测项ID
*/
private Long inspectionItemId;
/**
* 检测项名称
*/
private String inspectionItemName;
/**
* 有该检测项的版本号
*/
private String versions;
}
@Data
public static class PdiReportItemVO {
/**
* 状态0为静态1为动态2为特殊
*/
private Integer status;
/**
* 状态名称
*/
private String statusName;
/**
* 部件ID
*/
private Long pdiComponentId;
/**
* 部件名称
*/
private String pdiComponentName;
/**
* 检测项ID
*/
private Long inspectionItemId;
/**
* 检测项名称
*/
private String inspectionItemName;
/**
* 有该检测项的版本号
*/
private String versions;
}
@Data
public static class PqcReportItemVO {
/**
* 机型编号
*/
private String modelNo;
/**
* 步装字典ID
*/
private Long stepDicItemId;
/**
* 步装名称
*/
private String stepName;
/**
* 检查点ID
*/
private Long inspectionPointId;
/**
* 检查点名称
*/
private String inspectionPointName;
/**
* 检测项ID
*/
private Long inspectionItemId;
/**
* 检测项名称
*/
private String inspectionItemName;
/**
* 有该检测项的版本号
*/
private String versions;
}
}