From 7a1a3e2549435c3defb4eeea17a498eabd9a3f8b Mon Sep 17 00:00:00 2001 From: "ys.git" <18439391935@163.com> Date: Mon, 22 Dec 2025 11:04:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=AF=B9=E6=AF=94=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=EF=BC=9B=E8=A7=92=E8=89=B2=E6=9D=83=E9=99=90=E4=B8=BA?= =?UTF-8?q?=E7=A9=BA=E8=BF=94=E5=9B=9E=E7=A9=BA=E6=95=B0=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/PermissionController.java | 6 +- .../controller/TcDataQueryController.java | 7 + .../controller/request/AnalysisRequest.java | 2 +- .../request/ModelComparisonExportRequest.java | 12 ++ .../service/TcDataQueryService.java | 3 + .../service/impl/ModelRoleServiceImpl.java | 12 +- .../service/impl/TcDataQueryServiceImpl.java | 164 +++++++++++++++++- 7 files changed, 198 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/xdap/self_development/controller/request/ModelComparisonExportRequest.java diff --git a/src/main/java/com/xdap/self_development/controller/PermissionController.java b/src/main/java/com/xdap/self_development/controller/PermissionController.java index e6b8794..aa054b4 100644 --- a/src/main/java/com/xdap/self_development/controller/PermissionController.java +++ b/src/main/java/com/xdap/self_development/controller/PermissionController.java @@ -140,12 +140,16 @@ public class PermissionController { List list = parameterService.getAllParameters(subsystem); return Response.ok().data(list); } + // 查看角色绑定的人员或部门列表 @GetMapping("/selectUserOrDeptByRole") public Response selectUserOrDeptByRole( @NotBlank String roleID ) { - HashMap> map = modelRoleService.selectUserOrDeptByRole(roleID); + HashMap> map = modelRoleService.selectUserOrDeptByRole(roleID); + if (ObjectUtils.isEmpty(map)) { + return Response.ok().data(new HashMap<>()); + } return Response.ok().data(map); } diff --git a/src/main/java/com/xdap/self_development/controller/TcDataQueryController.java b/src/main/java/com/xdap/self_development/controller/TcDataQueryController.java index 48ae7d9..81256f7 100644 --- a/src/main/java/com/xdap/self_development/controller/TcDataQueryController.java +++ b/src/main/java/com/xdap/self_development/controller/TcDataQueryController.java @@ -3,6 +3,7 @@ package com.xdap.self_development.controller; import com.definesys.mpaas.common.http.Response; import com.xdap.self_development.controller.request.AnalysisRequest; +import com.xdap.self_development.controller.request.ModelComparisonExportRequest; import com.xdap.self_development.pojo.ClassificationAttribute; import com.xdap.self_development.pojo.EngineParamDetailPojo; import com.xdap.self_development.service.TcDataQueryService; @@ -34,6 +35,12 @@ public class TcDataQueryController { Map> stringListHashMap = tcDataQueryService.tcDataSelectAllByPartsNameBack(analysisRequest); return Response.ok().data(stringListHashMap); } + //根据机型ID和子系统-零部件+userID下载为excel + @PostMapping("/modelComparisonExport") + public Response modelComparisonExport(@RequestBody ModelComparisonExportRequest request,HttpServletResponse response) { + tcDataQueryService.modelComparisonExport(request,response); + return Response.ok().data("导出成功"); + } //下载TC数据ads_prd_f_yfsjglpt_fdjlbjcjb @PostMapping("/syncA") public Response excelExportA(HttpServletResponse response) { diff --git a/src/main/java/com/xdap/self_development/controller/request/AnalysisRequest.java b/src/main/java/com/xdap/self_development/controller/request/AnalysisRequest.java index 6f664a3..b5789ce 100644 --- a/src/main/java/com/xdap/self_development/controller/request/AnalysisRequest.java +++ b/src/main/java/com/xdap/self_development/controller/request/AnalysisRequest.java @@ -18,7 +18,7 @@ import java.util.List; */ @Data public class AnalysisRequest{ - + private String userID; private String engineModelID; /** * 子系统+零部件名称路径 diff --git a/src/main/java/com/xdap/self_development/controller/request/ModelComparisonExportRequest.java b/src/main/java/com/xdap/self_development/controller/request/ModelComparisonExportRequest.java new file mode 100644 index 0000000..18ffa8e --- /dev/null +++ b/src/main/java/com/xdap/self_development/controller/request/ModelComparisonExportRequest.java @@ -0,0 +1,12 @@ +package com.xdap.self_development.controller.request; + +import lombok.Data; + +import java.util.List; + +@Data +public class ModelComparisonExportRequest { + String userID; + List modelIds; + List subsystemParts; +} diff --git a/src/main/java/com/xdap/self_development/service/TcDataQueryService.java b/src/main/java/com/xdap/self_development/service/TcDataQueryService.java index a80c729..460f4e4 100644 --- a/src/main/java/com/xdap/self_development/service/TcDataQueryService.java +++ b/src/main/java/com/xdap/self_development/service/TcDataQueryService.java @@ -1,6 +1,7 @@ package com.xdap.self_development.service; import com.xdap.self_development.controller.request.AnalysisRequest; +import com.xdap.self_development.controller.request.ModelComparisonExportRequest; import com.xdap.self_development.pojo.ClassificationAttribute; import com.xdap.self_development.pojo.DataEntryEngineModelPojo; import com.xdap.self_development.pojo.EngineParamDetailPojo; @@ -25,4 +26,6 @@ public interface TcDataQueryService { void excelExportA(HttpServletResponse response); void excelExportB(HttpServletResponse response); + + void modelComparisonExport(ModelComparisonExportRequest request, HttpServletResponse response); } diff --git a/src/main/java/com/xdap/self_development/service/impl/ModelRoleServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/ModelRoleServiceImpl.java index 91e61d1..93d08c7 100644 --- a/src/main/java/com/xdap/self_development/service/impl/ModelRoleServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/ModelRoleServiceImpl.java @@ -276,13 +276,21 @@ public class ModelRoleServiceImpl implements ModelRoleService { for (ModelDepUserRolePojo userRolePojo : deptList) { String depId = userRolePojo.getUserOrDep(); XdapDepartments xdapDepartments = xdapDeptUsersService.selectDeptByID(depId); - stringsDept.add(xdapDepartments.getName()); + if (ObjectUtils.isEmpty(xdapDepartments)) { + stringsDept.add("未知部门:" + depId); + } else { + stringsDept.add(xdapDepartments.getName()); + } } map.put("部门", stringsDept); for (ModelDepUserRolePojo userRolePojo : userList) { String userId = userRolePojo.getUserOrDep(); XdapUsers xdapUsers = xdapDeptUsersService.selectUserByID(userId); - stringsUser.add(xdapUsers.getUsername() + "-" + xdapUsers.getAccount()); + if (ObjectUtils.isEmpty(xdapUsers)) { + stringsUser.add("未知人员:" + userId); + } else { + stringsUser.add(xdapUsers.getUsername() + "-" + xdapUsers.getAccount()); + } } map.put("人员", stringsUser); return map; diff --git a/src/main/java/com/xdap/self_development/service/impl/TcDataQueryServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/TcDataQueryServiceImpl.java index ca3810c..713ac3b 100644 --- a/src/main/java/com/xdap/self_development/service/impl/TcDataQueryServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/TcDataQueryServiceImpl.java @@ -6,10 +6,13 @@ import com.alibaba.excel.write.metadata.WriteSheet; import com.definesys.mpaas.query.MpaasQueryFactory; import com.xdap.self_development.config.BusinessDatabase; import com.xdap.self_development.controller.request.AnalysisRequest; +import com.xdap.self_development.controller.request.ModelComparisonExportRequest; import com.xdap.self_development.pojo.*; import com.xdap.self_development.service.DataEntryEngineModelService; import com.xdap.self_development.service.EngineParamDetailService; import com.xdap.self_development.service.TcDataQueryService; +import org.springframework.data.redis.core.StringRedisTemplate; +import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -19,6 +22,8 @@ import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URLEncoder; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; @@ -34,6 +39,13 @@ public class TcDataQueryServiceImpl implements TcDataQueryService { private DataEntryEngineModelService engineModelService; @Autowired private MpaasQueryFactory sw; + @Autowired + private StringRedisTemplate redisTemplate; + + private ObjectMapper objectMapper = new ObjectMapper(); + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + //产品编号(状态代号) = 状态机 @Override @@ -77,7 +89,7 @@ public class TcDataQueryServiceImpl implements TcDataQueryService { Set partsNames = stringListMap.keySet(); for (String partsName : partsNames) { //获取系统内零部件下的参数 - List parametersOnPartsName = stringListMap.get(partsName).stream().map(x->x.getParameterName()).collect(Collectors.toList()); + List parametersOnPartsName = stringListMap.get(partsName).stream().map(x -> x.getParameterName()).collect(Collectors.toList()); List partsCollections = bd.getTCDatabase() .eq("ztj", productNumber) @@ -215,17 +227,18 @@ public class TcDataQueryServiceImpl implements TcDataQueryService { public Map> tcDataSelectAllByPartsNameFunctionOptimized(AnalysisRequest analysisRequest) { String engineModelID = analysisRequest.getEngineModelID(); List subsystemTypes = analysisRequest.getSubsystemParts(); + String userID = analysisRequest.getUserID(); - if (ObjectUtils.isEmpty(engineModelID) || ObjectUtils.isEmpty(subsystemTypes)) { - throw new RuntimeException("传入参数为空,请检查"); + if (ObjectUtils.isEmpty(engineModelID) || ObjectUtils.isEmpty(subsystemTypes) || ObjectUtils.isEmpty(userID)) { + throw new RuntimeException("传入参数部分为空,请检查"); } + List allPojos = new ArrayList<>(); List parameters = engineParamDetailService.selectAllAndTcByNewVersion(); DataEntryEngineModelPojo dataEntryEngineModelPojo = engineModelService.selectBymodelId(engineModelID); // 预加载所有参数信息 - Map> parameterMap = parameters.stream() .collect(Collectors.groupingBy(p -> p.getPartsName() + "&&" + p.getParameterName())); @@ -328,9 +341,20 @@ public class TcDataQueryServiceImpl implements TcDataQueryService { allPojos.addAll(tcDataPojos); } + //将allPojos存到Redis,KEY为userID+engineModelID+预操作,过期时间24小时 + try { + String redisKey = userID + ":" + engineModelID + ":" + "ComparisonExport"; + String jsonValue = objectMapper.writeValueAsString(allPojos); + redisTemplate.opsForValue().set(redisKey, jsonValue, 24, java.util.concurrent.TimeUnit.HOURS); + log.info("成功将数据存储到Redis,KEY: {}", redisKey); + } catch (Exception e) { + log.error("存储数据到Redis失败: {}", e.getMessage()); + } Map> valueBySubSysName = allPojos.stream().collect(Collectors.groupingBy(EngineParamDetailPojo::getSubsystemName)); + + return valueBySubSysName; } @@ -384,6 +408,138 @@ public class TcDataQueryServiceImpl implements TcDataQueryService { } } + @Override + public void modelComparisonExport(ModelComparisonExportRequest request, HttpServletResponse response) { + List modelIds = request.getModelIds(); + String userID = request.getUserID(); + List subsystemParts = request.getSubsystemParts(); + + try { + // 设置响应头 + setupResponse(response, "机型参数对比表" + (formatter.format(LocalDateTime.now())) + ".xlsx"); + + // 获取机型名称映射 + Map modelNames = new HashMap<>(); + for (String modelId : modelIds) { + DataEntryEngineModelPojo model = engineModelService.selectBymodelId(modelId); + if (model != null) { + modelNames.put(modelId, model.getModelName()); + } + } + + // 存储所有参数信息,key为参数名,value为各机型的参数值 + Map> parameterValues = new HashMap<>(); + // 存储参数的子系统和零部件信息 + Map parameterSubsystemParts = new HashMap<>(); + + // 从Redis获取每个机型的数据 + for (String modelId : modelIds) { + try { + String redisKey = userID + ":" + modelId + ":" + "ComparisonExport"; + String cachedData = redisTemplate.opsForValue().get(redisKey); + + if (ObjectUtils.isNotEmpty(cachedData)) { + // 反序列化数据 + List allPojos = objectMapper.readValue(cachedData, + objectMapper.getTypeFactory().constructCollectionType(List.class, EngineParamDetailPojo.class)); + + // 根据子系统部件筛选数据 + List filteredPojos = allPojos.stream() + .filter(pojo -> subsystemParts.stream().anyMatch(part -> { + String[] parts = part.split("-"); + if (parts.length != 2) return false; + String subsystem = parts[0]; + String partsName = parts[1]; + + // 如果部件名为"/",表示只匹配子系统 + if ("/".equals(partsName)) { + return subsystem.equals(pojo.getSubsystemName()); + } else { + return subsystem.equals(pojo.getSubsystemName()) && partsName.equals(pojo.getPartsName()); + } + })) + .collect(Collectors.toList()); + + // 处理筛选后的数据,按参数名分组 + for (EngineParamDetailPojo pojo : filteredPojos) { + String paramName = pojo.getParameterName(); + String paramValue = pojo.getParameterValue(); + + // 如果参数名不存在,创建新条目 + if (!parameterValues.containsKey(paramName)) { + parameterValues.put(paramName, new HashMap<>()); + // 存储子系统和零部件信息 + parameterSubsystemParts.put(paramName, new String[]{pojo.getSubsystemName(), pojo.getPartsName()}); + } + + // 设置该机型的参数值 + parameterValues.get(paramName).put(modelId, paramValue); + } + } + } catch (Exception e) { + log.error("从Redis读取机型{}数据失败: {}", modelId, e.getMessage()); + } + } + + // 准备Excel数据 + List> excelData = new ArrayList<>(); + + // 表头行:子系统,零部件,参数名,机型1,机型2,机型3... + List header = new ArrayList<>(); + header.add("子系统"); + header.add("零部件"); + header.add("参数"); + for (String modelId : modelIds) { + header.add(modelNames.getOrDefault(modelId, "未知机型")); + } + excelData.add(header); + + // 数据行:每个参数一行 + for (Map.Entry> entry : parameterValues.entrySet()) { + List row = new ArrayList<>(); + String paramName = entry.getKey(); + + // 添加子系统和零部件信息 + String[] getSubsystemParts = parameterSubsystemParts.get(paramName); + if (getSubsystemParts != null) { + row.add(getSubsystemParts[0]); // 子系统 + row.add(getSubsystemParts[1]); // 零部件 + } else { + row.add(""); // 子系统 + row.add(""); // 零部件 + } + + row.add(paramName); // 参数名 + + // 每个机型的参数值 + Map values = entry.getValue(); + for (String modelId : modelIds) { + row.add(values.getOrDefault(modelId, "")); + } + + excelData.add(row); + } + + // 写入Excel + EasyExcel.write(response.getOutputStream()) + .sheet("机型参数对比") + .doWrite(excelData); + + log.info("机型参数对比表导出成功"); + + // 导出成功后删除Redis中的数据 +// for (String modelId : modelIds) { +// String redisKey = userID + ":" + modelId + ":" + "ComparisonExport"; +// redisTemplate.delete(redisKey); +// log.info("已删除Redis中的数据,KEY: {}", redisKey); +// } + + } catch (Exception e) { + log.error("导出机型参数对比表失败: {}", e.getMessage()); + throw new RuntimeException("导出失败: " + e.getMessage()); + } + } + private void setupResponse(HttpServletResponse response, String fileName) throws IOException { response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8");