做双端审批流
This commit is contained in:
1 parent
5b4dbb2b46
commit
ffaadc26ae
69 files changed
+6662
-1071
No files matched your search
@@ -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"
|
||||
}
|
||||
@@ -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),
|
||||
|
||||
Reference in new issue
Block a user