using JNPF.Common.Core.Manager; using JNPF.Common.Enums; using JNPF.Common.Extension; using JNPF.Common.Filter; using JNPF.Common.Security; using JNPF.DatabaseAccessor; using JNPF.DependencyInjection; using JNPF.DynamicApiController; using JNPF.FriendlyException; using JNPF.WorkFlow.Entitys.Dto.FlowBefore; using JNPF.WorkFlow.Entitys.Enum; using JNPF.WorkFlow.Entitys.Model; using JNPF.WorkFlow.Entitys.Model.Properties; using JNPF.WorkFlow.Interfaces.Manager; using JNPF.WorkFlow.Interfaces.Repository; using Microsoft.AspNetCore.Mvc; using SqlSugar; namespace JNPF.WorkFlow.Service; /// /// 流程审批. /// [ApiDescriptionSettings(Tag = "WorkflowEngine", Name = "FlowBefore", Order = 303)] [Route("api/workflow/Engine/[controller]")] public class FlowBeforeService : IDynamicApiController, ITransient { private readonly IFlowTaskRepository _flowTaskRepository; private readonly IFlowTaskManager _flowTaskManager; private readonly IUserManager _userManager; public FlowBeforeService(IFlowTaskRepository flowTaskRepository, IFlowTaskManager flowTaskManager, IUserManager userManager) { _flowTaskRepository = flowTaskRepository; _flowTaskManager = flowTaskManager; _userManager = userManager; } #region Get /// /// 列表. /// /// 请求参数. /// 分类. /// [HttpGet("List/{category}")] public async Task GetList([FromQuery] FlowBeforeListQuery input, string category) { try { switch (category) { case "1": return await _flowTaskRepository.GetWaitList(input); case "2": return await _flowTaskRepository.GetTrialList(input); case "3": return await _flowTaskRepository.GetCirculateList(input); case "4": return await _flowTaskRepository.GetBatchWaitList(input); default: var pageList = new SqlSugarPagedList() { list = new List(), pagination = new Pagination() { CurrentPage = input.currentPage, PageSize = input.pageSize, Total = 0 } }; return PageResult.SqlSugarPageResult(pageList); } } catch (Exception ex) { var pageList = new SqlSugarPagedList() { list = new List(), pagination = new Pagination() { CurrentPage = input.currentPage, PageSize = input.pageSize, Total = 0 } }; return PageResult.SqlSugarPageResult(pageList); } } /// /// 获取任务详情. /// /// 任务id. /// 流程id. /// 节点id. /// 经办id. /// [HttpGet("{id}")] public async Task GetInfo(string id, [FromQuery] string flowId, [FromQuery] string taskNodeId, [FromQuery] string taskOperatorId) { try { return await _flowTaskManager.GetFlowBeforeInfo(id, flowId, taskNodeId, taskOperatorId); } catch (Exception ex) { throw Oops.Oh(ErrorCode.WF0033); } } /// /// 审批汇总. /// /// 主键值. /// 分类(1:部门,2:角色,3:岗位). /// [HttpGet("RecordList/{taskRecordId}")] public async Task GetRecordList(string taskRecordId, [FromQuery] string category, [FromQuery] string type) { var recordList = await _flowTaskRepository.GetRecordListByCategory(taskRecordId, category, type); var categoryId = recordList.Select(x => x.category).Distinct().ToList(); var list = new List(); foreach (var item in categoryId) { var categoryList = recordList.FindAll(x => x.category == item).ToList(); var output = new FlowBeforeRecordListOutput(); output.fullName = categoryList.FirstOrDefault()?.categoryName; output.list = categoryList.OrderByDescending(x => x.handleTime).ToList(); list.Add(output); } return list; } /// /// 获取候选人编码. /// /// 经办id. /// 审批参数. /// [HttpPost("Candidates/{taskOperatorId}")] public async Task Candidates(string taskOperatorId, [FromBody] FlowHandleModel flowHandleModel) { if (taskOperatorId != "0") { var flowTaskParamter = await _flowTaskManager.Validation(taskOperatorId, flowHandleModel); var flowEngine = _flowTaskRepository.GetFlowTemplateInfo(flowTaskParamter.flowTaskEntity.FlowId); if (flowTaskParamter.flowTaskEntity.RejectDataId.IsNotEmptyOrNull()) { return new List(); } await _flowTaskManager.AdjustNodeByCon(flowEngine, flowHandleModel.formData, flowTaskParamter.flowTaskOperatorEntity); } return await _flowTaskManager.GetCandidateModelList(taskOperatorId, flowHandleModel); } /// /// 获取候选人. /// /// 经办id. /// 审批参数. /// [HttpPost("CandidateUser/{taskOperatorId}")] public async Task CandidateUser(string taskOperatorId, [FromBody] FlowHandleModel flowHandleModel) { return await _flowTaskManager.GetCandidateModelList(taskOperatorId, flowHandleModel, 1); } /// /// 批量审批流程分类列表. /// /// [HttpGet("BatchFlowSelector")] public async Task BatchFlowSelector() { return await _flowTaskRepository.BatchFlowSelector(); } /// /// 批量审批流程列表. /// /// /// [HttpGet("BatchFlowJsonList/{templateId}")] public async Task BatchFlowJsonList(string templateId) { var list = (await _flowTaskRepository.GetWaitList()).FindAll(x => x.IsBatch == 1 && x.TemplateId == templateId); var output = new List(); foreach (var item in list) { var flowJson = _flowTaskRepository.GetFlowTemplateJsonInfo(x => x.Id == item.FlowId && x.DeleteMark == null); if (flowJson.IsNotEmptyOrNull()) { output.Add(new { id = flowJson.Id, fullName = string.Format("{0}(v{1})", flowJson.FullName, flowJson.Version), flowTemplateJson = flowJson.FlowTemplateJson }); } } return output.Distinct(); } /// /// 批量审批节点列表. /// /// 流程id. /// [HttpGet("NodeSelector/{flowId}")] public async Task NodeSelector(string flowId) { return await _flowTaskManager.NodeSelector(flowId); } /// /// 批量审批候选人. /// /// 流程id. /// 经办id. /// [HttpGet("BatchCandidate")] public async Task GetBatchCandidate([FromQuery] string flowId, [FromQuery] string taskOperatorId) { await _flowTaskManager.Validation(taskOperatorId, null); return await _flowTaskManager.GetBatchCandidate(flowId, taskOperatorId); } /// /// 验证站内信详情是否有查看权限. /// /// 经办id. /// [HttpGet("{taskOperatorId}/Info")] public async Task IsInfo(string taskOperatorId) { var flowTaskOperatorEntity = await _flowTaskRepository.GetTaskOperatorInfo(taskOperatorId); if (flowTaskOperatorEntity.IsNullOrEmpty()) throw Oops.Oh(ErrorCode.WF0029); var flowTaskEntity = _flowTaskRepository.GetTaskFirstOrDefault(flowTaskOperatorEntity.TaskId); if (flowTaskOperatorEntity.HandleId == _userManager.UserId) { if (flowTaskOperatorEntity.State == "-1" || flowTaskEntity.Status == 5) throw Oops.Oh(ErrorCode.WF0029); } else { var toUserId = _flowTaskRepository.GetToUserId(flowTaskOperatorEntity.HandleId, flowTaskEntity.FlowId); if (!toUserId.Contains(_userManager.UserId) || flowTaskOperatorEntity.State == "-1" || flowTaskEntity.Status == 5) throw Oops.Oh(ErrorCode.WF0029); } // true 跳转抄送页面 false 审批页面 return new { isCheck = flowTaskOperatorEntity.Completion != 0 }; } /// /// 节点列表. /// /// 任务id. /// [HttpGet("Selector/{taskId}")] public async Task Selector(string taskId) { var nodeList = await _flowTaskRepository.GetTaskNodeList(x => x.TaskId == taskId && x.State == "0" && x.NodeType == "approver"); return nodeList.Select(x => new { id = x.Id, nodeName = x.NodeName }).ToList(); } /// /// 驳回节点列表. /// /// 经办id. /// [HttpGet("RejectList/{taskOperatorId}")] public async Task RejectNodeList(string taskOperatorId) { return await _flowTaskManager.RejectNodeList(taskOperatorId); } /// /// 子流程详情. /// /// 节点id. /// [HttpGet("SubFlowInfo/{taskNodeId}")] public async Task SubFlowInfo(string taskNodeId) { var output = new List(); var taskNodeEntity = await _flowTaskRepository.GetTaskNodeInfo(taskNodeId); if (FlowTaskNodeTypeEnum.subFlow.ParseToString().Equals(taskNodeEntity.NodeType)) { var childProp = taskNodeEntity.NodePropertyJson.ToObject(); foreach (var item in childProp.childTaskId) { var childTaskInfo = await _flowTaskManager.GetFlowBeforeInfo(item, childProp.flowId, null, null); output.Add(childTaskInfo); } } return output; } /// /// 挂起任务是否存在异步子流程. /// /// 任务id. /// [HttpGet("Suspend/{taskId}")] public async Task Suspend(string taskId) { return await _flowTaskRepository.AnyFlowTask(x => x.ParentId == taskId && x.IsAsync == 1 && x.DeleteMark == null); } #endregion #region POST /// /// 审核同意. /// /// 经办id. /// 审批参数. /// [HttpPost("Audit/{taskOperatorId}")] public async Task Audit(string taskOperatorId, [FromBody] FlowHandleModel flowHandleModel) { var flowTaskParamter = await _flowTaskManager.Validation(taskOperatorId, flowHandleModel); return await _flowTaskManager.Audit(flowTaskParamter); } /// /// 审核拒绝. /// /// 经办id. /// 审批参数. /// [HttpPost("Reject/{taskOperatorId}")] public async Task Reject(string taskOperatorId, [FromBody] FlowHandleModel flowHandleModel) { var flowTaskParamter = await _flowTaskRepository.GetTaskParamterByOperatorId(taskOperatorId, flowHandleModel); if (flowTaskParamter.flowTaskEntity.Suspend == 1) throw Oops.Oh(ErrorCode.WF0046); if (_flowTaskManager.IsSubFlowUpNode(flowTaskParamter)) throw Oops.Oh(ErrorCode.WF0019); if (flowHandleModel.rejectType.IsNotEmptyOrNull()) { flowTaskParamter.approversProperties.rejectType = flowHandleModel.rejectType.ParseToInt(); } return await _flowTaskManager.Reject(flowTaskParamter); } /// /// 审批撤回. /// 注意:在撤销流程时要保证你的下一节点没有处理这条记录;如已处理则无法撤销流程. /// /// 经办记录id. /// 审批参数. /// [HttpPost("Recall/{taskRecordId}")] public async Task Recall(string taskRecordId, [FromBody] FlowHandleModel flowHandleModel) { var flowTaskOperatorRecord = await _flowTaskRepository.GetTaskOperatorRecordInfo(taskRecordId); if (await _flowTaskRepository.AnyFlowTask(x => x.ParentId == flowTaskOperatorRecord.TaskId && x.Status != FlowTaskStatusEnum.Cancel.ParseToInt() && x.DeleteMark == null)) throw Oops.Oh(ErrorCode.WF0018); var flowTaskParamter = await _flowTaskRepository.GetTaskParamterByOperatorId(flowTaskOperatorRecord.TaskOperatorId, flowHandleModel); if (flowTaskParamter.flowTaskEntity.Suspend == 1) throw Oops.Oh(ErrorCode.WF0046); await _flowTaskManager.Recall(flowTaskParamter, flowTaskOperatorRecord); } /// /// 终止审核. /// /// 任务id. /// 审批参数. /// [HttpPost("Cancel/{taskId}")] public async Task Cancel(string taskId, [FromBody] FlowHandleModel flowHandleModel) { var flowTaskParamter = await _flowTaskRepository.GetTaskParamterByTaskId(taskId, flowHandleModel); if (flowTaskParamter.flowTaskEntity.Suspend == 1) throw Oops.Oh(ErrorCode.WF0046); if (flowTaskParamter.flowTaskEntity.FlowType == 1) throw Oops.Oh(ErrorCode.WF0016); await _flowTaskManager.Cancel(flowTaskParamter); } /// /// 转办. /// /// 经办id. /// 审批参数. /// [HttpPost("Transfer/{taskOperatorId}")] public async Task Transfer(string taskOperatorId, [FromBody] FlowHandleModel flowHandleModel) { var flowTaskParamter = await _flowTaskManager.Validation(taskOperatorId, flowHandleModel); await _flowTaskManager.Transfer(flowTaskParamter); } /// /// 指派. /// /// 任务id. /// 审批参数. /// [HttpPost("Assign/{taskId}")] public async Task Assigned(string taskId, [FromBody] FlowHandleModel flowHandleModel) { var nodeEntity = await _flowTaskRepository.GetTaskNodeList(x => x.TaskId == taskId && x.State.Equals("0") && FlowTaskNodeTypeEnum.subFlow.ParseToString().Equals(x.NodeType) && x.NodeCode.Equals(flowHandleModel.nodeCode)); if (nodeEntity.IsNotEmptyOrNull() && nodeEntity.Count > 0) throw Oops.Oh(ErrorCode.WF0014); var flowTaskParamter = await _flowTaskRepository.GetTaskParamterByTaskId(taskId, flowHandleModel); if (flowTaskParamter.flowTaskEntity.Suspend == 1) throw Oops.Oh(ErrorCode.WF0046); flowTaskParamter.thisFlowTaskOperatorEntityList = await _flowTaskRepository.GetTaskOperatorList(x => x.State == "0" && x.NodeCode == flowHandleModel.nodeCode && x.TaskId == taskId); await _flowTaskManager.Assigned(flowTaskParamter); } /// /// 保存审批草稿数据. /// /// 经办id. /// 审批参数. /// [HttpPost("SaveAudit/{taskOperatorId}")] [UnitOfWork] public async Task SaveAudit(string taskOperatorId, [FromBody] FlowHandleModel flowHandleModel) { var flowTaskParamter = await _flowTaskManager.Validation(taskOperatorId, flowHandleModel); if (flowTaskParamter.flowTaskEntity.Suspend == 1) throw Oops.Oh(ErrorCode.WF0046); flowTaskParamter.flowTaskOperatorEntity.DraftData = flowHandleModel.formData.ToJsonString(); await _flowTaskRepository.UpdateTaskOperator(flowTaskParamter.flowTaskOperatorEntity); } /// /// 批量审批. /// /// 审批参数. /// [HttpPost("BatchOperation")] public async Task BatchOperation([FromBody] FlowHandleModel flowHandleModel) { foreach (var item in flowHandleModel.ids) { var flowTaskParamter = await _flowTaskRepository.GetTaskParamterByOperatorId(item, flowHandleModel); flowTaskParamter.formData = await _flowTaskManager.GetBatchOperationData(flowTaskParamter); flowHandleModel.formData = flowTaskParamter.formData; switch (flowHandleModel.batchType) { case 0: if (flowTaskParamter.flowTaskOperatorEntity == null) throw Oops.Oh(ErrorCode.COM1005); if (flowTaskParamter.flowTaskOperatorEntity.Completion != 0) throw Oops.Oh(ErrorCode.WF0006); await _flowTaskManager.Audit(flowTaskParamter); break; case 1: await Reject(item, flowHandleModel); break; case 2: await Transfer(item, flowHandleModel); break; } } } /// /// 任务(变更/复活). /// /// 审批参数. /// [HttpPost("Change")] public async Task Change([FromBody] FlowHandleModel flowHandleModel) { // 清除依次经办数据 if (await _flowTaskRepository.AnyFlowTask(x => x.Id == flowHandleModel.taskId && x.Suspend == 1 && x.DeleteMark == null)) throw Oops.Oh(ErrorCode.WF0046); await _flowTaskRepository.DeleteTaskOperatorUser(flowHandleModel.taskId); _flowTaskRepository.DeleteFlowCandidates(x => x.TaskId == flowHandleModel.taskId); var flowTaskParamter = await _flowTaskRepository.GetTaskParamterByTaskId(flowHandleModel.taskId, flowHandleModel); return await _flowTaskManager.Change(flowTaskParamter); } /// /// 加签. /// /// 经办id. /// 审批参数. /// [HttpPost("freeApprover/{taskOperatorId}")] public async Task FreeApprover(string taskOperatorId, [FromBody] FlowHandleModel flowHandleModel) { return await Audit(taskOperatorId, flowHandleModel); } /// /// 挂起. /// /// 任务id. /// 审批参数. /// [HttpPost("Suspend/{taskId}")] public async Task Suspend(string taskId, [FromBody] FlowHandleModel flowHandleModel) { var flowTaskParamter = await _flowTaskRepository.GetTaskParamterByTaskId(taskId, flowHandleModel); await _flowTaskManager.Suspend(flowTaskParamter); } /// /// 恢复. /// /// 任务id. /// 审批参数. /// [HttpPost("Restore/{taskId}")] public async Task Restore(string taskId, [FromBody] FlowHandleModel flowHandleModel) { var flowTaskParamter = await _flowTaskRepository.GetTaskParamterByTaskId(taskId, flowHandleModel); await _flowTaskManager.Restore(flowTaskParamter); } #endregion }