You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
281 lines
11 KiB
281 lines
11 KiB
CREATE OR REPLACE PROCEDURE "public"."pro_hot_water_run_param"("floor_id_in" varchar, "floor_id_1_in" varchar, "floor_id_2_in" varchar, "cur_time_in" varchar) |
|
AS $BODY$ |
|
DECLARE |
|
-- 变量声明(保持原有结构,默认值优化) |
|
temp_set_hot_pump_one NUMERIC(24,2) := 0; |
|
temp_real_hot_pump_one NUMERIC(24,2) := 0; |
|
status_switch_hot_pump_one INT := 0; |
|
status_run_hot_pump_one INT := 0; |
|
temp_set_hot_pump_two NUMERIC(24,2) := 0; |
|
temp_real_hot_pump_two NUMERIC(24,2) := 0; |
|
status_switch_hot_pump_two INT := 0; |
|
status_run_hot_pump_two INT := 0; |
|
temp_set_hot_pump_three NUMERIC(24,2) := 0; |
|
temp_real_hot_pump_three NUMERIC(24,2) := 0; |
|
status_switch_hot_pump_three INT := 0; |
|
status_run_hot_pump_three INT := 0; |
|
temp_set_hot_pump_four NUMERIC(24,2) := 0; |
|
temp_real_hot_pump_four NUMERIC(24,2) := 0; |
|
status_switch_hot_pump_four INT := 0; |
|
status_run_hot_pump_four INT := 0; |
|
pres_set_supply_pump_area_one NUMERIC(24,2) := 0; |
|
pres_real_supply_pump_area_one NUMERIC(24,2) := 0; |
|
status_run_supply_pump_one INT := 0; |
|
status_run_supply_pump_two INT := 0; |
|
pres_set_supply_pump_area_two NUMERIC(24,2) := 0; |
|
pres_real_supply_pump_area_two NUMERIC(24,2) := 0; |
|
status_run_supply_pump_three INT := 0; |
|
status_run_supply_pump_four INT := 0; |
|
level_water_tank_one NUMERIC(24,2) := 0; |
|
level_water_tank_two NUMERIC(24,2) := 0; |
|
|
|
is_exits INT := 0; |
|
register_address VARCHAR(50); |
|
other_name VARCHAR(50); |
|
value NUMERIC(24,2); |
|
mt_num varchar(20); |
|
|
|
-- 游标1:中区/中厨 |
|
base_param_1 CURSOR FOR |
|
select |
|
cpm.mt_num::VARCHAR, |
|
COALESCE(MAX(cpm.cur_value), 0)::NUMERIC(24,2) |
|
from |
|
collection_params_manage cpm |
|
left join device_ledger dl on |
|
cpm.device_ledger_id = dl.id |
|
left join cpm_space_relation csr on |
|
cpm.id = csr.cpm_id |
|
left join house_info hi on |
|
csr.house_id = hi.id |
|
where |
|
csr.floor_id = floor_id_2_in |
|
and cpm.system_type = '1' |
|
and cpm.is_use = 0 |
|
and hi.house_name is not null |
|
AND TO_CHAR(cpm.cur_time, 'YYYY-MM-DD HH24') = cur_time_in |
|
GROUP BY |
|
cpm.cur_time::DATE, |
|
cpm.mt_num; |
|
|
|
-- 游标2:高区/裙楼 |
|
base_param_2 CURSOR FOR |
|
select |
|
cpm.other_name::VARCHAR, |
|
cpm.mt_num::VARCHAR, |
|
COALESCE(MAX(cpm.cur_value), 0)::NUMERIC(24,2) |
|
from |
|
collection_params_manage cpm |
|
left join device_ledger dl on |
|
cpm.device_ledger_id = dl.id |
|
left join cpm_space_relation csr on |
|
cpm.id = csr.cpm_id |
|
left join house_info hi on |
|
csr.house_id = hi.id |
|
where |
|
csr.floor_id = floor_id_1_in |
|
and cpm.system_type = '1' |
|
and cpm.is_use = 0 |
|
and hi.house_name is not null |
|
AND TO_CHAR(cpm.cur_time, 'YYYY-MM-DD HH24') = cur_time_in |
|
GROUP BY |
|
cpm.other_name::VARCHAR, |
|
cpm.cur_time::DATE, |
|
cpm.mt_num; |
|
|
|
BEGIN |
|
-- ------------------------------ |
|
-- 4. 遍历游标获取寄存器参数(严格关闭游标)高区/裙楼 |
|
-- ------------------------------ |
|
OPEN base_param_1; |
|
BEGIN -- 游标操作的异常处理块 |
|
LOOP |
|
FETCH NEXT FROM base_param_1 INTO register_address, value; |
|
EXIT WHEN NOT FOUND; |
|
-- 根据寄存器地址映射参数值 |
|
case |
|
WHEN register_address in ('1VD04000','2VD04000') THEN pres_set_supply_pump_area_two := value; |
|
WHEN register_address in ('1VD01500','2VD01500') THEN pres_real_supply_pump_area_two := value; |
|
WHEN register_address in ('1I00007','2I00007') THEN status_run_supply_pump_three := value; |
|
WHEN register_address in ('1I00012','2I00012') THEN status_run_supply_pump_four := value; |
|
WHEN register_address in ('1VD09200','2VD09200') THEN level_water_tank_two := value; |
|
ELSE |
|
-- 记录未匹配的寄存器地址(新增) |
|
RAISE NOTICE '未匹配的寄存器地址(设备:%): %', floor_id_1_in, register_address; |
|
END CASE; |
|
END LOOP; |
|
EXCEPTION |
|
WHEN OTHERS THEN |
|
-- 游标异常时记录错误 |
|
RAISE NOTICE '游标遍历失败(设备:%): %', floor_id_1_in, SQLERRM; |
|
END; |
|
CLOSE base_param_1; -- 确保游标最终关闭 |
|
RAISE NOTICE '关闭游标'; |
|
|
|
-- ------------------------------ |
|
-- 4. 遍历游标获取寄存器参数(严格关闭游标)中区/中厨 |
|
-- ------------------------------ |
|
OPEN base_param_2; |
|
BEGIN |
|
LOOP |
|
FETCH NEXT FROM base_param_2 INTO other_name, register_address, value; |
|
EXIT WHEN NOT FOUND; |
|
|
|
CASE |
|
-- 合并判断条件(推荐写法) |
|
WHEN other_name in ('3号热泵温度设置','1号热泵温度设置') and register_address IN ('1', '3') THEN |
|
temp_set_hot_pump_one := value; |
|
|
|
WHEN other_name in ('3号热泵实际温度','1号热泵实际温度') and register_address IN ('1', '3') THEN |
|
temp_real_hot_pump_one := value; |
|
|
|
WHEN other_name in ('3号热泵启停控制','1号热泵启停控制') and register_address IN ('1', '3') THEN |
|
status_switch_hot_pump_one := CASE WHEN value > 1 THEN 1 ELSE 0 END; |
|
|
|
WHEN other_name in ('3号热泵电流1','1号热泵电流1') and register_address IN ('1', '3') THEN |
|
temp_real_hot_pump_one := CASE WHEN value > 1 THEN 1 ELSE 0 END; |
|
|
|
WHEN other_name in ('4号热泵温度设置','2号热泵温度设置') and register_address IN ('2', '4') THEN |
|
temp_set_hot_pump_two := value; |
|
|
|
WHEN other_name in ('4号热泵实际温度','2号热泵实际温度') and register_address IN ('2', '4') THEN |
|
temp_real_hot_pump_two := value; |
|
|
|
WHEN other_name in ('4号热泵启停控制','2号热泵启停控制') and register_address IN ('2', '4') THEN |
|
status_switch_hot_pump_two := CASE WHEN value > 1 THEN 1 ELSE 0 END; |
|
|
|
WHEN other_name in ('4号热泵电流1','2号热泵电流1') and register_address IN ('2', '4') THEN |
|
temp_real_hot_pump_two := CASE WHEN value > 1 THEN 1 ELSE 0 END; |
|
|
|
WHEN other_name in ('5号热泵温度设置') and register_address IN ('5') THEN |
|
temp_set_hot_pump_three := value; |
|
|
|
WHEN other_name in ('5号热泵实际温度') and register_address IN ('5') THEN |
|
temp_real_hot_pump_three := value; |
|
|
|
WHEN other_name in ('5号热泵启停控制') and register_address IN ('5') THEN |
|
status_switch_hot_pump_three := CASE WHEN value > 1 THEN 1 ELSE 0 END; |
|
|
|
WHEN other_name in ('5号热泵电流1') and register_address IN ('5') THEN |
|
temp_real_hot_pump_three := CASE WHEN value > 1 THEN 1 ELSE 0 END; |
|
|
|
WHEN other_name in ('6号热泵温度设置') and register_address IN ('6') THEN |
|
temp_set_hot_pump_four := value; |
|
|
|
WHEN other_name in ('6号热泵实际温度') and register_address IN ('6') THEN |
|
temp_real_hot_pump_four := value; |
|
|
|
WHEN other_name in ('6号热泵启停控制') and register_address IN ('6') THEN |
|
status_switch_hot_pump_four := CASE WHEN value > 1 THEN 1 ELSE 0 END; |
|
|
|
WHEN other_name in ('6号热泵电流1') and register_address IN ('6') THEN |
|
temp_real_hot_pump_four := CASE WHEN value > 1 THEN 1 ELSE 0 END; |
|
|
|
WHEN register_address IN ('1VD07000', '2VD07000') THEN |
|
pres_set_supply_pump_area_one := value; |
|
|
|
WHEN register_address IN ('1VD01800', '2VD01800') THEN |
|
pres_real_supply_pump_area_one := value; |
|
|
|
WHEN register_address IN ('1I00001', '2I00001') THEN |
|
status_run_supply_pump_one := value; |
|
|
|
WHEN register_address IN ('1I00004', '2I00004') THEN |
|
status_run_supply_pump_two := value; |
|
|
|
WHEN register_address IN ('2VD06100', '1VD06100') THEN |
|
level_water_tank_one := value; |
|
|
|
ELSE |
|
RAISE NOTICE '设备类型或寄存器地址不匹配(设备:%): %', floor_id_2_in, register_address; |
|
END CASE; |
|
END LOOP; |
|
EXCEPTION |
|
WHEN OTHERS THEN |
|
RAISE NOTICE '游标遍历失败(设备:%): %', floor_id_2_in, SQLERRM; |
|
END; |
|
CLOSE base_param_2; -- 确保游标最终关闭 |
|
RAISE NOTICE '关闭游标'; |
|
|
|
-- ------------------------------ |
|
-- 5. 插入历史数据(处理唯一约束冲突) |
|
-- ------------------------------ |
|
SELECT COUNT(1) INTO is_exits |
|
FROM report_hot_water_param_his |
|
WHERE cur_time = cur_time_in |
|
AND floor_id = floor_id_in; |
|
|
|
IF is_exits = 0 THEN |
|
INSERT INTO public.report_hot_water_param_his ( |
|
id, |
|
floor_id, |
|
cur_date, |
|
cur_time, |
|
temp_set_hot_pump_one, |
|
temp_real_hot_pump_one, |
|
status_switch_hot_pump_one, |
|
status_run_hot_pump_one, |
|
temp_set_hot_pump_two, |
|
temp_real_hot_pump_two, |
|
status_switch_hot_pump_two, |
|
status_run_hot_pump_two, |
|
temp_set_hot_pump_three, |
|
temp_real_hot_pump_three, |
|
status_switch_hot_pump_three, |
|
status_run_hot_pump_three, |
|
temp_set_hot_pump_four, |
|
temp_real_hot_pump_four, |
|
status_switch_hot_pump_four, |
|
status_run_hot_pump_four, |
|
pres_set_supply_pump_area_one, |
|
pres_real_supply_pump_area_one, |
|
status_run_supply_pump_one, |
|
status_run_supply_pump_two, |
|
pres_set_supply_pump_area_two, |
|
pres_real_supply_pump_area_two, |
|
status_run_supply_pump_three, |
|
status_run_supply_pump_four, |
|
level_water_tank_one, |
|
level_water_tank_two |
|
) VALUES ( |
|
uuid_generate_v1mc(), |
|
floor_id_in, |
|
LEFT(cur_time_in, 10)::DATE, |
|
cur_time_in, |
|
temp_set_hot_pump_one, |
|
temp_real_hot_pump_one, |
|
status_switch_hot_pump_one, |
|
status_run_hot_pump_one, |
|
temp_set_hot_pump_two, |
|
temp_real_hot_pump_two, |
|
status_switch_hot_pump_two, |
|
status_run_hot_pump_two, |
|
temp_set_hot_pump_three, |
|
temp_real_hot_pump_three, |
|
status_switch_hot_pump_three, |
|
status_run_hot_pump_three, |
|
temp_set_hot_pump_four, |
|
temp_real_hot_pump_four, |
|
status_switch_hot_pump_four, |
|
status_run_hot_pump_four, |
|
pres_set_supply_pump_area_one, |
|
pres_real_supply_pump_area_one, |
|
status_run_supply_pump_one, |
|
status_run_supply_pump_two, |
|
pres_set_supply_pump_area_two, |
|
pres_real_supply_pump_area_two, |
|
status_run_supply_pump_three, |
|
status_run_supply_pump_four, |
|
level_water_tank_one, |
|
level_water_tank_two |
|
); |
|
END IF; |
|
|
|
EXCEPTION |
|
WHEN OTHERS THEN |
|
-- 主事务异常时,记录错误 |
|
RAISE NOTICE '存储过程执行失败(设备:%,时间:%): %', |
|
floor_id_in, cur_time_in, SQLERRM; |
|
END; |
|
$BODY$ |
|
LANGUAGE plpgsql |