198 lines
5.9 KiB
Go
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)
|
|
}
|