package com.casic.missiles.utils; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.dto.constAcal.*; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; import java.util.*; import static com.casic.missiles.enums.constAcal.ConstUri.*; /** * @Description: 请求Const康斯特接口工具 * @Author: wangpeng * @Date: 2024/9/26 9:43 */ @Data @NoArgsConstructor @AllArgsConstructor @Slf4j @Component public class ConstUtil { @Resource private RestTemplate restTemplate; /** * 登录 * @return ApiKey */ public String login(String ipPort) { Map map = new HashMap<>(); //账号密码配置现场实际唯一一台安装电脑安装的const软件登录账号密码 map.put("AccountID", "admin"); map.put("Password", "admin"); JSONObject responseJson = restTemplate.postForObject(ipPort + LOG_IN, map, JSONObject.class); Integer statusCode = responseJson.getInteger("StatusCode"); if (0 == statusCode) { return responseJson.getString("ApiKey"); } return null; } /** * 未同步检定数据列表(仅同步普通指针压力表、电接点指针压力表、精密指针压力表) * @param request * @return List<UnsyncRecordBaseInfoDTO> */ public List<UnsyncRecordBaseInfoDTO> unsyncRecordMessage(UnsyncRecordMessageRequest request) { JSONObject responseJson = constResponse(BeanUtil.beanToMap(request), request.getIpPort(), UNSYNC_RECORD_MESSAGE); Integer statusCode = responseJson.getInteger("StatusCode"); List<UnsyncRecordBaseInfoDTO> baseInfoList = new ArrayList<>(); if (0 == statusCode) { JSONArray reports = responseJson.getJSONArray("Reports"); for (Object report : reports) { JSONObject totalObject = (JSONObject)report; String id = totalObject.getString("ID"); String recordNo = totalObject.getString("RecordNo"); //记录编号 String certNo = totalObject.getString("CertNo"); //证书编号 String content = totalObject.getString("Content"); JSONObject dataObject = JSONObject.parseObject(content); if (Objects.isNull(dataObject)) { continue; } Integer dutTypeID = dataObject.getInteger("DUTTypeID"); JSONObject data = dataObject.getJSONObject("Data"); JSONObject baseInfo = data.getJSONObject("BaseInfo"); //基础数据获取 String deviceName = baseInfo.getString("B6"); String deviceModel = baseInfo.getString("B8"); String deviceManufactureNo = baseInfo.getString("B10"); String deviceManufacturer = baseInfo.getString("B16"); String orderNo = baseInfo.getString("B14"); String measureCategory = baseInfo.getString("U4"); //业务类别/证书类别(检定/校准/测试),对应业务系统检校类别字段 String measureDate = baseInfo.getString("G10"); //检定日期,格式"2024/9/24 11:23:36" String conclusion = baseInfo.getString("G28"); //检定结论(合格/不合格) String measureValidDate = baseInfo.getString("G20"); //检定有效期,格式"2024/9/24 11:23:36" String measureAddress = baseInfo.getString("I20"); //检定地点 String temperature = baseInfo.getString("G22"); //温度 String humidity = baseInfo.getString("G24"); //湿度 String technologyFileName = baseInfo.getString("K4"); //规程名称,对应业务系统依据的技术文件 String checkOrganization = baseInfo.getString("I4"); //规程名称,对应业务系统依据的技术文件 if (StringUtils.isNotEmpty(measureDate)) { measureDate = DateUtil.format(DateUtil.parseDate(measureDate), "yyyy-MM-dd"); } if (StringUtils.isNotEmpty(measureValidDate)) { measureValidDate = DateUtil.format(DateUtil.parseDate(measureValidDate), "yyyy-MM-dd"); } //检定数据(标准装置设备):设各名称、规格型号、出厂编号、不确定度或允许误差极限或准确度等级、检定有效期 //匹配规则:设备名称、规格型号、出厂编号,匹配到了关联到系统中标准设备,匹配不到就是文本存储,仅做展示不建立关系) //文件:原始记录、检定证书 //Const表格中最多5个标准设备 String equipmentNoOne = baseInfo.getString("K35"); //标准设备编号(即业务系统中出厂编号) String equipmentModelOne = baseInfo.getString("K39"); //标准设备规格型号 String equipmentNameOne = baseInfo.getString("K33"); //标准设备名称 String equipmentMeasureRangeOne = baseInfo.getString("K47"); //标准设备测量范围 String equipmentUncertaintyOne = baseInfo.getString("K49"); //标准设备准确度等级(即不确定度或允许误差极限或准确度等级) String equipmentMeasureValidDateOne = baseInfo.getString("K43"); //标准设备检定有效期 String equipmentNoTwo = baseInfo.getString("L35"); String equipmentModelTwo = baseInfo.getString("L39"); String equipmentNameTwo = baseInfo.getString("L33"); String equipmentMeasureRangeTwo = baseInfo.getString("L47"); String equipmentUncertaintyTwo = baseInfo.getString("L49"); String equipmentMeasureValidDateTwo = baseInfo.getString("L43"); String equipmentNoThree = baseInfo.getString("M35"); String equipmentModelThree = baseInfo.getString("M39"); String equipmentNameThree = baseInfo.getString("M33"); String equipmentMeasureRangeThree = baseInfo.getString("M47"); String equipmentUncertaintyThree = baseInfo.getString("M49"); String equipmentMeasureValidDateThree = baseInfo.getString("M43"); String equipmentNoFour = baseInfo.getString("N35"); String equipmentModelFour = baseInfo.getString("N39"); String equipmentNameFour = baseInfo.getString("N33"); String equipmentMeasureRangeFour = baseInfo.getString("N47"); String equipmentUncertaintyFour = baseInfo.getString("N49"); String equipmentMeasureValidDateFour = baseInfo.getString("N43"); String equipmentNoFive = baseInfo.getString("O35"); String equipmentModelFive = baseInfo.getString("O39"); String equipmentNameFive = baseInfo.getString("O33"); String equipmentMeasureRangeFive = baseInfo.getString("O47"); String equipmentUncertaintyFive = baseInfo.getString("O49"); String equipmentMeasureValidDateFive = baseInfo.getString("O43"); List<UnsyncRecordEquipmentDTO> equipmentList = new ArrayList<>(); buildEquipmentDTO(equipmentNoOne, equipmentModelOne, equipmentNameOne, equipmentMeasureRangeOne, equipmentUncertaintyOne, equipmentMeasureValidDateOne, equipmentList); buildEquipmentDTO(equipmentNoTwo, equipmentModelTwo, equipmentNameTwo, equipmentMeasureRangeTwo, equipmentUncertaintyTwo, equipmentMeasureValidDateTwo, equipmentList); buildEquipmentDTO(equipmentNoThree, equipmentModelThree, equipmentNameThree, equipmentMeasureRangeThree, equipmentUncertaintyThree, equipmentMeasureValidDateThree, equipmentList); buildEquipmentDTO(equipmentNoFour, equipmentModelFour, equipmentNameFour, equipmentMeasureRangeFour, equipmentUncertaintyFour, equipmentMeasureValidDateFour, equipmentList); buildEquipmentDTO(equipmentNoFive, equipmentModelFive, equipmentNameFive, equipmentMeasureRangeFive, equipmentUncertaintyFive, equipmentMeasureValidDateFive, equipmentList); //将上述字段构建为实体返回,调用该接口的位置将返回实体进行后续匹配等逻辑处理 UnsyncRecordBaseInfoDTO baseInfoDTO = new UnsyncRecordBaseInfoDTO(); baseInfoDTO.setDeviceName(deviceName); baseInfoDTO.setDeviceModel(deviceModel); baseInfoDTO.setDeviceManufactureNo(deviceManufactureNo); baseInfoDTO.setDeviceManufacturer(deviceManufacturer); baseInfoDTO.setOrderNo(orderNo); baseInfoDTO.setId(id); baseInfoDTO.setRecordNo(recordNo); baseInfoDTO.setCertificateNo(certNo); baseInfoDTO.setMeasureCategory(measureCategory); baseInfoDTO.setMeasureDate(measureDate); baseInfoDTO.setConclusion(conclusion); baseInfoDTO.setMeasureValidDate(measureValidDate); baseInfoDTO.setMeasureAddress(measureAddress); baseInfoDTO.setTemperature(temperature); baseInfoDTO.setHumidity(humidity); baseInfoDTO.setTechnologyFileName(technologyFileName); baseInfoDTO.setCheckOrganization(checkOrganization); baseInfoDTO.setEquipmentList(equipmentList); baseInfoList.add(baseInfoDTO); //若需要检定数据,需要按不同类别进行获取及存储数据 // if (dutTypeID == ConstDeviceType.POINTER_PRESSURE_GAUGE) { // // } else if (dutTypeID == ConstDeviceType.ELECTRIC_CONTACT_PRESSURE_GAUGE) { // // } else if (dutTypeID == ConstDeviceType.PRECISION_POINTER_PRESSURE_GAUGE) { // // } } } return baseInfoList; } /** * 更新数据同步状态 * @param request * @return "success"/"fail" */ public String updateSyncStatus(UpdateSyncStatusRequest request, String ipPort) { JSONObject responseJson = constResponse(BeanUtil.beanToMap(request), ipPort, UPDATE_SYNC_STATUS); Integer statusCode = responseJson.getInteger("StatusCode"); if (0 == statusCode) { return "success"; } return "fail"; } /** * 获取原始记录Excel数据 * @param request * @return Excel文件字节数组进行Base64编码后的字符串 * 1.压缩:GZIP压缩字节数组 * 2.压缩状态:Uncompressed(数据未压缩);Compressed(数据已压缩) * 3.ExcelData:将Excel文件流的字节数组(需要压缩时,使用GZIP压缩字节数组)执行Base64编码后形成的字符串 * 4.ExcelData创建Excel文件示例: 生成Excel文件代码示例 * 5.DateType参数不写或值是0时(表示不查询日期),StartDate和EndDate两个参数可以不用写 */ public String getRecordExcelData(RecordExcelDataRequest request, String ipPort) { JSONObject responseJson = constResponse(BeanUtil.beanToMap(request), ipPort, GET_RECORD_EXCEL_DATA); Integer statusCode = responseJson.getInteger("StatusCode"); if (0 == statusCode) { //压缩状态 String compressionState = responseJson.getString("CompressionState"); //Excel记录数据(Excel文件字节数组进行Base64编码后的字符串) String excelData = responseJson.getString("ExcelData"); return excelData; } return null; } /** * 获取检定证书Excel数据 * @param request * @return Excel文件字节数组进行Base64编码后的字符串 */ public String getCertificateExcelData(RecordExcelDataRequest request, String ipPort) { JSONObject responseJson = constResponse(BeanUtil.beanToMap(request), ipPort, GET_CERTIFICATE_EXCEL_DATA); Integer statusCode = responseJson.getInteger("StatusCode"); if (0 == statusCode) { //压缩状态 String compressionState = responseJson.getString("CompressionState"); //Excel记录数据(Excel文件字节数组进行Base64编码后的字符串) String excelData = responseJson.getString("ExcelData"); return excelData; } return null; } private void buildEquipmentDTO(String equipmentNoOne, String equipmentModelOne, String equipmentNameOne, String equipmentMeasureRangeOne, String equipmentUncertaintyOne, String equipmentMeasureValidDateOne, List<UnsyncRecordEquipmentDTO> equipmentList) { if (StringUtils.isNotEmpty(equipmentNoOne)) { UnsyncRecordEquipmentDTO equipmentDTO = new UnsyncRecordEquipmentDTO(); equipmentDTO.setEquipmentNo(equipmentNoOne); equipmentDTO.setEquipmentModel(equipmentModelOne); equipmentDTO.setEquipmentName(equipmentNameOne); equipmentDTO.setEquipmentMeasureRange(equipmentMeasureRangeOne); equipmentDTO.setEquipmentUncertainty(equipmentUncertaintyOne); equipmentDTO.setEquipmentMeasureValidDate(equipmentMeasureValidDateOne); equipmentList.add(equipmentDTO); } } private JSONObject constResponse(Map<String, Object> map, String ipPort, String uri) { HttpHeaders headers = new HttpHeaders(); String apiKey = this.login(ipPort); // headers.setContentType(MediaType.APPLICATION_JSON); headers.set("Accept", "application/json, application/*+json"); headers.set("ApiKey", apiKey); HttpEntity<Map<String, Object>> httpEntity = new HttpEntity<>(map, headers); // restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory()); String responseStr = restTemplate.postForObject( ipPort + uri, httpEntity, String.class ); JSONObject responseJson = JSONObject.parseObject(responseStr); return responseJson; } }