package com.estate.expert.admin.component.fuzzy; import com.estate.expert.admin.utils.json.CustomFloatDeserializer; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.exception.ExceptionUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.*; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; /** * 模糊层次分析法(FAHP)评估API调用组件 * *
该组件负责与外部模糊评估API进行通信,发送评估请求并处理响应结果。 * 主要用于建筑工程安全风险评估、多因素决策分析等场景。
* *主要功能:
*技术特点:
*用于发送HTTP请求到模糊评估API服务。 * Spring RestTemplate提供了便捷的HTTP客户端功能。
*/ RestTemplate restTemplate = new RestTemplate(); /** * 获取配置了自定义反序列化器的ObjectMapper * * @return 配置好的ObjectMapper实例 */ public static ObjectMapper getObjectMapper() { ObjectMapper mapper = new ObjectMapper(); // 允许非标准数值格式,如NaN、Infinity等 mapper.configure(JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS, true); SimpleModule module = new SimpleModule(); // 注册自定义Float反序列化器 module.addDeserializer(Float.class, new CustomFloatDeserializer()); mapper.registerModule(module); return mapper; } /** * 调用模糊评估API进行风险评估 * *该方法向远程模糊评估服务发送POST请求,传递评估参数并接收评估结果。 * 包含完整的错误处理和日志记录机制。
* *处理流程:
*异常处理:
*该方法演示了如何使用模糊评估API进行多因素综合风险评估。 * 适用于复杂的工程安全评估场景,如整个项目的综合安全风险评估。
* */ public static void main(String[] args) { // 创建模糊评估请求对象 FuzzyApiRequest bo = new FuzzyApiRequest(); FuzzyApiComponent component = new FuzzyApiComponent(); // 设置评估因素数量 bo.setN(18); // 设置评估因素名称数组 bo.setIndex(new String[]{"临时消防", "基坑工程", "悬挑式脚手架", "扣件式模板支架", "承插型钢管支模架", "文明施工", "施工机具", "施工用电", "有限空间作业", "盘扣式模板支架", "盘扣式落地钢管脚手架(双排、满堂)", "落地式扣件钢管脚手架(双排、满堂)", "轮扣式模板支架", "轮扣式落地钢管脚手架(双排、满堂)", "附着式升降脚手架", "附着式脚手架", "高处作业", "高处作业吊篮"}); // 设置隶属度矩阵(18×5) // 每行表示一个因素在5个风险等级上的隶属度分布 // 列含义:[可忽略风险, 低风险, 中等风险, 高风险, 不可接受风险] bo.setMembership_data(new float[][]{ {0.6917f, 0.2917f, 0.0166f, 0.0f, 0.0f}, // 临时消防 {0.6917f, 0.2917f, 0.0166f, 0.0f, 0.0f}, // 基坑工程 {0.6917f, 0.2917f, 0.0166f, 0.0f, 0.0f}, // 悬挑式脚手架 {0.6917f, 0.2917f, 0.0166f, 0.0f, 0.0f}, // 扣件式模板支架 {0.6917f, 0.2917f, 0.0166f, 0.0f, 0.0f}, // 承插型钢管支模架 {0.6917f, 0.2917f, 0.0166f, 0.0f, 0.0f}, // 文明施工 {0.6917f, 0.2917f, 0.0166f, 0.0f, 0.0f}, // 施工机具 {0.6917f, 0.2917f, 0.0166f, 0.0f, 0.0f}, // 施工用电 {0.6917f, 0.2917f, 0.0166f, 0.0f, 0.0f}, // 有限空间作业 {0.6917f, 0.2917f, 0.0166f, 0.0f, 0.0f}, // 盘扣式模板支架 {0.6917f, 0.2917f, 0.0166f, 0.0f, 0.0f}, // 盘扣式落地钢管脚手架(双排、满堂) {0.6917f, 0.2917f, 0.0166f, 0.0f, 0.0f}, // 落地式扣件钢管脚手架(双排、满堂) {0.6917f, 0.2917f, 0.0166f, 0.0f, 0.0f}, // 轮扣式模板支架 {0.6917f, 0.2917f, 0.0166f, 0.0f, 0.0f}, // 轮扣式落地钢管脚手架(双排、满堂) {0.6917f, 0.2917f, 0.0166f, 0.0f, 0.0f}, // 附着式升降脚手架 {0.6917f, 0.2917f, 0.0166f, 0.0f, 0.0f}, // 附着式脚手架 {0.6917f, 0.2917f, 0.0166f, 0.0f, 0.0f}, // 高处作业 {0.6917f, 0.2917f, 0.0166f, 0.0f, 0.0f} // 高处作业吊篮 }); // 设置两两比较矩阵(18×18) // 当前设置为所有因素同等重要(值为1.0) // 实际使用时需要根据专家判断设置不同的重要性比值 bo.setCompare_matrix_data(new float[][]{ {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}, {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}, {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}, {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}, {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}, {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}, {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}, {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}, {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}, {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}, {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}, {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}, {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}, {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}, {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}, {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}, {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}, {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f} }); // 设置专家数量 bo.setNum_experts(1); // 记录请求参数 log.info("模糊评估请求参数: {}", bo); // 调用模糊评估API var resp = component.call(bo); // 记录评估结果 log.info("模糊评估结果: {}", resp); } }