1. 项目背景与核心价值
去年疫情期间,我接手了一个企业内部的健康打卡系统开发需求。这个看似简单的每日打卡功能,在实际落地时却涉及到复杂的业务流程设计、数据统计分析以及异常情况预警机制。经过三个版本的迭代优化,最终形成的这套SpringBoot疫情打卡健康评测系统,不仅满足了基础信息收集功能,还实现了智能风险评估、数据可视化展示和分级预警等进阶能力。
这套系统的核心价值在于将零散的防疫动作标准化、数字化。通过自动化流程替代传统纸质登记,既减少了人员接触风险,又提高了数据采集效率。后台的智能评估算法能实时识别高风险人员,为管理者提供决策支持。特别在出现突发疫情时,系统生成的接触链分析报告能大幅缩短流调时间。
2. 系统架构设计
2.1 技术栈选型
基础框架采用SpringBoot 2.7 + MyBatis Plus组合,主要基于以下考虑:
- 快速开发:SpringBoot的自动配置特性适合快速迭代
- 数据持久化:MyBatis Plus提供的Lambda查询方式简化了健康数据统计代码
- 报表生成:集成EasyExcel处理每日健康报表导出
- 消息通知:使用RabbitMQ实现异常情况短信提醒的异步处理
数据库选用MySQL 8.0,主要考虑到:
- 打卡记录需要事务支持
- 地理围栏数据需要空间索引
- 后期可能对接BI系统的分析需求
前端采用Vue3 + Element Plus,特别开发了:
- 定位打卡组件(集成高德地图JS API)
- 体温输入校验组件
- 症状自评问卷组件
2.2 核心模块划分
系统分为5个主要模块:
- 用户认证模块(集成企业微信/钉钉单点登录)
- 每日打卡模块(含定位校验、表单验证)
- 健康评估模块(基于规则引擎的风险评分)
- 预警通知模块(分级预警规则配置)
- 数据看板模块(Echarts可视化展示)
3. 关键实现细节
3.1 智能风险评估算法
健康评分采用多维度加权算法:
java复制// 风险评分核心逻辑
public BigDecimal calculateHealthRisk(UserDailyReport report) {
BigDecimal score = BigDecimal.ZERO;
// 基础分(40%权重)
score = score.add(baseScore(report.getTemperature(),
report.hasSymptoms()));
// 轨迹分(30%权重)
score = score.add(locationScore(report.getLocationRiskLevel()));
// 接触史分(20%权重)
score = score.add(contactScore(report.hasHighRiskContact()));
// 疫苗分(10%权重)
score = score.add(vaccineScore(report.getVaccineStatus()));
return score.setScale(2, RoundingMode.HALF_UP);
}
评分规则配置采用数据库存储,便于动态调整:
sql复制CREATE TABLE risk_rule (
id BIGINT PRIMARY KEY,
rule_name VARCHAR(50),
condition_expression VARCHAR(200),
weight DECIMAL(5,2),
is_active BOOLEAN
);
3.2 地理围栏校验
为防止虚假打卡,实现了基于GIS的地理围栏校验:
- 通过高德地图JS API获取用户实际坐标
- 与企业登记的工作地点坐标比对
- 计算Haversine距离公式判断是否在允许范围内
java复制public boolean checkInAllowedArea(Location current, Location office) {
double distance = Haversine.distance(
current.getLat(), current.getLng(),
office.getLat(), office.getLng()
);
return distance <= ALLOWED_RADIUS;
}
4. 典型问题解决方案
4.1 高峰时段系统卡顿
在早8-9点打卡高峰期间,系统曾出现响应延迟问题。通过以下措施优化:
- 引入Redis缓存:
- 用户基础信息缓存
- 企业地理围栏配置缓存
- 数据库优化:
- 为打卡记录表添加时间范围分区
- 建立复合索引(user_id, report_date)
- 采用消息队列异步处理:
- 非核心流程(如通知发送)转入RabbitMQ处理
4.2 异常数据识别
针对可能的虚假填报情况,建立了多维度校验机制:
- 体温异常检测:
- 连续3天37.3℃以上自动触发复核
- 定位异常检测:
- 频繁变更城市触发预警
- 填报时间分析:
- 固定时间规律性填报可能为脚本行为
5. 数据可视化实践
5.1 实时疫情看板
使用Echarts实现动态数据展示:
- 企业健康状态分布图(热力图展示)
- 高风险人员动线追踪
- 疫苗接种进度仪表盘
关键配置示例:
javascript复制option = {
tooltip: {
trigger: 'item',
formatter: '{a} <br/>{b}: {c} ({d}%)'
},
series: [{
name: '健康状态',
type: 'pie',
radius: ['40%', '70%'],
data: [
{value: 335, name: '健康'},
{value: 10, name: '高风险'},
{value: 20, name: '待复核'}
]
}]
};
5.2 自动化报表生成
采用EasyExcel实现日报自动生成:
- 定时任务每天8:30生成前日汇总
- 支持多sheet设计:
- 汇总统计页
- 异常明细页
- 趋势分析页
- 企业微信机器人自动推送
6. 部署注意事项
-
定位服务配置:
- 高德地图Web端Key需要配置IP白名单
- iOS设备需额外处理精确定位权限问题
-
短信网关对接:
- 建议配置多个通道备用
- 注意验证码类短信和通知类短信的区分
-
数据备份策略:
- 每日全量备份保留7天
- 增量备份每小时执行
- 敏感数据需要加密存储
这套系统在实际运行中,日均处理打卡记录超过2万条,识别高风险情况37次,有效辅助了企业的疫情防控决策。核心经验是:在基础打卡功能上,通过智能分析赋予数据更多价值,同时保持系统的灵活可配置性,以应对不断变化的防疫政策要求。