package com.example.erp.service.pp; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.example.erp.common.RabbitMQUtil; import com.example.erp.entity.pp.*; import com.example.erp.entity.sd.Delivery; import com.example.erp.entity.sd.OrderDetail; import com.example.erp.entity.userInfo.Log; import com.example.erp.entity.userInfo.SysError; import com.example.erp.mapper.pp.GlassOptimizeMapper; import com.example.erp.service.userInfo.SysErrorService; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.interceptor.TransactionAspectSupport; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.math.BigDecimal; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; import java.sql.Date; import java.text.DecimalFormat; import java.time.LocalDate; import java.util.*; import java.util.concurrent.TimeoutException; import java.util.stream.Collectors; @Service @Transactional(rollbackFor = Exception.class) @DS("sd") public class GlassOptimizeService { @Autowired GlassOptimizeMapper glassOptimizeMapper; @Autowired SysErrorService sysErrorService; @Value("${mesIp:localhost}") // 注入mesIp配置,默认值为10.153.19.31 private String mesIp; RabbitMQUtil rabbitMQUtil; //模拟计算 /*public Map SimulationCalculation(Map message) { Map map = new HashMap<>(); try { rabbitMQUtil = new RabbitMQUtil(); // 发送消息 // 获取 computeData 和 cardData *//*Object computeData = message.get("computeData"); Object cardData = message.get("cardData");*//* rabbitMQUtil.sendMessage(message.toString()); System.out.println("send message: " + message); String date = rabbitMQUtil.receiveMessages(); System.out.println("Received message: " + date); // 关闭连接 rabbitMQUtil.close(); map.put("data", date); } catch (IOException e) { e.printStackTrace(); } catch (TimeoutException | InterruptedException e) { e.printStackTrace(); } return map; }*/ public Map SimulationCalculation(Map message) { Map map = new HashMap<>(); try { URL url = new URL("https://example.com"); // 替换为你的目标 URL HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setDoOutput(true); // 允许写入请求体 conn.setConnectTimeout(5000); // 读取超时(等待服务器响应的最大时间) conn.setReadTimeout(108000); // 写入请求体数据 String postData = message.toString(); try (OutputStream os = conn.getOutputStream()) { byte[] input = postData.getBytes(StandardCharsets.UTF_8); os.write(input, 0, input.length); } // 3. 获取状态码 int statusCode = conn.getResponseCode(); System.out.println("状态码: " + statusCode); // 4. 读取响应内容 BufferedReader reader = new BufferedReader( new InputStreamReader(conn.getInputStream()) ); String line; StringBuilder response = new StringBuilder(); while ((line = reader.readLine()) != null) { response.append(line); } reader.close(); // 输出响应内容 System.out.println("响应内容:\n" + response.toString()); }catch (Exception e) { e.printStackTrace(); } return map; } //模拟计算保存 public Boolean addSimulation(Map object) { try { Map objectMap = (Map) object.get("inputValues"); String projectNo = objectMap.get("project_no").toString(); String userName = object.get("userName").toString(); Map optimizeProjectMap = glassOptimizeMapper.selectProjectCount(projectNo); if(Integer.valueOf(object.get("state").toString())==3){ List> flowCardList = glassOptimizeMapper.selectProjectComputeMp(projectNo); int index=0; for (Map flowCard:flowCardList){ List> glassDetailList=new ArrayList<>(); if(Integer.valueOf(flowCard.get("patch_state").toString())==0){ glassDetailList = glassOptimizeMapper.selectComputeDetailMp(flowCard.get("processId").toString(), Integer.valueOf(flowCard.get("technologyNumber").toString())); }else{ glassDetailList = glassOptimizeMapper.selectComputeDetailMpPatchState(flowCard.get("processId").toString(), Integer.valueOf(flowCard.get("technologyNumber").toString())); } for (Map glassDetail:glassDetailList){ for(int i=0;i> objectList = (List>) object.get("projectdetail"); for (Map objectMap1:objectList){ Integer count = glassOptimizeMapper.selectPatchLogState(objectMap1.get("process_id").toString(), Integer.valueOf(objectMap1.get("layers_number").toString()),Integer.valueOf(objectMap1.get("order_number").toString()),projectNo); if(count>0){ objectMap1.put("patchState",1); }else { objectMap1.put("patchState",0); } } glassOptimizeMapper.addSimulation(object); glassOptimizeMapper.addratioResult(object); glassOptimizeMapper.addratioProjectResult(object); if(Integer.valueOf(object.get("state").toString())==2){ List> flowCardList = glassOptimizeMapper.selectProjectComputeMp(projectNo); List rackinfosList = (List) object.get("rackinfos"); Iterator> iterator = flowCardList.iterator(); while (iterator.hasNext()) { Map map = iterator.next(); for(String rackinfos:rackinfosList){ String processId=rackinfos.substring(0,14); String processId1=map.get("processId").toString(); Integer technologyNumber= Integer.valueOf(rackinfos.substring(15)); Integer technologyNumber1= Integer.valueOf(map.get("technologyNumber").toString()); if(map.get("processId").toString().equals(processId) && Integer.valueOf(map.get("technologyNumber").toString())==technologyNumber){ iterator.remove(); } } } int index=0; for (Map flowCard:flowCardList){ List> glassDetailList=new ArrayList<>(); if(flowCard.get("patch_state").toString()=="0"){ glassDetailList = glassOptimizeMapper.selectComputeDetailMp(flowCard.get("processId").toString(), Integer.valueOf(flowCard.get("technologyNumber").toString())); }else{ glassDetailList = glassOptimizeMapper.selectComputeDetailMp(flowCard.get("processId").toString(), Integer.valueOf(flowCard.get("technologyNumber").toString())); } for (Map glassDetail:glassDetailList){ for(int i=0;i optimizeHeatDetail = glassOptimizeMapper.selectOptimizeHeatDetail(projectNo); for (OptimizeHeatDetail projectdetail:optimizeHeatDetail){ OptimizeDetail optimizeDetail=glassOptimizeMapper.selectOptimizeDetailById(projectNo,projectdetail.getProcessId(), projectdetail.getOrderSort(),projectdetail.getLayer()); glassOptimizeMapper.updateOptimizeDetail(optimizeDetail.getId(),projectdetail.getLayoutId(),projectdetail.getSort()); } } return true; } catch (Exception e) { e.printStackTrace(); return false; } } //优化设置保存 public Boolean optimizeParmsSave(Map object,String username) { try { ObjectMapper mapper = new ObjectMapper(); String jsonString = mapper.writeValueAsString(object); glassOptimizeMapper.optimizeParmsSave(jsonString,username); return true; } catch (Exception e) { e.printStackTrace(); return false; } } //优化调整结果保存 public Boolean saveOptimizeResult(Map object,String projectId) { try { Map optimalResults = (Map) object.get("optimalResults"); List> originalFilm = (List>) object.get("originalFilm"); glassOptimizeMapper.addOptimizeUse(originalFilm,projectId,"admin"); Map glassInfo = glassOptimizeMapper.getGlassInfo(projectId); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(optimalResults); glassOptimizeMapper.addOptimizeProjectFile(json,projectId,"admin"); List> objectMapList = (List>) optimalResults.get("layouts"); glassOptimizeMapper.addOptimizeLayout(objectMapList,projectId); // 收集所有需要保存的玻璃明细数据 List> allGlassDetails = new ArrayList<>(); for(Map objectMap:objectMapList){ List> objectMap2 = (List>) objectMap.get("glassDetails"); //迭代玻璃明细集合处理余料和其他 Iterator> iterator = objectMap2.iterator(); while (iterator.hasNext()) { Map map = iterator.next(); // 修改isRemain判断逻辑,支持数字0/1和字符串"0"/"1" boolean isRemain = false; if (map.containsKey("isRemain")) { Object isRemainObj = map.get("isRemain"); if (isRemainObj != null) { if (isRemainObj instanceof Number) { // 数字类型: 1表示true,0表示false isRemain = ((Number) isRemainObj).intValue() == 1; } else { // 字符串类型: "1"表示true,"0"表示false isRemain = "1".equals(isRemainObj.toString()); } } } if (isRemain) { System.out.println( map); if (glassInfo != null) { String glassType = (String) glassInfo.get("glass_type"); String glassThickness = (String) glassInfo.get("glass_thickness"); // 余料存入optimizeoffcut glassOptimizeMapper.addOptimizeOffcut(map, projectId, glassType, glassThickness); } iterator.remove(); // 从原列表中移除 }else { // 处理isRotate字段转换 (现在是0/1) if (map.containsKey("isRotate")) { Object isRotateObj = map.get("isRotate"); if (isRotateObj != null) { if (isRotateObj instanceof Number) { // 直接使用数字值 map.put("isRotate", ((Number) isRotateObj).intValue()); } else { // 字符串形式的"0"/"1" String isRotateStr = isRotateObj.toString(); if ("1".equals(isRotateStr)) { map.put("isRotate", 1); } else { map.put("isRotate", 0); } } } else { map.put("isRotate", 0); // 默认值 } } } } // 在保存之前处理 glassPoint 数据 for (Map detail : objectMap2) { 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"); } } else { // 如果 glassPointObj 为 null,移除该字段 detail.remove("glassPoint"); } } } // 将当前批次的玻璃明细添加到总列表中 allGlassDetails.addAll(objectMap2); } Map projectInfo = glassOptimizeMapper.getGlassProjectList(projectId); if (projectInfo != null && Integer.parseInt(projectInfo.get("tempering_state").toString()) == 1) { // tempering_state 为 1 时的处理逻辑 glassOptimizeMapper.addOptimizeDetail(allGlassDetails,projectId); List optimizeHeatDetail = glassOptimizeMapper.selectOptimizeHeatDetail(projectId); for (OptimizeHeatDetail projectdetail:optimizeHeatDetail){ OptimizeDetail optimizeDetail=glassOptimizeMapper.selectOptimizeDetailById(projectId,projectdetail.getProcessId(), projectdetail.getOrderSort(),projectdetail.getLayer()); glassOptimizeMapper.updateOptimizeDetail(optimizeDetail.getId(),projectdetail.getLayoutId(),projectdetail.getSort()); } } else { // tempering_state 为 0 时的处理逻辑 glassOptimizeMapper.addOptimizeDetail(allGlassDetails,projectId); } List> materialStoreList = glassOptimizeMapper.materialStoreOptimizeUse(projectId); double totalUseArea = 0.0; for (Map material : materialStoreList) { if (material.containsKey("totalArea")) { Object totalAreaObj = material.get("totalArea"); if (totalAreaObj != null) { try { double area = Double.parseDouble(totalAreaObj.toString()); totalUseArea += area; } catch (NumberFormatException e) { System.err.println("无法解析总面积数据: " + totalAreaObj); } } } } glassOptimizeMapper.updateProjectOptimize(projectId, 1, optimalResults, totalUseArea); return true; } catch (Exception e) { e.printStackTrace(); return false; } } public Boolean updateOptimizeResult(Map object, String processId) { try { ObjectMapper mapper = new ObjectMapper(); List> objectMapList = (List>) object.get("layouts"); Map glassInfo = glassOptimizeMapper.getGlassInfo(processId); glassOptimizeMapper.deleteOffcutDetails(processId); int stockId = 1; for (Map objectMap : objectMapList) { List> objectMap2 = (List>) objectMap.get("glassDetails"); // 分离 glassDetails 为两部分 List> normalDetails = new ArrayList<>(); // isRemain 为 false 的部分 List> offCutDetails = new ArrayList<>(); // isRemain 为 true 的部分 for (Map detail : objectMap2) { boolean isRemain = false; if (detail.containsKey("isRemain")) { Object isRemainObj = detail.get("isRemain"); if (isRemainObj != null) { if (isRemainObj instanceof Number) { // 数字类型: 1表示true,0表示false isRemain = ((Number) isRemainObj).intValue() == 1; } else if (isRemainObj instanceof Boolean) { // 布尔类型 isRemain = (Boolean) isRemainObj; } else { // 字符串类型: "1"/"true"表示true,"0"/"false"表示false String isRemainStr = isRemainObj.toString().toLowerCase(); isRemain = "1".equals(isRemainStr) || "true".equals(isRemainStr); } } } // 处理 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); } else { normalDetails.add(detail); } } // 保存所有数据到 optimize_detail if (!normalDetails.isEmpty()) { for (Map detail : normalDetails) { glassOptimizeMapper.updateNormalDetails(detail, processId); } } // 对 remainDetails 部分先删除 offcut 再处理 if (!offCutDetails.isEmpty()) { if (glassInfo != null) { String glassType = (String) glassInfo.get("glass_type"); String glassThickness = (String) glassInfo.get("glass_thickness"); // 余料存入optimizeoffcut for (Map detail : offCutDetails) { glassOptimizeMapper.addUpdateOffcut(detail, processId, glassType, glassThickness, stockId); } } } stockId++; } // 更新优化结果文件 String jsonString = mapper.writeValueAsString(object); glassOptimizeMapper.updateOptimizeResult(jsonString, processId); return true; } catch (Exception e) { e.printStackTrace(); return false; } } //优化调整结果查询 public Map selectOptimizeResult(String processId) { Map map = new HashMap<>(); map.put("data", glassOptimizeMapper.selectOptimizeResult(processId)); map.put("optimizeUse", glassOptimizeMapper.materialStoreOptimizeUse(processId)); return map; } public Object getOptimizeInfoSv(String processId) { // 获取布局信息 List> layouts = glassOptimizeMapper.getOptimizeLayoutsInfo(processId); // 获取玻璃明细信息 List> glassDetails = glassOptimizeMapper.getOptimizeDetailsInfo(processId); // 获取余料信息 List> offsets = glassOptimizeMapper.getOptimizeOffsetsInfo(processId); // 将玻璃明细和余料合并到一个列表中 List> allDetails = new ArrayList<>(); if (glassDetails != null) { allDetails.addAll(glassDetails); } if (offsets != null) { allDetails.addAll(offsets); } // 解析 glassPoint 字符串 ObjectMapper mapper = new ObjectMapper(); for (Map detail : allDetails) { if (detail.containsKey("glassPoint")) { Object glassPointObj = detail.get("glassPoint"); if (glassPointObj instanceof String) { String glassPointStr = (String) glassPointObj; if (glassPointStr != null && !glassPointStr.isEmpty() && !glassPointStr.equals("null")) { try { // 解析 JSON 字符串为对象 Object parsedGlassPoint = mapper.readValue(glassPointStr, Object.class); detail.put("glassPoint", parsedGlassPoint); } catch (Exception e) { System.err.println("解析 glassPoint 失败: " + e.getMessage()); // 解析失败时保留原字符串或设置默认值 detail.put("glassPoint", new ArrayList<>()); } } else { // 空字符串或 null 时设置默认值 detail.put("glassPoint", new ArrayList<>()); } } } } // 按照stockId将明细分组并添加到对应的布局中 if (layouts != null && !layouts.isEmpty()) { for (Map layout : layouts) { Object stockIdObj = layout.get("stockId"); if (stockIdObj != null) { Integer stockId = null; if (stockIdObj instanceof Number) { stockId = ((Number) stockIdObj).intValue(); } else { try { stockId = Integer.valueOf(stockIdObj.toString()); } catch (NumberFormatException e) { // 如果无法转换为数字,则跳过该布局 continue; } } List> matchedDetails = new ArrayList<>(); for (Map detail : allDetails) { Object layoutIdObj = detail.get("layoutId"); Object stockSortObj = detail.get("stockSort"); Integer detailStockId = null; if (layoutIdObj != null) { if (layoutIdObj instanceof Number) { detailStockId = ((Number) layoutIdObj).intValue(); } else { try { detailStockId = Integer.valueOf(layoutIdObj.toString()); } catch (NumberFormatException e) { // 跳过无效的layoutId continue; } } } else if (stockSortObj != null) { if (stockSortObj instanceof Number) { detailStockId = ((Number) stockSortObj).intValue(); } else { try { detailStockId = Integer.valueOf(stockSortObj.toString()); } catch (NumberFormatException e) { // 跳过无效的stockSort continue; } } } // 如果detail的stockId与layout的stockId匹配,则添加到匹配列表中 if (detailStockId != null && detailStockId.equals(stockId)) { matchedDetails.add(detail); } } // 将匹配的明细添加到布局的glassDetails字段中 layout.put("glassDetails", matchedDetails); } } } // Map result = new HashMap<>(); Map result = new LinkedHashMap<>(); result.put("layouts", layouts); result.put("optimizeUse", glassOptimizeMapper.materialOptimizeUse(processId)); return result; } //工程信息 public Map projectInfoSv(String projectNo,String username) { Map stringObjectMap = glassOptimizeMapper.selectProjectCount(projectNo); Map map = new HashMap<>(); // if(Integer.parseInt(stringObjectMap.get("optimize_state").toString())==1){ // map.put("optimizeState", Integer.parseInt(stringObjectMap.get("optimize_state").toString())); // map.put("data", glassOptimizeMapper.getOptimizeDetail(projectNo)); // map.put("project", glassOptimizeMapper.selectProjectCount(projectNo)); // map.put("grindingTrimming", null); // } else if (Integer.parseInt(stringObjectMap.get("tempering_state").toString())==1) { // map.put("optimizeState", Integer.parseInt(stringObjectMap.get("optimize_state").toString())); // map.put("data", glassOptimizeMapper.analogComputationOptimization(projectNo)); // map.put("project", glassOptimizeMapper.selectProjectCount(projectNo)); // map.put("grindingTrimming", glassOptimizeMapper.getGrindingTrimming(username)); // } else{ // map.put("optimizeState", Integer.parseInt(stringObjectMap.get("optimize_state").toString())); // map.put("data", glassOptimizeMapper.firstOptimization(projectNo)); // map.put("project", glassOptimizeMapper.selectProjectCount(projectNo)); // map.put("grindingTrimming", glassOptimizeMapper.getGrindingTrimming(username)); // } map.put("optimizeState", Integer.parseInt(stringObjectMap.get("optimize_state").toString())); map.put("data", glassOptimizeMapper.firstOptimization(projectNo)); map.put("project", glassOptimizeMapper.selectProjectCount(projectNo)); map.put("grindingTrimming", glassOptimizeMapper.getGrindingTrimming(username)); return map; } public Object optimizeInfoSv(String projectNo, String username) { Map stringObjectMap = glassOptimizeMapper.selectProjectCount(projectNo); Map map = new HashMap<>(); List> dataList = null; if (Integer.parseInt(stringObjectMap.get("tempering_state").toString())==1){ dataList = glassOptimizeMapper.computeAndOptimization(projectNo); } else { dataList = glassOptimizeMapper.directOptimization(projectNo); } // 获取磨量配置数据 List> grindingTrimmingList = glassOptimizeMapper.getGrindingOptimize(username); // 将磨量配置数据拼接到每条主数据后面 if (dataList != null && !dataList.isEmpty() && grindingTrimmingList != null && !grindingTrimmingList.isEmpty()) { // 获取第一条磨量配置数据(通常只有一条记录) Map grindingConfig = grindingTrimmingList.get(0); // 将磨量配置添加到每条主数据中 for (Map dataItem : dataList) { // 将磨量配置的字段添加到每条数据中 for (Map.Entry entry : grindingConfig.entrySet()) { // 避免覆盖原有字段 if (!dataItem.containsKey(entry.getKey())) { dataItem.put(entry.getKey(), entry.getValue()); } } } } map.put("optimizeState", Integer.parseInt(stringObjectMap.get("optimize_state").toString())); map.put("data", dataList); map.put("project", glassOptimizeMapper.selectProjectCount(projectNo)); map.put("grindingTrimming", glassOptimizeMapper.getGrindingTrimming(username)); return map; } //工程信息流程卡 public Map getProcessCardSv(String projectNo) { Map map = new HashMap<>(); map.put("data", glassOptimizeMapper.getProcessCardMp(projectNo)); return map; } //库存信息 public Map materialStoreSv(String thickness, String model, String projectNumber,Integer type,String username) { Map stringObjectMap = glassOptimizeMapper.selectProjectCount(projectNumber); Map map = new HashMap<>(); if(Integer.parseInt(stringObjectMap.get("optimize_state").toString())==0){ if(type==1){ map.put("data", glassOptimizeMapper.materialStoreMp(thickness,model)); }else if(type==2){ map.put("data", glassOptimizeMapper.surplusMaterialsMp(thickness,model)); }else{ map.put("data", glassOptimizeMapper.materialStoreSurplusMp(thickness,model)); } map.put("edgeTrimming", glassOptimizeMapper.getEdgeTrimming(username)); }else{ map.put("data", glassOptimizeMapper.materialStoreOptimizeUse(projectNumber)); map.put("edgeTrimming", null); } map.put("state", Integer.parseInt(stringObjectMap.get("state").toString())); return map; } //工程查询流程卡 public Map getFlowCardList(String optionVal, Integer radio) { Map map = new HashMap<>(); if(radio==1){ map.put("data", glassOptimizeMapper.getFlowCardListWhole(optionVal)); }else if(radio==2){ map.put("data", glassOptimizeMapper.getFlowCardListNormal(optionVal)); }else{ map.put("data", glassOptimizeMapper.getFlowCardListPatch(optionVal)); } return map; } public Map getUpdateFlowCardList(String type,String thickness, Integer radio,String projectNo) { Map map = new HashMap<>(); if(radio==1){ map.put("data", glassOptimizeMapper.getFlowCardListModify(type,thickness,projectNo)); }else if(radio==2){ map.put("data", glassOptimizeMapper.getFlowCardListNormal(type)); }else{ map.put("data", glassOptimizeMapper.getFlowCardListPatch(type)); } return map; } //工程管理查询 public Map OptimizeProjectMange(Date startSelectTime, Date endSelectTime, OptimizeProjectMange optimizeProjectMange) { Map map = new HashMap<>(); map.put("data", glassOptimizeMapper.optimizeProjectMangeMp(startSelectTime, endSelectTime , optimizeProjectMange)); return map; } //修改排版状态 public Boolean updateProjectState(String projectNumber, Integer state,Integer states, Integer code) throws JsonProcessingException { if (!projectNumber.isEmpty()) { //撤销模拟计算 if(code==1){ glassOptimizeMapper.deleteOptimizeHeatDetail(projectNumber); glassOptimizeMapper.deleteOptimizeHeatLayout(projectNumber); glassOptimizeMapper.updateProjectTemperingStateMp(projectNumber, states); Map temperingState = glassOptimizeMapper.getProjectState(projectNumber); if (temperingState != null && temperingState.containsKey("optimize_state")) { Object optimizeStateObj = temperingState.get("optimize_state"); if (optimizeStateObj != null) { try { int optimizeState = Integer.parseInt(optimizeStateObj.toString()); if (optimizeState == 1) { glassOptimizeMapper.updateProjectTemperingId(projectNumber); } } catch (NumberFormatException e) { // 处理转换异常,记录日志或采取其他适当措施 System.err.println("解析 optimize_state 失败: " + e.getMessage()); } } } } //撤销优化排版 else if(code==2){ glassOptimizeMapper.deleteOptimizeDetail(projectNumber); glassOptimizeMapper.deleteOptimizeLayout(projectNumber); glassOptimizeMapper.deleteOptimizeOffcut(projectNumber); glassOptimizeMapper.deleteOptimizeProjectFile(projectNumber); glassOptimizeMapper.updateOptimizeUse(projectNumber); glassOptimizeMapper.updateProjectOptimizeStateMp(projectNumber, states); } //允许生产 else if(code==3){ Boolean isSeccess = issuingProjects(projectNumber); if(isSeccess){ glassOptimizeMapper.updateProjectStateMp(projectNumber, state); }else{ return false; } } //生产不可见 else if(code==4){ Map cancelResult = issuingCancelProject(projectNumber); // 获取返回结果中的data字段 Map responseData = (Map) cancelResult.get("data"); // 检查响应中的code字段,只有当code为200或202时才允许更新状态 if (responseData != null && responseData.containsKey("code")) { Object responseCode = responseData.get("code"); if (responseCode.equals(200) || responseCode.equals(202)) { glassOptimizeMapper.updateProjectStateMp(projectNumber, state); } else if (responseCode.equals(201)) { // 当返回201时,抛出自定义异常或返回错误信息 throw new RuntimeException(responseData.get("message").toString()); } else { return false; } } else { return false; } } //初始化工程 else if(code==5){ glassOptimizeMapper.updateProjectStateMp(projectNumber, state); } return true; } else { return false; } } //删除工程 public boolean deleteProject(String projectNumber,Integer type) { Map stringObjectMap = glassOptimizeMapper.selectProjectCount(projectNumber); if(stringObjectMap.get("tempering_state").equals(1)){ glassOptimizeMapper.deleteOptimizeHeatDetail(projectNumber); glassOptimizeMapper.deleteOptimizeHeatLayout(projectNumber); } if(stringObjectMap.get("optimize_state").equals(1)){ glassOptimizeMapper.deleteOptimizeDetail(projectNumber); glassOptimizeMapper.deleteOptimizeLayout(projectNumber); glassOptimizeMapper.deleteOptimizeLayout(projectNumber); glassOptimizeMapper.updateOptimizeUse(projectNumber); glassOptimizeMapper.deleteOptimizeHeatDetail(projectNumber); glassOptimizeMapper.deleteOptimizeHeatLayout(projectNumber); } List flowCardList =glassOptimizeMapper.getFlowCardList(projectNumber); List patchLogList =glassOptimizeMapper.getPatchLogList(projectNumber); if(flowCardList!=null){ for (FlowCard flowCard:flowCardList){ glassOptimizeMapper.updateFlowCardProjectReturn(flowCard.getProcessId(),flowCard.getTechnologyNumber(),projectNumber); } } if(patchLogList!=null){ for (PatchLog patchLog:patchLogList){ glassOptimizeMapper.updatePatchLogProjectReturn(patchLog.getProcessId(),patchLog.getTechnologyNumber(),projectNumber); } } //判断是否是修改工程 if(type.equals(1)){ glassOptimizeMapper.deleteProjectMp(projectNumber); } return true; } public Map getProjectListSv() { Map map = new HashMap<>(); map.put("data", glassOptimizeMapper.getProjectListMp()); return map; } //模拟计算工程号查询 public MapselectProjectComputeSv(String projectNumber) { Map map = new HashMap<>(); map.put("data", glassOptimizeMapper.selectProjectComputeMp(projectNumber)); //map.put("project", glassOptimizeMapper.selectProjectCount(projectNumber)); return map; } public MapselectProjectComputeAll(String projectNumber) { Map map = new HashMap<>(); List> projectComputeMpList=glassOptimizeMapper.selectProjectComputeMp(projectNumber); for (Map stringObjectMap : projectComputeMpList) { stringObjectMap.get("process_id"); stringObjectMap.get("technology_number"); } map.put("data", glassOptimizeMapper.selectProjectComputeMp(projectNumber)); //map.put("project", glassOptimizeMapper.selectProjectCount(projectNumber)); return map; } //模拟计算流程卡详情 public MapselectComputeDetailSv(String processId,Integer technologyNumber,String patchState) { Map map = new HashMap<>(); if(patchState.equals("0")){ map.put("data", glassOptimizeMapper.selectComputeDetailMp(processId,technologyNumber)); }else{ map.put("data", glassOptimizeMapper.selectComputeDetailMpPatchState(processId,technologyNumber)); } return map; } public Map getProcessCardDetailSv(String processId, Integer technologyNumber) { Map map = new HashMap<>(); map.put("data", glassOptimizeMapper.getProcessCardDetailmMp(processId,technologyNumber)); return map; } public Map selectGlassTypeSv() { Map map = new HashMap<>(); map.put("data", glassOptimizeMapper.selectGlassTypeMp()); return map; } public Map getProjectIdSv() { Map map = new HashMap<>(); map.put("data", glassOptimizeMapper.getProjectIdSv()); return map; } public String addProjectSv(String optionVal, String projectId, String projectNmae, Map object) { String saveState = "true"; //设置回滚点 Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint(); try { String userName = ""; if (object.get("userName") != null) { userName = object.get("userName").toString(); } String projectType = ""; if (object.get("projectType") != null) { projectType = object.get("projectType").toString(); } if ("null".equals(projectNmae)) { projectNmae = ""; } BigDecimal sumArea = new BigDecimal(0); double area = 0; Integer sumQuantity = 0; Integer type = 0; int state1 = 0; int state2 = 0; StringBuilder processId= new StringBuilder(); List flowCardList = JSONArray.parseArray(JSONObject.toJSONString(object.get("projectdetail")), FlowCard.class); if (!flowCardList.isEmpty()) { if(projectType.equals("2")){ deleteProject(projectId,2); } // 创建一个映射来存储 (processId-technologyNumber) 组合到 rack 编号的映射 Map rackMap = new HashMap<>(); int rackCounter = 1; for (FlowCard flowCard : flowCardList) { // 为每个唯一的 processId-technologyNumber 组合分配 rack 编号 String key = flowCard.getProcessId() + "-" + flowCard.getTechnologyNumber(); if (!rackMap.containsKey(key)) { rackMap.put(key, rackCounter++); } int rackValue = rackMap.get(key); if(flowCard.getPatchState().equals(0)){ state1=1; //给流程卡表添加对应的工程号 Boolean a = glassOptimizeMapper.updateFlowCardProject(flowCard.getProcessId(),flowCard.getTechnologyNumber(),projectId); // 更新流程卡的rack字段 glassOptimizeMapper.updateFlowCardRack(flowCard.getProcessId(), flowCard.getTechnologyNumber(), rackValue); area = glassOptimizeMapper.getSelectArea(flowCard.getProcessId(),flowCard.getTechnologyNumber()).doubleValue(); sumArea = sumArea.add(BigDecimal.valueOf(area)); sumQuantity +=flowCard.getQuantity(); processId.append(flowCard.getProcessId()).append("-").append(flowCard.getTechnologyNumber()).append(";"); }else{ state2=1; Boolean a=glassOptimizeMapper.updatePatchLogProject(flowCard.getProcessId(),flowCard.getTechnologyNumber(),projectId); area = glassOptimizeMapper.getSelectAreaPatchLog(flowCard.getProcessId(),flowCard.getTechnologyNumber()).doubleValue(); sumArea = sumArea.add(BigDecimal.valueOf(area)); sumQuantity +=flowCard.getQuantity(); processId.append(flowCard.getProcessId()).append("-").append(flowCard.getTechnologyNumber()).append(";"); } } if(state1==1&&state2==0){ type=1; }else if(state1==1&&state2==1){ type=2; } int index = optionVal.indexOf("mm"); // 获取 "mm" 前面的部分 String glass_thickness = optionVal.substring(0, index); // 获取 "mm" 后面的部分 String glass_type = optionVal.substring(index + 2); if(projectType.equals("2")){ glassOptimizeMapper.updateProjectMp(projectId,projectNmae,glass_thickness,glass_type,sumQuantity,sumArea.doubleValue(),userName, flowCardList.size(), String.valueOf(processId),type); }else{ if(glassOptimizeMapper.selectProjectCount(projectId)==null){ glassOptimizeMapper.addProjectMp(projectId,projectNmae,glass_thickness,glass_type,sumQuantity,sumArea.doubleValue(),userName, flowCardList.size(), String.valueOf(processId),type); }else{ TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint); return "false1"; } } }else { return "false2"; } } catch (Exception e) { TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint); //将异常传入数据库 SysError sysError = new SysError(); sysError.setError(e+Arrays.toString(e.getStackTrace())); sysError.setFunc("addProjectSv"); sysErrorService.insert(sysError); saveState = "false"; } return saveState; } public Map getConfiguration(String type,String username) { Map map = new HashMap<>(); if(type.equals("钢化")){ map.put("data", glassOptimizeMapper.getTemperedConfiguration(username)); }else if(type.equals("磨量")){ map.put("data", glassOptimizeMapper.getGrindingTrimming(username)); }else if(type.equals("修边")){ map.put("data", glassOptimizeMapper.getEdgeTrimming(username)); } return map; } public Boolean saveConfiguration(Map object,String type,String username) { String json = ""; if (object.get("json") != null) { json = object.get("json").toString(); } if(type.equals("钢化")){ String existingConfig = glassOptimizeMapper.selectConfigByUserAndType(username, 1); if (existingConfig == null) { String configName = "钢化推荐"; glassOptimizeMapper.insertOptimizeConfig(json,1,username,configName); }else { glassOptimizeMapper.updateOptimizeConfig(json,1,username); } } else if (type.equals("修边")) { String existingConfig = glassOptimizeMapper.selectConfigByUserAndType(username, 5); if (existingConfig == null) { String configName = "修边配置"; glassOptimizeMapper.insertOptimizeConfig(json,5,username,configName); }else { glassOptimizeMapper.updateOptimizeConfig(json,5,username); } }else if (type.equals("磨量")) { String existingConfig = glassOptimizeMapper.selectConfigByUserAndType(username, 4); if (existingConfig == null) { String configName = "磨量配置"; glassOptimizeMapper.insertOptimizeConfig(json,4,username,configName); }else{ glassOptimizeMapper.updateOptimizeConfig(json,4,username); } } return true; } public String simulatedTypesetting1(Map object) { String optionVal = ""; int quantity; Double area; if (object.get("optionVal") != null) { optionVal = object.get("optionVal").toString(); } if (object.get("quantity") != null) { quantity = Integer.valueOf(object.get("quantity").toString()); } else { quantity = 0; } if (object.get("area") != null) { area = Double.valueOf(object.get("area").toString()); } else { area = 0.0; } JSONArray materialStore = JSONArray.parseArray(JSONObject.toJSONString(object.get("materialStore"))); List> flowCardListNormal = glassOptimizeMapper.getFlowCardListSimulated(optionVal); Queue> queue = flowCardListNormal.stream() .filter(item -> { if ((quantity>0 ? (Integer.valueOf(item.get("quantity").toString()) > quantity):false) || (area>0 ? (Double.valueOf(item.get("area").toString()) > area):false)) { return false; } return true; }) .collect(Collectors.toCollection(LinkedList::new)); List> result = new ArrayList<>(); while (!queue.isEmpty()) { List> currentGroup = new ArrayList<>(); Map currentGroupMap = new HashMap<>(); int currentCount = 0; double currentArea = 0; // 处理当前轮次队列中的所有元素 int queueSize = queue.size(); boolean addedAny = false; String processId=""; for (int i = 0; i < queueSize; i++) { Map item = queue.poll(); if ((quantity>0?currentCount + Integer.valueOf(item.get("quantity").toString()) <= quantity:true) && (area>0?currentArea + Double.valueOf(item.get("area").toString()) <= area:true)) { if(i+1==queueSize){ processId=processId+item.get("process_id").toString()+"/"+item.get("technology_number").toString(); }else{ processId=processId+item.get("process_id").toString()+"/"+item.get("technology_number").toString()+";"; } currentGroup.add(item); currentCount += Integer.valueOf(item.get("quantity").toString()); currentArea += Double.valueOf(item.get("area").toString()); addedAny = true; } else { queue.offer(item); // 放回队列等待下次处理 } } if (currentGroup.isEmpty()) { throw new RuntimeException("无法继续分组,剩余数据无法放入任何分组"); } currentGroupMap.put("processId",processId); currentGroupMap.put("count",currentCount); currentGroupMap.put("area",Math.round(currentArea * 100) / 100.0); result.add(currentGroupMap); //System.out.println("流程卡:"+processId+"数量:"+currentCount+"面积:"+Math.round(currentArea * 100) / 100.0); } for (Map objectMap:result){ Map map = new HashMap<>(); String[] substrings = objectMap.get("processId").toString().split(";"); List> flowCardMap = new ArrayList<>(); List processIdList=new ArrayList<>(); List technologyNumberList=new ArrayList<>(); for(String substring : substrings) { String processId = substring.substring(0, 14); Integer technologyNumber = Integer.valueOf(substring.substring(15)); processIdList.add(processId); technologyNumberList.add(technologyNumber); } map.put("data",glassOptimizeMapper.simulatedTypesettingUsingOpt(processIdList,technologyNumberList)); objectMap.put("cuttingRate",90); } System.out.println(result); return ""; } //模拟计算工程号查询 public MapselectProjectComputeMpThirdParty(String projectNumber) { Map map = new HashMap<>(); map.put("data", glassOptimizeMapper.selectProjectComputeMpThirdParty(projectNumber)); return map; } //模拟计算流程卡详情 public MapselectComputeDetailThirdParty(String processId,Integer technologyNumber) { Map map = new HashMap<>(); map.put("data", glassOptimizeMapper.selectComputeDetailMpThirdParty(processId,technologyNumber)); return map; } public Boolean simulationSaveThirdParty(Map object) { try { Map objectMap = (Map) object.get("inputValues"); String projectNo = objectMap.get("project_no").toString(); Map optimizeProjectMap = glassOptimizeMapper.selectProjectCount(projectNo); glassOptimizeMapper.addSimulation(object); glassOptimizeMapper.addratioResult(object); glassOptimizeMapper.addratioProjectResult(object); List optimizeHeatDetail = glassOptimizeMapper.selectOptimizeHeatDetail(projectNo); for (OptimizeHeatDetail projectdetail:optimizeHeatDetail){ OptimizeDetail optimizeDetail=glassOptimizeMapper.selectOptimizeDetailById(projectNo,projectdetail.getProcessId(), projectdetail.getOrderSort(),projectdetail.getLayer()); glassOptimizeMapper.updateOptimizeDetail(optimizeDetail.getId(),projectdetail.getLayoutId(),projectdetail.getSort()); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } //删除工程 public boolean deleteProjectThirdParty(String projectNumber) { Map stringObjectMap = glassOptimizeMapper.selectProjectCount(projectNumber); if(stringObjectMap.get("state").equals(2)){ glassOptimizeMapper.deleteOptimizeDetailThirdParty(projectNumber); glassOptimizeMapper.deleteOptimizeDetail(projectNumber); }else if(stringObjectMap.get("state").equals(10)){ glassOptimizeMapper.deleteOptimizeDetailThirdParty(projectNumber); glassOptimizeMapper.deleteOptimizeHeatDetail(projectNumber); glassOptimizeMapper.deleteOptimizeHeatLayout(projectNumber); } glassOptimizeMapper.deleteProjectMp(projectNumber); return true; } //工程信息 public Map projectInfoThirdParty(String projectNo) { Map stringObjectMap = glassOptimizeMapper.selectProjectCount(projectNo); Map map = new HashMap<>(); if(stringObjectMap.get("state").equals(2)){ map.put("data", glassOptimizeMapper.firstOptimizationThirdParty(projectNo)); map.put("grindingTrimming", null); }else{ map.put("data", glassOptimizeMapper.firstOptimizationThirdParty(projectNo)); map.put("grindingTrimming", null); } return map; } //库存信息 public Map materialStoreSvThirdParty(String projectNumber) { Map stringObjectMap = glassOptimizeMapper.selectProjectCount(projectNumber); Map map = new HashMap<>(); map.put("data", glassOptimizeMapper.materialStoreOptimizeUse(projectNumber)); map.put("edgeTrimming", null); map.put("state", Integer.parseInt(stringObjectMap.get("state").toString())); return map; } //工程信息流程卡 public Map getProcessCardMpThirdParty(String projectNo) { Map map = new HashMap<>(); map.put("data", glassOptimizeMapper.getProcessCardMpThirdParty(projectNo)); return map; } public Map getProjectByProjectNoSv(String projectNo) { Map map = new HashMap<>(); map.put("data", glassOptimizeMapper.getProjectByProjectNoSv(projectNo)); return map; } public Boolean issuingProjects(String projectNo) throws JsonProcessingException { boolean saveState=false; try { // 1. 创建URL对象 URL url = new URL("http://" + mesIp + ":88/api/loadGlass/engineering/importEngineer"); // 2. 打开连接 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json"); conn.setRequestProperty("Accept", "application/json"); conn.setDoOutput(true); // 3. 准备请求体 Map optimizeProject=glassOptimizeMapper.selectOptimizeProject(projectNo); optimizeProject.put("engineeringRawQueueList", glassOptimizeMapper.selectOptimizeLayout(projectNo)); optimizeProject.put("glassInfolList", glassOptimizeMapper.selectOptimizeDetail(projectNo)); optimizeProject.put("flowCardInfoList", glassOptimizeMapper.selectFlowCardInfoList(projectNo)); ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new JavaTimeModule()); String jsonInputString = mapper.writeValueAsString(optimizeProject); //发送请求 try(OutputStream os = conn.getOutputStream()) { byte[] input = jsonInputString.getBytes(StandardCharsets.UTF_8); os.write(input, 0, input.length); } // 获取响应 try(BufferedReader br = new BufferedReader( new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) { StringBuilder response = new StringBuilder(); String responseLine; while ((responseLine = br.readLine()) != null) { response.append(responseLine.trim()); } System.out.println("Response: " + response.toString()); JSONObject obj = JSONObject.parseObject(response.toString()); if(obj.get("code").equals(200)&&obj.get("data").equals(true)){ saveState=true; } } //关闭连接 conn.disconnect(); } catch (Exception e) { e.printStackTrace(); saveState= false; } return saveState; } public Map getReportDataSv(String processId) { Map perimap = new HashMap<>(); perimap.put("peridata", glassOptimizeMapper.getPeriMeterDataSv(processId)); Map map = new HashMap<>(); Object layoutSetObj = glassOptimizeMapper.getReportDataProcessIdSv(processId); map.put("reportData", layoutSetObj); List> peridata = (List>) perimap.get("peridata"); double totalPerimeter = 0.0; if (peridata != null && !peridata.isEmpty()) { for (Map 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> layoutSet = (List>) layoutSetObj; if (!layoutSet.isEmpty()) { layoutSet.get(0).put("rectanglePerimeter", totalPerimeter); } } return map; } public Map getMaterialInfoSv(String processId) { Map map = new HashMap<>(); // List> materialList = glassOptimizeMapper.getMaterialInfoSv(processId); List> layoutSet = glassOptimizeMapper.getLayoutSetSv(processId); // // 创建一个Map来存储每个stock_code的总面积 // Map stockCodeAreaMap = new HashMap<>(); // // // 遍历layoutSet计算每个stock_code的总面积(面积*使用率) // for (Map 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 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", layoutSet); return map; } public Map getProductListSv(String processId) { Map productMap = new HashMap<>(); List> productInfo = glassOptimizeMapper.selectProjectList(processId); productMap.put("productInfo", productInfo); Map map = new HashMap<>(); if (productInfo != null && !productInfo.isEmpty()) { // 按照 processCard 分组 Map>> groupedByProcessCard = new HashMap<>(); for (Map item : productInfo) { String processCard = (String) item.get("processCard"); if (processCard != null) { groupedByProcessCard.computeIfAbsent(processCard, k -> new ArrayList<>()).add(item); } } // 为每个 processCard 计算统计信息 List> result = new ArrayList<>(); for (Map.Entry>> entry : groupedByProcessCard.entrySet()) { String processCard = entry.getKey(); List> 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 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 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; } public Map getProjectState(String projectNo) { Map map = new HashMap<>(); map.put("data", glassOptimizeMapper.getProjectState(projectNo)); return map; } public Map issuingCancelProject(String projectNo){ Map result = new HashMap<>(); Map responseData = new HashMap<>(); try { // 1. 创建URL对象 URL url = new URL("http://" + mesIp + ":88/api/loadGlass/engineering/optimizeCancelTask"); // URL url = new URL("http://localhost:88/api/loadGlass/engineering/optimizeCancelTask"); // 2. 打开连接 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json"); conn.setRequestProperty("Accept", "application/json"); conn.setDoOutput(true); // 3. 准备请求体 - 将projectNo转换为engineerId格式 String engineerId = projectNo; // 如果传入的是JSON字符串,需要提取真正的projectNo值 if (projectNo.startsWith("{") && projectNo.contains("\"projectNo\"")) { try { JSONObject jsonObject = JSONObject.parseObject(projectNo); engineerId = jsonObject.getString("projectNo"); } catch (Exception e) { // 解析失败时使用原始值 System.err.println("解析projectNo JSON失败: " + e.getMessage()); } } // 构建新的JSON请求体,使用engineerId字段 String jsonInputString = "{\"engineerId\":\"" + engineerId + "\"}"; System.out.println("engineerId: " + engineerId); System.out.println("Request: " + jsonInputString); //发送请求 try(OutputStream os = conn.getOutputStream()) { byte[] input = jsonInputString.getBytes(StandardCharsets.UTF_8); os.write(input, 0, input.length); } // 获取响应 try(BufferedReader br = new BufferedReader( new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) { StringBuilder response = new StringBuilder(); String responseLine; while ((responseLine = br.readLine()) != null) { response.append(responseLine.trim()); } String fullResponse = response.toString(); System.out.println("Response: " + fullResponse); // 直接将响应内容解析为Map responseData = JSONObject.parseObject(fullResponse, Map.class); } //关闭连接 conn.disconnect(); } catch (Exception e) { e.printStackTrace(); // 异常情况下将异常信息放入data responseData.put("error", e.getMessage()); } // 构造最终返回结果 result.put("data", responseData); return result; } }