| | |
| | | } |
| | | glassOptimizeMapper.addOptimizeDetail(objectMap2,projectId); |
| | | } |
| | | glassOptimizeMapper.updateProjectOptimizeStateMp(projectId,1); |
| | | |
| | | glassOptimizeMapper.updateProjectOptimize(projectId, 1, optimalResults); |
| | | return true; |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | |
| | | List<Map<String, Object>> objectMapList = (List<Map<String, Object>>) object.get("layouts"); |
| | | |
| | | Map<String, Object> glassInfo = glassOptimizeMapper.getGlassInfo(processId); |
| | | glassOptimizeMapper.deleteOffcutDetails(processId); |
| | | |
| | | int stockId = 1; |
| | | for (Map<String, Object> objectMap : objectMapList) { |
| | | List<Map<String, Object>> objectMap2 = (List<Map<String, Object>>) objectMap.get("glassDetails"); |
| | | |
| | |
| | | } |
| | | } |
| | | } |
| | | // 处理 glassPoint 序列化 |
| | | if (detail.containsKey("glassPoint")) { |
| | | Object glassPointObj = detail.get("glassPoint"); |
| | | if (glassPointObj != null) { |
| | | try { |
| | | // 如果 glassPointObj 已经是字符串,则不需要转换 |
| | | if (!(glassPointObj instanceof String)) { |
| | | // 将对象转换为 JSON 字符串 |
| | | String glassPointStr = mapper.writeValueAsString(glassPointObj); |
| | | detail.put("glassPoint", glassPointStr); |
| | | } |
| | | } catch (Exception e) { |
| | | // 如果转换失败,记录错误并移除该字段 |
| | | System.err.println("转换 glassPoint 失败: " + e.getMessage()); |
| | | detail.remove("glassPoint"); |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (isRemain) { |
| | | offCutDetails.add(detail); |
| | |
| | | } |
| | | } |
| | | |
| | | // 例如对 remainDetails 部分先删除 offcut 再处理 |
| | | // 对 remainDetails 部分先删除 offcut 再处理 |
| | | if (!offCutDetails.isEmpty()) { |
| | | glassOptimizeMapper.deleteOffcutDetails(processId); |
| | | if (glassInfo != null) { |
| | | String glassType = (String) glassInfo.get("glass_type"); |
| | | String glassThickness = (String) glassInfo.get("glass_thickness"); |
| | | // 余料存入optimizeoffcut |
| | | for (Map<String, Object> detail : offCutDetails) { |
| | | glassOptimizeMapper.addUpdateOffcut(detail, processId, glassType, glassThickness); |
| | | glassOptimizeMapper.addUpdateOffcut(detail, processId, glassType, glassThickness, stockId); |
| | | } |
| | | } |
| | | } |
| | | stockId++; |
| | | } |
| | | // 更新优化结果文件 |
| | | String jsonString = mapper.writeValueAsString(object); |
| | |
| | | // 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 Boolean updateProjectState(String projectNumber, Integer state,Integer states, Integer code) { |
| | | public Boolean updateProjectState(String projectNumber, Integer state,Integer states, Integer code) throws JsonProcessingException { |
| | | if (!projectNumber.isEmpty()) { |
| | | //撤销模拟计算 |
| | | if(code==1){ |
| | |
| | | } |
| | | //允许生产 |
| | | else if(code==3){ |
| | | glassOptimizeMapper.updateProjectStateMp(projectNumber, state); |
| | | Boolean isSeccess = issuingProjects(projectNumber); |
| | | if(isSeccess){ |
| | | glassOptimizeMapper.updateProjectStateMp(projectNumber, state); |
| | | }else{ |
| | | return false; |
| | | } |
| | | } |
| | | //生产不可见 |
| | | else if(code==4){ |
| | |
| | | } |
| | | |
| | | |
| | | 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<>(); |
| | | List<Map<String, Object>> materialList = glassOptimizeMapper.getMaterialInfoSv(processId); |
| | | List<Map<String, Object>> layoutSet = glassOptimizeMapper.getLayoutSetSv(processId); |
| | | |
| | | // 创建一个Map来存储每个stock_code的总面积 |
| | | Map<String, Double> stockCodeAreaMap = new HashMap<>(); |
| | | |
| | | // 遍历layoutSet计算每个stock_code的总面积(面积*使用率) |
| | | for (Map<String, Object> layout : layoutSet) { |
| | | Object stockCodeObj = layout.get("stock_code"); |
| | | Object widthObj = layout.get("width"); |
| | | Object heightObj = layout.get("height"); |
| | | Object usageRateObj = layout.get("usage_rate"); |
| | | |
| | | if (stockCodeObj != null && widthObj != null && heightObj != null && usageRateObj != null) { |
| | | try { |
| | | String stockCode = stockCodeObj.toString(); |
| | | double width = Double.parseDouble(widthObj.toString()); |
| | | double height = Double.parseDouble(heightObj.toString()); |
| | | double usageRate = Double.parseDouble(usageRateObj.toString()); |
| | | |
| | | // 计算单条数据的面积(平方米) |
| | | double area = (width * height * usageRate) / 1000000.0; |
| | | |
| | | // 累加到对应stock_code的总面积 |
| | | stockCodeAreaMap.put(stockCode, stockCodeAreaMap.getOrDefault(stockCode, 0.0) + area); |
| | | } catch (NumberFormatException e) { |
| | | System.err.println("数据转换错误: " + e.getMessage()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 将计算出的总面积添加到materialList中对应的物料数据 |
| | | for (Map<String, Object> material : materialList) { |
| | | Object stockCodeObj = material.get("code"); |
| | | if (stockCodeObj != null) { |
| | | String stockCode = stockCodeObj.toString(); |
| | | if (stockCodeAreaMap.containsKey(stockCode)) { |
| | | material.put("totalArea", stockCodeAreaMap.get(stockCode)); |
| | | } |
| | | } |
| | | } |
| | | |
| | | map.put("materialList", materialList); |
| | | 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; |
| | | } |
| | | |
| | | |
| | | } |