438 lines
12 KiB
Go
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{}
|
|
}
|