| | |
| | | // Map<String, Object> result = new HashMap<>(); |
| | | Map<String, Object> result = new LinkedHashMap<>(); |
| | | result.put("layouts", layouts); |
| | | result.put("optimizeUse", glassOptimizeMapper.materialStoreOptimizeUse(processId)); |
| | | result.put("optimizeUse", glassOptimizeMapper.materialOptimizeUse(processId)); |
| | | return result; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | |
| | | public Map<String, Object> getReportDataSv(String processId) { |
| | | Map<String, Object> perimap = new HashMap<>(); |
| | | perimap.put("peridata", glassOptimizeMapper.getPeriMeterDataSv(processId)); |
| | | |
| | | Map<String, Object> map = new HashMap<>(); |
| | | Object layoutSetObj = glassOptimizeMapper.getReportDataProcessIdSv(processId); |
| | | map.put("reportData", layoutSetObj); |
| | | List<Map<String, Object>> peridata = (List<Map<String, Object>>) perimap.get("peridata"); |
| | | double totalPerimeter = 0.0; |
| | | if (peridata != null && !peridata.isEmpty()) { |
| | | for (Map<String, Object> perimeterData : peridata) { |
| | | if (perimeterData.containsKey("perimeter") && perimeterData.get("perimeter") != null) { |
| | | try { |
| | | Object perimeterObj = perimeterData.get("perimeter"); |
| | | if (perimeterObj instanceof Number) { |
| | | totalPerimeter += ((Number) perimeterObj).doubleValue(); |
| | | } else { |
| | | totalPerimeter += Double.parseDouble(perimeterObj.toString()); |
| | | } |
| | | } catch (NumberFormatException e) { |
| | | System.err.println("无法解析周长数据: " + perimeterData.get("perimeter")); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (layoutSetObj instanceof List) { |
| | | List<Map<String, Object>> layoutSet = (List<Map<String, Object>>) layoutSetObj; |
| | | if (!layoutSet.isEmpty()) { |
| | | layoutSet.get(0).put("rectanglePerimeter", totalPerimeter); |
| | | } |
| | | } |
| | | return map; |
| | | } |
| | | |
| | | public Map<String, Object> getMaterialInfoSv(String processId) { |
| | | Map<String, Object> map = new HashMap<>(); |
| | | map.put("materialList", glassOptimizeMapper.getMaterialInfoSv(processId)); |
| | | return map; |
| | | } |
| | | |
| | | public Map<String, Object> getProductListSv(String processId) { |
| | | Map<String, Object> productMap = new HashMap<>(); |
| | | List<Map<String, Object>> productInfo = glassOptimizeMapper.selectProjectList(processId); |
| | | productMap.put("productInfo", productInfo); |
| | | Map<String, Object> map = new HashMap<>(); |
| | | |
| | | if (productInfo != null && !productInfo.isEmpty()) { |
| | | // 按照 processCard 分组 |
| | | Map<String, List<Map<String, Object>>> groupedByProcessCard = new HashMap<>(); |
| | | for (Map<String, Object> item : productInfo) { |
| | | String processCard = (String) item.get("processCard"); |
| | | if (processCard != null) { |
| | | groupedByProcessCard.computeIfAbsent(processCard, k -> new ArrayList<>()).add(item); |
| | | } |
| | | } |
| | | |
| | | // 为每个 processCard 计算统计信息 |
| | | List<Map<String, Object>> result = new ArrayList<>(); |
| | | for (Map.Entry<String, List<Map<String, Object>>> entry : groupedByProcessCard.entrySet()) { |
| | | String processCard = entry.getKey(); |
| | | List<Map<String, Object>> items = entry.getValue(); |
| | | |
| | | // 计算统计信息 |
| | | double longestSide = 0; |
| | | double shortestSide = Double.MAX_VALUE; |
| | | int specQuantity = items.size(); |
| | | int totalQuantity = 0; |
| | | |
| | | // 使用 BigDecimal 精确计算面积 |
| | | BigDecimal totalArea = BigDecimal.ZERO; |
| | | |
| | | for (Map<String, Object> item : items) { |
| | | // 安全获取长和宽 |
| | | Number widthObj = (Number) item.get("width"); |
| | | Number heightObj = (Number) item.get("height"); |
| | | |
| | | if (widthObj == null || heightObj == null) { |
| | | continue; |
| | | } |
| | | |
| | | double width = widthObj.doubleValue(); |
| | | double height = heightObj.doubleValue(); |
| | | |
| | | // 更新最长边和最短边 |
| | | double maxSide = Math.max(width, height); |
| | | double minSide = Math.min(width, height); |
| | | |
| | | if (maxSide > longestSide) { |
| | | longestSide = maxSide; |
| | | } |
| | | if (minSide < shortestSide) { |
| | | shortestSide = minSide; |
| | | } |
| | | |
| | | // 安全获取数量 |
| | | Number quantityObj = (Number) item.get("quantity"); |
| | | if (quantityObj != null) { |
| | | totalQuantity += quantityObj.intValue(); |
| | | } |
| | | |
| | | // 安全获取面积 —— 使用 BigDecimal 精确累加 |
| | | Object areaObj = item.get("Area"); |
| | | if (areaObj != null) { |
| | | // 关键:通过 toString() 转为字符串再构造 BigDecimal,避免 double 精度损失 |
| | | BigDecimal area = new BigDecimal(areaObj.toString()); |
| | | totalArea = totalArea.add(area); |
| | | } |
| | | } |
| | | |
| | | // 处理 shortestSide 的边界情况 |
| | | if (shortestSide == Double.MAX_VALUE) { |
| | | shortestSide = 0; |
| | | } |
| | | |
| | | // 构造返回数据 |
| | | Map<String, Object> resultMap = new HashMap<>(); |
| | | resultMap.put("processCard", processCard); |
| | | resultMap.put("longestSide", longestSide); |
| | | resultMap.put("shortestSide", shortestSide); |
| | | resultMap.put("specQuantity", specQuantity); |
| | | resultMap.put("totalQuantity", totalQuantity); |
| | | resultMap.put("totalArea", totalArea); |
| | | |
| | | result.add(resultMap); |
| | | } |
| | | |
| | | map.put("productList", result); |
| | | } |
| | | return map; |
| | | } |
| | | |
| | | |
| | | } |