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) }