From 34de09b7eb5e1aa7cc03494b8ed82b49839454f4 Mon Sep 17 00:00:00 2001 From: 潘志宝 <979469083@qq.com> Date: 星期五, 25 四月 2025 17:24:14 +0800 Subject: [PATCH] 影响因数偏差值 表结构修改 --- ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingTraceModelGXJTask.java | 120 +++++---- ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingTraceModelHCTask.java | 89 +++++-- ansteel-biz/db/mysql.sql | 118 +++++---- ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingTraceModelBMTask.java | 84 +++++- ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/entity/CokingTraceDeviationEntity.java | 103 +++++++- ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingTraceModelLJTask.java | 103 +++++--- ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/dto/CokingTraceDeviationDTO.java | 67 ++++ 7 files changed, 473 insertions(+), 211 deletions(-) diff --git a/ansteel-biz/db/mysql.sql b/ansteel-biz/db/mysql.sql index 4874375..20d02e8 100644 --- a/ansteel-biz/db/mysql.sql +++ b/ansteel-biz/db/mysql.sql @@ -248,7 +248,7 @@ ADD COLUMN `cur_flag` int DEFAULT 0 COMMENT '无功返送(1:大于0是,-1:小于0是)'; ALTER TABLE `t_power_net_factor` - ADD COLUMN `node_code` varchar(50) NULL DEFAULT NULL COMMENT '节点编号'; + ADD COLUMN `node_code` varchar(50) NULL DEFAULT NULL COMMENT '节点编号'; -- ---------------------------- -- 电力功率因数-发电机组实时状态 @@ -518,14 +518,32 @@ `process` varchar(20) NULL DEFAULT NULL COMMENT '工序名称', `sug_obj` varchar(20) NULL DEFAULT NULL COMMENT '建议对象', `clock` varchar(20) NULL DEFAULT NULL COMMENT '查询时间', - `group_name` varchar(20) NULL DEFAULT NULL COMMENT '分组名称', - `ind_name` varchar(20) NULL DEFAULT NULL COMMENT '指标名称', - `ind_value` varchar(20) NULL DEFAULT NULL COMMENT '偏差值', - `ind_unit` varchar(20) NULL DEFAULT NULL COMMENT '单位', + `ind1_name` varchar(20) NULL DEFAULT NULL COMMENT '一级指标-偏差值-名称', + `ind1_value` varchar(20) NULL DEFAULT NULL COMMENT '一级指标-偏差值-值', + `ind1_unit` varchar(20) NULL DEFAULT NULL COMMENT '一级指标-偏差值-单位', + `ind2_name` varchar(20) NULL DEFAULT NULL COMMENT '二级指标-偏差值-名称', + `ind2_value` varchar(20) NULL DEFAULT NULL COMMENT '二级指标-偏差值-值', + `ind2_unit` varchar(20) NULL DEFAULT NULL COMMENT '二级指标-偏差值-单位', + `fac1_name` varchar(20) NULL DEFAULT NULL COMMENT '影响因素1-偏差值-名称', + `fac1_value` varchar(20) NULL DEFAULT NULL COMMENT '影响因素1-偏差值-值', + `fac1_unit` varchar(20) NULL DEFAULT NULL COMMENT '影响因素1-偏差值-单位', + `fac2_name` varchar(20) NULL DEFAULT NULL COMMENT '影响因素2-偏差值-名称', + `fac2_value` varchar(20) NULL DEFAULT NULL COMMENT '影响因素2-偏差值-值', + `fac2_unit` varchar(20) NULL DEFAULT NULL COMMENT '影响因素2-偏差值-单位', + `fac3_name` varchar(20) NULL DEFAULT NULL COMMENT '影响因素3-偏差值-名称', + `fac3_value` varchar(20) NULL DEFAULT NULL COMMENT '影响因素3-偏差值-值', + `fac3_unit` varchar(20) NULL DEFAULT NULL COMMENT '影响因素4-偏差值-单位', + `fac4_name` varchar(20) NULL DEFAULT NULL COMMENT '影响因素4-偏差值-名称', + `fac4_value` varchar(20) NULL DEFAULT NULL COMMENT '影响因素4-偏差值-值', + `fac4_unit` varchar(20) NULL DEFAULT NULL COMMENT '影响因素4-偏差值-单位', + `fac5_name` varchar(20) NULL DEFAULT NULL COMMENT '影响因素5-偏差值-名称', + `fac5_value` varchar(20) NULL DEFAULT NULL COMMENT '影响因素5-偏差值-值', + `fac5_unit` varchar(20) NULL DEFAULT NULL COMMENT '影响因素5-偏差值-单位', `create_date` datetime COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE, key idx_clock (clock) ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC COMMENT '焦化工序影响因数偏差值'; + -- ---------------------------- -- 焦化工序-异常溯源折线图 @@ -553,16 +571,16 @@ DROP TABLE IF EXISTS `t_coking_trace_data`; CREATE TABLE `t_coking_trace_data` ( - `id` varchar(36) NOT NULL COMMENT 'id', - `rel_id` varchar(36) NULL DEFAULT NULL COMMENT '关联ID', + `id` varchar(36) NOT NULL COMMENT 'id', + `rel_id` varchar(36) NULL DEFAULT NULL COMMENT '关联ID', `process` varchar(20) NULL DEFAULT NULL COMMENT '工序名称', - `ex_obj` varchar(20) NULL DEFAULT NULL COMMENT '异常对象', + `ex_obj` varchar(20) NULL DEFAULT NULL COMMENT '异常对象', `clock` varchar(20) NULL DEFAULT NULL COMMENT '查询时间', - `data_type` varchar(20) NULL DEFAULT NULL COMMENT '数据类型', - `point_no` varchar(20) NULL DEFAULT NULL COMMENT '异常点位编号', - `point_name` varchar(20) NULL DEFAULT NULL COMMENT '异常点位名称', - `ex_time` datetime NULL DEFAULT NULL COMMENT '异常时间', - `ex_type` varchar(200) NULL DEFAULT NULL COMMENT '异常原因', + `data_type` varchar(20) NULL DEFAULT NULL COMMENT '数据类型', + `point_no` varchar(20) NULL DEFAULT NULL COMMENT '异常点位编号', + `point_name` varchar(20) NULL DEFAULT NULL COMMENT '异常点位名称', + `ex_time` datetime NULL DEFAULT NULL COMMENT '异常时间', + `ex_type` varchar(200) NULL DEFAULT NULL COMMENT '异常原因', `create_date` datetime COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE, key idx_rel_id (rel_id) @@ -572,31 +590,32 @@ -- 焦化工序-能耗整体情况 -- ---------------------------- DROP TABLE IF EXISTS `t_coking_overview`; -CREATE TABLE `t_coking_overview` ( - `id` varchar(36) COLLATE utf8mb4_general_ci NOT NULL COMMENT 'id', - `rel_id` varchar(36) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '关联ID', - `process_type` varchar(20) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '工序类型', - `sub_process_type` varchar(20) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '子工序类型', - `clock` varchar(20) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '查询时间', - `steam_p` decimal(10,4) DEFAULT NULL COMMENT '蒸汽发生', - `dj_steam_p` decimal(10,4) DEFAULT NULL COMMENT '吨焦产蒸汽', - `steam_c` decimal(10,4) DEFAULT NULL COMMENT '蒸汽消耗', - `steam_only_c` decimal(10,4) DEFAULT NULL COMMENT '蒸汽单耗', - `steam_v` decimal(10,4) DEFAULT NULL COMMENT '蒸汽量', - `gas_p` decimal(10,4) DEFAULT NULL COMMENT '煤气发生', - `gas_c` decimal(10,4) DEFAULT NULL COMMENT '煤气消耗', - `power_c` decimal(10,4) DEFAULT NULL COMMENT '电力消耗', - `power_only_c` decimal(10,4) DEFAULT NULL COMMENT '电力单耗', - `power_c_standard` decimal(10,4) DEFAULT NULL COMMENT '电耗基准', - `idle_time` decimal(10,4) DEFAULT NULL COMMENT '空转时间', - `bfg_c` decimal(10,4) DEFAULT NULL COMMENT 'BFG消耗', - `cog_p` decimal(10,4) DEFAULT NULL COMMENT 'COG回收', - `cog_c` decimal(10,4) DEFAULT NULL COMMENT 'COG消耗', - `bfg_only_c` decimal(10,4) DEFAULT NULL COMMENT 'BFG单耗', - `cog_only_c` decimal(10,4) DEFAULT NULL COMMENT 'COG单耗', - PRIMARY KEY (`id`) USING BTREE, - UNIQUE KEY `process_type_clock_unique` (`process_type`,`sub_process_type`,`clock`), - KEY `idx_rel_id` (`rel_id`) +CREATE TABLE `t_coking_overview` +( + `id` varchar(36) COLLATE utf8mb4_general_ci NOT NULL COMMENT 'id', + `rel_id` varchar(36) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '关联ID', + `process_type` varchar(20) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '工序类型', + `sub_process_type` varchar(20) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '子工序类型', + `clock` varchar(20) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '查询时间', + `steam_p` decimal(10, 4) DEFAULT NULL COMMENT '蒸汽发生', + `dj_steam_p` decimal(10, 4) DEFAULT NULL COMMENT '吨焦产蒸汽', + `steam_c` decimal(10, 4) DEFAULT NULL COMMENT '蒸汽消耗', + `steam_only_c` decimal(10, 4) DEFAULT NULL COMMENT '蒸汽单耗', + `steam_v` decimal(10, 4) DEFAULT NULL COMMENT '蒸汽量', + `gas_p` decimal(10, 4) DEFAULT NULL COMMENT '煤气发生', + `gas_c` decimal(10, 4) DEFAULT NULL COMMENT '煤气消耗', + `power_c` decimal(10, 4) DEFAULT NULL COMMENT '电力消耗', + `power_only_c` decimal(10, 4) DEFAULT NULL COMMENT '电力单耗', + `power_c_standard` decimal(10, 4) DEFAULT NULL COMMENT '电耗基准', + `idle_time` decimal(10, 4) DEFAULT NULL COMMENT '空转时间', + `bfg_c` decimal(10, 4) DEFAULT NULL COMMENT 'BFG消耗', + `cog_p` decimal(10, 4) DEFAULT NULL COMMENT 'COG回收', + `cog_c` decimal(10, 4) DEFAULT NULL COMMENT 'COG消耗', + `bfg_only_c` decimal(10, 4) DEFAULT NULL COMMENT 'BFG单耗', + `cog_only_c` decimal(10, 4) DEFAULT NULL COMMENT 'COG单耗', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `process_type_clock_unique` (`process_type`,`sub_process_type`,`clock`), + KEY `idx_rel_id` (`rel_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='工序概况情况'; -- ---------------------------- @@ -637,20 +656,21 @@ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='月最大需量,实测需量,有功功率'; ALTER TABLE `t_power_demand` - ADD COLUMN `code` varchar(50) NULL DEFAULT NULL COMMENT '编号'; + ADD COLUMN `code` varchar(50) NULL DEFAULT NULL COMMENT '编号'; -CREATE UNIQUE INDEX `idx_code` ON t_power_demand(`code`); +CREATE UNIQUE INDEX `idx_code` ON t_power_demand (`code`); -- ---------------------------- -- 负荷移植-调整后的功率因数与无功倒送量 -- ---------------------------- -CREATE TABLE `t_power_adjusted_factor` ( - `id` varchar(36) NOT NULL, - `code` varchar(50) DEFAULT NULL COMMENT '编码', - `name` varchar(50) DEFAULT NULL COMMENT '名称', - `data_type` varchar(20) NULL DEFAULT NULL COMMENT '数据类型', - `point_no` varchar(50) DEFAULT NULL COMMENT '点位', - `sort` varchar(50) DEFAULT NULL COMMENT '排序', - PRIMARY KEY (`id`), - UNIQUE key uk_code (code) +CREATE TABLE `t_power_adjusted_factor` +( + `id` varchar(36) NOT NULL, + `code` varchar(50) DEFAULT NULL COMMENT '编码', + `name` varchar(50) DEFAULT NULL COMMENT '名称', + `data_type` varchar(20) NULL DEFAULT NULL COMMENT '数据类型', + `point_no` varchar(50) DEFAULT NULL COMMENT '点位', + `sort` varchar(50) DEFAULT NULL COMMENT '排序', + PRIMARY KEY (`id`), + UNIQUE key uk_code (code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='调整后的功率因数与无功倒送量'; \ No newline at end of file diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/dto/CokingTraceDeviationDTO.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/dto/CokingTraceDeviationDTO.java index 2014f4e..33f807f 100644 --- a/ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/dto/CokingTraceDeviationDTO.java +++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/dto/CokingTraceDeviationDTO.java @@ -33,17 +33,68 @@ @Schema(description = "查询时间") private String clock; - @Schema(description = "分组名称") - private String groupName; + @Schema(description = "一级指标-偏差值-名称") + private String ind1Name; - @Schema(description = "指标名称") - private String indName; + @Schema(description = "一级指标-偏差值-值") + private String ind1Value; - @Schema(description = "偏差值") - private String indValue; + @Schema(description = "一级指标-偏差值-单位") + private String ind1Unit; - @Schema(description = "单位") - private String indUnit; + @Schema(description = "二级指标-偏差值-名称") + private String ind2Name; + + @Schema(description = "二级指标-偏差值-值") + private String ind2Value; + + @Schema(description = "二级指标-偏差值-单位") + private String ind2Unit; + + @Schema(description = "影响因素1-偏差值-名称") + private String fac1Name; + + @Schema(description = "影响因素1-偏差值-值") + private String fac1Value; + + @Schema(description = "影响因素1-偏差值-单位") + private String fac1Unit; + + @Schema(description = "影响因素2-偏差值-名称") + private String fac2Name; + + @Schema(description = "影响因素2-偏差值-值") + private String fac2Value; + + @Schema(description = "影响因素2-偏差值-单位") + private String fac2Unit; + + @Schema(description = "影响因素3-偏差值-名称") + private String fac3Name; + + @Schema(description = "影响因素3-偏差值-值") + private String fac3Value; + + @Schema(description = "影响因素3-偏差值-单位") + private String fac3Unit; + + @Schema(description = "影响因素4-偏差值-名称") + private String fac4Name; + + @Schema(description = "影响因素4-偏差值-值") + private String fac4Value; + + @Schema(description = "影响因素4-偏差值-单位") + private String fac4Unit; + + @Schema(description = "影响因素5-偏差值-名称") + private String fac5Name; + + @Schema(description = "影响因素5-偏差值-值") + private String fac5Value; + + @Schema(description = "影响因素5-偏差值-单位") + private String fac5Unit; @Schema(description = "创建时间") private Date createDate; diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/entity/CokingTraceDeviationEntity.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/entity/CokingTraceDeviationEntity.java index 32fab94..cac87a7 100644 --- a/ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/entity/CokingTraceDeviationEntity.java +++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/entity/CokingTraceDeviationEntity.java @@ -18,15 +18,15 @@ public class CokingTraceDeviationEntity { @TableId(type = IdType.ASSIGN_UUID) - private String id; + private String id; /** * 关联ID */ - private String relId; + private String relId; /** * 工序名称 */ - private String process; + private String process; /** * 建议对象 */ @@ -34,25 +34,102 @@ /** * 查询时间 */ - private String clock; + private String clock; /** - * 分组名称 + * 一级指标-偏差值-名称 */ - private String groupName; + private String ind1Name; /** - * 指标名称 + * 一级指标-偏差值-值 */ - private String indName; + private String ind1Value; /** - * 偏差值 + * 一级指标-偏差值-单位 */ - private String indValue; + private String ind1Unit; + + /** - * 单位 + * 二级指标-偏差值-名称 */ - private String indUnit; + private String ind2Name; + /** + * 二级指标-偏差值-值 + */ + private String ind2Value; + /** + * 二级指标-偏差值-单位 + */ + private String ind2Unit; + + /** + * 影响因素1-偏差值-名称 + */ + private String fac1Name; + /** + * 影响因素1-偏差值-值 + */ + private String fac1Value; + /** + * 影响因素1-偏差值-单位 + */ + private String fac1Unit; + + /** + * 影响因素2-偏差值-名称 + */ + private String fac2Name; + /** + * 影响因素2-偏差值-值 + */ + private String fac2Value; + /** + * 影响因素2-偏差值-单位 + */ + private String fac2Unit; + + /** + * 影响因素3-偏差值-名称 + */ + private String fac3Name; + /** + * 影响因素3-偏差值-值 + */ + private String fac3Value; + /** + * 影响因素3-偏差值-单位 + */ + private String fac3Unit; + + /** + * 影响因素4-偏差值-名称 + */ + private String fac4Name; + /** + * 影响因素4-偏差值-值 + */ + private String fac4Value; + /** + * 影响因素4-偏差值-单位 + */ + private String fac4Unit; + + /** + * 影响因素5-偏差值-名称 + */ + private String fac5Name; + /** + * 影响因素5-偏差值-值 + */ + private String fac5Value; + /** + * 影响因素5-偏差值-单位 + */ + private String fac5Unit; + + /** * 创建时间 */ - private Date createDate; + private Date createDate; } \ No newline at end of file diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingTraceModelBMTask.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingTraceModelBMTask.java index c07ec92..d62de28 100644 --- a/ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingTraceModelBMTask.java +++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingTraceModelBMTask.java @@ -19,6 +19,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import java.util.*; import java.util.stream.Collectors; @@ -72,6 +73,8 @@ private final static String indType = "备煤工序异常溯源"; + private final static String coalRow = "coalRow"; + private static final HashMap<String, Object> coalColoumMap = new HashMap<String, Object>() {{ put("coalColoum0", "一级指标-偏差值"); put("coalColoum1", "二级指标-偏差值"); @@ -88,9 +91,9 @@ "\"coalPrepElecIndex\":[[0.8,0.73],[723,608],[1782,1782],[752,743],[729,783]],\n" + "\"coalPrepElecTotal1\":\"1#粉碎机耗电因粉碎机偏高增加220KW/h,经模型计算,建建议调整单班用煤量,预计可使粉碎机耗电量指标降低170KW/h\",\n" + "\"coalPrepElecTotal2\":\"1#粉碎机耗电量数据异常\",\n" + - "\"coalColoum0\":[[0,450],[0,137],[0,342]],\n" + - "\"coalColoum1\":[[2,306],[3,134],[1,142]],\n" + - "\"coalColoum2\":[[4,142],[4,132],[4,349]],\n" + + "\"coalRow0\":[[0,450],[0,137],[0,342]],\n" + + "\"coalRow1\":[[0,450],[3,134],[1,142]],\n" + + "\"coalRow2\":[[4,142],[4,132],[4,349]],\n" + "\"coalPrepElecHomePage\":[[50,42],[10,10]],\n" + "\"coalHomeIndex\":[[90.4,90.2],[80.3,78],[103,100],[280,270]],\n" + "\"coalIndexInfo\":\"2月18日甲班:备煤耗电异常\",\n" + @@ -190,27 +193,64 @@ public void saveTraceDeviation(String relId, String process, String clock, JSONObject result) { List<ChartParamDTO> list = mcsApi.getChartParamList(CommonConstant.COAL_INDEX_CHARTCODE); Map<String, String> steamIndexMaps = list.stream().collect(Collectors.toMap(ChartParamDTO::getParamCode, e -> e.getParamName())); - for (int i = 0; i <= 2; i++) { - String coalColoum = result.get("coalColoum" + i).toString(); - if (StringUtils.isNotBlank(coalColoum)) { - JSONArray responseArr = JSON.parseArray(coalColoum); - List<CokingTraceDeviationEntity> entityList = new ArrayList<>(); - for (int j = 0; j < responseArr.size(); j++) { - JSONArray element = JSON.parseArray(responseArr.get(j).toString()); - CokingTraceDeviationEntity deviationEntity = new CokingTraceDeviationEntity(); - deviationEntity.setRelId(relId); - deviationEntity.setProcess(process); - deviationEntity.setClock(clock); - deviationEntity.setSugObj(SugObj); - deviationEntity.setGroupName(coalColoumMap.get("coalColoum" + i).toString()); - deviationEntity.setIndName(steamIndexMaps.get(element.get(0).toString())); - deviationEntity.setIndValue(element.get(1).toString()); - deviationEntity.setCreateDate(new Date()); - entityList.add(deviationEntity); - } - cokingTraceDeviationService.save(entityList); + + List<String> coalRowKeys = new ArrayList<>(); + result.forEach((key, value) -> { + if (StringUtils.isBlank(key) && key.contains(coalRow)) { + coalRowKeys.add(key); } + + }); + + List<CokingTraceDeviationEntity> entityList = new ArrayList<>(); + for (String key : coalRowKeys) { + JSONArray rowArr = JSON.parseArray(result.get(key).toString()); + if (CollectionUtils.isEmpty(rowArr)) { + continue; + } + CokingTraceDeviationEntity entity = new CokingTraceDeviationEntity(); + entity.setRelId(relId); + entity.setProcess(process); + entity.setClock(clock); + entity.setSugObj(SugObj); + + entity.setInd1Name(steamIndexMaps.get(rowArr.getJSONArray(0).get(0).toString())); + entity.setInd1Value(rowArr.getJSONArray(0).get(1).toString()); + entity.setInd1Unit(""); + + entity.setInd2Name(steamIndexMaps.get(rowArr.getJSONArray(1).get(0).toString())); + entity.setInd2Value(rowArr.getJSONArray(1).get(1).toString()); + entity.setInd2Unit(""); + + if (rowArr.size() > 2) { + entity.setFac1Name(steamIndexMaps.get(rowArr.getJSONArray(2).get(0).toString())); + entity.setFac1Value(rowArr.getJSONArray(2).get(1).toString()); + entity.setFac1Unit(""); + } + if (rowArr.size() > 3) { + entity.setFac2Name(steamIndexMaps.get(rowArr.getJSONArray(3).get(0).toString())); + entity.setFac2Value(rowArr.getJSONArray(3).get(1).toString()); + entity.setFac2Unit(""); + } + if (rowArr.size() > 4) { + entity.setFac3Name(steamIndexMaps.get(rowArr.getJSONArray(4).get(0).toString())); + entity.setFac3Value(rowArr.getJSONArray(4).get(1).toString()); + entity.setFac3Unit(""); + } + if (rowArr.size() > 5) { + entity.setFac4Name(steamIndexMaps.get(rowArr.getJSONArray(5).get(0).toString())); + entity.setFac4Value(rowArr.getJSONArray(5).get(1).toString()); + entity.setFac4Unit(""); + } + if (rowArr.size() > 6) { + entity.setFac5Name(steamIndexMaps.get(rowArr.getJSONArray(6).get(0).toString())); + entity.setFac5Value(rowArr.getJSONArray(6).get(1).toString()); + entity.setFac5Unit(""); + } + entityList.add(entity); } + + cokingTraceDeviationService.save(entityList); } public void saveAnalyInd(String relId, String process, String analyDate, String analyClass, String analyContent) { diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingTraceModelGXJTask.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingTraceModelGXJTask.java index e7bed8b..423463e 100644 --- a/ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingTraceModelGXJTask.java +++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingTraceModelGXJTask.java @@ -19,6 +19,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import java.util.*; import java.util.stream.Collectors; @@ -51,22 +52,16 @@ private CokingTraceIndService cokingTraceIndService; @Autowired - private CokingTraceConfService cokingTraceConfService; - - @Autowired private McsApi mcsApi; - - @Autowired - private DataPointApi dataPointApi; - - @Autowired - private IndItemApi indItemApi; private final static String process = "干熄焦工序"; private final static String reportName = "干熄焦工序异常溯源"; private final static String indType = "干熄焦工序异常溯源"; + + private final static String steamRow = "steamRow"; + private static final HashMap<String, Object> steamFirstColoumMap = new HashMap<String, Object>() {{ put("steamFirstColoum0", "一级指标-偏差值"); put("steamFirstColoum1", "二级指标-偏差值"); @@ -88,12 +83,12 @@ private static final String jsonStr="{\"result\":{" + " \"steamTotal1\":\"2#干熄焦蒸汽发生量因空气导入量偏高、锅炉入口温度偏低而减少13t,经模型计算,建议调整空气导入量,预计可使主蒸汽流量指标升高20m3/h\",\n" + " \"steamTotal2\":\"2#干熄焦蒸汽发生量因空气导入量偏高、锅炉入口温度偏低而减少13m3/h,经模型计算,建议调整循环风机转速,预计可使主蒸汽流量指标升高32m3/h\",\n" + - " \"steamFirstColoum0\":[[14,20],[14,30],[14,35]],\n" + - " \"steamFirstColoum1\":[[10,5],[11,15],[21,20]],\n" + - " \"steamFirstColoum2\":[[74,8],[36,18],[35,34]],\n" + - " \"steamFirstColoum3\":[[24,67],[6,12],[19,21]],\n" + - " \"steamFirstColoum4\":[[21,19],[22,31],[8,42]],\n" + - " \"steamFirstColoum5\":[[11,45],[9,62],[18,34]],\n" + + " \"steamRow0\":[[14,20],[14,30],[14,35]],\n" + + " \"steamRow1\":[[10,5],[11,15],[21,20]],\n" + + " \"steamRow2\":[[74,8],[36,18],[35,34]],\n" + + " \"steamRow3\":[[24,67],[6,12],[19,21]],\n" + + " \"steamRow4\":[[21,19],[22,31],[8,42]],\n" + + " \"steamRow5\":[[11,45],[9,62],[18,34]],\n" + " \"steamSecondColoum0\":[[14,20],[14,50],[14,13]],\n" + " \"steamSecondColoum1\":[[11,27],[10,35],[22,16]],\n" + " \"steamSecondColoum2\":[[36,90],[35,34],[74,55]],\n" + @@ -196,51 +191,66 @@ @Transactional public void saveTraceDeviation(String relId, String process, String clock, JSONObject result) { - List<ChartParamDTO> list = mcsApi.getChartParamList(CommonConstant.STEAM_INDEX_CHARTCODE); + List<ChartParamDTO> list = mcsApi.getChartParamList(CommonConstant.COAL_INDEX_CHARTCODE); Map<String, String> steamIndexMaps = list.stream().collect(Collectors.toMap(ChartParamDTO::getParamCode, e -> e.getParamName())); - for(int i=0;i<=5;i++){ - String steamFirstColoum = result.get("steamFirstColoum"+i).toString(); - if(StringUtils.isNotBlank(steamFirstColoum)){ - JSONArray responseArr = JSON.parseArray(steamFirstColoum); - List<CokingTraceDeviationEntity> entityList = new ArrayList<>(); - for (int j = 0; j < responseArr.size(); j++) { - JSONArray element = JSON.parseArray(responseArr.get(j).toString()); - CokingTraceDeviationEntity deviationEntity = new CokingTraceDeviationEntity(); - deviationEntity.setRelId(relId); - deviationEntity.setProcess(process); - deviationEntity.setClock(clock); - deviationEntity.setSugObj("1#"); - deviationEntity.setGroupName(steamFirstColoumMap.get("steamFirstColoum"+i).toString()); - deviationEntity.setIndName(steamIndexMaps.get(element.get(0).toString())); - deviationEntity.setIndValue(element.get(1).toString()); - deviationEntity.setCreateDate(new Date()); - entityList.add(deviationEntity); - } - cokingTraceDeviationService.save(entityList); + + List<String> coalRowKeys = new ArrayList<>(); + result.forEach((key, value) -> { + if (StringUtils.isBlank(key) && key.contains(steamRow)) { + coalRowKeys.add(key); } - } - for(int i=0;i<=5;i++){ - String steamSecondColoum = result.get("steamSecondColoum"+i).toString(); - if(StringUtils.isNotBlank(steamSecondColoum)){ - JSONArray responseArr = JSON.parseArray(steamSecondColoum); - List<CokingTraceDeviationEntity> entityList = new ArrayList<>(); - for (int j = 0; j < responseArr.size(); j++) { - JSONArray element = JSON.parseArray(responseArr.get(j).toString()); - CokingTraceDeviationEntity deviationEntity = new CokingTraceDeviationEntity(); - deviationEntity.setRelId(relId); - deviationEntity.setProcess(process); - deviationEntity.setClock(clock); - deviationEntity.setSugObj("2#"); - deviationEntity.setGroupName(steamSecondColoumMap.get("steamSecondColoum" + i).toString()); - deviationEntity.setIndName(steamIndexMaps.get(element.get(0).toString())); - deviationEntity.setIndValue(element.get(1).toString()); - deviationEntity.setCreateDate(new Date()); - entityList.add(deviationEntity); - } - cokingTraceDeviationService.save(entityList); + + }); + + List<CokingTraceDeviationEntity> entityList = new ArrayList<>(); + for (String key : coalRowKeys) { + JSONArray rowArr = JSON.parseArray(result.get(key).toString()); + if (CollectionUtils.isEmpty(rowArr)) { + continue; } + CokingTraceDeviationEntity entity = new CokingTraceDeviationEntity(); + entity.setRelId(relId); + entity.setProcess(process); + entity.setClock(clock); + entity.setSugObj(""); + + entity.setInd1Name(steamIndexMaps.get(rowArr.getJSONArray(0).get(0).toString())); + entity.setInd1Value(rowArr.getJSONArray(0).get(1).toString()); + entity.setInd1Unit(""); + + entity.setInd2Name(steamIndexMaps.get(rowArr.getJSONArray(1).get(0).toString())); + entity.setInd2Value(rowArr.getJSONArray(1).get(1).toString()); + entity.setInd2Unit(""); + + if (rowArr.size() > 2) { + entity.setFac1Name(steamIndexMaps.get(rowArr.getJSONArray(2).get(0).toString())); + entity.setFac1Value(rowArr.getJSONArray(2).get(1).toString()); + entity.setFac1Unit(""); + } + if (rowArr.size() > 3) { + entity.setFac2Name(steamIndexMaps.get(rowArr.getJSONArray(3).get(0).toString())); + entity.setFac2Value(rowArr.getJSONArray(3).get(1).toString()); + entity.setFac2Unit(""); + } + if (rowArr.size() > 4) { + entity.setFac3Name(steamIndexMaps.get(rowArr.getJSONArray(4).get(0).toString())); + entity.setFac3Value(rowArr.getJSONArray(4).get(1).toString()); + entity.setFac3Unit(""); + } + if (rowArr.size() > 5) { + entity.setFac4Name(steamIndexMaps.get(rowArr.getJSONArray(5).get(0).toString())); + entity.setFac4Value(rowArr.getJSONArray(5).get(1).toString()); + entity.setFac4Unit(""); + } + if (rowArr.size() > 6) { + entity.setFac5Name(steamIndexMaps.get(rowArr.getJSONArray(6).get(0).toString())); + entity.setFac5Value(rowArr.getJSONArray(6).get(1).toString()); + entity.setFac5Unit(""); + } + entityList.add(entity); } + cokingTraceDeviationService.save(entityList); } public void saveAnalyInd(String relId, String process, String analyDate, String analyClass, String analyContent) { diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingTraceModelHCTask.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingTraceModelHCTask.java index b62563e..07e4cb6 100644 --- a/ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingTraceModelHCTask.java +++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingTraceModelHCTask.java @@ -7,10 +7,6 @@ import com.iailab.module.ansteel.coking.entity.*; import com.iailab.module.ansteel.coking.service.*; import com.iailab.module.ansteel.common.constant.CommonConstant; -import com.iailab.module.ansteel.common.enums.ProcessConfDataTypeEnum; -import com.iailab.module.data.api.ind.IndItemApi; -import com.iailab.module.data.api.ind.dto.ApiIndItemValueDTO; -import com.iailab.module.data.api.point.DataPointApi; import com.iailab.module.model.api.mcs.McsApi; import com.iailab.module.model.api.mcs.dto.ChartParamDTO; import org.apache.commons.lang3.StringUtils; @@ -64,6 +60,8 @@ private final static String indType = "化产工序异常溯源"; + private final static String chemProdRow = "chemProdRow"; + private static final HashMap<String, Object> chemProdColoumMap = new HashMap<String, Object>() {{ put("chemProdFirstColoum0", "一级指标-偏差值"); put("chemProdFirstColoum1", "二级指标-偏差值"); @@ -82,9 +80,9 @@ "\"chemProdSteam\":[[33836,33925]], \n" + "\"chemProdIndex\":[[352,355],[68,66.3],[82.5,87.6],[50.7,56.5],[73.5,73.1]],\n" + "\"chemProdTotal\":\"蒸汽消耗量异常,当前值1342,经模型计算,指标1异常,当前值1342,建议调整指标1至区间[90,110],指标2异常,当前值1342,建议调整指标2至区间[50,80]\",\n" + - "\"chemProdFirstColoum0\":[[0,42]],\n" + " " + - "\"chemProdFirstColoum1\":[[5,1342],[7,1342],[9,1342]],\n" + - "\"chemProdFirstColoum2\":[[5,10,1342],[5,16,1342],[7,18,1342]],\n" + + "\"chemProdRow0\":[[0,42]],\n" + " " + + "\"chemProdRow1\":[[5,1342],[7,1342],[9,1342]],\n" + + "\"chemProdRow2\":[[5,10,1342],[5,16,1342],[7,18,1342]],\n" + "\"chemProdHomePage\":[[9,1342],[9,1342]],\n" + "\"chemProdHomeIndex\":[[90.4,90.2],[80.3,78],[103,100],[280,270]],\n" + "\"chemProdHomeIndexInfo\":\"2月18日甲班:化产蒸汽消耗量异常\",\n" + @@ -181,29 +179,66 @@ @Transactional public void saveTraceDeviation(String relId, String process, String clock, JSONObject result) { - List<ChartParamDTO> list = mcsApi.getChartParamList(CommonConstant.CHEMPROD_INDEX_CHARTCODE); + List<ChartParamDTO> list = mcsApi.getChartParamList(CommonConstant.COAL_INDEX_CHARTCODE); Map<String, String> steamIndexMaps = list.stream().collect(Collectors.toMap(ChartParamDTO::getParamCode, e -> e.getParamName())); - for (int i = 0; i <= 2; i++) { - String chemProdFirstColoum = result.get("chemProdFirstColoum" + i).toString(); - if (StringUtils.isNotBlank(chemProdFirstColoum)) { - JSONArray responseArr = JSON.parseArray(chemProdFirstColoum); - List<CokingTraceDeviationEntity> cokingTraceDeviationEntities = new ArrayList<>(); - for (int j = 0; j < responseArr.size(); j++) { - JSONArray element = JSON.parseArray(responseArr.get(j).toString()); - CokingTraceDeviationEntity deviationEntity = new CokingTraceDeviationEntity(); - deviationEntity.setRelId(relId); - deviationEntity.setProcess(process); - deviationEntity.setClock(clock); - deviationEntity.setSugObj(SugObj); - deviationEntity.setGroupName(chemProdColoumMap.get("chemProdFirstColoum" + i).toString()); - deviationEntity.setIndName(steamIndexMaps.get(element.get(0).toString())); - deviationEntity.setIndValue(element.get(1).toString()); - deviationEntity.setCreateDate(new Date()); - cokingTraceDeviationEntities.add(deviationEntity); - } - cokingTraceDeviationService.save(cokingTraceDeviationEntities); + + List<String> coalRowKeys = new ArrayList<>(); + result.forEach((key, value) -> { + if (StringUtils.isBlank(key) && key.contains(chemProdRow)) { + coalRowKeys.add(key); } + + }); + + List<CokingTraceDeviationEntity> entityList = new ArrayList<>(); + for (String key : coalRowKeys) { + JSONArray rowArr = JSON.parseArray(result.get(key).toString()); + if (CollectionUtils.isEmpty(rowArr)) { + continue; + } + CokingTraceDeviationEntity entity = new CokingTraceDeviationEntity(); + entity.setRelId(relId); + entity.setProcess(process); + entity.setClock(clock); + entity.setSugObj(SugObj); + + entity.setInd1Name(steamIndexMaps.get(rowArr.getJSONArray(0).get(0).toString())); + entity.setInd1Value(rowArr.getJSONArray(0).get(1).toString()); + entity.setInd1Unit(""); + + entity.setInd2Name(steamIndexMaps.get(rowArr.getJSONArray(1).get(0).toString())); + entity.setInd2Value(rowArr.getJSONArray(1).get(1).toString()); + entity.setInd2Unit(""); + + if (rowArr.size() > 2) { + entity.setFac1Name(steamIndexMaps.get(rowArr.getJSONArray(2).get(0).toString())); + entity.setFac1Value(rowArr.getJSONArray(2).get(1).toString()); + entity.setFac1Unit(""); + } + if (rowArr.size() > 3) { + entity.setFac2Name(steamIndexMaps.get(rowArr.getJSONArray(3).get(0).toString())); + entity.setFac2Value(rowArr.getJSONArray(3).get(1).toString()); + entity.setFac2Unit(""); + } + if (rowArr.size() > 4) { + entity.setFac3Name(steamIndexMaps.get(rowArr.getJSONArray(4).get(0).toString())); + entity.setFac3Value(rowArr.getJSONArray(4).get(1).toString()); + entity.setFac3Unit(""); + } + if (rowArr.size() > 5) { + entity.setFac4Name(steamIndexMaps.get(rowArr.getJSONArray(5).get(0).toString())); + entity.setFac4Value(rowArr.getJSONArray(5).get(1).toString()); + entity.setFac4Unit(""); + } + if (rowArr.size() > 6) { + entity.setFac5Name(steamIndexMaps.get(rowArr.getJSONArray(6).get(0).toString())); + entity.setFac5Value(rowArr.getJSONArray(6).get(1).toString()); + entity.setFac5Unit(""); + } + entityList.add(entity); } + + cokingTraceDeviationService.save(entityList); } public void saveAnalyInd(String relId, String process, String analyDate, String analyClass, String analyContent) { diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingTraceModelLJTask.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingTraceModelLJTask.java index 46e165f..eb85583 100644 --- a/ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingTraceModelLJTask.java +++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingTraceModelLJTask.java @@ -9,8 +9,6 @@ import com.iailab.module.ansteel.coking.entity.CokingTraceSuggestEntity; import com.iailab.module.ansteel.coking.service.*; import com.iailab.module.ansteel.common.constant.CommonConstant; -import com.iailab.module.data.api.ind.IndItemApi; -import com.iailab.module.data.api.point.DataPointApi; import com.iailab.module.model.api.mcs.McsApi; import com.iailab.module.model.api.mcs.dto.ChartParamDTO; import org.apache.commons.lang3.StringUtils; @@ -19,6 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import java.util.*; import java.util.stream.Collectors; @@ -50,19 +49,10 @@ private CokingTraceIndService cokingTraceIndService; @Autowired - private CokingTraceConfService cokingTraceConfService; - - @Autowired private CokingTraceChartService cokingTraceChartService; @Autowired private McsApi mcsApi; - - @Autowired - private DataPointApi dataPointApi; - - @Autowired - private IndItemApi indItemApi; private final static String process = "炼焦工序"; @@ -71,6 +61,8 @@ private final static String SugObj = "LJ"; private final static String indType = "炼焦工序异常溯源"; + + private final static String cokeRow = "cokeRow"; private static final HashMap<String, Object> cokeColoumMap = new HashMap<String, Object>() {{ put("cokeColoum0", "一级指标-偏差值"); @@ -92,12 +84,12 @@ "\"cokeHeat\":[3.7,3.8],\n" + " " + "\"cokeIndex\":[[0.8,0.7],[608,608],[1440,1460],[1346,1293],[0.8,0.7],[1372,1293]],\n" + " " + "\"cokeTotal\":\"炼焦吨焦耗热量因煤气流量偏高、煤气水分偏低而增加23,经模型计算,延建议调整煤气流量,预计可使吨焦耗热量指标降低17\",\n" + " " + - "\"cokeColoum0\":[[0,13],[0,42],[0,34]],\n" + " " + - "\"cokeColoum1\":[[13,12],[12,34],[24,42]],\n" + " " + - "\"cokeColoum2\":[[27,45],[58,42],[70,31]],\n" + " " + - "\"cokeColoum3\":[[108,56],[110,89],[185,21]],\n" + " " + - "\"cokeColoum4\":[[199,13],[200,51],[197,34]],\n" + " " + - "\"cokeColoum5\":[[147,33],[131,12],[122,13]],\n" + " " + + "\"cokeRow0\":[[0,13],[0,42],[0,34]],\n" + " " + + "\"cokeRow1\":[[13,12],[12,34],[24,42]],\n" + " " + + "\"cokeRow2\":[[27,45],[58,42],[70,31]],\n" + " " + + "\"cokeRow3\":[[108,56],[110,89],[185,21]],\n" + " " + + "\"cokeRow4\":[[199,13],[200,51],[197,34]],\n" + " " + + "\"cokeRow5\":[[147,33],[131,12],[122,13]],\n" + " " + "\"cokeHomePage\":[[202,42],[203,13],[204,45],[205,34],[206,17]],\n" + " " + "\"cokeHomeIndex\":[[90.4,90.2],[80.3,78],[103,100],[280,270]],\n" + " " + "\"cokeHomeIndexInfo\":\"2月18日甲班:吨焦耗热量异常\",\n" + " " + @@ -194,29 +186,66 @@ @Transactional public void saveTraceDeviation(String relId, String process, String clock, JSONObject result) { - List<ChartParamDTO> list = mcsApi.getChartParamList(CommonConstant.COKE_INDEX_CHARTCODE); + List<ChartParamDTO> list = mcsApi.getChartParamList(CommonConstant.COAL_INDEX_CHARTCODE); Map<String, String> steamIndexMaps = list.stream().collect(Collectors.toMap(ChartParamDTO::getParamCode, e -> e.getParamName())); - for (int i = 0; i <= 5; i++) { - String cokeColoum = result.get("cokeColoum" + i).toString(); - if (StringUtils.isNotBlank(cokeColoum)) { - JSONArray responseArr = JSON.parseArray(cokeColoum); - List<CokingTraceDeviationEntity> entityList = new ArrayList<>(); - for (int j = 0; j < responseArr.size(); j++) { - JSONArray element = JSON.parseArray(responseArr.get(j).toString()); - CokingTraceDeviationEntity deviationEntity = new CokingTraceDeviationEntity(); - deviationEntity.setRelId(relId); - deviationEntity.setProcess(process); - deviationEntity.setClock(clock); - deviationEntity.setSugObj(SugObj); - deviationEntity.setGroupName(cokeColoumMap.get("cokeColoum" + i).toString()); - deviationEntity.setIndName(steamIndexMaps.get(element.get(0).toString())); - deviationEntity.setIndValue(element.get(1).toString()); - deviationEntity.setCreateDate(new Date()); - entityList.add(deviationEntity); - } - cokingTraceDeviationService.save(entityList); + + List<String> coalRowKeys = new ArrayList<>(); + result.forEach((key, value) -> { + if (StringUtils.isBlank(key) && key.contains(cokeRow)) { + coalRowKeys.add(key); } + + }); + + List<CokingTraceDeviationEntity> entityList = new ArrayList<>(); + for (String key : coalRowKeys) { + JSONArray rowArr = JSON.parseArray(result.get(key).toString()); + if (CollectionUtils.isEmpty(rowArr)) { + continue; + } + CokingTraceDeviationEntity entity = new CokingTraceDeviationEntity(); + entity.setRelId(relId); + entity.setProcess(process); + entity.setClock(clock); + entity.setSugObj(SugObj); + + entity.setInd1Name(steamIndexMaps.get(rowArr.getJSONArray(0).get(0).toString())); + entity.setInd1Value(rowArr.getJSONArray(0).get(1).toString()); + entity.setInd1Unit(""); + + entity.setInd2Name(steamIndexMaps.get(rowArr.getJSONArray(1).get(0).toString())); + entity.setInd2Value(rowArr.getJSONArray(1).get(1).toString()); + entity.setInd2Unit(""); + + if (rowArr.size() > 2) { + entity.setFac1Name(steamIndexMaps.get(rowArr.getJSONArray(2).get(0).toString())); + entity.setFac1Value(rowArr.getJSONArray(2).get(1).toString()); + entity.setFac1Unit(""); + } + if (rowArr.size() > 3) { + entity.setFac2Name(steamIndexMaps.get(rowArr.getJSONArray(3).get(0).toString())); + entity.setFac2Value(rowArr.getJSONArray(3).get(1).toString()); + entity.setFac2Unit(""); + } + if (rowArr.size() > 4) { + entity.setFac3Name(steamIndexMaps.get(rowArr.getJSONArray(4).get(0).toString())); + entity.setFac3Value(rowArr.getJSONArray(4).get(1).toString()); + entity.setFac3Unit(""); + } + if (rowArr.size() > 5) { + entity.setFac4Name(steamIndexMaps.get(rowArr.getJSONArray(5).get(0).toString())); + entity.setFac4Value(rowArr.getJSONArray(5).get(1).toString()); + entity.setFac4Unit(""); + } + if (rowArr.size() > 6) { + entity.setFac5Name(steamIndexMaps.get(rowArr.getJSONArray(6).get(0).toString())); + entity.setFac5Value(rowArr.getJSONArray(6).get(1).toString()); + entity.setFac5Unit(""); + } + entityList.add(entity); } + + cokingTraceDeviationService.save(entityList); } public void saveAnalyInd(String relId, String process, String analyDate, String analyClass, String analyContent) { -- Gitblit v1.9.3