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.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:
return PageResult.SqlSugarPageResult(new SqlSugarPagedList());
}
}
catch (Exception ex)
{
return PageResult.SqlSugarPageResult(new SqlSugarPagedList());
}
}
///
/// 获取任务详情.
///
/// 任务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();
}
///
/// 批量审批节点列表.
///
/// 流程id.
///
[HttpGet("NodeSelector/{templateId}")]
public async Task NodeSelector(string templateId)
{
return await _flowTaskManager.NodeSelector(templateId);
}
///
/// 批量审批候选人.
///
/// 流程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);
}
#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 (_flowTaskManager.IsSubFlowUpNode(flowTaskParamter))
throw Oops.Oh(ErrorCode.WF0019);
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);
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.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);
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);
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)
{
// 清除依次经办数据
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);
}
#endregion
}