点狮 OA 办公系统入门:核心功能解析与代码实践

1. 引言

随着企业数字化转型的深入,传统线下审批、纸质公文流转、信息孤岛等问题严重拖慢了办公效率。点狮 OA 作为一款面向中小企业和团队的协同办公平台,围绕“流程、表单、权限、数据”四大核心,把日常办公中的审批、公告、会议、任务等场景逐步搬到线上。

本文将从功能模块、技术架构和关键代码实现三个维度,带你了解点狮 OA 的常见能力,并给出可落地的代码示例。

相关链接

源码地址

在这里插入图片描述

2. 点狮 OA 简介

点狮 OA 是一套浏览器/移动端双端可用的协同办公系统,主要解决以下几类问题:

  • 审批流程繁琐、难以追踪;
  • 组织架构与人员权限管理混乱;
  • 公文、公告缺乏统一发布渠道;
  • 任务、日程依赖人工口头传达;
  • 各类业务数据分散,无法形成报表。

它通常由以下层次组成:

用户端:PC浏览器 / 移动端 H5 / 小程序

应用层:审批、公文、日程、任务等

平台层:流程引擎、表单引擎、权限中心、消息中心

数据层:关系型数据库 / 缓存 / 文件存储

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 系统的价值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值