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

148 lines
4.7 KiB
Go

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"
)
// CreateNodeRequest 创建工作流节点请求参数
type CreateNodeRequest struct {
WorkflowGuid string `json:"workflowGuid"` // 所属工作流ID
NodeName string `json:"nodeName"` // 节点名称
NodeType int `json:"nodeType"` // 节点类型
NodeOrder int `json:"nodeOrder"` // 节点顺序
ApproverType int `json:"approverType"` // 审批人类型
ApproverValue string `json:"approverValue"` // 审批人值
ConditionExp string `json:"conditionExp"` // 条件表达式
Description string `json:"description"` // 节点描述
}
// QueryNodesRequest 查询工作流节点请求参数
type QueryNodesRequest struct {
WorkflowGuid string `json:"workflowGuid"` // 工作流ID
NodeType int `json:"nodeType"` // 节点类型,-1表示所有类型
}
// CreateWorkflowNode 创建工作流节点
func CreateWorkflowNode(params CreateNodeRequest) (*oa.WorkflowNodeModel, *process.Process) {
// 验证工作流是否存在
workflowGuid, err := unique.FromString(params.WorkflowGuid)
if err != nil {
return nil, process.FailError(types.InvalidOACreateParamError, err)
}
workflow := &oa.WorkflowModel{}
r := dblib.DBIns.DB.Where("RecordGuid = ? AND (RecordStatus & 524288) = 0", workflowGuid).First(workflow)
if r.Error != nil {
return nil, process.FailError(types.WorkflowNotFoundError, r.Error)
}
// 创建工作流节点
node := oa.WorkflowNodeInstance()
node.WorkflowGuid = workflowGuid
node.NodeName = params.NodeName
node.NodeType = int16(params.NodeType)
node.NodeOrder = params.NodeOrder
node.ApproverType = int16(params.ApproverType)
node.ApproverValue = params.ApproverValue
node.ConditionExp = params.ConditionExp
node.Description = params.Description
// 保存节点
r = dblib.DBIns.DB.Create(node)
if r.Error != nil {
return nil, process.FailError(types.CreateWorkflowNodeError, r.Error)
}
return node, process.Success(200)
}
// QueryWorkflowNodes 查询工作流节点
func QueryWorkflowNodes(params QueryNodesRequest) ([]*oa.WorkflowNodeModel, *process.Process) {
result := make([]*oa.WorkflowNodeModel, 0)
// 验证工作流是否存在
workflowGuid, err := unique.FromString(params.WorkflowGuid)
if err != nil {
return nil, process.FailError(types.InvalidOAQueryParamError, err)
}
db := dblib.DBIns.DB.Model(&oa.WorkflowNodeModel{}).Where("WorkflowGuid = ? AND (RecordStatus & 524288) = 0", workflowGuid)
// 按节点类型筛选
if params.NodeType >= 0 {
db = db.Where("NodeType = ?", params.NodeType)
}
// 按节点顺序排序
r := db.Order("NodeOrder ASC").Find(&result)
if r.Error != nil {
return result, process.FailError(types.QueryWorkflowNodeError, r.Error)
}
return result, process.Success(200)
}
// GetWorkflowNodeByID 根据ID获取工作流节点
func GetWorkflowNodeByID(nodeGuid string) (*oa.WorkflowNodeModel, *process.Process) {
guid, err := unique.FromString(nodeGuid)
if err != nil {
return nil, process.FailError(types.InvalidOAQueryParamError, err)
}
node := &oa.WorkflowNodeModel{}
r := dblib.DBIns.DB.Where("RecordGuid = ? AND (RecordStatus & 524288) = 0", guid).First(node)
if r.Error != nil {
return nil, process.FailError(types.WorkflowNodeNotFoundError, r.Error)
}
return node, process.Success(200)
}
// UpdateWorkflowNode 更新工作流节点
func UpdateWorkflowNode(nodeGuid string, params CreateNodeRequest) (*oa.WorkflowNodeModel, *process.Process) {
// 获取工作流节点
node, proc := GetWorkflowNodeByID(nodeGuid)
if proc.IsError() {
return nil, proc
}
// 更新节点信息
node.NodeName = params.NodeName
node.NodeType = int16(params.NodeType)
node.NodeOrder = params.NodeOrder
node.ApproverType = int16(params.ApproverType)
node.ApproverValue = params.ApproverValue
node.ConditionExp = params.ConditionExp
node.Description = params.Description
// 保存更新
r := dblib.DBIns.DB.Save(node)
if r.Error != nil {
return nil, process.FailError(types.UpdateWorkflowNodeError, r.Error)
}
return node, process.Success(200)
}
// DeleteWorkflowNode 删除工作流节点(逻辑删除)
func DeleteWorkflowNode(nodeGuid string) *process.Process {
// 验证GUID格式
guid, err := unique.FromString(nodeGuid)
if err != nil {
return process.FailError(types.InvalidOAQueryParamError, err)
}
// 使用原生SQL直接执行位操作
sql := "UPDATE " + oa.WorkflowNodeTable + " SET RecordStatus = RecordStatus | 524288 WHERE RecordGuid = ?"
r := dblib.DBIns.DB.Exec(sql, guid)
if r.Error != nil {
return process.FailError(types.DeleteWorkflowNodeError, r.Error)
}
return process.Success(200)
}