Newer
Older
casic-metering-biz-xichang / casic-metering-common / src / main / java / com / casic / missiles / utils / ConstUtil.java
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;
    }
}