17 changed files with 482 additions and 28 deletions
@ -0,0 +1,142 @@
|
||||
package com.mh.common.core.domain.entity; |
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableName; |
||||
import org.apache.commons.lang3.builder.ToStringBuilder; |
||||
|
||||
/** |
||||
* @author LJF |
||||
* @version 1.0 |
||||
* @project EEMCS |
||||
* @description 维保统计 |
||||
* @date 2025-02-26 16:47:18 |
||||
*/ |
||||
@TableName("maintain_sum") |
||||
public class MaintainSum { |
||||
|
||||
private String id; |
||||
|
||||
private String buildingId; |
||||
|
||||
private String curDate; |
||||
|
||||
private int dayNum; |
||||
|
||||
private String dayP; |
||||
|
||||
private int weekNum; |
||||
|
||||
private String weekP; |
||||
|
||||
private int monthNum; |
||||
|
||||
private String monthP; |
||||
|
||||
private int yearNum; |
||||
|
||||
private String yearP; |
||||
|
||||
public String getId() { |
||||
return id; |
||||
} |
||||
|
||||
public void setId(String id) { |
||||
this.id = id; |
||||
} |
||||
|
||||
public String getBuildingId() { |
||||
return buildingId; |
||||
} |
||||
|
||||
public void setBuildingId(String buildingId) { |
||||
this.buildingId = buildingId; |
||||
} |
||||
|
||||
public String getCurDate() { |
||||
return curDate; |
||||
} |
||||
|
||||
public void setCurDate(String curDate) { |
||||
this.curDate = curDate; |
||||
} |
||||
|
||||
public int getDayNum() { |
||||
return dayNum; |
||||
} |
||||
|
||||
public void setDayNum(int dayNum) { |
||||
this.dayNum = dayNum; |
||||
} |
||||
|
||||
public String getDayP() { |
||||
return dayP; |
||||
} |
||||
|
||||
public void setDayP(String dayP) { |
||||
this.dayP = dayP; |
||||
} |
||||
|
||||
public int getWeekNum() { |
||||
return weekNum; |
||||
} |
||||
|
||||
public void setWeekNum(int weekNum) { |
||||
this.weekNum = weekNum; |
||||
} |
||||
|
||||
public String getWeekP() { |
||||
return weekP; |
||||
} |
||||
|
||||
public void setWeekP(String weekP) { |
||||
this.weekP = weekP; |
||||
} |
||||
|
||||
public int getMonthNum() { |
||||
return monthNum; |
||||
} |
||||
|
||||
public void setMonthNum(int monthNum) { |
||||
this.monthNum = monthNum; |
||||
} |
||||
|
||||
public String getMonthP() { |
||||
return monthP; |
||||
} |
||||
|
||||
public void setMonthP(String monthP) { |
||||
this.monthP = monthP; |
||||
} |
||||
|
||||
public int getYearNum() { |
||||
return yearNum; |
||||
} |
||||
|
||||
public void setYearNum(int yearNum) { |
||||
this.yearNum = yearNum; |
||||
} |
||||
|
||||
public String getYearP() { |
||||
return yearP; |
||||
} |
||||
|
||||
public void setYearP(String yearP) { |
||||
this.yearP = yearP; |
||||
} |
||||
|
||||
@Override |
||||
public String toString() { |
||||
return new ToStringBuilder(this) |
||||
.append("id", id) |
||||
.append("buildingId", buildingId) |
||||
.append("curDate", curDate) |
||||
.append("dayNum", dayNum) |
||||
.append("dayP", dayP) |
||||
.append("weekNum", weekNum) |
||||
.append("weekP", weekP) |
||||
.append("monthNum", monthNum) |
||||
.append("monthP", monthP) |
||||
.append("yearNum", yearNum) |
||||
.append("yearP", yearP) |
||||
.toString(); |
||||
} |
||||
} |
@ -0,0 +1,34 @@
|
||||
package com.mh.quartz.task; |
||||
|
||||
import com.mh.system.service.device.IMaintainInfoService; |
||||
import com.mh.system.service.device.impl.MaintainInfoServiceImpl; |
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
import org.springframework.stereotype.Component; |
||||
|
||||
import java.text.SimpleDateFormat; |
||||
import java.util.Date; |
||||
|
||||
/** |
||||
* @author LJF |
||||
* @version 1.0 |
||||
* @project EEMCS |
||||
* @description 定时处理维保统计 |
||||
* @date 2025-02-26 18:09:32 |
||||
*/ |
||||
@Component("createMaintainTask") |
||||
public class CreateMaintainTask { |
||||
|
||||
private final IMaintainInfoService maintainInfoService; |
||||
|
||||
@Autowired |
||||
public CreateMaintainTask(IMaintainInfoService maintainInfoService) { |
||||
this.maintainInfoService = maintainInfoService; |
||||
} |
||||
|
||||
public void createMaintainTask() { |
||||
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); |
||||
Date date = new Date(); |
||||
String curDate = sdf1.format(date); |
||||
maintainInfoService.createMaintainTask(curDate); |
||||
} |
||||
} |
@ -0,0 +1,144 @@
|
||||
CREATE OR REPLACE PROCEDURE pro_maintain_sum(p_cur_date varchar(50)) |
||||
LANGUAGE plpgsql |
||||
AS $$ |
||||
DECLARE |
||||
v_cur_date date := to_date(p_cur_date, 'YYYY-MM-DD'); |
||||
v_last_date date := v_cur_date - interval '1 day'; |
||||
v_last_week_start date := v_cur_date - interval '14 days'; |
||||
v_last_week_end date := v_cur_date - interval '8 days'; |
||||
v_last_month date := v_cur_date - interval '1 month'; |
||||
v_last_year date := v_cur_date - interval '1 year'; |
||||
|
||||
day_num int; |
||||
week_num int; |
||||
month_num int; |
||||
year_num int; |
||||
last_day_num int; |
||||
last_week_num int; |
||||
last_month_num int; |
||||
last_year_num int; |
||||
day_p varchar(50); |
||||
week_p varchar(50); |
||||
month_p varchar(50); |
||||
year_p varchar(50); |
||||
|
||||
all_day_num int; |
||||
all_week_num int; |
||||
all_month_num int; |
||||
all_year_num int; |
||||
all_last_day_num int; |
||||
all_last_week_num int; |
||||
all_last_month_num int; |
||||
all_last_year_num int; |
||||
|
||||
v_building_id varchar(50); -- 楼栋编号(添加前缀避免冲突) |
||||
BEGIN |
||||
-- 处理各楼栋数据 |
||||
FOR v_building_id IN SELECT DISTINCT id FROM building LOOP |
||||
-- 历史数据查询 |
||||
SELECT COUNT(*) INTO last_day_num |
||||
FROM maintain_info |
||||
WHERE building_id = building_id |
||||
AND cur_date::date = v_last_date; |
||||
|
||||
SELECT COUNT(*) INTO last_week_num |
||||
FROM maintain_info |
||||
WHERE building_id = building_id |
||||
AND cur_date::date BETWEEN v_last_week_start AND v_last_week_end; |
||||
|
||||
SELECT COUNT(*) INTO last_month_num |
||||
FROM maintain_info |
||||
WHERE building_id = building_id |
||||
AND date_trunc('month', cur_date) = date_trunc('month', v_last_month); |
||||
|
||||
SELECT COUNT(*) INTO last_year_num |
||||
FROM maintain_info |
||||
WHERE building_id = building_id |
||||
AND date_trunc('year', cur_date) = date_trunc('year', v_last_year); |
||||
|
||||
-- 当前数据查询 |
||||
SELECT COUNT(*) INTO day_num |
||||
FROM maintain_info |
||||
WHERE building_id = building_id |
||||
AND cur_date::date = v_cur_date; |
||||
|
||||
SELECT COUNT(*) INTO week_num |
||||
FROM maintain_info |
||||
WHERE building_id = building_id |
||||
AND cur_date::date BETWEEN (v_cur_date - interval '6 days') AND v_cur_date; |
||||
|
||||
SELECT COUNT(*) INTO month_num |
||||
FROM maintain_info |
||||
WHERE building_id = building_id |
||||
AND date_trunc('month', cur_date) = date_trunc('month', v_cur_date); |
||||
|
||||
SELECT COUNT(*) INTO year_num |
||||
FROM maintain_info |
||||
WHERE building_id = building_id |
||||
AND date_trunc('year', cur_date) = date_trunc('year', v_cur_date); |
||||
|
||||
-- 计算百分比 |
||||
day_p := calc_percentage(day_num, last_day_num); |
||||
week_p := calc_percentage(week_num, last_week_num); |
||||
month_p := calc_percentage(month_num, last_month_num); |
||||
year_p := calc_percentage(year_num, last_year_num); |
||||
|
||||
-- 插入或更新(使用UPSERT) |
||||
INSERT INTO maintain_sum AS ms |
||||
(cur_date, building_id, day_num, day_p, week_num, week_p, month_num, month_p, year_num, year_p) |
||||
VALUES (v_cur_date, building_id, day_num, day_p, week_num, week_p, month_num, month_p, year_num, year_p) |
||||
ON CONFLICT (cur_date, building_id) DO UPDATE SET |
||||
day_num = EXCLUDED.day_num, |
||||
day_p = EXCLUDED.day_p, |
||||
week_num = EXCLUDED.week_num, |
||||
week_p = EXCLUDED.week_p, |
||||
month_num = EXCLUDED.month_num, |
||||
month_p = EXCLUDED.month_p, |
||||
year_num = EXCLUDED.year_num, |
||||
year_p = EXCLUDED.year_p; |
||||
END LOOP; |
||||
|
||||
-- 处理所有楼栋汇总数据 |
||||
SELECT COUNT(*) INTO all_last_day_num FROM maintain_info WHERE cur_date::date = v_last_date; |
||||
SELECT COUNT(*) INTO all_last_week_num FROM maintain_info WHERE cur_date::date BETWEEN v_last_week_start AND v_last_week_end; |
||||
SELECT COUNT(*) INTO all_last_month_num FROM maintain_info WHERE date_trunc('month', cur_date) = date_trunc('month', v_last_month); |
||||
SELECT COUNT(*) INTO all_last_year_num FROM maintain_info WHERE date_trunc('year', cur_date) = date_trunc('year', v_last_year); |
||||
|
||||
SELECT COUNT(*) INTO all_day_num FROM maintain_info WHERE cur_date::date = v_cur_date; |
||||
SELECT COUNT(*) INTO all_week_num FROM maintain_info WHERE cur_date::date BETWEEN (v_cur_date - interval '6 days') AND v_cur_date; |
||||
SELECT COUNT(*) INTO all_month_num FROM maintain_info WHERE date_trunc('month', cur_date) = date_trunc('month', v_cur_date); |
||||
SELECT COUNT(*) INTO all_year_num FROM maintain_info WHERE date_trunc('year', cur_date) = date_trunc('year', v_cur_date); |
||||
|
||||
-- 计算百分比(可复用函数) |
||||
day_p := calc_percentage(all_day_num, all_last_day_num); |
||||
week_p := calc_percentage(all_week_num, all_last_week_num); |
||||
month_p := calc_percentage(all_month_num, all_last_month_num); |
||||
year_p := calc_percentage(all_year_num, all_last_year_num); |
||||
|
||||
-- 使用UPSERT处理汇总数据 |
||||
INSERT INTO maintain_sum AS ms |
||||
(cur_date, building_id, day_num, day_p, week_num, week_p, month_num, month_p, year_num, year_p) |
||||
VALUES (v_cur_date, '所有', all_day_num, day_p, all_week_num, week_p, all_month_num, month_p, all_year_num, year_p) |
||||
ON CONFLICT (cur_date, building_id) DO UPDATE SET |
||||
day_num = EXCLUDED.day_num, |
||||
day_p = EXCLUDED.day_p, |
||||
week_num = EXCLUDED.week_num, |
||||
week_p = EXCLUDED.week_p, |
||||
month_num = EXCLUDED.month_num, |
||||
month_p = EXCLUDED.month_p, |
||||
year_num = EXCLUDED.year_num, |
||||
year_p = EXCLUDED.year_p; |
||||
END; |
||||
$$; |
||||
|
||||
-- 创建百分比计算函数 |
||||
CREATE OR REPLACE FUNCTION calc_percentage(current_val int, last_val int) |
||||
RETURNS varchar(50) AS $$ |
||||
BEGIN |
||||
RETURN CASE |
||||
WHEN last_val > 0 THEN |
||||
ROUND(((current_val - last_val)::numeric / last_val * 100)::numeric, 2) || '%' |
||||
ELSE '0%' |
||||
END; |
||||
END; |
||||
$$ LANGUAGE plpgsql; |
@ -0,0 +1,34 @@
|
||||
-- 创建表 |
||||
CREATE TABLE maintain_sum ( |
||||
id varchar(36) not null PRIMARY KEY, |
||||
building_id varchar(50), |
||||
cur_date varchar(50), |
||||
day_num int, |
||||
day_p varchar(50), |
||||
week_num int, |
||||
week_p varchar(50), |
||||
month_num int, |
||||
month_p varchar(50), |
||||
year_num int, |
||||
year_p varchar(50) |
||||
); |
||||
|
||||
-- 添加表注释(可选,原脚本未提供表注释) |
||||
COMMENT ON TABLE maintain_sum IS '维护汇总表'; |
||||
|
||||
-- 添加列注释 |
||||
COMMENT ON COLUMN maintain_sum.id IS '序号'; |
||||
COMMENT ON COLUMN maintain_sum.building_id IS '楼栋编号'; |
||||
COMMENT ON COLUMN maintain_sum.cur_date IS '日期'; |
||||
COMMENT ON COLUMN maintain_sum.day_num IS '当日维修量'; |
||||
COMMENT ON COLUMN maintain_sum.day_p IS '当日维修与昨日比'; |
||||
COMMENT ON COLUMN maintain_sum.week_num IS '最近七天维修量'; |
||||
COMMENT ON COLUMN maintain_sum.week_p IS '与上周比'; |
||||
COMMENT ON COLUMN maintain_sum.month_num IS '月维修量'; |
||||
COMMENT ON COLUMN maintain_sum.month_p IS '与上月比'; |
||||
COMMENT ON COLUMN maintain_sum.year_num IS '年维修量'; |
||||
COMMENT ON COLUMN maintain_sum.year_p IS '与上年比'; |
||||
|
||||
-- 创建唯一约束 |
||||
ALTER TABLE maintain_sum ADD CONSTRAINT uniq_maintain_sum |
||||
UNIQUE (cur_date, building_id); |
Loading…
Reference in new issue