Files
yunzerwebsiteallinone/go/services/approval/instance_query.go
T
2026-10-19 01:13:17 +08:00

122 lines
3.8 KiB
Go

package approval
import (
"time"
"server/models"
"github.com/beego/beego/v2/client/orm"
)
// InstanceStatusOf 读取实例当前状态(单据提交后用于判断流程是否已直接结束)。
func InstanceStatusOf(instID uint64) int8 {
var inst models.ApprovalInstance
if err := models.Orm.QueryTable(new(models.ApprovalInstance)).
Filter("id", instID).One(&inst, "status"); err != nil {
return models.ApprovalInstanceRunning
}
return inst.Status
}
// InstanceBrief 单据详情页展示的审批进度摘要:当前节点、待办人、时间线。
func InstanceBrief(instID uint64) map[string]interface{} {
if instID == 0 {
return nil
}
var inst models.ApprovalInstance
if err := models.Orm.QueryTable(new(models.ApprovalInstance)).
Filter("id", instID).One(&inst); err != nil {
return nil
}
tasks := make([]map[string]interface{}, 0)
var rows []models.ApprovalTask
_, _ = models.Orm.QueryTable(new(models.ApprovalTask)).
Filter("instance_id", instID).OrderBy("sort", "id").All(&rows)
for _, t := range rows {
tasks = append(tasks, map[string]interface{}{
"task_id": t.ID, "node_key": t.NodeKey, "node_name": t.NodeName,
"approver_id": t.ApproverID, "approver_name": t.ApproverName,
"status": t.Status, "status_label": approvalTaskLabel(t.Status),
"comment": t.Comment, "action": t.Action,
"create_time": t.CreateTime, "finish_time": t.FinishTime,
})
}
return map[string]interface{}{
"instance_id": inst.ID,
"flow_id": inst.FlowID,
"flow_name": flowNameOf(inst.FlowID),
"biz_type": inst.BizType,
"status": inst.Status,
"status_label": approvalInstanceLabel(inst.Status),
"current_node": inst.CurrentNode,
"submit_name": inst.SubmitUserName,
"submit_time": inst.CreateTime,
"finish_time": inst.FinishTime,
"tasks": tasks,
}
}
// flowNameOf 流程名称(流程被删除时回落为占位文案,不影响单据查看)
func flowNameOf(flowID uint64) string {
if flowID == 0 {
return ""
}
var f models.TenantApprovalFlow
if err := models.Orm.QueryTable(new(models.TenantApprovalFlow)).
Filter("id", flowID).One(&f, "flow_name"); err == nil {
return f.FlowName
}
return "已删除的审批流"
}
func approvalTaskLabel(status int8) string {
switch status {
case models.ApprovalTaskApproved:
return "已通过"
case models.ApprovalTaskRejected:
return "已驳回"
case models.ApprovalTaskSkipped:
return "已跳过"
case models.ApprovalTaskNotified:
return "已通知"
default:
return "待审批"
}
}
func approvalInstanceLabel(status int8) string {
switch status {
case models.ApprovalInstanceApproved:
return "已通过"
case models.ApprovalInstanceRejected:
return "已驳回"
case models.ApprovalInstanceWithdrawn:
return "已撤回"
default:
return "审批中"
}
}
// CancelInstance 业务单据作废时同步终结在途实例,避免审批中心留下无效待办。
// 不做成「驳回」是因为驳回会让单据回到已驳回态;这里直接按撤回处理,
// 调用方已负责把业务单据置为终态。
func CancelInstance(instID uint64, reason string) {
if instID == 0 {
return
}
var inst models.ApprovalInstance
if err := models.Orm.QueryTable(new(models.ApprovalInstance)).
Filter("id", instID).One(&inst, "id", "status"); err != nil {
return
}
if inst.Status != models.ApprovalInstanceRunning {
return
}
now := time.Now()
_, _ = models.Orm.QueryTable(new(models.ApprovalInstance)).Filter("id", instID).
Update(orm.Params{"status": models.ApprovalInstanceWithdrawn, "finish_time": now, "update_time": now})
_, _ = models.Orm.QueryTable(new(models.ApprovalTask)).
Filter("instance_id", instID).Filter("status", models.ApprovalTaskPending).
Update(orm.Params{"status": models.ApprovalTaskSkipped, "comment": reason, "update_time": now})
}