WiiCITMS/process/oa/approval_record.go
2025-11-07 14:14:34 +08:00

259 lines
8.5 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package oa
import (
"WiiCITMS/models/oa"
"WiiGenerates/WiiCITMS/generates/v1/go/types"
"WiiGoLibrary/apply/middle/process/v1"
"WiiGoLibrary/framework/db/v1/utils/mssql/unique"
"WiiGoLibrary/framework/hub/v1/dblib"
"errors"
"time"
)
// QueryMyApprovalTasksRequest 查询我的审批任务请求参数
type QueryMyApprovalTasksRequest struct {
ApproverGuid string `json:"approverGuid"` // 审批人ID
Status int `json:"status"` // 状态,-1表示所有状态
Limit int `json:"limit"` // 分页参数,每页数量
Offset int `json:"offset"` // 分页参数,偏移量
}
// ApprovalActionRequest 审批操作请求参数
type ApprovalActionRequest struct {
RecordGuid string `json:"recordGuid"` // 审批记录ID
Status int `json:"status"` // 操作结果1-同意2-拒绝3-转交4-委托
Comment string `json:"comment"` // 审批意见
TargetGuid string `json:"targetGuid"` // 转交/委托目标人ID如果是转交或委托操作
}
// QueryApprovalHistory 查询流程审批历史
func QueryApprovalHistory(instanceGuid string) ([]*oa.ApprovalRecordModel, *process.Process) {
result := make([]*oa.ApprovalRecordModel, 0)
// 验证实例ID格式
guid, err := unique.FromString(instanceGuid)
if err != nil {
return nil, process.FailError(types.InvalidApprovalParamError, err)
}
// 查询该实例的所有审批记录
r := dblib.DBIns.DB.Where("InstanceGuid = ? AND (RecordStatus & 524288) = 0", guid).
Order("CreateTime ASC").Find(&result)
if r.Error != nil {
return result, process.FailError(types.QueryApprovalHistoryError, r.Error)
}
return result, process.Success(200)
}
// QueryMyApprovalTasks 查询我的待审批任务
func QueryMyApprovalTasks(params QueryMyApprovalTasksRequest) ([]*oa.ApprovalRecordModel, *process.Process) {
result := make([]*oa.ApprovalRecordModel, 0)
// 验证审批人ID
approverGuid, err := unique.FromString(params.ApproverGuid)
if err != nil {
return nil, process.FailError(types.InvalidApprovalParamError, err)
}
// 构建查询条件
db := dblib.DBIns.DB.Model(&oa.ApprovalRecordModel{}).
Where("ApproverGuid = ? AND (RecordStatus & 524288) = 0", approverGuid)
// 按状态筛选
if params.Status >= 0 {
db = db.Where("Status = ?", params.Status)
}
// 分页查询
limit := params.Limit
if limit <= 0 {
limit = 20 // 默认每页20条
}
offset := params.Offset
if offset < 0 {
offset = 0
}
r := db.Limit(limit).Offset(offset).Order("CreateTime DESC").Find(&result)
if r.Error != nil {
return result, process.FailError(types.QueryApprovalTasksError, r.Error)
}
return result, process.Success(200)
}
// ProcessApproval 处理审批
func ProcessApproval(params ApprovalActionRequest) (*oa.ApprovalRecordModel, *process.Process) {
// 使用事务确保操作的原子性
tx := dblib.DBIns.DB.Begin()
// 获取审批记录
recordGuid, err := unique.FromString(params.RecordGuid)
if err != nil {
tx.Rollback()
return nil, process.FailError(types.InvalidApprovalParamError, err)
}
approvalRecord := &oa.ApprovalRecordModel{}
r := tx.Where("RecordGuid = ? AND (RecordStatus & 524288) = 0", recordGuid).First(approvalRecord)
if r.Error != nil {
tx.Rollback()
return nil, process.FailError(types.ApprovalRecordNotFoundError, r.Error)
}
// 只有待处理的审批才能处理
if approvalRecord.Status != 0 {
tx.Rollback()
return nil, process.FailError(types.InvalidApprovalStatusError, errors.New("只有待处理的审批才能处理"))
}
// 更新审批记录
approvalRecord.Status = int16(params.Status)
approvalRecord.Comment = params.Comment
approvalRecord.ActionTime = time.Now()
// 处理转交或委托
if params.Status == 3 || params.Status == 4 { // 转交或委托
if params.TargetGuid == "" {
tx.Rollback()
return nil, process.FailError(types.InvalidApprovalParamError, errors.New("转交或委托操作需要指定目标人"))
}
targetGuid, err := unique.FromString(params.TargetGuid)
if err != nil {
tx.Rollback()
return nil, process.FailError(types.InvalidApprovalParamError, err)
}
if params.Status == 3 { // 转交
approvalRecord.HandoverTo = targetGuid
}
// 创建新的审批记录给目标人
newApproval := oa.ApprovalRecordInstance()
newApproval.InstanceGuid = approvalRecord.InstanceGuid
newApproval.NodeGuid = approvalRecord.NodeGuid
newApproval.ApproverGuid = targetGuid
newApproval.Status = 0 // 待处理
if params.Status == 4 { // 委托
newApproval.DelegateFrom = approvalRecord.ApproverGuid
}
r = tx.Create(newApproval)
if r.Error != nil {
tx.Rollback()
return nil, process.FailError(types.CreateApprovalRecordError, r.Error)
}
} else if params.Status == 1 || params.Status == 2 { // 同意或拒绝
// 获取工作流实例
instance := &oa.WorkflowInstanceModel{}
r = tx.Where("RecordGuid = ? AND (RecordStatus & 524288) = 0", approvalRecord.InstanceGuid).First(instance)
if r.Error != nil {
tx.Rollback()
return nil, process.FailError(types.WorkflowInstanceNotFoundError, r.Error)
}
// 获取当前节点
currentNode := &oa.WorkflowNodeModel{}
r = tx.Where("RecordGuid = ? AND (RecordStatus & 524288) = 0", approvalRecord.NodeGuid).First(currentNode)
if r.Error != nil {
tx.Rollback()
return nil, process.FailError(types.WorkflowNodeNotFoundError, r.Error)
}
if params.Status == 2 { // 拒绝
// 更新实例状态为已拒绝
instance.Status = 2 // 已拒绝
instance.CompletionTime = time.Now()
r = tx.Save(instance)
if r.Error != nil {
tx.Rollback()
return nil, process.FailError(types.UpdateWorkflowInstanceError, r.Error)
}
} else { // 同意
// 查找下一个节点
nextNode := &oa.WorkflowNodeModel{}
r = tx.Where("WorkflowGuid = ? AND NodeOrder > ? AND (RecordStatus & 524288) = 0",
currentNode.WorkflowGuid, currentNode.NodeOrder).
Order("NodeOrder ASC").First(nextNode)
if r.Error != nil { // 没有下一个节点,流程结束
instance.Status = 1 // 已完成
instance.CompletionTime = time.Now()
r = tx.Save(instance)
if r.Error != nil {
tx.Rollback()
return nil, process.FailError(types.UpdateWorkflowInstanceError, r.Error)
}
} else if nextNode.NodeType == 2 { // 下一个节点是审批节点
// 解析审批人
var nextApproverGuid unique.UUID
if nextNode.ApproverType == 1 { // 指定人
nextApproverGuid, err = unique.FromString(nextNode.ApproverValue)
if err != nil {
tx.Rollback()
return nil, process.FailError(types.InvalidApproverError, err)
}
} else {
// 其他类型的审批人逻辑(角色、部门负责人等)
// 这里简化处理,实际项目中需要根据不同的审批人类型查询对应的审批人
tx.Rollback()
return nil, process.FailError(types.UnsupportedApproverTypeError, errors.New("暂不支持的审批人类型"))
}
// 创建下一个审批任务
nextApproval := oa.ApprovalRecordInstance()
nextApproval.InstanceGuid = instance.RecordGuid
nextApproval.NodeGuid = nextNode.RecordGuid
nextApproval.ApproverGuid = nextApproverGuid
nextApproval.Status = 0 // 待处理
r = tx.Create(nextApproval)
if r.Error != nil {
tx.Rollback()
return nil, process.FailError(types.CreateApprovalRecordError, r.Error)
}
// 更新实例当前节点
instance.CurrentNodeID = nextNode.RecordGuid
r = tx.Save(instance)
if r.Error != nil {
tx.Rollback()
return nil, process.FailError(types.UpdateWorkflowInstanceError, r.Error)
}
} else if nextNode.NodeType == 5 { // 结束节点
instance.Status = 1 // 已完成
instance.CompletionTime = time.Now()
instance.CurrentNodeID = nextNode.RecordGuid
r = tx.Save(instance)
if r.Error != nil {
tx.Rollback()
return nil, process.FailError(types.UpdateWorkflowInstanceError, r.Error)
}
} else { // 其他类型节点,暂不支持
tx.Rollback()
return nil, process.FailError(types.UnsupportedNodeTypeError, errors.New("暂不支持的节点类型"))
}
}
} else {
tx.Rollback()
return nil, process.FailError(types.InvalidApprovalParamError, errors.New("无效的操作类型"))
}
// 保存审批记录的更新
r = tx.Save(approvalRecord)
if r.Error != nil {
tx.Rollback()
return nil, process.FailError(types.UpdateApprovalRecordError, r.Error)
}
// 提交事务
if err := tx.Commit().Error; err != nil {
return nil, process.FailError(types.TransactionCommitError, err)
}
return approvalRecord, process.Success(200)
}