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

438 lines
12 KiB
Go

package oa
import (
"WiiCITMS/models/oa"
"WiiCITMS/process/common"
"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"
)
// WorkflowServiceImpl 工作流服务实现
type WorkflowServiceImpl struct{}
// 确保WorkflowServiceImpl实现了WorkflowService接口
var _ common.WorkflowService = (*WorkflowServiceImpl)(nil)
// 工作流模型适配器
type workflowModelAdapter struct {
*oa.WorkflowModel
}
func (w *workflowModelAdapter) GetGuid() string {
return w.RecordGuid.String()
}
// 工作流节点适配器
type workflowNodeModelAdapter struct {
*oa.WorkflowNodeModel
}
func (n *workflowNodeModelAdapter) GetGuid() string {
return n.RecordGuid.String()
}
func (n *workflowNodeModelAdapter) GetType() int16 {
return n.NodeType
}
func (n *workflowNodeModelAdapter) GetApproverType() int16 {
return n.ApproverType
}
func (n *workflowNodeModelAdapter) GetApproverValue() string {
return n.ApproverValue
}
// 工作流实例适配器
type workflowInstanceModelAdapter struct {
*oa.WorkflowInstanceModel
}
func (i *workflowInstanceModelAdapter) GetGuid() string {
return i.RecordGuid.String()
}
func (i *workflowInstanceModelAdapter) GetWorkflowGuid() string {
return i.WorkflowGuid.String()
}
func (i *workflowInstanceModelAdapter) GetCurrentNodeID() string {
return i.CurrentNodeID.String()
}
func (i *workflowInstanceModelAdapter) GetInitiatorGuid() string {
return i.InitiatorGuid.String()
}
func (i *workflowInstanceModelAdapter) GetStatus() int16 {
return i.Status
}
func (i *workflowInstanceModelAdapter) GetCreateTime() time.Time {
return i.CreateTime
}
func (i *workflowInstanceModelAdapter) GetUpdateTime() time.Time {
return i.UpdateTime
}
func (i *workflowInstanceModelAdapter) GetCompletionTime() time.Time {
return i.CompletionTime
}
// 审批记录适配器
type approvalRecordModelAdapter struct {
*oa.ApprovalRecordModel
}
func (a *approvalRecordModelAdapter) GetGuid() string {
return a.RecordGuid.String()
}
func (a *approvalRecordModelAdapter) GetStatus() int16 {
return a.Status
}
func (a *approvalRecordModelAdapter) GetComment() string {
return a.Comment
}
func (a *approvalRecordModelAdapter) GetApproverGuid() string {
return a.ApproverGuid.String()
}
func (a *approvalRecordModelAdapter) GetCreateTime() time.Time {
return a.CreateTime
}
func (a *approvalRecordModelAdapter) GetActionTime() time.Time {
return a.ActionTime
}
// CreateWorkflow 创建工作流
func (svc *WorkflowServiceImpl) CreateWorkflow(params common.CreateWorkflowRequest) (common.WorkflowModel, *process.Process) {
// 创建工作流
workflow := oa.WorkflowInstance()
workflow.WorkflowName = params.WorkflowName
workflow.WorkflowType = int16(params.WorkflowType)
workflow.Description = params.Description
// 设置创建人
if params.CreatorGuid != "" {
creatorGuid, err := unique.FromString(params.CreatorGuid)
if err == nil {
workflow.Creator = creatorGuid
}
}
// 保存工作流
r := dblib.DBIns.DB.Create(workflow)
if r.Error != nil {
return nil, process.FailError(types.CreateWorkflowError, r.Error)
}
return &workflowModelAdapter{workflow}, process.Success(200)
}
// QueryWorkflows 查询工作流列表
func (svc *WorkflowServiceImpl) QueryWorkflows(params common.QueryWorkflowsRequest) ([]common.WorkflowModel, *process.Process) {
result := make([]*oa.WorkflowModel, 0)
db := dblib.DBIns.DB.Model(&oa.WorkflowModel{}).Where("(RecordStatus & 524288) = 0")
// 按工作流名称筛选
if params.WorkflowName != "" {
db = db.Where("WorkflowName LIKE ?", "%"+params.WorkflowName+"%")
}
// 按工作流类型筛选
if params.WorkflowType >= 0 {
db = db.Where("WorkflowType = ?", params.WorkflowType)
}
// 按是否启用筛选
if params.IsActive {
db = db.Where("IsActive = 1")
}
// 分页查询
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 nil, process.FailError(types.QueryWorkflowError, r.Error)
}
// 转换为接口类型
models := make([]common.WorkflowModel, len(result))
for i, w := range result {
models[i] = &workflowModelAdapter{w}
}
return models, process.Success(200)
}
// CreateWorkflowNode 创建工作流节点
func (svc *WorkflowServiceImpl) CreateWorkflowNode(params common.CreateNodeRequest) (common.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 &workflowNodeModelAdapter{node}, process.Success(200)
}
// StartWorkflowInstance 启动工作流实例
func (svc *WorkflowServiceImpl) StartWorkflowInstance(params common.CreateInstanceRequest, checkPermission bool) (common.WorkflowInstanceModel, *process.Process) {
// 使用事务确保操作的原子性
tx := dblib.DBIns.DB.Begin()
// 验证工作流是否存在并且处于激活状态
workflowGuid, err := unique.FromString(params.WorkflowGuid)
if err != nil {
tx.Rollback()
return nil, process.FailError(types.InvalidWorkflowInstanceParamError, err)
}
workflow := &oa.WorkflowModel{}
r := tx.Where("RecordGuid = ? AND IsActive = 1 AND (RecordStatus & 524288) = 0", workflowGuid).First(workflow)
if r.Error != nil {
tx.Rollback()
return nil, process.FailError(types.WorkflowNotFoundOrInactiveError, r.Error)
}
// 解析发起人ID
initiatorGuid, err := unique.FromString(params.InitiatorGuid)
if err != nil {
tx.Rollback()
return nil, process.FailError(types.InvalidWorkflowInstanceParamError, err)
}
// 创建工作流实例
instance := oa.WorkflowInstanceInstance()
instance.WorkflowGuid = workflowGuid
instance.Title = params.Title
instance.BusinessType = int16(params.BusinessType)
instance.BusinessID = params.BusinessID
instance.InitiatorGuid = initiatorGuid
instance.Status = 0 // 进行中
instance.FormData = params.FormData
// 保存实例
r = tx.Create(instance)
if r.Error != nil {
tx.Rollback()
return nil, process.FailError(types.CreateWorkflowInstanceError, r.Error)
}
// 获取工作流的第一个节点
firstNode := &oa.WorkflowNodeModel{}
r = tx.Where("WorkflowGuid = ? AND NodeType = 1 AND (RecordStatus & 524288) = 0", workflowGuid).
Order("NodeOrder ASC").First(firstNode)
if r.Error != nil {
tx.Rollback()
return nil, process.FailError(types.WorkflowStartNodeNotFoundError, r.Error)
}
// 设置当前节点为第一个节点
instance.CurrentNodeID = firstNode.RecordGuid
r = tx.Save(instance)
if r.Error != nil {
tx.Rollback()
return nil, process.FailError(types.UpdateWorkflowInstanceError, r.Error)
}
// 提交事务
if err := tx.Commit().Error; err != nil {
return nil, process.FailError(types.TransactionCommitError, err)
}
return &workflowInstanceModelAdapter{instance}, process.Success(200)
}
// QueryWorkflowInstances 查询工作流实例
func (svc *WorkflowServiceImpl) QueryWorkflowInstances(params common.QueryInstancesRequest) ([]common.WorkflowInstanceModel, *process.Process) {
result := make([]*oa.WorkflowInstanceModel, 0)
db := dblib.DBIns.DB.Model(&oa.WorkflowInstanceModel{}).Where("(RecordStatus & 524288) = 0")
// 按工作流ID筛选
if params.WorkflowGuid != "" {
workflowGuid, err := unique.FromString(params.WorkflowGuid)
if err == nil {
db = db.Where("WorkflowGuid = ?", workflowGuid)
}
}
// 按业务类型筛选
if params.BusinessType >= 0 {
db = db.Where("BusinessType = ?", params.BusinessType)
}
// 按业务ID筛选
if params.BusinessID != "" {
db = db.Where("BusinessID = ?", params.BusinessID)
}
// 按发起人筛选
if params.InitiatorGuid != "" {
initiatorGuid, err := unique.FromString(params.InitiatorGuid)
if err == nil {
db = db.Where("InitiatorGuid = ?", initiatorGuid)
}
}
// 按状态筛选
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 nil, process.FailError(types.QueryWorkflowInstanceError, r.Error)
}
// 转换为接口类型
instances := make([]common.WorkflowInstanceModel, len(result))
for i, instance := range result {
instances[i] = &workflowInstanceModelAdapter{instance}
}
return instances, process.Success(200)
}
// QueryApprovalHistory 查询审批历史
func (svc *WorkflowServiceImpl) QueryApprovalHistory(instanceGuid string) ([]common.ApprovalRecordModel, *process.Process) {
// 解析实例ID
guid, err := unique.FromString(instanceGuid)
if err != nil {
return nil, process.FailError(types.InvalidWorkflowInstanceParamError, err)
}
// 查询审批记录
records := make([]*oa.ApprovalRecordModel, 0)
r := dblib.DBIns.DB.Where("InstanceGuid = ? AND (RecordStatus & 524288) = 0", guid).
Order("CreateTime ASC").Find(&records)
if r.Error != nil {
return nil, process.FailError(types.QueryWorkflowError, r.Error)
}
// 转换为接口类型
approvalRecords := make([]common.ApprovalRecordModel, len(records))
for i, record := range records {
approvalRecords[i] = &approvalRecordModelAdapter{record}
}
return approvalRecords, process.Success(200)
}
// CheckPermission 检查权限
func (svc *WorkflowServiceImpl) CheckPermission(staffGuid string, operation string, instanceGuid string) *process.Process {
// 获取工作流实例
instance, proc := GetWorkflowInstance(instanceGuid)
if proc.IsError() {
return proc
}
// 根据操作类型检查权限
switch operation {
case common.OperationView:
// 检查是否是发起人
if instance.InitiatorGuid.String() == staffGuid {
return process.Success(200)
}
// 检查是否是审批人
isApprover := false
nodes, proc := GetWorkflowNodes(instance.WorkflowGuid.String())
if proc.IsError() {
return proc
}
for _, node := range nodes {
if node.ApproverType == 1 && node.ApproverValue == staffGuid {
isApprover = true
break
}
}
if isApprover {
return process.Success(200)
}
// 如果既不是发起人又不是审批人,返回权限错误
return process.FailError(types.NoPermissionError, errors.New("无权查看此工作流"))
case common.OperationApprove:
// 获取当前节点
node, proc := GetWorkflowNode(instance.CurrentNodeID.String())
if proc.IsError() {
return proc
}
// 检查是否是审批节点
if node.NodeType != common.NodeTypeApprove {
return process.FailError(types.InvalidWorkflowStatusError, errors.New("当前节点不是审批节点"))
}
// 检查是否是指定审批人
if node.ApproverType == 1 && node.ApproverValue == staffGuid {
return process.Success(200)
}
// 如果不是指定审批人,返回权限错误
return process.FailError(types.NoPermissionError, errors.New("无权限进行此审批操作"))
default:
return process.FailError(types.InvalidParamError, errors.New("不支持的操作类型"))
}
}
// 初始化函数,注册工作流服务
func init() {
common.WorkflowSvc = &WorkflowServiceImpl{}
}