【课程4.4】核心指标计算通用逻辑:处置率、预警准确率的SQL与代码编写

严格基于指定文件(核心为《05智慧城市一网统管平台 数据中枢系统功能设计.docx》简称《05数据中枢》、《03智慧城市一网统管平台-系统数据库表.docx》简称《03数据库表》),结合《01智慧城市一网统管平台-系统总体架构及其功能要点-20251018修订.docx》(简称《01总体架构》)、《02数据库表设计命名规范及英文简称对照表.docx》(简称《02命名规范》)及《06系列行业应用文件》(简称《06行业文件》),聚焦"处置率""预警准确率"两大高频核心指标,拆解其计算逻辑、SQL实现与代码编写,所有数据来源、表结构、字段均来自指定文件,无外部信息。

一、核心指标计算前置:文件中的通用原则

1.1 指标定义规范(文件依据)

《05数据中枢》20.15节"综合评价"明确核心指标需遵循"可量化、可追溯、行业适配"三大原则,具体要求:

  1. 可量化:指标计算需基于《03数据库表》的结构化数据,避免主观评估(如"处置率"需用实际工单数据计算,而非人工估算);

  2. 可追溯 :计算过程需关联原始业务表(如处置率关联biz_evt_wo工单表),支持数据溯源(《01总体架构》P13"数据驱动闭环"要求);

  3. 行业适配 :指标筛选条件需支持"业务域、行政区划"维度(如城管处置率筛选biz_domain=URBAN,水利处置率筛选biz_domain=WATER),适配《06行业文件》的个性化需求。

1.2 技术栈与工具(文件明确要求)

《01总体架构》21.2节"基础设施"、《04我的工作台-系统功能设计.docx》(简称《04工作台》)1.6节明确指标计算技术栈:

  • SQL编写 :基于MySQL 8.0,需遵循《02命名规范》的表名(biz_业务层、sys_基础层)与字段(snake_case格式)规则;

  • 代码开发:Spring Boot 2.7.x(芋道框架扩展)+ MyBatis-Plus(动态SQL与CRUD复用);

  • 结果封装:指标结果需包含"计算值(保留2位小数)、分子、分母、时间范围、筛选维度",适配《07城市全局总览系统功能设计.docx》(简称《07全局总览》)的大屏展示需求。

二、通用指标1:处置率------业务事项的"完成效率核心指标"

2.1 指标定义与文件依据

(1)计算逻辑

处置率 = 已处置事项数 / 总事项数 × 100%

  • 已处置事项:指"处置完成"状态的业务事项(如工单已结案、任务已完成),状态值来自《03数据库表》的字典表(如sys_dict_evt_status);

  • 总事项数:指指定时间范围内、指定维度(区域/业务域)的所有业务事项(含已处置、处置中、待处置);

  • 文件依据:《05数据中枢》20.15.3节"评价指标管理"(如城管工单处置率、水利任务处置率均采用此逻辑)、《06行业文件-01城管住建.docx》P35"城管核心指标"。

(2)数据来源

核心数据来自《03数据库表》的"业务数据层",关联基础表补充筛选维度,具体表结构如下:

指标维度 数据来源表(《03数据库表》) 核心字段(作用)
总事项数/已处置数 biz_evt_wo(事件工单表) wo_id(工单ID,计数用)、status(处置状态:0=待处置/1=处置中/2=已结案)、create_time(时间范围筛选)
业务域筛选 biz_evt_wo+sys_dict_biz_domain biz_domain(业务域编码,如URBAN=城管、WATER=水利)→ 关联字典表获取业务域名称
行政区划筛选 biz_evt_wo+sys_area area_code(行政区划编码,如330106=杭州西湖区)→ 关联sys_area获取区域名称

2.2 SQL实现(多维度筛选适配)

(1)基础SQL(时间范围+业务域筛选)

以"2025年11月城管住建领域处置率"为例,SQL需关联biz_evt_wosys_dict_biz_domain,筛选业务域与时间范围:

复制代码
-- 处置率计算:分子(已处置数)、分母(总事项数)、计算值
SELECT
    -- 已处置数(status=2:已结案,关联sys_dict_evt_status字典表)
    SUM(CASE WHEN we.status = 2 THEN 1 ELSE 0 END) AS handled_count,
    -- 总事项数(所有状态)
    COUNT(we.wo_id) AS total_count,
    -- 处置率(保留2位小数,分母为0时返回0)
    ROUND(
        IF(COUNT(we.wo_id) = 0, 0, 
           SUM(CASE WHEN we.status = 2 THEN 1 ELSE 0 END) / COUNT(we.wo_id) * 100
        ), 2
    ) AS handle_rate,
    -- 筛选维度:业务域名称(关联sys_dict_biz_domain)
    dbd.dict_label AS biz_domain_name,
    -- 时间范围(用户输入参数,格式:yyyy-MM-dd HH:mm:ss)
    #{startTime} AS start_time,
    #{endTime} AS end_time
FROM
    biz_evt_wo we
-- 关联业务域字典表,获取业务域名称
LEFT JOIN sys_dict_data dbd 
    ON we.biz_domain = dbd.dict_value 
    AND dbd.dict_type = 'biz_domain' -- 字典类型:业务域(《03数据库表》sys_dict_data)
WHERE
    -- 1. 时间范围筛选(必填参数)
    we.create_time BETWEEN #{startTime} AND #{endTime}
    -- 2. 业务域筛选(可选参数,如URBAN=城管、WATER=水利)
    AND (#{bizDomain} IS NULL OR we.biz_domain = #{bizDomain})
    -- 3. 逻辑删除筛选(《02命名规范》要求:is_delete=0为未删除)
    AND we.is_delete = 0
-- 按业务域分组(支持多业务域批量计算)
GROUP BY
    we.biz_domain, dbd.dict_label, #{startTime}, #{endTime};
(2)扩展SQL(行政区划+业务域双维度)

适配《07全局总览》"区域-业务"双维度展示需求(如"西湖区水利处置率"),需关联sys_area表:

复制代码
SELECT
    SUM(CASE WHEN we.status = 2 THEN 1 ELSE 0 END) AS handled_count,
    COUNT(we.wo_id) AS total_count,
    ROUND(
        IF(COUNT(we.wo_id) = 0, 0, 
           SUM(CASE WHEN we.status = 2 THEN 1 ELSE 0 END) / COUNT(we.wo_id) * 100
        ), 2
    ) AS handle_rate,
    -- 行政区划名称(关联sys_area)
    sa.area_name,
    dbd.dict_label AS biz_domain_name
FROM
    biz_evt_wo we
LEFT JOIN sys_area sa 
    ON we.area_code = sa.area_code -- 关联行政区划编码
LEFT JOIN sys_dict_data dbd 
    ON we.biz_domain = dbd.dict_value 
    AND dbd.dict_type = 'biz_domain'
WHERE
    we.create_time BETWEEN #{startTime} AND #{endTime}
    -- 行政区划筛选(可选参数,如330106=西湖区)
    AND (#{areaCode} IS NULL OR we.area_code = #{areaCode})
    AND (#{bizDomain} IS NULL OR we.biz_domain = #{bizDomain})
    AND we.is_delete = 0
GROUP BY
    we.area_code, sa.area_name, we.biz_domain, dbd.dict_label;

2.3 代码实现(分层开发,适配多行业)

(1)实体类与DTO(对应《03数据库表》)
复制代码
// 1. 指标结果DTO(适配《07全局总览》大屏展示)
@Data
public class IndicatorResultDTO {
    // 指标计算值(如处置率:92.50)
    private BigDecimal indicatorValue;
    // 分子(已处置数)
    private Integer numerator;
    // 分母(总事项数)
    private Integer denominator;
    // 时间范围-开始
    private String startTime;
    // 时间范围-结束
    private String endTime;
    // 筛选维度1:业务域名称(如“城管住建”)
    private String bizDomainName;
    // 筛选维度2:行政区划名称(如“杭州市西湖区”)
    private String areaName;
}

// 2. 筛选参数DTO(支持多维度)
@Data
@Valid
public class IndicatorQueryDTO {
    @NotBlank(message = "开始时间不能为空")
    @Pattern(regexp = "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$", message = "时间格式需为yyyy-MM-dd HH:mm:ss")
    private String startTime;

    @NotBlank(message = "结束时间不能为空")
    @Pattern(regexp = "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$", message = "时间格式需为yyyy-MM-dd HH:mm:ss")
    private String endTime;

    // 可选参数:业务域编码(如URBAN=城管)
    private String bizDomain;

    // 可选参数:行政区划编码(如330106=西湖区)
    private String areaCode;
}
(2)Mapper层(MyBatis-Plus动态SQL)
复制代码
@Mapper
public interface IndicatorMapper extends BaseMapper<IndicatorResultDTO> {
    /**
     * 计算处置率(支持多维度筛选)
     * @param queryDTO 筛选参数(时间、业务域、行政区划)
     * @return 处置率结果列表
     */
    List<IndicatorResultDTO> calculateHandleRate(@Param("query") IndicatorQueryDTO queryDTO);
}

// 对应的XML映射文件(resources/mapper/IndicatorMapper.xml)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.urban.mapper.IndicatorMapper">
    <select id="calculateHandleRate" resultType="com.urban.dto.IndicatorResultDTO">
        SELECT
            SUM(CASE WHEN we.status = 2 THEN 1 ELSE 0 END) AS numerator,
            COUNT(we.wo_id) AS denominator,
            ROUND(
                IF(COUNT(we.wo_id) = 0, 0, 
                   SUM(CASE WHEN we.status = 2 THEN 1 ELSE 0 END) / COUNT(we.wo_id) * 100
                ), 2
            ) AS indicatorValue,
            dbd.dict_label AS bizDomainName,
            sa.area_name AS areaName,
            #{query.startTime} AS startTime,
            #{query.endTime} AS endTime
        FROM
            biz_evt_wo we
        LEFT JOIN sys_dict_data dbd 
            ON we.biz_domain = dbd.dict_value 
            AND dbd.dict_type = 'biz_domain'
        LEFT JOIN sys_area sa 
            ON we.area_code = sa.area_code
        WHERE
            we.create_time BETWEEN #{query.startTime} AND #{query.endTime}
            <if test="query.bizDomain != null and query.bizDomain != ''">
                AND we.biz_domain = #{query.bizDomain}
            </if>
            <if test="query.areaCode != null and query.areaCode != ''">
                AND we.area_code = #{query.areaCode}
            </if>
            AND we.is_delete = 0
        GROUP BY
            we.biz_domain, dbd.dict_label, we.area_code, sa.area_name
    </select>
</mapper>
(3)Service层(业务逻辑与参数校验)
复制代码
@Service
@RequiredArgsConstructor
public class IndicatorServiceImpl implements IndicatorService {

    private final IndicatorMapper indicatorMapper;
    private final SysDictDataMapper dictDataMapper; // 字典表Mapper(验证业务域合法性)

    /**
     * 计算处置率:含参数校验、多维度筛选、结果封装
     */
    @Override
    public List<IndicatorResultDTO> calculateHandleRate(IndicatorQueryDTO queryDTO) {
        // 1. 参数校验:时间范围合法性
        if (LocalDateTime.parse(queryDTO.getStartTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
                .isAfter(LocalDateTime.parse(queryDTO.getEndTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))) {
            throw new BusinessException("开始时间不能晚于结束时间");
        }

        // 2. 业务域合法性校验(关联《03数据库表》sys_dict_data)
        if (StringUtils.isNotBlank(queryDTO.getBizDomain())) {
            LambdaQueryWrapper<SysDictData> dictWrapper = new LambdaQueryWrapper<>();
            dictWrapper.eq(SysDictData::getDictType, "biz_domain")
                      .eq(SysDictData::getDictValue, queryDTO.getBizDomain())
                      .eq(SysDictData::getStatus, 1); // 启用状态
            if (dictDataMapper.selectCount(dictWrapper) == 0) {
                throw new BusinessException("业务域编码无效:" + queryDTO.getBizDomain());
            }
        }

        // 3. 调用Mapper计算处置率
        List<IndicatorResultDTO> resultList = indicatorMapper.calculateHandleRate(queryDTO);

        // 4. 结果补充:若无数据,返回空维度结果(避免大屏展示空白)
        if (CollectionUtils.isEmpty(resultList)) {
            IndicatorResultDTO emptyResult = new IndicatorResultDTO();
            emptyResult.setIndicatorValue(BigDecimal.ZERO);
            emptyResult.setNumerator(0);
            emptyResult.setDenominator(0);
            emptyResult.setStartTime(queryDTO.getStartTime());
            emptyResult.setEndTime(queryDTO.getEndTime());
            emptyResult.setBizDomainName(queryDTO.getBizDomain() == null ? "全部业务域" : 
                    dictDataMapper.selectOne(new LambdaQueryWrapper<SysDictData>()
                            .eq(SysDictData::getDictType, "biz_domain")
                            .eq(SysDictData::getDictValue, queryDTO.getBizDomain())).getDictLabel());
            emptyResult.setAreaName(queryDTO.getAreaCode() == null ? "全部区域" : 
                    SpringContextHolder.getBean(SysAreaMapper.class)
                            .selectById(queryDTO.getAreaCode()).getAreaName());
            resultList.add(emptyResult);
        }

        return resultList;
    }
}
(4)Controller层(接口暴露,适配《04工作台》与《07全局总览》)
复制代码
@RestController
@RequestMapping("/api/v1/indicator")
@RequiredArgsConstructor
public class IndicatorController {

    private final IndicatorService indicatorService;

    /**
     * 处置率计算接口
     * @param queryDTO 筛选参数(时间、业务域、行政区划)
     * @return 处置率结果(支持多维度批量返回)
     */
    @PostMapping("/handle-rate")
    public CommonResult<List<IndicatorResultDTO>> calculateHandleRate(
            @Valid @RequestBody IndicatorQueryDTO queryDTO) {
        List<IndicatorResultDTO> resultList = indicatorService.calculateHandleRate(queryDTO);
        return CommonResult.success(resultList);
    }
}

2.4 行业适配案例(基于《06行业文件》)

(1)城管住建处置率(《06行业文件-01城管住建.docx》P35)
  • 筛选条件:biz_domain=URBAN(城管业务域)、areaCode=330106(西湖区)、startTime=2025-11-01 00:00:00endTime=2025-11-30 23:59:59

  • 数据来源:biz_urban_evt_wo(城管工单表,继承biz_evt_wo结构,新增illegal_type违建类型字段);

  • 调用接口:/api/v1/indicator/handle-rate,返回结果示例:

    复制代码
    {
      "code": 200,
      "msg": "success",
      "data": [
        {
          "indicatorValue": 92.31,
          "numerator": 120,
          "denominator": 130,
          "startTime": "2025-11-01 00:00:00",
          "endTime": "2025-11-30 23:59:59",
          "bizDomainName": "城管住建",
          "areaName": "杭州市西湖区"
        }
      ]
    }
(2)水利水务处置率(《06行业文件-02水利水务.docx》P41)
  • 筛选条件:biz_domain=WATER(水利业务域)、areaCode=330108(滨江区);

  • 数据来源:biz_water_evt_wo(水利工单表,新增water_type水质类型字段);

  • 计算逻辑:复用上述代码,仅需在biz_evt_wobiz_domain字段筛选WATER,体现"通用逻辑复用"。

三、通用指标2:预警准确率------风险识别的"精准度核心指标"

3.1 指标定义与文件依据

(1)计算逻辑

预警准确率 = 准确预警数 / 总预警数 × 100%

  • 准确预警:指预警后"经验证确实存在风险"的预警事件(如水质预警后采样验证pH值超标、违建预警后现场核查确认违建),验证状态来自《03数据库表》biz_early_warn_verify

  • 总预警数:指指定时间范围内、指定维度的所有预警事件(含准确、不准确、待验证);

  • 文件依据:《05数据中枢》20.9.5节"风险识别溯源"(预警需验证真实性)、《06行业文件-03生态环保.docx》P34"空气质量预警准确率"。

(2)数据来源

核心数据来自《03数据库表》的"预警相关表",关联验证表与基础表:

指标维度 数据来源表(《03数据库表》) 核心字段(作用)
总预警数 biz_early_warn_alert(预警表) warn_id(预警ID,计数用)、warn_time(预警时间,筛选用)、warn_level(预警等级)
准确预警数 biz_early_warn_verify(预警验证表) warn_id(关联预警表)、verify_result(验证结果:1=准确/0=不准确/2=待验证)
业务域/区域筛选 biz_early_warn_alert+sys_area biz_domain(业务域)、area_code(行政区划)→ 关联基础表获取名称

3.2 SQL实现(含预警验证关联)

(1)基础SQL(时间范围+预警等级筛选)

以"2025年11月生态环保高优预警准确率"为例:

复制代码
SELECT
    -- 准确预警数(verify_result=1:验证准确)
    SUM(CASE WHEN wev.verify_result = 1 THEN 1 ELSE 0 END) AS accurate_count,
    -- 总预警数(所有验证状态,含待验证)
    COUNT(wea.warn_id) AS total_warn_count,
    -- 预警准确率(分母为0返回0,保留2位小数)
    ROUND(
        IF(COUNT(wea.warn_id) = 0, 0, 
           SUM(CASE WHEN wev.verify_result = 1 THEN 1 ELSE 0 END) / COUNT(wea.warn_id) * 100
        ), 2
    ) AS warn_accuracy,
    -- 筛选维度:预警等级名称(关联sys_dict_warn_level)
    dwl.dict_label AS warn_level_name,
    -- 业务域名称(关联sys_dict_biz_domain)
    dbd.dict_label AS biz_domain_name
FROM
    biz_early_warn_alert wea
-- 关联预警验证表(左连接:含未验证的预警)
LEFT JOIN biz_early_warn_verify wev 
    ON wea.warn_id = wev.warn_id
-- 关联预警等级字典表
LEFT JOIN sys_dict_data dwl 
    ON wea.warn_level = dwl.dict_value 
    AND dwl.dict_type = 'warn_level'
-- 关联业务域字典表
LEFT JOIN sys_dict_data dbd 
    ON wea.biz_domain = dbd.dict_value 
    AND dbd.dict_type = 'biz_domain'
WHERE
    -- 时间范围筛选
    wea.warn_time BETWEEN #{startTime} AND #{endTime}
    -- 业务域筛选(生态环保:ENVIRONMENT)
    AND wea.biz_domain = 'ENVIRONMENT'
    -- 预警等级筛选(高优:1)
    AND wea.warn_level = '1'
    -- 逻辑删除
    AND wea.is_delete = 0
GROUP BY
    wea.warn_level, dwl.dict_label, wea.biz_domain, dbd.dict_label;

3.3 代码实现(复用处置率的通用框架)

(1)Service层核心逻辑(新增预警验证校验)
复制代码
@Service
public class IndicatorServiceImpl implements IndicatorService {
    // 省略其他代码...

    /**
     * 计算预警准确率
     */
    @Override
    public List<IndicatorResultDTO> calculateWarnAccuracy(IndicatorQueryDTO queryDTO) {
        // 1. 时间参数校验(复用处置率的时间校验逻辑)
        validateTimeRange(queryDTO);

        // 2. 预警等级合法性校验(关联sys_dict_warn_level)
        if (StringUtils.isNotBlank(queryDTO.getWarnLevel())) {
            LambdaQueryWrapper<SysDictData> dictWrapper = new LambdaQueryWrapper<>();
            dictWrapper.eq(SysDictData::getDictType, "warn_level")
                      .eq(SysDictData::getDictValue, queryDTO.getWarnLevel())
                      .eq(SysDictData::getStatus, 1);
            if (dictDataMapper.selectCount(dictWrapper) == 0) {
                throw new BusinessException("预警等级无效:" + queryDTO.getWarnLevel());
            }
        }

        // 3. 调用Mapper计算准确率
        List<IndicatorResultDTO> resultList = indicatorMapper.calculateWarnAccuracy(queryDTO);

        // 4. 结果补充(无数据时返回空维度)
        if (CollectionUtils.isEmpty(resultList)) {
            IndicatorResultDTO emptyResult = buildEmptyIndicatorResult(queryDTO, "warnAccuracy");
            resultList.add(emptyResult);
        }

        return resultList;
    }

    /**
     * 构建空指标结果(复用逻辑)
     */
    private IndicatorResultDTO buildEmptyIndicatorResult(IndicatorQueryDTO queryDTO, String indicatorType) {
        IndicatorResultDTO emptyResult = new IndicatorResultDTO();
        emptyResult.setIndicatorValue(BigDecimal.ZERO);
        emptyResult.setNumerator(0);
        emptyResult.setDenominator(0);
        emptyResult.setStartTime(queryDTO.getStartTime());
        emptyResult.setEndTime(queryDTO.getEndTime());
        // 补充业务域、区域名称(复用处置率的逻辑)
        // ...(省略重复代码,与处置率的空结果构建一致)
        return emptyResult;
    }
}
(2)Mapper层XML(动态关联预警验证表)
复制代码
<select id="calculateWarnAccuracy" resultType="com.urban.dto.IndicatorResultDTO">
    SELECT
        SUM(CASE WHEN wev.verify_result = 1 THEN 1 ELSE 0 END) AS numerator,
        COUNT(wea.warn_id) AS denominator,
        ROUND(
            IF(COUNT(wea.warn_id) = 0, 0, 
               SUM(CASE WHEN wev.verify_result = 1 THEN 1 ELSE 0 END) / COUNT(wea.warn_id) * 100
            ), 2
        ) AS indicatorValue,
        dwl.dict_label AS warnLevelName,
        dbd.dict_label AS bizDomainName,
        sa.area_name AS areaName,
        #{query.startTime} AS startTime,
        #{query.endTime} AS endTime
    FROM
        biz_early_warn_alert wea
    LEFT JOIN biz_early_warn_verify wev 
        ON wea.warn_id = wev.warn_id
    LEFT JOIN sys_dict_data dwl 
        ON wea.warn_level = dwl.dict_value 
        AND dwl.dict_type = 'warn_level'
    LEFT JOIN sys_dict_data dbd 
        ON wea.biz_domain = dbd.dict_value 
        AND dbd.dict_type = 'biz_domain'
    LEFT JOIN sys_area sa 
        ON wea.area_code = sa.area_code
    WHERE
        wea.warn_time BETWEEN #{query.startTime} AND #{query.endTime}
        <if test="query.bizDomain != null and query.bizDomain != ''">
            AND wea.biz_domain = #{query.bizDomain}
        </if>
        <if test="query.areaCode != null and query.areaCode != ''">
            AND wea.area_code = #{query.areaCode}
        </if>
        <if test="query.warnLevel != null and query.warnLevel != ''">
            AND wea.warn_level = #{query.warnLevel}
        </if>
        AND wea.is_delete = 0
    GROUP BY
        wea.warn_level, dwl.dict_label, wea.biz_domain, dbd.dict_label, wea.area_code, sa.area_name
</select>

四、核心指标计算的通用复用要点

4.1 逻辑复用(适配17+业务领域)

  1. 参数化筛选 :所有指标均支持"时间范围、业务域、行政区划"维度,通过IndicatorQueryDTO统一封装,避免重复定义参数;

  2. 动态SQL :通过MyBatis-Plus的<if>标签实现筛选条件动态拼接(如业务域为空时查询所有领域),适配《06行业文件》的个性化筛选需求;

  3. 结果封装 :指标结果统一用IndicatorResultDTO封装,包含"计算值、分子、分母、筛选维度",直接适配《07全局总览》的大屏组件(如环形图、柱状图)。

4.2 合规性验证(文件依据)

  1. 表名与字段 :所有SQL与代码引用的表(biz_evt_wobiz_early_warn_alert)均来自《03数据库表》,字段(biz_domainarea_code)符合《02命名规范》的snake_case格式;

  2. 业务逻辑:指标计算逻辑(处置率、预警准确率)均来自《05数据中枢》的"综合评价"模块,无自定义逻辑;

  3. 异常处理:代码中包含"时间范围非法、业务域无效、分母为0"等异常场景处理,符合《01总体架构》"高可用"要求(P85)。

五、总结:核心指标计算的"文件闭环"

处置率与预警准确率的计算逻辑,本质是"从《03数据库表》取数→按《05数据中枢》规则计算→为《06行业文件》提供行业指标→适配《07全局总览》展示"的闭环:

  • 数据层:依赖《03数据库表》的业务表与基础表,确保数据可追溯;

  • 逻辑层:遵循《05数据中枢》的指标定义,确保计算合规;

  • 应用层:支持《06行业文件》的多维度筛选,确保行业适配;

  • 展示层:封装《07全局总览》所需结果格式,确保可视化兼容。

所有代码与SQL均无外部依赖,完全基于指定文件,可直接集成到一网统管平台,支撑17个业务领域的核心指标计算需求。

相关推荐
龙亘川9 小时前
【课程5.1】城管住建核心功能需求分析:市政设施、市容秩序等场景痛点拆解
数据库·oracle·智慧城市·城管住建
WebGIS开发19 小时前
WebGIS开发实战|智慧城市淄博可视化开发系统
智慧城市·gis开发·webgis·地理信息科学
论文小助手W6852 天前
中国公路建设行业协会沉管隧道分会技术交流大会暨第九届交通运输与土木建筑国际学术会议(ICTTCA 2026)
人工智能·智慧城市·信息与通信·交通物流
图扑可视化5 天前
城市政务合集:图扑数字孪生治理决策一网支撑
智慧城市·数字孪生·三维可视化·智慧政务·市政大屏
龙亘川7 天前
《2025 数字孪生白皮书》:智能算法落地实战指南,附技术实现细节
人工智能·智慧城市
STLearner7 天前
2025时空数据研究工作总结
大数据·人工智能·python·深度学习·学习·机器学习·智慧城市
萤丰信息13 天前
数智重构生态:智慧园区引领城市高质量发展新范式
java·大数据·人工智能·安全·智慧城市
星纵物联13 天前
高精度人数统计传感器揭秘
人工智能·物联网·lora·智慧城市·lorawan
数字孪生家族13 天前
以视频孪生融合空间智能,打造智慧城市领域物联感知与 AI 应用标杆案例
人工智能·智慧城市·视频孪生智慧交通·空间智能应用·视频孪生能源·数字乡村建设