做双端审批流

This commit is contained in:
hero920103 committed 2026-10-07 13:46:32 +08:00
1 parent 5b4dbb2b46
commit ffaadc26ae
69 files changed
+6662 -1071

No files matched your search

+246
View File
@@ -0,0 +1,246 @@
package models
import "time"
// =============================================================
// 自定义审批流(配置侧)
//
// 设计要点:
// - 租户侧与平台侧配置分表隔离:平台账号不归属租户,其流程不带 tid;
// - 节点表用 prev_keys / next_keys / condition_expr 承载连线与条件,
// 当期顺序链只按 sort 流转,后续上拖拽图与条件分支无需改表。
// =============================================================
// 审批适用范围:租户侧 / 平台侧
const (
ApprovalScopeTenant = 1 // 租户侧(backend / uniapp)
ApprovalScopePlatform = 2 // 平台侧(platform,跨租户管控)
)
// 节点类型
const (
ApprovalNodeStart = 1 // 开始
ApprovalNodeApproval = 2 // 审批
ApprovalNodeEnd = 3 // 结束
ApprovalNodeCondition = 4 // 条件分支(预留)
)
// 审批人类型
const (
ApprovalApproverUser = 1 // 指定用户
ApprovalApproverRole = 2 // 指定角色
ApprovalApproverOrgLeader = 3 // 部门主管
ApprovalApproverPosition = 4 // 指定职位
ApprovalApproverInitiator = 5 // 发起人本人
ApprovalApproverInitLeader = 6 // 发起人所在部门主管
)
// 多人审批方式
const (
ApprovalMultiAny = 1 // 或签:任一通过即通过
ApprovalMultiAll = 2 // 会签:全部通过才通过
)
// 单据类型
const (
ApprovalBizReimburse = "reimburse" // OA 报销单
ApprovalBizBid = "bid" // CRM 投标立项
ApprovalBizDomain = "domain" // 域名申请(平台侧审批)
)
// ---------------- 租户侧配置 ----------------
// TenantApprovalFlow 租户侧审批流程 yz_backend_approval_flow
type TenantApprovalFlow struct {
ID uint64 `orm:"column(id);pk;auto" json:"id"`
Tid uint64 `orm:"column(tid)" json:"tid"`
ModuleCode string `orm:"column(module_code);size(50);default()" json:"module_code"`
BizType string `orm:"column(biz_type);size(50);default()" json:"biz_type"`
FlowCode string `orm:"column(flow_code);size(64);default()" json:"flow_code"`
FlowName string `orm:"column(flow_name);size(100);default()" json:"flow_name"`
Description string `orm:"column(description);size(500);default()" json:"description"`
IsDefault int8 `orm:"column(is_default);default(0)" json:"is_default"`
Status int8 `orm:"column(status);default(1)" json:"status"`
IsDeleted int8 `orm:"column(is_deleted);default(0)" json:"is_deleted"`
CreateTime time.Time `orm:"column(create_time);auto_now_add;type(datetime)" json:"create_time"`
UpdateTime *time.Time `orm:"column(update_time);type(datetime);null" json:"update_time"`
DeleteTime *time.Time `orm:"column(delete_time);type(datetime);null" json:"delete_time"`
}
func (m *TenantApprovalFlow) TableName() string {
return "yz_backend_approval_flow"
}
// TenantApprovalNode 租户侧审批节点 yz_backend_approval_node
type TenantApprovalNode struct {
ID uint64 `orm:"column(id);pk;auto" json:"id"`
FlowID uint64 `orm:"column(flow_id)" json:"flow_id"`
Tid uint64 `orm:"column(tid);default(0)" json:"tid"`
NodeKey string `orm:"column(node_key);size(50);default()" json:"node_key"`
NodeName string `orm:"column(node_name);size(100);default()" json:"node_name"`
NodeType int8 `orm:"column(node_type);default(2)" json:"node_type"`
ApproverType int8 `orm:"column(approver_type);default(1)" json:"approver_type"`
ApproverIDs string `orm:"column(approver_ids);size(500);default()" json:"approver_ids"`
MultiMode int8 `orm:"column(multi_mode);default(1)" json:"multi_mode"`
AllowReturn int8 `orm:"column(allow_return);default(0)" json:"allow_return"`
TimeoutHours int `orm:"column(timeout_hours);default(48)" json:"timeout_hours"`
PrevKeys string `orm:"column(prev_keys);size(500);default()" json:"prev_keys"`
NextKeys string `orm:"column(next_keys);size(500);default()" json:"next_keys"`
ConditionExpr string `orm:"column(condition_expr);size(500);default()" json:"condition_expr"`
Sort int `orm:"column(sort);default(0)" json:"sort"`
PosX int `orm:"column(pos_x);default(0)" json:"pos_x"`
PosY int `orm:"column(pos_y);default(0)" json:"pos_y"`
IsDeleted int8 `orm:"column(is_deleted);default(0)" json:"is_deleted"`
CreateTime time.Time `orm:"column(create_time);auto_now_add;type(datetime)" json:"create_time"`
UpdateTime *time.Time `orm:"column(update_time);type(datetime);null" json:"update_time"`
DeleteTime *time.Time `orm:"column(delete_time);type(datetime);null" json:"delete_time"`
}
func (m *TenantApprovalNode) TableName() string {
return "yz_backend_approval_node"
}
// ---------------- 平台侧配置 ----------------
// PlatformApprovalFlow 平台侧审批流程 yz_platform_approval_flow
// 平台账号不归属租户,因此无 tid 字段。
type PlatformApprovalFlow struct {
ID uint64 `orm:"column(id);pk;auto" json:"id"`
ModuleCode string `orm:"column(module_code);size(50);default()" json:"module_code"`
BizType string `orm:"column(biz_type);size(50);default()" json:"biz_type"`
FlowCode string `orm:"column(flow_code);size(64);default()" json:"flow_code"`
FlowName string `orm:"column(flow_name);size(100);default()" json:"flow_name"`
Description string `orm:"column(description);size(500);default()" json:"description"`
IsDefault int8 `orm:"column(is_default);default(0)" json:"is_default"`
Status int8 `orm:"column(status);default(1)" json:"status"`
IsDeleted int8 `orm:"column(is_deleted);default(0)" json:"is_deleted"`
CreateTime time.Time `orm:"column(create_time);auto_now_add;type(datetime)" json:"create_time"`
UpdateTime *time.Time `orm:"column(update_time);type(datetime);null" json:"update_time"`
DeleteTime *time.Time `orm:"column(delete_time);type(datetime);null" json:"delete_time"`
}
func (m *PlatformApprovalFlow) TableName() string {
return "yz_platform_approval_flow"
}
// PlatformApprovalNode 平台侧审批节点 yz_platform_approval_node
// approver_ids 存平台主体:user=AdminUser.id / role=AdminRole.id
type PlatformApprovalNode struct {
ID uint64 `orm:"column(id);pk;auto" json:"id"`
FlowID uint64 `orm:"column(flow_id)" json:"flow_id"`
NodeKey string `orm:"column(node_key);size(50);default()" json:"node_key"`
NodeName string `orm:"column(node_name);size(100);default()" json:"node_name"`
NodeType int8 `orm:"column(node_type);default(2)" json:"node_type"`
ApproverType int8 `orm:"column(approver_type);default(1)" json:"approver_type"`
ApproverIDs string `orm:"column(approver_ids);size(500);default()" json:"approver_ids"`
MultiMode int8 `orm:"column(multi_mode);default(1)" json:"multi_mode"`
AllowReturn int8 `orm:"column(allow_return);default(0)" json:"allow_return"`
TimeoutHours int `orm:"column(timeout_hours);default(48)" json:"timeout_hours"`
PrevKeys string `orm:"column(prev_keys);size(500);default()" json:"prev_keys"`
NextKeys string `orm:"column(next_keys);size(500);default()" json:"next_keys"`
ConditionExpr string `orm:"column(condition_expr);size(500);default()" json:"condition_expr"`
Sort int `orm:"column(sort);default(0)" json:"sort"`
PosX int `orm:"column(pos_x);default(0)" json:"pos_x"`
PosY int `orm:"column(pos_y);default(0)" json:"pos_y"`
IsDeleted int8 `orm:"column(is_deleted);default(0)" json:"is_deleted"`
CreateTime time.Time `orm:"column(create_time);auto_now_add;type(datetime)" json:"create_time"`
UpdateTime *time.Time `orm:"column(update_time);type(datetime);null" json:"update_time"`
DeleteTime *time.Time `orm:"column(delete_time);type(datetime);null" json:"delete_time"`
}
func (m *PlatformApprovalNode) TableName() string {
return "yz_platform_approval_node"
}
// ---------------- 运行时(租户侧与平台侧共用) ----------------
// 实例状态
const (
ApprovalInstanceDraft = 0 // 草稿
ApprovalInstanceRunning = 1 // 审批中
ApprovalInstanceApproved = 2 // 已通过
ApprovalInstanceRejected = 3 // 已驳回
ApprovalInstanceWithdrawn = 4 // 已撤回
ApprovalInstanceCanceled = 5 // 已取消
)
// 任务状态
const (
ApprovalTaskPending = 0 // 待审批
ApprovalTaskApproved = 1 // 已通过
ApprovalTaskRejected = 2 // 已驳回
ApprovalTaskReturned = 3 // 已退回
ApprovalTaskSkipped = 4 // 已跳过
ApprovalTaskTimeout = 5 // 已超时
)
// 任务动作
const (
ApprovalActionSubmit = 1 // 提交
ApprovalActionApprove = 2 // 通过
ApprovalActionReject = 3 // 驳回
ApprovalActionReturn = 4 // 退回
ApprovalActionWithdraw = 5 // 撤回
ApprovalActionAutoPass = 6 // 超时自动通过
)
// ApprovalInstance 审批实例 yz_approval_instance
//
// scope 区分租户侧/平台侧。平台侧实例的 biz_tid 标记申请来源租户,
// 使平台端能按租户筛选并代租户操作。
type ApprovalInstance struct {
ID uint64 `orm:"column(id);pk;auto" json:"id"`
Scope int8 `orm:"column(scope);default(1)" json:"scope"`
Tid uint64 `orm:"column(tid);default(0)" json:"tid"`
BizTid uint64 `orm:"column(biz_tid);default(0)" json:"biz_tid"`
FlowID uint64 `orm:"column(flow_id);default(0)" json:"flow_id"`
BizType string `orm:"column(biz_type);size(50);default()" json:"biz_type"`
BizID uint64 `orm:"column(biz_id);default(0)" json:"biz_id"`
BizTitle string `orm:"column(biz_title);size(200);default()" json:"biz_title"`
SubmitUserID uint64 `orm:"column(submit_user_id);default(0)" json:"submit_user_id"`
SubmitUserName string `orm:"column(submit_user_name);size(64);default()" json:"submit_user_name"`
SubmitDeptID uint64 `orm:"column(submit_dept_id);default(0)" json:"submit_dept_id"`
FormData *string `orm:"column(form_data);type(text);null" json:"form_data"`
CurrentNode string `orm:"column(current_node);size(50);default()" json:"current_node"`
Status int8 `orm:"column(status);default(1)" json:"status"`
SubmitTime *time.Time `orm:"column(submit_time);type(datetime);null" json:"submit_time"`
FinishTime *time.Time `orm:"column(finish_time);type(datetime);null" json:"finish_time"`
IsDeleted int8 `orm:"column(is_deleted);default(0)" json:"is_deleted"`
CreateTime time.Time `orm:"column(create_time);auto_now_add;type(datetime)" json:"create_time"`
UpdateTime *time.Time `orm:"column(update_time);type(datetime);null" json:"update_time"`
DeleteTime *time.Time `orm:"column(delete_time);type(datetime);null" json:"delete_time"`
}
func (m *ApprovalInstance) TableName() string {
return "yz_approval_instance"
}
// ApprovalTask 审批任务 yz_approval_task
// 节点级待办:一个节点可展开多条任务(会签时每个审批人一条)。
type ApprovalTask struct {
ID uint64 `orm:"column(id);pk;auto" json:"id"`
InstanceID uint64 `orm:"column(instance_id)" json:"instance_id"`
Scope int8 `orm:"column(scope);default(1)" json:"scope"`
Tid uint64 `orm:"column(tid);default(0)" json:"tid"`
BizType string `orm:"column(biz_type);size(50);default()" json:"biz_type"`
BizID uint64 `orm:"column(biz_id);default(0)" json:"biz_id"`
NodeKey string `orm:"column(node_key);size(50);default()" json:"node_key"`
NodeName string `orm:"column(node_name);size(100);default()" json:"node_name"`
Sort int `orm:"column(sort);default(0)" json:"sort"`
ApproverID uint64 `orm:"column(approver_id);default(0)" json:"approver_id"`
ApproverName string `orm:"column(approver_name);size(64);default()" json:"approver_name"`
MultiMode int8 `orm:"column(multi_mode);default(1)" json:"multi_mode"`
Status int8 `orm:"column(status);default(0)" json:"status"`
Action int8 `orm:"column(action);default(0)" json:"action"`
Comment string `orm:"column(comment);size(500);default()" json:"comment"`
Deadline *time.Time `orm:"column(deadline);type(datetime);null" json:"deadline"`
FinishTime *time.Time `orm:"column(finish_time);type(datetime);null" json:"finish_time"`
IsDeleted int8 `orm:"column(is_deleted);default(0)" json:"is_deleted"`
CreateTime time.Time `orm:"column(create_time);auto_now_add;type(datetime)" json:"create_time"`
UpdateTime *time.Time `orm:"column(update_time);type(datetime);null" json:"update_time"`
DeleteTime *time.Time `orm:"column(delete_time);type(datetime);null" json:"delete_time"`
}
func (m *ApprovalTask) TableName() string {
return "yz_approval_task"
}
+7
View File
@@ -50,6 +50,13 @@ func Init(_ string) {
new(BackendErpContact),
new(BackendApprovalFlow),
new(BackendApprovalRecord),
// 自定义审批流(docs/sql/create_approval_flow.sql)
new(TenantApprovalFlow),
new(TenantApprovalNode),
new(PlatformApprovalFlow),
new(PlatformApprovalNode),
new(ApprovalInstance),
new(ApprovalTask),
new(BackendReimbursement),
new(BackendReimbursementItem),
new(BackendReimbursementExpenseType),