知识库积分统计看板 - 开发说明
一、功能概述
每月1号凌晨5点自动生成上个月的积分快照数据,并向指定人员发送通知。
通知点击后展示积分统计看板,支持公司级/部门级/员工级三层下钻查看。
入口
- 通知入口:点击待办通知(type=201)直接进入看板页面
- 菜单入口:知识库管理 → 积分看板(支持手动选择月份查看)
数据层级
| 层级 |
说明 |
交互 |
| 公司级 |
全公司汇总卡片 |
默认展示 |
| 部门级 |
各部门汇总表格 |
点击部门名称弹出员工列表 |
| 员工级 |
部门下员工明细 |
点击"详情"弹出积分明细 |
二、数据库表
2.1 知识库积分通知人员表
CREATE TABLE `work_knowledge_point_notify_user` (
`id` VARCHAR(64) NOT NULL COMMENT '主键',
`user_id` VARCHAR(64) NOT NULL COMMENT '用户ID(关联sys_user.id)',
`del_flag` VARCHAR(1) NOT NULL DEFAULT '0' COMMENT '删除标记(0正常 1删除)',
`create_date` DATETIME DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='知识库积分通知人员表';
使用说明:在表中插入需要接收通知的用户记录即可。
-- 示例:添加通知人员
INSERT INTO work_knowledge_point_notify_user (id, user_id, del_flag, create_date)
VALUES (REPLACE(UUID(), '-', ''), '用户ID', '0', NOW());
2.2 知识库积分快照明细表(员工级)
CREATE TABLE `wk_point_snapshot_info` (
`id` VARCHAR(64) NOT NULL COMMENT '主键',
`del_flag` VARCHAR(1) NOT NULL DEFAULT '0' COMMENT '删除标记',
`create_date` DATETIME DEFAULT NULL COMMENT '创建时间',
`snapshot_year` INT NOT NULL COMMENT '快照年份',
`snapshot_month` INT NOT NULL COMMENT '快照月份',
`office_id` VARCHAR(64) DEFAULT NULL COMMENT '部门ID',
`office_name` VARCHAR(200) DEFAULT NULL COMMENT '部门名称',
`user_id` VARCHAR(64) NOT NULL COMMENT '用户ID',
`user_name` VARCHAR(200) DEFAULT NULL COMMENT '用户姓名',
`upload_count` INT DEFAULT 0 COMMENT '上传文档数',
`field1` VARCHAR(64) DEFAULT NULL COMMENT '基础-阅读积分',
`field2` VARCHAR(64) DEFAULT NULL COMMENT '基础-点赞积分',
`field3` VARCHAR(64) DEFAULT NULL COMMENT '贡献-技术总结-创建',
`field4` VARCHAR(64) DEFAULT NULL COMMENT '贡献-技术总结-审核',
`field5` VARCHAR(64) DEFAULT NULL COMMENT '贡献-培训心得-创建',
`field6` VARCHAR(64) DEFAULT NULL COMMENT '贡献-培训心得-审核',
`field7` VARCHAR(64) DEFAULT NULL COMMENT '贡献-相关资料-创建',
`field8` VARCHAR(64) DEFAULT NULL COMMENT '贡献-相关资料-审核',
`field9` VARCHAR(64) DEFAULT NULL COMMENT '贡献-问答答疑-创建',
`field10` VARCHAR(64) DEFAULT NULL COMMENT '贡献-问答答疑-回答',
`field11` VARCHAR(64) DEFAULT NULL COMMENT '贡献-典型案例(原创)-创建',
`field12` VARCHAR(64) DEFAULT NULL COMMENT '贡献-典型案例(原创)-审核',
`field13` VARCHAR(64) DEFAULT NULL COMMENT '贡献-典型案例(转载)-创建',
`field14` VARCHAR(64) DEFAULT NULL COMMENT '贡献-典型案例(转载)-审核',
`field15` VARCHAR(64) DEFAULT NULL COMMENT '贡献-扣除积分',
`field16` VARCHAR(64) DEFAULT NULL COMMENT '扩展字段16',
`field17` VARCHAR(64) DEFAULT NULL COMMENT '扩展字段17',
`field18` VARCHAR(64) DEFAULT NULL COMMENT '扩展字段18',
`field19` VARCHAR(64) DEFAULT NULL COMMENT '扩展字段19',
`field20` VARCHAR(64) DEFAULT NULL COMMENT '扩展字段20',
PRIMARY KEY (`id`),
KEY `idx_snapshot_ym` (`snapshot_year`, `snapshot_month`),
KEY `idx_snapshot_user` (`snapshot_year`, `snapshot_month`, `user_id`),
KEY `idx_snapshot_office` (`snapshot_year`, `snapshot_month`, `office_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='知识库积分快照明细表';
2.3 知识库积分快照汇总表(公司/部门/员工三级)
CREATE TABLE `wk_point_snapshot_summary` (
`id` VARCHAR(64) NOT NULL COMMENT '主键',
`del_flag` VARCHAR(1) NOT NULL DEFAULT '0' COMMENT '删除标记',
`create_date` DATETIME DEFAULT NULL COMMENT '创建时间',
`snapshot_year` INT NOT NULL COMMENT '快照年份',
`snapshot_month` INT NOT NULL COMMENT '快照月份',
`grade_type` VARCHAR(10) NOT NULL COMMENT '层级类型(1:公司 2:部门 3:员工)',
`office_id` VARCHAR(64) DEFAULT NULL COMMENT '部门ID(公司级为空)',
`office_name` VARCHAR(200) DEFAULT NULL COMMENT '部门名称',
`user_id` VARCHAR(64) DEFAULT NULL COMMENT '用户ID(员工级才有)',
`user_name` VARCHAR(200) DEFAULT NULL COMMENT '用户姓名',
`upload_count` INT DEFAULT 0 COMMENT '上传文档数',
`basic_subtotal` INT DEFAULT 0 COMMENT '基础积分汇总',
`basic_exchange` INT DEFAULT 0 COMMENT '基础已兑换积分',
`basic_remaining` INT DEFAULT 0 COMMENT '基础剩余积分',
`contrib_subtotal` INT DEFAULT 0 COMMENT '贡献积分汇总(含扣除)',
`contrib_deduction` INT DEFAULT 0 COMMENT '贡献-扣除积分',
`contrib_exchange` INT DEFAULT 0 COMMENT '贡献已兑换积分',
`contrib_remaining` INT DEFAULT 0 COMMENT '贡献剩余积分',
PRIMARY KEY (`id`),
KEY `idx_summary_ym` (`snapshot_year`, `snapshot_month`),
KEY `idx_summary_ym_grade` (`snapshot_year`, `snapshot_month`, `grade_type`),
KEY `idx_summary_ym_office` (`snapshot_year`, `snapshot_month`, `office_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='知识库积分快照汇总表';
三、通知参数说明
| 参数 |
值 |
说明 |
| utilNotifyId |
201 |
通知类型标识 |
| notifyId |
201,{year},{month} |
如 201,2026,6 |
| type |
201 |
WorkProjectNotify.type |
| title |
{year}年{month}月-知识库积分统计 |
通知标题 |
| content |
{year}年{month}月-知识库积分统计 |
通知内容 |
| status |
0 |
待办状态 |
| remarks |
待通知 |
备注 |
四、定时任务
| 项目 |
说明 |
| 类 |
WorkCalendarTaskService |
| 方法 |
getKnowledgeBasePointSnapshotOnMonth() |
| cron |
0 0 5 1 * ?(每月1号凌晨5点) |
| 逻辑 |
计算上个月的年月 → 生成快照 → 发送通知 |
五、接口清单
| 接口 |
URL |
方法 |
说明 |
| 看板页面 |
/workKnowledgeBase/point/dashboard |
GET |
从菜单进入的看板页面 |
| 看板数据 |
/workKnowledgeBase/point/dashboardData |
GET |
AJAX,参数:year, month |
| 部门员工 |
/workKnowledgeBase/point/departmentEmployees |
GET |
AJAX,参数:year, month, officeId |
| 员工详情 |
/workKnowledgeBase/point/employeeSnapshot |
GET |
AJAX,参数:year, month, userId |
| 手动生成 |
/workKnowledgeBase/point/generateSnapshot |
GET |
AJAX,参数:year, month(需listAll权限) |
六、文件清单
新增文件
| 文件 |
说明 |
entity/WkPointSnapshotInfo.java |
快照明细实体类 |
entity/WkPointSnapshotSummary.java |
快照汇总实体类 |
entity/WorkKnowledgePointNotifyUser.java |
通知人员实体类 |
dao/WkPointSnapshotInfoDao.java |
快照明细DAO |
dao/WkPointSnapshotSummaryDao.java |
快照汇总DAO |
dao/WorkKnowledgePointNotifyUserDao.java |
通知人员DAO |
service/WkPointSnapshotService.java |
快照Service(核心计算+通知发送) |
WkPointSnapshotInfoDao.xml |
快照明细MyBatis映射 |
WkPointSnapshotSummaryDao.xml |
快照汇总MyBatis映射 |
WorkKnowledgePointNotifyUserDao.xml |
通知人员MyBatis映射 |
workKnowledgeBasePointDashboard.jsp |
看板展示页面 |
修改文件
| 文件 |
修改内容 |
WorkCalendarTaskService.java |
新增定时任务方法 + 注入WkPointSnapshotService |
WorkProjectNotifyController.java |
新增type=201的通知处理分支 + 注入WkPointSnapshotService |
WorkKnowledgeBasePointController.java |
新增看板页面入口和5个AJAX接口 + 注入WkPointSnapshotService |
七、部署步骤
- 执行建表SQL:按第二节依次执行3张表的CREATE TABLE语句
- 插入通知人员:在
work_knowledge_point_notify_user 表中添加需要接收通知的用户
- 部署代码:编译打包部署
- 手动测试:调用
/workKnowledgeBase/point/generateSnapshot?year=2026&month=6 生成测试数据
- 查看看板:访问
/workKnowledgeBase/point/dashboard 查看效果
- 验证通知:等待每月1号凌晨5点自动执行,或手动触发
八、扩展字段说明
wk_point_snapshot_info 表预留了 field16 ~ field20 共5个扩展字段。
如需新增规则积分列:
- 在
WkPointSnapshotService.FIELD_MAPPING 中添加映射
- 在
buildRuleIdToFieldMapping() 中添加规则匹配
- 在
setField() 方法中添加 case 分支
- 在 JSP 详情弹窗中添加对应行