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}) }