2026/5/18 9:47:37
网站建设
项目流程
恶意推广网站,上海十大好厂排名,代理ip官网,图书馆网站建设教程严格基于指定水利水务相关文件#xff08;核心为《06行业应用系统功能设计-02水利水务.docx》简称《06-02水利》、《03智慧城市一网统管平台-系统数据库表.docx》简称《03数据库表》、《05智慧城市一网统管平台 数据中枢系统功能设计.docx》简称《05数据中枢》、《02数据库表设…严格基于指定水利水务相关文件核心为《06行业应用系统功能设计-02水利水务.docx》简称《06-02水利》、《03智慧城市一网统管平台-系统数据库表.docx》简称《03数据库表》、《05智慧城市一网统管平台 数据中枢系统功能设计.docx》简称《05数据中枢》、《02数据库表设计命名规范及英文简称对照表.docx》简称《02命名规范》聚焦“水质达标率”计算含pH值、浊度、溶解氧、余氯指标所有代码逻辑、表关联、达标标准均来自文件原文不涉及外部信息。一、编码前置文件明确的核心依据1.1 水质达标标准《06-02水利》3.2节文件明确4类核心水质指标的达标范围是代码中判断达标的唯一依据指标编码指标名称达标范围文件要求代码可直接使用的判断逻辑单位适用监测类型qual_type适用场景说明规范依据PH_VALUEpH 值6.5 ≤ pH ≤ 8.5ph_value 6.5 AND ph_value 8.5-01、02、03、04地表水、地下水、供水、水源地-TURBIDITY浊度浊度 ≤ 5turbidity 5NTU01、02、03、04地表水、地下水、供水、水源地-DISSOLVED_OXYGEN溶解氧溶解氧 ≥ 2dissolved_oxygen 2mg/L01、04地表水、水源地生态监测专用《06-02 水利》3.2.4 节RESIDUAL_CHLORINE余氯0.2 ≤ 余氯 ≤ 4residual_chlorine 0.2 AND residual_chlorine 4mg/L3供水水质消毒合规性监测《06-02 水利》3.4 节1.2 核心数据表《03数据库表》关联代码需关联3张核心表字段命名符合《02命名规范》biz_*业务层、sys_*基础层、rel_*关联层表名核心字段计算用含字段含义建议字段类型作用补充约束 / 说明biz_water_qual_monqual_id监测记录唯一 IDqual_id: VARCHAR(64)存储单次水质监测的基础元数据作为水质达标判断的主记录载体关联监测点、时间、区域等主键qual_id非空、唯一qual_type监测类型编码qual_type: VARCHAR(16)fac_id 关联设施表如 biz_fac_water_monfac_id关联监测点 IDfac_id: VARCHAR(64)monitor_time监测时间monitor_time: DATETIMEarea_code行政区划编码area_code: VARCHAR(20)rel_qual_indexqual_id关联监测记录 IDqual_id: VARCHAR(64)存储单次监测中各水质指标的实际检测值是达标判断的核心数据来源联合主键(qual_id, index_code)index_code指标编码index_code: VARCHAR(32)qual_id 外键关联 biz_water_qual_mon.qual_idactual_value指标实际检测值actual_value: DECIMAL(10,2)index_code 外键关联 sys_dict_qual_index.index_codesys_dict_qual_indexindex_code指标编码index_code: VARCHAR(32)存储水质指标的达标阈值标准作为实际值是否合格的判定依据主键index_code非空、唯一index_name指标名称index_name: VARCHAR(64)min_value/max_value 可根据指标特性设为非空min_value指标最小达标值min_value: DECIMAL(10,2)max_value指标最大达标值max_value: DECIMAL(10,2)二、核心编码1实体类与DTO映射《03数据库表》2.1 实体类对应数据表字段// 1. 水质监测主表实体biz_water_qual_mon Data TableName(biz_water_qual_mon) public class BizWaterQualMon { TableId(type IdType.ASSIGN_UUID) private String qualId; // 监测IDUUID符合《02命名规范》 NotBlank(message 监测类型不能为空) private String qualType; // 监测类型01地表水/02地下水/03供水/04水源地 NotBlank(message 监测点ID不能为空) private String facId; // 关联sys_water_fac的fac_id NotBlank(message 行政区划编码不能为空) private String areaCode; // 关联sys_area的area_code private Integer qualStatus; // 整体达标状态1达标/0不达标所有指标均合格为达标 NotNull(message 监测时间不能为空) TableField(monitor_time) private Date monitorTime; // 监测时间 TableField(fill FieldFill.INSERT) private Date createTime; // 创建时间自动填充 TableField(is_delete) private Integer isDelete 0; // 逻辑删除0未删除/1已删除 } // 2. 监测-指标关联表实体rel_qual_index Data TableName(rel_qual_index) public class RelQualIndex { TableId(type IdType.ASSIGN_UUID) private String id; NotBlank(message 监测ID不能为空) private String qualId; // 关联biz_water_qual_mon的qual_id NotBlank(message 指标编码不能为空) private String indexCode; // 关联sys_dict_qual_index的index_code NotNull(message 指标实际值不能为空) private BigDecimal actualValue; // 指标实际检测值 private Integer indexStatus; // 单指标达标状态1达标/0不达标 } // 3. 水质指标字典表实体sys_dict_qual_index Data TableName(sys_dict_qual_index) public class SysDictQualIndex { TableId(type IdType.ASSIGN_UUID) private String id; NotBlank(message 指标编码不能为空) private String indexCode; // 指标编码如PH、TURBIDITY、DO、RESIDUAL_CL NotBlank(message 指标名称不能为空) private String indexName; // 指标名称pH值、浊度、溶解氧、余氯 private BigDecimal minValue; // 最小达标值如pH6.5 private BigDecimal maxValue; // 最大达标值如pH8.5 NotBlank(message 指标单位不能为空) private String unit; // 单位-、NTU、mg/L }2.2 指标计算DTO适配前端展示// 水质达标率结果DTO含统计维度与计算值 Data public class WaterQualRateDTO { // 统计维度 private String areaCode; // 行政区划编码 private String areaName; // 行政区划名称关联sys_area private String qualType; // 监测类型 private String qualTypeName; // 监测类型名称如“地表水” private String startTime; // 统计开始时间yyyy-MM-dd HH:mm:ss private String endTime; // 统计结束时间yyyy-MM-dd HH:mm:ss // 计算结果 private BigDecimal qualRate; // 水质达标率%保留2位小数 private Integer qualifiedCount; // 达标监测次数 private Integer totalCount; // 总监测次数 } // 水质达标率查询参数DTO Data Valid public class WaterQualRateQueryDTO { NotBlank(message 行政区划编码不能为空, groups QueryGroup.class) private String areaCode; // 必选行政区划编码如330106西湖区 NotBlank(message 监测类型不能为空, groups QueryGroup.class) private String qualType; // 必选监测类型01地表水/02地下水/03供水/04水源地 NotBlank(message 开始时间不能为空, groups QueryGroup.class) Pattern(regexp ^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$, message 开始时间格式需为yyyy-MM-dd HH:mm:ss, groups QueryGroup.class) private String startTime; // 必选统计开始时间 NotBlank(message 结束时间不能为空, groups QueryGroup.class) Pattern(regexp ^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$, message 结束时间格式需为yyyy-MM-dd HH:mm:ss, groups QueryGroup.class) private String endTime; // 必选统计结束时间 }三、核心编码2Mapper层MyBatis-Plus动态SQL3.1 核心查询接口关联多表统计达标率Mapper public interface WaterQualRateMapper extends BaseMapperWaterQualRateDTO { /** * 计算水质达标率按区域、监测类型、时间范围统计 * 逻辑单次监测中所有指标均达标则该次监测为达标qual_status1 */ Select( SELECT -- 区域信息 sa.area_code AS areaCode, sa.area_name AS areaName, #{query.qualType} AS qualType, sd.dict_label AS qualTypeName, #{query.startTime} AS startTime, #{query.endTime} AS endTime, -- 达标次数qual_status1 SUM(CASE WHEN bqm.qual_status 1 THEN 1 ELSE 0 END) AS qualifiedCount, -- 总监测次数未删除且在时间范围内 COUNT(bqm.qual_id) AS totalCount, -- 达标率分母为0时返回0.00保留2位小数 ROUND( IF(COUNT(bqm.qual_id) 0, 0, SUM(CASE WHEN bqm.qual_status 1 THEN 1 ELSE 0 END) / COUNT(bqm.qual_id) * 100 ), 2 ) AS qualRate FROM biz_water_qual_mon bqm -- 关联行政区划表获取区域名称 LEFT JOIN sys_area sa ON bqm.area_code sa.area_code -- 关联监测类型字典表获取监测类型名称 LEFT JOIN sys_dict_data sd ON bqm.qual_type sd.dict_value AND sd.dict_type water_qual_type WHERE -- 1. 行政区划筛选 bqm.area_code #{query.areaCode} -- 2. 监测类型筛选 AND bqm.qual_type #{query.qualType} -- 3. 时间范围筛选监测时间在统计范围内 AND bqm.monitor_time BETWEEN #{query.startTime} AND #{query.endTime} -- 4. 逻辑删除筛选未删除 AND bqm.is_delete 0 GROUP BY bqm.area_code, sa.area_name, #{query.qualType}, sd.dict_label, #{query.startTime}, #{query.endTime} ) WaterQualRateDTO calculateWaterQualRate(Param(query) WaterQualRateQueryDTO queryDTO); /** * 批量更新水质监测达标状态qual_status * 逻辑关联rel_qual_index若单次监测所有指标均达标index_status1则qual_status1 */ Update( UPDATE biz_water_qual_mon bqm JOIN ( -- 子查询统计单次监测中不达标指标数 SELECT qual_id, SUM(CASE WHEN index_status 0 THEN 1 ELSE 0 END) AS unqual_index_count FROM rel_qual_index rqi WHERE rqi.is_delete 0 AND rqi.qual_id IN (SELECT qual_id FROM biz_water_qual_mon WHERE monitor_time BETWEEN #{startTime} AND #{endTime} AND is_delete 0) GROUP BY qual_id ) rqi_sub ON bqm.qual_id rqi_sub.qual_id SET bqm.qual_status CASE WHEN rqi_sub.unqual_index_count 0 THEN 1 ELSE 0 END WHERE bqm.monitor_time BETWEEN #{startTime} AND #{endTime} AND bqm.is_delete 0 ) void batchUpdateQualStatus(Param(startTime) String startTime, Param(endTime) String endTime); }四、核心编码3Service层业务逻辑与达标判断4.1 达标状态更新逻辑批量判定单次监测是否达标Service RequiredArgsConstructor Slf4j public class WaterQualStatusServiceImpl implements WaterQualStatusService { private final WaterQualRateMapper qualRateMapper; private final RelQualIndexMapper relIndexMapper; private final SysDictQualIndexMapper dictIndexMapper; /** * 批量更新水质监测达标状态 * 1. 按时间范围查询监测-指标关联数据 * 2. 逐指标判断是否达标对比sys_dict_qual_index的min/max值 * 3. 更新rel_qual_index的index_status * 4. 调用Mapper批量更新biz_water_qual_mon的qual_status */ Override Transactional(rollbackFor Exception.class) public void batchUpdateQualStatus(String startTime, String endTime) { // 1. 按时间范围查询需判定的监测-指标关联数据 LambdaQueryWrapperRelQualIndex indexWrapper new LambdaQueryWrapper(); indexWrapper.inSql(RelQualIndex::getQualId, SELECT qual_id FROM biz_water_qual_mon WHERE monitor_time BETWEEN startTime AND endTime AND is_delete 0) .eq(RelQualIndex::getIsDelete, 0); ListRelQualIndex relIndexList relIndexMapper.selectList(indexWrapper); if (CollectionUtils.isEmpty(relIndexList)) { log.info(无需要更新达标状态的水质监测数据时间范围{}~{}, startTime, endTime); return; } // 2. 逐指标判断达标状态对比字典表标准 for (RelQualIndex relIndex : relIndexList) { // 2.1 查询该指标的达标标准min_value/max_value SysDictQualIndex dictIndex dictIndexMapper.selectOne( new LambdaQueryWrapperSysDictQualIndex().eq(SysDictQualIndex::getIndexCode, relIndex.getIndexCode())); if (dictIndex null) { log.warn(水质指标字典不存在indexCode{}跳过该指标判定, relIndex.getIndexCode()); relIndex.setIndexStatus(0); // 指标不存在视为不达标 relIndexMapper.updateById(relIndex); continue; } // 2.2 判定实际值是否在达标范围内《06-02水利》3.2节标准 BigDecimal actualValue relIndex.getActualValue(); Integer indexStatus 0; // 默认不达标 // 处理无最小值如溶解氧仅需≥2mg/L或无最大值如无上限指标实际无此场景的情况 if ((dictIndex.getMinValue() null || actualValue.compareTo(dictIndex.getMinValue()) 0) (dictIndex.getMaxValue() null || actualValue.compareTo(dictIndex.getMaxValue()) 0)) { indexStatus 1; // 达标 } // 2.3 更新单指标达标状态 relIndex.setIndexStatus(indexStatus); relIndexMapper.updateById(relIndex); log.debug(更新水质指标达标状态qualId{}indexCode{}actualValue{}indexStatus{}, relIndex.getQualId(), relIndex.getIndexCode(), actualValue, indexStatus); } // 3. 批量更新监测主表的整体达标状态所有指标达标则整体达标 qualRateMapper.batchUpdateQualStatus(startTime, endTime); log.info(批量更新水质监测达标状态完成时间范围{}~{}, startTime, endTime); } }4.2 水质达标率计算逻辑按维度统计Service RequiredArgsConstructor public class WaterQualRateServiceImpl implements WaterQualRateService { private final WaterQualRateMapper qualRateMapper; private final SysAreaMapper areaMapper; private final SysDictDataMapper dictDataMapper; private final WaterQualStatusService qualStatusService; /** * 计算水质达标率 * 1. 校验查询参数时间范围、区域合法性 * 2. 先更新指定时间范围的达标状态确保数据最新 * 3. 调用Mapper查询达标率 * 4. 补充统计维度名称区域名称、监测类型名称 */ Override public CommonResultWaterQualRateDTO calculateWaterQualRate(WaterQualRateQueryDTO queryDTO) { // 1. 参数校验时间范围合法性 LocalDateTime startLdt LocalDateTime.parse(queryDTO.getStartTime(), DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss)); LocalDateTime endLdt LocalDateTime.parse(queryDTO.getEndTime(), DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss)); if (startLdt.isAfter(endLdt)) { throw new BusinessException(开始时间不能晚于结束时间); } // 2. 参数校验行政区划合法性关联sys_area SysArea area areaMapper.selectById(queryDTO.getAreaCode()); if (area null) { throw new BusinessException(行政区划编码无效 queryDTO.getAreaCode()); } // 3. 参数校验监测类型合法性关联sys_dict_data LambdaQueryWrapperSysDictData dictWrapper new LambdaQueryWrapper(); dictWrapper.eq(SysDictData::getDictType, water_qual_type) .eq(SysDictData::getDictValue, queryDTO.getQualType()) .eq(SysDictData::getStatus, 1); // 启用状态 if (dictDataMapper.selectCount(dictWrapper) 0) { throw new BusinessException(监测类型无效 queryDTO.getQualType()); } // 4. 先更新指定时间范围的达标状态确保统计数据最新 qualStatusService.batchUpdateQualStatus(queryDTO.getStartTime(), queryDTO.getEndTime()); // 5. 调用Mapper计算达标率 WaterQualRateDTO resultDTO qualRateMapper.calculateWaterQualRate(queryDTO); if (resultDTO null) { // 无数据时构建空结果避免前端展示异常 resultDTO buildEmptyQualRateDTO(queryDTO, area); } else { // 6. 补充统计维度名称 resultDTO.setAreaName(area.getAreaName()); resultDTO.setQualTypeName(dictDataMapper.selectOne(dictWrapper).getDictLabel()); } return CommonResult.success(resultDTO); } /** * 构建无数据时的空达标率结果 */ private WaterQualRateDTO buildEmptyQualRateDTO(WaterQualRateQueryDTO queryDTO, SysArea area) { WaterQualRateDTO emptyDTO new WaterQualRateDTO(); // 统计维度 emptyDTO.setAreaCode(queryDTO.getAreaCode()); emptyDTO.setAreaName(area.getAreaName()); emptyDTO.setQualType(queryDTO.getQualType()); emptyDTO.setQualTypeName(dictDataMapper.selectOne( new LambdaQueryWrapperSysDictData() .eq(SysDictData::getDictType, water_qual_type) .eq(SysDictData::getDictValue, queryDTO.getQualType()) ).getDictLabel()); emptyDTO.setStartTime(queryDTO.getStartTime()); emptyDTO.setEndTime(queryDTO.getEndTime()); // 计算结果无数据时均为0 emptyDTO.setQualRate(BigDecimal.ZERO); emptyDTO.setQualifiedCount(0); emptyDTO.setTotalCount(0); return emptyDTO; } }五、核心编码4Controller层接口暴露RestController RequestMapping(/api/v1/water/qual) RequiredArgsConstructor public class WaterQualRateController { private final WaterQualRateService qualRateService; private final TokenService tokenService; // 对接《04我的工作台》token认证 /** * 水质达标率计算接口供前端/大屏调用 * param queryDTO 筛选参数区域、监测类型、时间范围 * param token 登录token验证用户权限 */ PostMapping(/rate/calculate) public CommonResultWaterQualRateDTO calculateWaterQualRate( Valid RequestBody Validated(QueryGroup.class) WaterQualRateQueryDTO queryDTO, RequestHeader(token) String token) { // 1. token认证解析用户ID《04工作台》统一认证逻辑 String userId tokenService.getUserIdByToken(token); if (userId null) { return CommonResult.fail(token无效或已过期); } // 2. 数据权限控制用户仅能查询所属区域的达标率《05数据中枢》20.15.2节 checkDataPermission(userId, queryDTO.getAreaCode()); // 3. 调用Service计算达标率 WaterQualRateDTO resultDTO qualRateService.calculateWaterQualRate(queryDTO); return CommonResult.success(resultDTO); } /** * 数据权限校验用户仅能查询自己有权限的区域 */ private void checkDataPermission(String userId, String areaCode) { LambdaQueryWrapperSysUserRoleData dataWrapper new LambdaQueryWrapper(); dataWrapper.eq(SysUserRoleData::getUserId, userId) .eq(SysUserRoleData::getDataScope, AREA) // 区域数据权限 .like(SysUserRoleData::getAreaCodes, areaCode); // 权限区域包含目标区域 if (SpringContextHolder.getBean(SysUserRoleDataMapper.class).selectCount(dataWrapper) 0) { throw new BusinessException(无权限查询该区域水质达标率); } } }六、代码验证文件合规性与功能适配6.1 验证场景与文件依据验证场景验证步骤预期结果文件依据地表水pH达标判定1. 模拟监测数据pH7.0在6.5-8.5范围内2. 调用batchUpdateQualStatus1. rel_qual_index的index_status12. biz_water_qual_mon的qual_status1假设其他指标也达标《06-02水利》3.2节供水余氯不达标判定1. 模拟监测数据余氯0.1mg/L0.2mg/L2. 调用达标率计算接口1. 该次监测qual_status02. 达标率统计时计入不达标次数《06-02水利》3.4节无数据场景处理1. 查询无监测数据的区域时间范围2. 调用接口返回达标率0.00%、qualifiedCount0、totalCount0《05数据中枢》20.15节容错要求七、总结代码与文件的闭环契合水质达标指标计算代码完全基于指定文件构建数据层实体类字段与《03数据库表》完全一致达标标准来自《06-02水利》3.2节逻辑层达标判定逻辑指标范围对比、达标率计算达标次数/总次数均遵循文件要求无自定义规则应用层接口适配《04工作台》认证与数据权限结果DTO支撑《07城市全局总览》大屏展示符合《01总体架构》“数据驱动”原则。所有代码仅针对指定文件无外部依赖确保与一网统管平台整体架构完全兼容。