WiiCITMS/process/hr/leave_workflow.go
2025-11-07 14:14:34 +08:00

198 lines
5.9 KiB
Go

package hr
import (
"WiiCITMS/models/hr"
"WiiCITMS/process/common"
"WiiGenerates/WiiCITMS/generates/v1/go/types"
"WiiGoLibrary/apply/middle/process/v1"
"WiiGoLibrary/framework/hub/v1/dblib"
"encoding/json"
"errors"
"fmt"
)
// LeaveFormData 请假表单数据
type LeaveFormData struct {
StaffName string `json:"staffName"` // 员工姓名
LeaveType int `json:"leaveType"` // 请假类型
StartTime string `json:"startTime"` // 开始时间
EndTime string `json:"endTime"` // 结束时间
Duration float32 `json:"duration"` // 请假时长
Reason string `json:"reason"` // 请假原因
}
// CreateLeaveWithWorkflow 创建请假记录并启动审批流程
func CreateLeaveWithWorkflow(params CreateLeaveRequest, initiatorGuid string, approverGuids []string) (*hr.LeaveModel, *process.Process) {
// 检查权限
// 如果发起人不是请假人自己,则需要检查权限
if initiatorGuid != params.StaffGuid {
result := CheckAccessControl(initiatorGuid, common.OperationCreate, common.ResourceStaff, "")
if !result.HasPermission {
return nil, process.FailError(types.NoPermissionError, errors.New(result.ErrorMessage))
}
}
// 创建请假记录
leave, proc := CreateLeave(params, initiatorGuid)
if proc.IsError() {
return nil, proc
}
// 构建请假表单数据
formData := LeaveFormData{
LeaveType: int(leave.LeaveType),
StartTime: leave.StartTime.Format("2006-01-02 15:04:05"),
EndTime: leave.EndTime.Format("2006-01-02 15:04:05"),
Duration: leave.Duration,
Reason: leave.Reason,
}
formDataJson, err := json.Marshal(formData)
if err != nil {
return nil, process.FailError(types.InvalidWorkflowParamError, err)
}
// 查找或创建请假工作流定义
workflowGuid, proc := getOrCreateLeaveWorkflow(approverGuids)
if proc.IsError() {
return nil, proc
}
// 启动工作流实例
instanceRequest := common.CreateInstanceRequest{
WorkflowGuid: workflowGuid,
Title: fmt.Sprintf("请假申请-%s", leave.StartTime.Format("2006-01-02")),
BusinessType: common.LeaveWorkflowType,
BusinessID: leave.RecordGuid.String(),
InitiatorGuid: initiatorGuid,
FormData: string(formDataJson),
}
// 已经在这个函数开始检查了权限,所以不需要再次检查
_, proc = common.WorkflowSvc.StartWorkflowInstance(instanceRequest, false)
if proc.IsError() {
return nil, proc
}
return leave, process.Success(200)
}
// getOrCreateLeaveWorkflow 获取或创建请假工作流定义
func getOrCreateLeaveWorkflow(approverGuids []string) (string, *process.Process) {
// 查询是否已存在请假类型的工作流
workflows, proc := common.WorkflowSvc.QueryWorkflows(common.QueryWorkflowsRequest{
WorkflowType: common.LeaveWorkflowType,
IsActive: true,
})
// 如果存在,返回第一个活跃的工作流
if !proc.IsError() && len(workflows) > 0 {
return workflows[0].GetGuid(), process.Success(200)
}
// 创建新的请假工作流
workflow, proc := common.WorkflowSvc.CreateWorkflow(common.CreateWorkflowRequest{
WorkflowName: "请假审批流程",
WorkflowType: common.LeaveWorkflowType,
Description: "员工请假审批流程",
})
if proc.IsError() {
return "", proc
}
workflowGuid := workflow.GetGuid()
// 创建工作流节点
// 1. 开始节点
_, proc = common.WorkflowSvc.CreateWorkflowNode(common.CreateNodeRequest{
WorkflowGuid: workflowGuid,
NodeName: "开始",
NodeType: common.NodeTypeStart,
NodeOrder: 0,
})
if proc.IsError() {
return "", proc
}
// 2. 审批节点 - 添加所有审批人
for i, approverGuid := range approverGuids {
_, proc = common.WorkflowSvc.CreateWorkflowNode(common.CreateNodeRequest{
WorkflowGuid: workflowGuid,
NodeName: fmt.Sprintf("审批节点%d", i+1),
NodeType: common.NodeTypeApprove,
NodeOrder: i + 1,
ApproverType: 1, // 指定审批人
ApproverValue: approverGuid,
})
if proc.IsError() {
return "", proc
}
}
// 3. 结束节点
_, proc = common.WorkflowSvc.CreateWorkflowNode(common.CreateNodeRequest{
WorkflowGuid: workflowGuid,
NodeName: "结束",
NodeType: common.NodeTypeEnd,
NodeOrder: len(approverGuids) + 1,
})
if proc.IsError() {
return "", proc
}
return workflowGuid, process.Success(200)
}
// QueryLeaveWithWorkflowStatus 查询请假记录及其工作流状态
func QueryLeaveWithWorkflowStatus(leaveGuid string) (*hr.LeaveModel, map[string]interface{}, *process.Process) {
// 获取请假信息
leave := &hr.LeaveModel{}
r := dblib.DBIns.DB.Where("RecordGuid = ? AND (RecordStatus & 524288) = 0", leaveGuid).First(leave)
if r.Error != nil {
return nil, nil, process.FailError(types.LeaveNotFoundError, r.Error)
}
// 查询对应的工作流实例
instances, proc := common.WorkflowSvc.QueryWorkflowInstances(common.QueryInstancesRequest{
BusinessType: common.LeaveWorkflowType,
BusinessID: leaveGuid,
})
if proc.IsError() || len(instances) == 0 {
return leave, nil, process.Success(200) // 返回请假信息,工作流信息为空
}
// 获取工作流实例状态
instance := instances[0]
workflowStatus := map[string]interface{}{
"instanceId": instance.GetGuid(),
"status": instance.GetStatus(),
"currentNode": instance.GetCurrentNodeID(),
"createTime": instance.GetCreateTime(),
"updateTime": instance.GetUpdateTime(),
"completeTime": instance.GetCompletionTime(),
}
// 获取审批历史
approvalRecords, proc := common.WorkflowSvc.QueryApprovalHistory(instance.GetGuid())
if !proc.IsError() {
var history []map[string]interface{}
for _, record := range approvalRecords {
history = append(history, map[string]interface{}{
"approver": record.GetApproverGuid(),
"status": record.GetStatus(),
"comment": record.GetComment(),
"createTime": record.GetCreateTime(),
"actionTime": record.GetActionTime(),
})
}
workflowStatus["approvalHistory"] = history
}
return leave, workflowStatus, process.Success(200)
}