# GLMWorkflow **Repository Path**: aricluo/glmworkflow ## Basic Information - **Project Name**: GLMWorkflow - **Description**: GLMWorkflow - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-14 - **Last Updated**: 2026-09-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # OA 工作流审批系统 基于 **Flask + SQLite + 原生 JavaScript** 的轻量级 OA 工作流审批系统,零外部服务依赖,开箱即用。 v2 新增 **部门 / 角色 / 权限** 三大组织能力,并与工作流引擎深度结合。 ## 功能特性 ### 组织与权限(v2) - **部门管理**:部门编码、上级部门(支持层级)、部门负责人、在编人数统计;旧库(部门文本字段)自动迁移 - **角色管理**:系统内置角色(员工/部门经理/财务主管/总经理/管理员)+ 自定义角色,一个用户可兼 multiple 角色 - **权限点体系**:9 个细粒度权限(部门/用户/角色/表单/流程管理、查看全部单据、全局统计等), 按「角色 → 权限」矩阵授权;侧边栏菜单、管理接口双重校验(前端隐藏入口 + 后端 `perm_required` 强制) ### 表单管理与流程关联(v3) - **表单管理**:可视化定义申请表单——字段类型支持单行文本/数字/日期/下拉选择/多行文本,以及 4 种系统数据类型 (**系统部门下拉 / 系统用户下拉**提交结构化 id,审批详情自动转名称;**系统部门单行文本 / 系统用户单行文本** 可自由输入并带系统数据候选),可设必填与提示语; 字段 key 自动生成且编辑保持稳定(已提交单据数据不受影响);内置表单(请假/报销/采购/通用)自动入库,不可删除 - **流程关联表单**:新建/编辑流程时选择关联表单,发起申请、审批详情均按关联表单动态渲染; 表单中的**数字字段可直接作为条件节点的依据**(如自定义"预算金额"字段 ≥ 5000 时加签总经理) - **与工作流深度结合**: - 节点审批人类型:**部门负责人**(从发起人所在部门起逐级向上查找,发起人为负责人时自动向上避让) - 条件节点:数值字段(≥/≤)、**发起部门**(=/≠)、**自定义表单数字字段**,不满足自动跳过并记录人读原因 ### 可视化流程设计器 - 垂直流程画布:发起卡 → 审批节点卡(显示审批人/或签会签/条件标签)→ 结束卡,连接线上「+」按位置插入节点 - 点击卡片弹出属性编辑(审批人类型联动控件,指定用户为表格多选);卡片悬停可上移/下移/删除,统一保存生效 ### 工作流引擎 - 审批人解析:直属上级 / 部门负责人(递归向上)/ 按角色(多角色用户均参与)/ 指定用户,自动排除发起人本人 - 条件节点:数值字段(≥/≤)与部门条件(=/≠),不满足自动跳过并记录人读原因 - 或签(any:一人通过)/ 会签(all:全员通过);无可用审批人自动跳过防卡死 - 同意 / 驳回(意见必填)/ 发起人撤回;待办/已办/我发起的/全部单据(按权限)四张清单 - 流程可视化:节点进度条 + 完整审批时间线;站内通知与未读徽章;统计看板(按权限区分视角) ## 快速开始 ```bash pip install flask # 唯一依赖 python app.py # 启动自动建库;检测到旧结构库会自动迁移到 v2 ``` 打开 http://127.0.0.1:8018 ### 演示账号(密码均为 `123456`) | 账号 | 姓名 | 角色 | 部门 | 部门负责人 | |---|---|---|---|---| | zhangsan | 张三 | 普通员工 | 研发部 | 李四 | | lisi | 李四 | 部门经理 | 研发部 | 赵六 | | wangwu | 王五 | 财务主管 | 财务部 | 赵六 | | zhaoliu | 赵六 | 总经理 | 总经办 | - | | sunqi | 孙七 | 普通员工 | 市场部 | 孙七(本人) | | admin | 系统管理员 | 管理员 | 信息技术部 | 系统管理员 | 管理员拥有全部权限点;其他角色默认无管理权限,可在「角色权限」页配置(如新建"人事专员"角色并授予用户管理与查看全部单据)。 ### 内置流程模板 | 流程 | 审批链 | |---|---| | 请假审批 | 直属上级 → 总经理(天数 ≥ 3 时) | | 费用报销 | 直属上级 → 总经理(金额 ≥ 10000 时) → 财务复核打款 | | 物品采购 | 直属上级 → 总经理 | | 通用审批 | 直属上级 | ## 权限点清单 | 权限标识 | 名称 | 控制内容 | |---|---|---| | dept:manage | 部门管理 | 部门新建/编辑、菜单入口 | | user:manage | 用户管理 | 用户新建/编辑(部门、角色、上级) | | role:manage | 角色权限管理 | 角色增改、权限矩阵配置 | | workflow:manage | 流程模板管理 | 模板新建/启停/节点编辑 | | request:view_all | 查看全部单据 | 「全部单据」菜单与接口 | | request:stats | 全局统计 | 工作台管理视角统计卡 | | dept:view / 用户查看 | 只读查看 | 预留细粒度控制 | | form:manage | 表单管理 | 表单新建/编辑/删除、菜单入口 | ## 目录结构 ``` GLMWorkflow/ ├── app.py # Flask 入口:REST API + 权限点校验(perm_required) ├── engine.py # 工作流引擎:审批人解析(含部门负责人链)、条件判断、或签会签、流转与通知 ├── db.py # SQLite 建表、v1→v2 自动迁移、表单与权限定义、演示种子数据 ├── test_flow.py # API 全流程测试(37 项断言,10 大场景) ├── static/ # 前端 SPA(hash 路由,菜单按权限渲染) └── oa.db # 运行时生成的 SQLite 数据库 ``` ## API 概览(新增部分) | 方法 | 路径 | 权限 | 说明 | |---|---|---|---| | GET | /api/departments | 登录 | 部门列表(含负责人、在编人数) | | POST/PUT | /api/departments[/:id] | dept:manage | 部门新建/编辑 | | GET | /api/roles | 登录 | 角色列表(含成员数与权限) | | POST/PUT | /api/roles[/:id] | role:manage | 角色新建/编辑 + 权限矩阵 | | GET | /api/permissions | 登录 | 权限点字典 | | GET | /api/forms | 登录 | 表单列表(含字段定义、关联流程数) | | POST/PUT/DELETE | /api/forms[/:id] | form:manage | 表单新建/编辑/删除(被关联或内置时禁止删除) | | GET/POST/PUT | /api/users[/:id] | user:manage(写) | 用户管理,支持多角色 `role_codes` | | GET/POST/PUT | /api/workflows[/:id] | workflow:manage(写) | 流程管理,`form_id` 关联表单(兼容旧 form_type) | 登录与 `/api/me` 返回 `permissions` 数组,前端据此渲染菜单;后端每个管理接口以 `perm_required` 强制校验。 ## 测试 ```bash python test_flow.py # 需先启动 app.py;覆盖 11 大场景 49 项断言: # 条件跳过、多级链路、驳回、撤回、会签、越权、 # 部门负责人递归、部门条件节点、自建角色授权、 # 自定义表单全链路(字段key稳定/条件绑定/删除保护) ``` ## 重置演示数据 停止服务后执行 `python db.py`(删除并重建 oa.db)。已有 v1 旧库(用户表含 role/department 文本列)无需重建, 启动时自动迁移:部门文本 → 部门表,角色文本 → 角色表 + 用户角色关联,管理员自动授予全部权限。 ## 说明 - 密码以 SHA-256 存储;token 会话保存在 SQLite `sessions` 表。**仅供演示/教学,生产环境请接入企业认证并加固。** - 编辑流程节点会重建该模板的节点配置;建议先停用模板再调整。 - 撤销用户角色后,其在待办中的既有审批资格按实时解析为准。