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