【课程5.7】代码编写:违建处置指标计算(违建发现率、整改率SQL实现)
指标名称计算逻辑(文件原文提炼)数据来源表(《03数据库表》)核心筛选条件(文件要求)违建发现率报告期内“主动发现的新增违建数” / 报告期内“新增违建总数” × 100%- 主动发现:AI识别、网格员巡查上报;- 新增违建总数:主动发现数 + 群众举报数(被动发现)(违建线索表)、(违建类型字典)(新增,《03数据库表》sys_dict_illegal_type);在报告期内;(未作废)违建整改
严格基于指定文件(核心为《03智慧城市一网统管平台-系统数据库表》简称《03数据库表》、《06行业应用系统功能设计-01城管住建.docx》简称《06-01城管》、《05智慧城市一网统管平台 数据中枢系统功能设计》简称《05数据中枢》、《02数据库表设计命名规范及英文简称对照表》简称《02命名规范》),聚焦违建处置核心指标“违建发现率”“违建整改率”的SQL实现与代码适配,所有逻辑、表结构、字段均来自文件原文,不涉及外部信息。
一、指标计算前置:文件定义的核心规则
1.1 指标定义与业务逻辑(文件依据)
根据《06-01城管》3.5节“违建处置核心指标”及《05数据中枢》20.15节“综合评价指标规则”,两大指标的计算逻辑明确如下:
| 指标名称 | 计算逻辑(文件原文提炼) | 数据来源表(《03数据库表》) | 核心筛选条件(文件要求) |
|---|---|---|---|
| 违建发现率 | 报告期内“主动发现的新增违建数” / 报告期内“新增违建总数” × 100% - 主动发现:AI识别、网格员巡查上报; - 新增违建总数:主动发现数 + 群众举报数(被动发现) |
gen_illegal_build_clue_mng(违建线索表)、sys_dict_data(违建类型字典) |
1. 违建类型:illegal_type=0(新增,《03数据库表》sys_dict_illegal_type);2. 时间范围: create_time在报告期内;3. 状态: clue_status≠2(未作废) |
| 违建整改率 | 报告期内“已完成整改的新增违建数” / 报告期内“需整改的新增违建数” × 100% - 已完成整改:处置后复查通过; - 需整改:已立案的新增违建 |
gen_illegal_build_disposal(违建处置表)、gen_illegal_build_clue_mng(违建线索表) |
1. 违建类型:illegal_type=0(新增);2. 处置状态: disposal_status=1(已立案);3. 整改状态: rectify_status=1(已整改,《03数据库表》sys_dict_rectify_status) |
1.2 核心数据表关联(《03数据库表》)
指标计算需关联4张核心表,字段关联符合《02命名规范》“行业表用gen_前缀、字典表用sys_dict_前缀”的规则:
| 表名 | 核心字段(作用) | 与其他表关联逻辑 |
|---|---|---|
gen_illegal_build_clue_mng |
clue_id(线索ID)、illegal_type(违建类型)、discover_type(发现类型:0=AI/1=巡查/2=举报)、create_time(线索创建时间)、area_code(行政区划) |
1. 与gen_illegal_build_disposal通过clue_id关联;2. 与 sys_area通过area_code关联(区域筛选) |
gen_illegal_build_disposal |
disposal_id(处置ID)、clue_id(关联线索)、disposal_status(处置状态)、rectify_status(整改状态)、rectify_time(整改时间) |
与gen_illegal_build_clue_mng通过clue_id关联,筛选“已立案+已整改”记录 |
sys_area |
area_code(行政区划编码)、area_name(区域名称)、area_level(区域层级) |
与gen_illegal_build_clue_mng通过area_code关联,实现“按区域统计指标” |
sys_dict_data |
dict_type(字典类型:如“illegal_type”“discover_type”)、dict_value(字典值)、dict_label(字典名称) |
为指标筛选提供字典值映射(如illegal_type=0对应“新增违建”) |
二、核心SQL实现:违建发现率(按区域/时间维度)
2.1 基础SQL逻辑(符合《06-01城管》3.5节统计要求)
违建发现率需区分“主动发现数”与“新增违建总数”,按“行政区划+时间范围”筛选,处理分母为0的异常场景(返回0避免除零错误),保留2位小数(《05数据中枢》20.15节“统计精度”要求):
-- 违建发现率计算(按区域+时间统计)
SELECT
-- 区域信息(关联sys_area获取区域名称)
sa.area_code AS area_code,
sa.area_name AS area_name,
-- 报告期(用户输入参数:开始时间/结束时间)
#{start_time} AS start_time,
#{end_time} AS end_time,
-- 分子:主动发现的新增违建数(发现类型:0=AI识别、1=网格员巡查)
SUM(CASE
WHEN gicl.illegal_type = '0' -- 新增违建
AND gicl.discover_type IN ('0', '1') -- 主动发现
AND gicl.clue_status != '2' -- 未作废线索
THEN 1 ELSE 0
END) AS active_discover_count,
-- 分母:新增违建总数(主动发现+群众举报)
SUM(CASE
WHEN gicl.illegal_type = '0'
AND gicl.clue_status != '2'
THEN 1 ELSE 0
END) AS total_new_illegal_count,
-- 违建发现率(分母为0时返回0,保留2位小数)
ROUND(
IF(
SUM(CASE WHEN gicl.illegal_type = '0' AND gicl.clue_status != '2' THEN 1 ELSE 0 END) = 0,
0,
SUM(CASE WHEN gicl.illegal_type = '0' AND gicl.discover_type IN ('0','1') AND gicl.clue_status != '2' THEN 1 ELSE 0 END)
/ SUM(CASE WHEN gicl.illegal_type = '0' AND gicl.clue_status != '2' THEN 1 ELSE 0 END) * 100
),
2
) AS illegal_discover_rate
FROM
gen_illegal_build_clue_mng gicl
-- 关联行政区划表(筛选指定区域,支持市级/区级/街道级)
LEFT JOIN sys_area sa
ON gicl.area_code = sa.area_code
-- 关联违建类型字典表(验证新增违建类型合法性)
LEFT JOIN sys_dict_data sdd
ON gicl.illegal_type = sdd.dict_value
AND sdd.dict_type = 'illegal_build_type' -- 字典类型:违建类型(《03数据库表》)
WHERE
-- 时间范围筛选(报告期内的新增线索)
gicl.create_time BETWEEN #{start_time} AND #{end_time}
-- 区域筛选(可选参数,如筛选西湖区:area_code=330106)
<if test="area_code != null and area_code != ''">
AND gicl.area_code = #{area_code}
</if>
-- 逻辑删除筛选(《02命名规范》要求:is_delete=0为未删除)
AND gicl.is_delete = 0
-- 按区域分组(支持多区域批量统计)
GROUP BY
gicl.area_code, sa.area_name, #{start_time}, #{end_time}
ORDER BY
illegal_discover_rate DESC;
2.2 维度扩展SQL(按时间周期细分)
适配《07城市全局总览系统功能设计.docx》大屏“日/周/月”维度展示需求,新增“时间周期”分组,基于create_time提取周期字段:
-- 违建发现率(按区域+月周期统计)
SELECT
sa.area_code AS area_code,
sa.area_name AS area_name,
-- 提取月份周期(格式:2025-11)
DATE_FORMAT(gicl.create_time, '%Y-%m') AS stat_cycle,
SUM(CASE WHEN gicl.illegal_type = '0' AND gicl.discover_type IN ('0','1') AND gicl.clue_status != '2' THEN 1 ELSE 0 END) AS active_discover_count,
SUM(CASE WHEN gicl.illegal_type = '0' AND gicl.clue_status != '2' THEN 1 ELSE 0 END) AS total_new_illegal_count,
ROUND(
IF(
SUM(CASE WHEN gicl.illegal_type = '0' AND gicl.clue_status != '2' THEN 1 ELSE 0 END) = 0,
0,
SUM(CASE WHEN gicl.illegal_type = '0' AND gicl.discover_type IN ('0','1') AND gicl.clue_status != '2' THEN 1 ELSE 0 END)
/ SUM(CASE WHEN gicl.illegal_type = '0' AND gicl.clue_status != '2' THEN 1 ELSE 0 END) * 100
),
2
) AS illegal_discover_rate
FROM
gen_illegal_build_clue_mng gicl
LEFT JOIN sys_area sa ON gicl.area_code = sa.area_code
LEFT JOIN sys_dict_data sdd ON gicl.illegal_type = sdd.dict_value AND sdd.dict_type = 'illegal_build_type'
WHERE
gicl.create_time BETWEEN #{start_time} AND #{end_time}
AND gicl.is_delete = 0
GROUP BY
gicl.area_code, sa.area_name, DATE_FORMAT(gicl.create_time, '%Y-%m')
ORDER BY
stat_cycle DESC, illegal_discover_rate DESC;
三、核心SQL实现:违建整改率(按区域/处置周期)
3.1 基础SQL逻辑(符合《06-01城管》3.5节整改要求)
违建整改率需关联“违建线索表”与“违建处置表”,筛选“已立案+新增违建”的处置记录,统计“已整改数”与“需整改数”,同样处理分母为0场景:
-- 违建整改率计算(按区域+时间统计)
SELECT
sa.area_code AS area_code,
sa.area_name AS area_name,
#{start_time} AS start_time,
#{end_time} AS end_time,
-- 分子:已完成整改的新增违建数(整改状态=1,处置状态=1)
SUM(CASE
WHEN gicl.illegal_type = '0' -- 新增违建
AND gid.disposal_status = '1' -- 已立案
AND gid.rectify_status = '1' -- 已整改
AND gid.rectify_time BETWEEN #{start_time} AND #{end_time} -- 整改时间在报告期内
THEN 1 ELSE 0
END) AS rectified_count,
-- 分母:需整改的新增违建数(已立案的新增违建)
SUM(CASE
WHEN gicl.illegal_type = '0'
AND gid.disposal_status = '1'
AND gid.create_time BETWEEN #{start_time} AND #{end_time} -- 立案时间在报告期内
THEN 1 ELSE 0
END) AS need_rectify_count,
-- 违建整改率(保留2位小数)
ROUND(
IF(
SUM(CASE WHEN gicl.illegal_type = '0' AND gid.disposal_status = '1' AND gid.create_time BETWEEN #{start_time} AND #{end_time} THEN 1 ELSE 0 END) = 0,
0,
SUM(CASE WHEN gicl.illegal_type = '0' AND gid.disposal_status = '1' AND gid.rectify_status = '1' AND gid.rectify_time BETWEEN #{start_time} AND #{end_time} THEN 1 ELSE 0 END)
/ SUM(CASE WHEN gicl.illegal_type = '0' AND gid.disposal_status = '1' AND gid.create_time BETWEEN #{start_time} AND #{end_time} THEN 1 ELSE 0 END) * 100
),
2
) AS illegal_rectify_rate
FROM
gen_illegal_build_clue_mng gicl
-- 关联违建处置表(仅统计已处置的线索)
INNER JOIN gen_illegal_build_disposal gid
ON gicl.clue_id = gid.clue_id
-- 关联行政区划表
LEFT JOIN sys_area sa
ON gicl.area_code = sa.area_code
-- 关联整改状态字典表(验证整改状态合法性)
LEFT JOIN sys_dict_data sdd_rect
ON gid.rectify_status = sdd_rect.dict_value
AND sdd_rect.dict_type = 'illegal_build_rectify_status'
WHERE
-- 线索与处置均未删除
gicl.is_delete = 0
AND gid.is_delete = 0
-- 区域筛选(可选)
<if test="area_code != null and area_code != ''">
AND gicl.area_code = #{area_code}
</if>
GROUP BY
gicl.area_code, sa.area_name, #{start_time}, #{end_time}
ORDER BY
illegal_rectify_rate DESC;
3.2 特殊场景处理SQL(逾期未整改统计)
根据《06-01城管》3.5节“逾期整改预警”要求,需统计“逾期未整改数”,作为整改率的补充指标,SQL逻辑如下:
-- 逾期未整改数统计(按区域)
SELECT
sa.area_name AS area_name,
-- 逾期未整改:需整改且超整改时限(《06-01城管》要求整改时限≤7天)
SUM(CASE
WHEN gicl.illegal_type = '0'
AND gid.disposal_status = '1'
AND gid.rectify_status = '0' -- 未整改
AND DATE_ADD(gid.disposal_time, INTERVAL 7 DAY) < NOW() -- 超7天整改时限
THEN 1 ELSE 0
END) AS overdue_unrectify_count
FROM
gen_illegal_build_clue_mng gicl
INNER JOIN gen_illegal_build_disposal gid ON gicl.clue_id = gid.clue_id
LEFT JOIN sys_area sa ON gicl.area_code = sa.area_code
WHERE
gicl.is_delete = 0
AND gid.is_delete = 0
<if test="area_code != null and area_code != ''">
AND gicl.area_code = #{area_code}
</if>
GROUP BY
sa.area_name
ORDER BY
overdue_unrectify_count DESC;
四、代码适配:Mapper层与DTO实体(对接《03数据库表》)
4.1 指标结果DTO(适配前端展示与大屏需求)
实体字段与SQL结果字段一一映射,符合《02命名规范》“驼峰转下划线”规则,包含“指标值、分子、分母、统计维度”,支撑《07全局总览》大屏展示:
// 违建处置指标结果DTO
@Data
public class IllegalBuildIndicatorDTO {
// 区域编码(关联sys_area.area_code)
private String areaCode;
// 区域名称(关联sys_area.area_name)
private String areaName;
// 统计开始时间
private String startTime;
// 统计结束时间
private String endTime;
// 统计周期(如“2025-11”,仅时间维度统计时非空)
private String statCycle;
// 违建发现率(%,保留2位小数)
private BigDecimal illegalDiscoverRate;
// 主动发现数(发现率分子)
private Integer activeDiscoverCount;
// 新增违建总数(发现率分母)
private Integer totalNewIllegalCount;
// 违建整改率(%,保留2位小数)
private BigDecimal illegalRectifyRate;
// 已整改数(整改率分子)
private Integer rectifiedCount;
// 需整改数(整改率分母)
private Integer needRectifyCount;
// 逾期未整改数(补充指标)
private Integer overdueUnrectifyCount;
}
4.2 Mapper层接口(MyBatis-Plus适配)
定义指标查询接口,接收“时间范围、区域编码”参数,返回指标结果DTO,SQL通过注解或XML映射(此处采用注解方式,与前文SQL逻辑一致):
@Mapper
public interface IllegalBuildIndicatorMapper extends BaseMapper<IllegalBuildIndicatorDTO> {
/**
* 查询违建发现率(按区域+时间)
* @param startTime 统计开始时间(yyyy-MM-dd HH:mm:ss)
* @param endTime 统计结束时间(yyyy-MM-dd HH:mm:ss)
* @param areaCode 行政区划编码(可选)
* @return 发现率结果列表
*/
@Select("""
-- 此处嵌入前文“违建发现率基础SQL”,参数替换为#{startTime}、#{endTime}、#{areaCode}
""")
List<IllegalBuildIndicatorDTO> queryIllegalDiscoverRate(
@Param("startTime") String startTime,
@Param("endTime") String endTime,
@Param("areaCode") String areaCode);
/**
* 查询违建整改率(按区域+时间)
* @param startTime 统计开始时间
* @param endTime 统计结束时间
* @param areaCode 行政区划编码(可选)
* @return 整改率结果列表
*/
@Select("""
-- 此处嵌入前文“违建整改率基础SQL”,参数替换为#{startTime}、#{endTime}、#{areaCode}
""")
List<IllegalBuildIndicatorDTO> queryIllegalRectifyRate(
@Param("startTime") String startTime,
@Param("endTime") String endTime,
@Param("areaCode") String areaCode);
/**
* 查询逾期未整改数(按区域)
* @param areaCode 行政区划编码(可选)
* @return 逾期未整改结果列表
*/
@Select("""
-- 此处嵌入前文“逾期未整改数统计SQL”,参数替换为#{areaCode}
""")
List<IllegalBuildIndicatorDTO> queryOverdueUnrectifyCount(@Param("areaCode") String areaCode);
}
五、SQL与代码验证(文件合规性校验)
5.1 验证场景与文件依据
| 验证场景 | 验证步骤 | 预期结果(文件依据) |
|---|---|---|
| 西湖区2025年11月发现率 | 1. 输入startTime=2025-11-01 00:00:00、endTime=2025-11-30 23:59:59、areaCode=330106;2. 执行发现率SQL | 1. 主动发现数=50、新增违建总数=60;2. 发现率=83.33%(保留2位小数)(《06-01城管》3.5节“发现率≥80%”目标) |
| 上城区2025年11月整改率 | 1. 输入相同时间范围、areaCode=330102;2. 执行整改率SQL | 1. 已整改数=40、需整改数=45;2. 整改率=88.89%(符合《06-01城管》“整改率≥85%”要求) |
| 分母为0场景 | 1. 输入无新增违建的区域(如拱墅区2025-11);2. 执行SQL | 发现率=0.00%、整改率=0.00%(无除零错误,《05数据中枢》20.15节统计容错要求) |
六、总结:指标计算的文件闭环
违建处置指标的SQL与代码实现,完全基于指定文件构建:
-
数据层:依赖《03数据库表》的
gen_*行业表、sys_*基础表,字段使用符合《02命名规范》(如illegal_type、rectify_status); -
逻辑层:指标计算规则严格遵循《06-01城管》3.5节业务要求(如主动发现范围、整改时限),异常处理符合《05数据中枢》统计精度标准;
-
应用层:DTO实体适配前端大屏展示需求,Mapper接口支持多维度筛选(区域、时间),可直接集成到城管住建“违建治理专题”(5.4节)与核心指标模块(5.3节)。
所有实现无外部依赖,仅针对指定文件,确保与一网统管平台整体架构完全兼容。
更多推荐


所有评论(0)