去年为本地一家80人规模的制造企业实施人事管理系统时,我深刻体会到传统Excel管理的痛点:数据分散、流程混乱、统计滞后。这套基于SpringBoot+Vue3+MyBatis的技术方案,正是针对20-300人规模企业的典型需求设计而成。
核心解决三个层面的问题:
技术栈选择体现了当前主流的中台架构思想:
这套组合在保证功能完整性的同时,对中小企业的服务器资源要求极低——测试环境下2核4G的云服务器即可流畅运行整套系统。
采用JWT+RBAC的认证方案,前端Vue3通过axios封装了三种级别的请求拦截:
typescript复制// 请求拦截器示例
service.interceptors.request.use(config => {
if (store.getters.token) {
config.headers['Authorization'] = 'Bearer ' + getToken()
}
// 分级超时设置
config.timeout = config.url.includes('/export') ? 60000 : 15000
return config
})
特别注意处理了三种特殊场景:
人员主表(hr_employee)采用纵向分表策略:
sql复制CREATE TABLE `hr_employee` (
`id` bigint NOT NULL COMMENT '雪花算法ID',
`dept_id` int NOT NULL COMMENT '部门编码',
`job_number` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '工号规则: DEPT+年份+序号',
`id_card` varchar(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '加密存储',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_job_number` (`job_number`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
薪资计算表(hr_salary)特别需要注意:
RBAC模型通过五张表实现:
前端权限控制的关键代码:
vue复制<template>
<el-button
v-if="hasPermission('hr:employee:edit')"
@click="handleEdit">
编辑
</el-button>
</template>
<script setup>
import { usePermission } from '@/hooks/usePermission'
const hasPermission = usePermission()
</script>
考勤规则配置采用策略模式:
java复制public interface AttendanceCalculator {
AttendanceResult calculate(LocalDate date, Employee employee);
}
// 实现类示例 - 弹性工作制计算
@Component("flexible")
public class FlexibleCalculator implements AttendanceCalculator {
@Override
public AttendanceResult calculate(LocalDate date, Employee employee) {
// 核心计算逻辑...
}
}
考勤异常处理流程:
薪资公式配置界面采用类Excel的表达式解析:
code复制基本工资 + 岗位津贴 + 绩效奖金 * 考核系数 - 社保个人部分 - 公积金个人部分
技术实现要点:
使用Activiti7实现审批流,关键配置:
xml复制<process id="leaveApproval" name="请假审批">
<startEvent id="start"/>
<userTask id="deptLeaderAudit" name="部门审批"/>
<sequenceFlow sourceRef="start" targetRef="deptLeaderAudit"/>
<exclusiveGateway id="gateway1"/>
<!-- 更多节点... -->
</process>
特别处理了三种业务场景:
Docker-compose编排示例:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf:/etc/mysql/conf.d
backend:
build: ./hr-server
ports:
- "8080:8080"
depends_on:
- mysql
使用Redis缓存三层数据:
缓存击穿防护方案:
java复制@Cacheable(value = "deptTree", key = "#root.methodName",
unless = "#result == null",
cacheManager = "redisCacheManager")
public List<DeptTreeNode> getDeptTree() {
// 加锁查询数据库
return baseMapper.selectTree();
}
关键安全配置:
java复制@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
常见问题现象:
排查步骤:
数据核对流程:
特别注意:
异常流程恢复方法:
java复制runtimeService.createChangeActivityStateBuilder()
.processInstanceId(processInstanceId)
.moveActivityIdTo(currentActivityId, newActivityId)
.changeState();
这套系统在实际部署时有个小技巧:先在小范围试点运行(如选择单个部门),用真实数据验证核心流程后再全公司推广。我们实施时发现,制造企业的夜班考勤规则往往比想象的复杂,需要预留2-3次规则调整的迭代周期。