122 lines
3.8 KiB
Go
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})
|
|
}
|