【课程5.7】代码编写:违建处置指标计算(违建发现率、整改率SQL实现)

严格基于指定文件(核心为《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与代码实现,完全基于指定文件构建:

  1. 数据层 :依赖《03数据库表》的gen_*行业表、sys_*基础表,字段使用符合《02命名规范》(如illegal_typerectify_status);

  2. 逻辑层:指标计算规则严格遵循《06-01城管》3.5节业务要求(如主动发现范围、整改时限),异常处理符合《05数据中枢》统计精度标准;

  3. 应用层:DTO实体适配前端大屏展示需求,Mapper接口支持多维度筛选(区域、时间),可直接集成到城管住建"违建治理专题"(5.4节)与核心指标模块(5.3节)。

所有实现无外部依赖,仅针对指定文件,确保与一网统管平台整体架构完全兼容。

相关推荐
松涛和鸣2 小时前
55、ARM与IMX6ULL入门
c语言·arm开发·数据库·单片机·sqlite·html
这儿有一堆花2 小时前
Linux 内网环境构建与配置深度解析
linux·数据库·php
Codeking__3 小时前
Redis——事务
数据库·redis·缓存
Codeking__3 小时前
Redis——认识持久化、RDB、AOF
数据库·redis·缓存
Funky_oaNiu3 小时前
Oracle在没有dba权限和表空间对不上和不能用数据泵的情况下迁移
数据库·oracle·dba
阳光九叶草LXGZXJ3 小时前
达梦数据库-报错-06-[-502]OUT OF TEMPORARY DATABASE SPACE(临时表空间不足)
linux·运维·数据库·sql·学习
龙亘川3 小时前
GB/Z167-2025《系统控制图》全维度解析
运维·网络·智慧城市·内涝监测·技术标准
+VX:Fegn08953 小时前
计算机毕业设计|基于springboot + vue校园跑腿系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
黎陌MLing3 小时前
PVE安装Ubuntu操作系统详细过程
linux·数据库·ubuntu