1. 引言
随着企业数字化转型的深入,传统线下审批、纸质公文流转、信息孤岛等问题严重拖慢了办公效率。点狮 OA 作为一款面向中小企业和团队的协同办公平台,围绕“流程、表单、权限、数据”四大核心,把日常办公中的审批、公告、会议、任务等场景逐步搬到线上。
本文将从功能模块、技术架构和关键代码实现三个维度,带你了解点狮 OA 的常见能力,并给出可落地的代码示例。
相关链接
源码地址
- 🎨 Gitee:https://gitee.com/shandong-dianshi-information/L-ONE.git
- 💻 GitCode:https://gitcode.com/Glory_Lion/pointlion-cloud

2. 点狮 OA 简介
点狮 OA 是一套浏览器/移动端双端可用的协同办公系统,主要解决以下几类问题:
- 审批流程繁琐、难以追踪;
- 组织架构与人员权限管理混乱;
- 公文、公告缺乏统一发布渠道;
- 任务、日程依赖人工口头传达;
- 各类业务数据分散,无法形成报表。
它通常由以下层次组成:
3. 核心功能模块
3.1 组织与权限管理
点狮 OA 支持树形组织架构维护,包括部门、岗位、职级、角色等维度。权限体系通常采用 RBAC 模型,将“菜单权限、数据权限、按钮权限”分离,便于精细化控制。
常见功能点:
- 组织架构导入导出;
- 员工账号与状态管理;
- 角色授权与数据范围隔离;
- 登录认证与单点登录(SSO)。
3.2 流程审批
流程审批是 OA 系统最核心的模块,覆盖请假、报销、采购、用章、合同审批等场景。点狮 OA 提供可视化流程设计器,支持:
- 固定流程与自由流程;
- 会签、或签、转办、加签、退回;
- 条件分支与审批表单绑定;
- 催办、超时提醒与流程跟踪。
3.3 表单设计器
表单设计器允许管理员通过拖拽方式生成审批单、业务表单,无需开发即可上线新流程。设计器输出 JSON Schema,前端渲染器读取 JSON 动态生成表单。
3.4 公文与公告
点狮 OA 提供公文起草、审核、发布、归档的完整链路,并支持公告分类、置顶、已读统计。公文流转与流程引擎复用,保证发布合规可控。
3.5 日程、任务与会议
- 个人/团队日历;
- 任务分配、进度跟踪与提醒;
- 会议室预订与会议纪要沉淀。
3.6 移动办公与消息中心
通过 H5 或小程序提供移动审批、待办提醒。消息中心统一推送站内信、短信、邮件和 WebSocket 通知,让用户及时处理待办事项。
4. 技术架构概览
一个典型的点狮 OA 后端可采用 Spring Boot + MyBatis-Plus + MySQL 组合,前端采用 Vue 3 + Element Plus。其分层结构如下:
dianshi-oa
├── oa-common # 通用工具、常量、异常
├── oa-security # 安全认证、JWT、权限
├── oa-system # 组织、用户、角色、菜单
├── oa-flow # 流程引擎、审批操作
├── oa-form # 动态表单
├── oa-message # 消息通知
└── oa-web # 控制器入口
5. 关键代码示例
5.1 审批流程节点定义
流程引擎中,流程定义可通过 JSON 描述节点与连接关系。下面是一个“申请人 -> 部门经理 -> 财务复核”的简单流程结构:
{
"processKey": "expense_approval",
"name": "费用报销审批",
"nodes": [
{ "id": "start", "type": "start", "name": "发起申请" },
{ "id": "manager", "type": "approval", "name": "部门经理审批", "assigneeType": "role", "assigneeValue": "DEPT_MANAGER" },
{ "id": "finance", "type": "approval", "name": "财务复核", "assigneeType": "role", "assigneeValue": "FINANCE" },
{ "id": "end", "type": "end", "name": "流程结束" }
],
"edges": [
{ "from": "start", "to": "manager" },
{ "from": "manager", "to": "finance" },
{ "from": "finance", "to": "end" }
]
}
5.2 审批服务核心代码
后端启动流程并生成待办任务的示例:
@Service
@RequiredArgsConstructor
public class ProcessInstanceService {
private final ProcessDefinitionService definitionService;
private final TaskService taskService;
@Transactional
public Long startProcess(String processKey, String businessKey, Map<String, Object> variables) {
ProcessDefinition definition = definitionService.getByKey(processKey);
if (definition == null) {
throw new BusinessException("流程定义不存在:" + processKey);
}
ProcessInstance instance = new ProcessInstance();
instance.setProcessKey(processKey);
instance.setName(definition.getName());
instance.setBusinessKey(businessKey);
instance.setStatus(ProcessStatus.RUNNING.getCode());
instance.setVariables(JsonUtils.toJson(variables));
instance.setCreateTime(LocalDateTime.now());
processInstanceMapper.insert(instance);
// 生成第一个待办节点,分配到对应审批人
Node firstNode = definition.getFirstNode();
taskService.createTask(instance.getId(), firstNode, variables);
return instance.getId();
}
}
5.3 待办任务审批
审批通过后流转到下一节点,若为结束节点则完成流程:
@Service
@RequiredArgsConstructor
public class TaskService {
private final ProcessInstanceMapper instanceMapper;
private final NodeResolver nodeResolver;
@Transactional
public void approve(Long taskId, Long operatorId, String comment, ApprovalAction action) {
TaskEntity task = taskMapper.selectById(taskId);
if (task == null || !ApprovalStatus.PENDING.equals(task.getStatus())) {
throw new BusinessException("当前任务不可审批");
}
task.setOperatorId(operatorId);
task.setComment(comment);
task.setAction(action.getCode());
task.setCompleteTime(LocalDateTime.now());
task.setStatus(ApprovalStatus.DONE.getCode());
taskMapper.updateById(task);
ProcessInstance instance = instanceMapper.selectById(task.getInstanceId());
Node nextNode = action == ApprovalAction.APPROVE
? nodeResolver.resolveNext(instance, task.getNodeId())
: nodeResolver.resolveReject(instance, task.getNodeId());
if (nextNode == null) {
instance.setStatus(ProcessStatus.FINISHED.getCode());
instance.setEndTime(LocalDateTime.now());
instanceMapper.updateById(instance);
messageService.notify(instance.getApplicantId(), "您的审批流程已结束");
} else {
createTask(instance.getId(), nextNode, parseVariables(instance.getVariables()));
}
}
}
5.4 动态表单渲染思路
表单设计器输出 JSON Schema,前端动态渲染组件:
<template>
<el-form :model="formData" label-width="100px">
<template v-for="field in formSchema.fields" :key="field.key">
<el-form-item :label="field.label" :required="field.required">
<el-input
v-if="field.type === 'input'"
v-model="formData[field.key]"
:placeholder="field.placeholder"
/>
<el-select
v-else-if="field.type === 'select'"
v-model="formData[field.key]"
:placeholder="field.placeholder">
<el-option
v-for="opt in field.options"
:key="opt.value"
:label="opt.label"
:value="opt.value" />
</el-select>
<el-date-picker
v-else-if="field.type === 'date'"
v-model="formData[field.key]"
type="date" />
</el-form-item>
</template>
</el-form>
</template>
<script setup>
import { reactive } from 'vue'
defineProps({
formSchema: {
type: Object,
required: true
}
})
const formData = reactive({})
</script>
6. 总结
点狮 OA 以“低代码流程 + 动态表单 + 精细权限”为核心,帮助企业快速搭建标准化、留痕可查的协同办公体系。对开发者而言,理解流程引擎的状态流转和动态表单渲染是二次开发的关键。
如果你的团队正在评估 OA 系统,建议优先确认以下能力是否满足需求:
- 流程设计器是否支持复杂审批场景;
- 权限体系能否覆盖数据隔离要求;
- 表单能否通过 JSON Schema 动态扩展;
- 消息提醒与移动端体验是否顺畅。
后续可以结合实际业务,逐步引入电子签章、数据报表、第三方系统集成等功能,进一步释放 OA 系统的价值。
430

被折叠的 条评论
为什么被折叠?



