mh_sms/APT.BaseData.Services/Services/FM/PFFlowService.cs

1180 lines
55 KiB
C#
Raw Normal View History

2024-04-12 16:50:28 +08:00
using APT.BaseData.Domain.ApiModel;
using APT.BaseData.Domain.Entities;
using APT.BaseData.Domain.Enums;
using APT.BaseData.Domain.IServices;
using APT.Infrastructure.Core;
using APT.BaseData.Domain.Entities.FM;
using APT.BaseData.Domain.IServices.FM;
using APT.Utility;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using APT.Infrastructure.Api;
namespace APT.BaseData.Services.Services.FM
{
public partial class PFFlowService : CommonService, IPFFlowService
{
IFMUserService UserService { get; set; }
public PFFlowService(IRepository repository, IFMUserService userService)
: base(repository)
{
this.UserService = userService;
}
#region API
/// <summary>
/// 检查自动送审(直接保存数据)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="id"></param>
/// <param name="entityType">实体类型 参考PFCodeRuleType</param>
public void SendFlowAndCommit<T>(T entity, int entityType, string schemeCode, Action action) where T : MesEntityBase, new()
{
if (entity == null)
throw new Exception("无效的实体");
//if (entity.FLOW_SEND_STATUS == (int)PPFlowSendStatusEnum.已送审) return;
//var dbEntity = this.AddAndGetEntity(entity);
if (entity.FLOW_STATUS == (int)PPFlowStatusEnum. || entity.FLOW_STATUS == (int)PPFlowStatusEnum.)
return;
var tmpScheme = this.GetEntity<T_PF_FLOW_SCHEME>(t => t.SchemeCode == schemeCode
&& t.Disabled == (int)PPFlowSchemeDisabledEnum.);
if (tmpScheme != null)
{
entity.FLOW_STATUS = (int)PPFlowStatusEnum.;
if (tmpScheme.ActiveAutoSend == 1)//自动送审
{
SendFlowParam param = new SendFlowParam();
param.EntityId = entity.ID;
param.EntityType = entityType;
param.FlowSchemeId = tmpScheme.ID;
SendFlow<T>(param,tmpScheme,entity, action);
}
}
else if (entity.FLOW_STATUS == (int)PPFlowStatusEnum.)
{
entity.FLOW_STATUS = (int)PPFlowStatusEnum.;
this.UpdateEntity(entity);
}
}
/// <summary>
/// 检查自动送审(直接保存数据)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="id"></param>
/// <param name="entityType">实体类型 参考PFCodeRuleType</param>
public void AddAndSendFlow<T>(T entity, int entityType) where T : MesEntityBase, new()
{
if (entity == null)
throw new Exception("无效的实体");
//if (entity.FLOW_SEND_STATUS == (int)PPFlowSendStatusEnum.已送审) return;
//var dbEntity = this.AddAndGetEntity(entity);
if (entity.FORM_ID == null)
throw new Exception("实体表单不允许为空");
this.UpdateEntity(entity);
if (entity.FLOW_STATUS == (int)PPFlowStatusEnum. || entity.FLOW_STATUS == (int)PPFlowStatusEnum.)
return;
var tmpScheme = this.GetEntities<T_PF_FLOW_SCHEME>(t => t.FrmId == entity.FORM_ID
&& t.Disabled == (int)PPFlowSchemeDisabledEnum.).OrderByDescending(t => t.SortCode).FirstOrDefault();
if (tmpScheme != null)
{
entity.FLOW_STATUS = (int)PPFlowStatusEnum.;
if (tmpScheme.ActiveAutoSend == 1)//自动送审
{
SendFlowParam param = new SendFlowParam();
param.EntityId = entity.ID;
param.EntityType = entityType;
param.FlowSchemeId = tmpScheme.ID;
SendFlow<T>(param);
}
}
else if (entity.FLOW_STATUS == (int)PPFlowStatusEnum.)
{
entity.FLOW_STATUS = (int)PPFlowStatusEnum.;
this.UpdateEntity(entity);
}
}
/// <summary>
/// 检查自动送审(直接保存数据)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="id"></param>
/// <param name="entityType">实体类型 参考PFCodeRuleType</param>
public void CheckAndSendFlow<T>(Guid id, int entityType) where T : MesEntityBase, new()
{
CheckAndSendFlow<T>(id, entityType, string.Empty, string.Empty);
}
/// <summary>
/// 检查自动送审(直接保存数据)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="id"></param>
/// <param name="entityType">实体类型 参考PFCodeRuleType</param>
/// <param name="userId"></param>
/// <param name="userName"></param>
public void CheckAndSendFlow<T>(Guid id, int entityType, string userId, string userName) where T : MesEntityBase, new()
{
if (id == Guid.Empty) return;
//var flowSchemeService = ServiceUtils.GetCommonService<T_PF_FLOW_SCHEME>();
//var entityService = ServiceUtils.GetCommonService<T>();
T entity = this.GetEntity<T>(id);// entityService.Get(id);
if (entity == null)
throw new Exception("无效的实体");
if (entity.FLOW_SEND_STATUS == (int)PPFlowSendStatusEnum.) return;
if (entity.FORM_ID == null)
throw new Exception("实体表单不允许为空");
var tmpScheme = this.GetEntities<T_PF_FLOW_SCHEME>(t => t.FrmId == entity.FORM_ID
&& t.Disabled == (int)PPFlowSchemeDisabledEnum.).OrderByDescending(t => t.SortCode).FirstOrDefault();
if (tmpScheme != null)
{
entity.FLOW_STATUS = (int)PPFlowStatusEnum.;
this.UpdateEntity(entity);
if (tmpScheme.ActiveAutoSend == 1)//自动送审
{
SendFlowParam param = new SendFlowParam();
param.EntityId = id;
param.FlowSchemeId = tmpScheme.ID;
param.UserId = userId;
param.EntityType = entityType;
param.UserName = userName;
SendFlow<T>(param);
}
}
else if (entity.FLOW_STATUS == (int)PPFlowStatusEnum.)
{
entity.FLOW_STATUS = (int)PPFlowStatusEnum.;
this.UpdateEntity(entity);
}
}
/// <summary>
/// 检查自动送审(未保存数据)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entity"></param>
/// <param name="entityType">实体类型 参考PFCodeRuleType</param>
/// <returns></returns>
public SendFlowResult<T> CheckAndSendFlow<T>(T entity, int entityType) where T : MesEntityBase, new()
{
if (entity.FLOW_SEND_STATUS == (int)PPFlowSendStatusEnum.) return null;
if (entity.FORM_ID == null)
throw new Exception("实体表单不允许为空");
// var flowSchemeService = ServiceUtils.GetCommonService<T_PF_FLOW_SCHEME>();
SendFlowResult<T> result = null;
var tmpScheme = this.GetEntities<T_PF_FLOW_SCHEME>(t => t.FrmId == entity.FORM_ID
&& t.Disabled == (int)PPFlowSchemeDisabledEnum.).OrderByDescending(t => t.SortCode).FirstOrDefault();
if (tmpScheme != null)
{
entity.FLOW_STATUS = (int)PPFlowStatusEnum.;
if (tmpScheme.ActiveAutoSend == 1)//自动送审
{
SendFlowEntityParam<T> param = new SendFlowEntityParam<T>();
param.Entity = entity;
param.FlowScheme = tmpScheme;
param.EntityType = entityType;
result = SendFlow<T>(param);
}
}
else if (entity.FLOW_STATUS == (int)PPFlowStatusEnum.)
{
entity.FLOW_STATUS = (int)PPFlowStatusEnum.;
}
return result;
}
/// <summary>
/// 送审(直接保存数据)
/// </summary>
/// <param name="id">实体ID</param>
/// <param name="entityType">实体类型 参考PFCodeRuleType</param>
/// <returns></returns>
public void SendFlow<T>(Guid id, int entityType) where T : MesEntityBase, new()
{
SendFlow<T>(id, entityType, string.Empty, string.Empty);
}
/// <summary>
/// 送审(直接保存数据)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="id">实体ID</param>
/// <param name="entityType">实体类型 参考PFCodeRuleType</param>
/// <param name="userId"></param>
/// <param name="userName"></param>
public void SendFlow<T>(Guid id, int entityType, string userId, string userName) where T : MesEntityBase, new()
{
if (id == Guid.Empty) return;
// var flowSchemeService = ServiceUtils.GetCommonService<T_PF_FLOW_SCHEME>();
// var entityService = ServiceUtils.GetCommonService<T>();
T entity = this.GetEntity<T>(id);
if (entity == null)
throw new Exception("无效的实体");
if (entity.FLOW_SEND_STATUS == (int)PPFlowSendStatusEnum.) return;
if (entity.FORM_ID == null)
throw new Exception("实体表单不允许为空");
var tmpScheme = this.GetEntities<T_PF_FLOW_SCHEME>(t => t.FrmId == entity.FORM_ID
&& t.Disabled == (int)PPFlowSchemeDisabledEnum.).OrderByDescending(t => t.SortCode).FirstOrDefault();
if (tmpScheme != null)
{
entity.FLOW_STATUS = (int)PPFlowStatusEnum.;
this.UpdateEntity<T>(entity);
SendFlowParam param = new SendFlowParam();
param.EntityId = id;
param.FlowSchemeId = tmpScheme.ID;
param.UserId = userId;
param.UserName = userName;
param.EntityType = entityType;
SendFlow<T>(param);
}
else if (entity.FLOW_STATUS == (int)PPFlowStatusEnum.)
{
entity.FLOW_STATUS = (int)PPFlowStatusEnum.;
this.UpdateEntity(entity);
}
}
public SendFlowResult<T> SendFlow<T>(SendFlowParam param, T_PF_FLOW_SCHEME flowScheme, T entity, Action action = null) where T : MesEntityBase, new()
{
//var flowSchemeService = ServiceUtils.GetCommonService<T_PF_FLOW_SCHEME>();
//var entityService = ServiceUtils.GetCommonService<T>();
//var flowInstanceService = ServiceUtils.GetCommonService<T_PF_FLOW_INSTANCE>();
//var flowInstanceOperationHistoryService = ServiceUtils.GetCommonService<T_PF_FLOW_INSTANCE_OPER_HIS>();
//var flowInstanceTransitionHistoryService = ServiceUtils.GetCommonService<T_PF_FLOW_INSTANCE_TRANS_HIS>();
var codeRuleService = APT.Infrastructure.Api.ServiceLocator.Instance.GetService<IPFCodeRuleService>();
T_PF_FLOW_INSTANCE flowInstance = null;
//flowInstance = this.GetEntity<T_PF_FLOW_INSTANCE>(i=>i.InstanceSchemeId==flowScheme.ID);
var orgId = param.OrgId == null ? entity.ORG_ID : param.OrgId;
SystemCodeFilter filter = new SystemCodeFilter();
filter.CodeType = (int)PFCodeRuleType.;
filter.Count = 1;
filter.OrgId = orgId;
var code = codeRuleService.NewGenSerial(filter);
var result = DoSendFlow(code, orgId, param.CustomName, param.Description,
flowScheme, entity, param.EntityType, flowInstance, param.UserId, param.UserName);
UnifiedCommit(() =>
{
if (action != null)
action();
this.UpdateEntityNoCommit(entity);
if (result.FlowInstance != null)
{
if (flowInstance == null)
this.AddEntityNoCommit(result.FlowInstance);
else
this.UpdateEntityNoCommit(result.FlowInstance);
}
if (result.FlowInstanceOperationHistory != null)
this.AddEntityNoCommit(result.FlowInstanceOperationHistory);
if (result.FlowInstanceTransitionHistory != null)
this.AddEntityNoCommit(result.FlowInstanceTransitionHistory);
});
return result;
}
/// <summary>
/// 送审
/// </summary>
/// <returns></returns>
public SendFlowResult<T> SendFlow<T>(SendFlowParam param, Action action = null) where T : MesEntityBase, new()
{
//var flowSchemeService = ServiceUtils.GetCommonService<T_PF_FLOW_SCHEME>();
//var entityService = ServiceUtils.GetCommonService<T>();
//var flowInstanceService = ServiceUtils.GetCommonService<T_PF_FLOW_INSTANCE>();
//var flowInstanceOperationHistoryService = ServiceUtils.GetCommonService<T_PF_FLOW_INSTANCE_OPER_HIS>();
//var flowInstanceTransitionHistoryService = ServiceUtils.GetCommonService<T_PF_FLOW_INSTANCE_TRANS_HIS>();
var codeRuleService = APT.Infrastructure.Api.ServiceLocator.Instance.GetService<IPFCodeRuleService>();
T entity = null;
if (param.EntityId != null)
{
entity = this.GetEntity<T>(param.EntityId.ToString());
if (entity == null)
throw new Exception("无效的实体");
if (entity.FLOW_SEND_STATUS == (int)PPFlowSendStatusEnum.) return null;
}
else
throw new Exception("参数异常");
if (entity.FORM_ID == null)
throw new Exception("实体表单不允许为空");
if (entity != null && entity.FORM_ID != null && param.FlowSchemeId == Guid.Empty)
{
var tmpScheme = this.GetEntities<T_PF_FLOW_SCHEME>(t => t.FrmId == entity.FORM_ID
&& t.Disabled == (int)PPFlowSchemeDisabledEnum.).OrderByDescending(t => t.SortCode).FirstOrDefault();
if (tmpScheme != null)
param.FlowSchemeId = tmpScheme.ID;
}
if (param.FlowSchemeId == Guid.Empty)
throw new Exception("参数异常");
var flowScheme = this.GetEntity<T_PF_FLOW_SCHEME>(param.FlowSchemeId.ToString());
if (flowScheme == null)
throw new Exception("无效的流程模板");
T_PF_FLOW_INSTANCE flowInstance = null;
if (entity.FLOW_ID != null)
flowInstance = this.GetEntity<T_PF_FLOW_INSTANCE>(entity.FLOW_ID.Value.ToString());
var orgId = param.OrgId == null ? entity.ORG_ID : param.OrgId;
SystemCodeFilter filter = new SystemCodeFilter();
filter.CodeType = (int)PFCodeRuleType.;
filter.Count = 1;
filter.OrgId = orgId;
var code = codeRuleService.NewGenSerial(filter);
var result = DoSendFlow(code, orgId, param.CustomName, param.Description, flowScheme, entity, param.EntityType, flowInstance, param.UserId, param.UserName);
UnifiedCommit(() =>
{
if (action != null)
action();
this.UpdateEntityNoCommit(entity);
if (result.FlowInstance != null)
{
if (flowInstance == null)
this.AddEntityNoCommit(result.FlowInstance);
else
this.UpdateEntityNoCommit(result.FlowInstance);
}
if (result.FlowInstanceOperationHistory != null)
this.AddEntityNoCommit(result.FlowInstanceOperationHistory);
if (result.FlowInstanceTransitionHistory != null)
this.AddEntityNoCommit(result.FlowInstanceTransitionHistory);
});
return result;
}
/// <summary>
/// 送审
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="param"></param>
/// <returns></returns>
public SendFlowResult<T> SendFlow<T>(SendFlowEntityParam<T> param) where T : MesEntityBase, new()
{
if (param.Entity == null || param.FlowScheme == null)
throw new Exception("参数异常");
//var flowSchemeService = ServiceUtils.GetCommonService<T_PF_FLOW_SCHEME>();
//var entityService = ServiceUtils.GetCommonService<T>();
//var flowInstanceService = ServiceUtils.GetCommonService<T_PF_FLOW_INSTANCE>();
//var flowInstanceOperationHistoryService = ServiceUtils.GetCommonService<T_PF_FLOW_INSTANCE_OPER_HIS>();
//var flowInstanceTransitionHistoryService = ServiceUtils.GetCommonService<T_PF_FLOW_INSTANCE_TRANS_HIS>();
var codeRuleService = APT.Infrastructure.Api.ServiceLocator.Instance.GetService<IPFCodeRuleService>();
var orgId = param.OrgId == null || param.Entity != null ? param.Entity.ORG_ID : param.OrgId;
var code = param.FlowCode;
if (string.IsNullOrEmpty(code))
{
SystemCodeFilter filter = new SystemCodeFilter();
filter.CodeType = (int)PFCodeRuleType.;
filter.Count = 1;
filter.OrgId = orgId;
code = codeRuleService.NewGenSerial(filter);
}
T_PF_FLOW_INSTANCE flowInstance = null;
if (param.Entity.FLOW_ID != null)
flowInstance = this.GetEntity<T_PF_FLOW_INSTANCE>(param.Entity.FLOW_ID.Value);
return DoSendFlow(code, orgId, param.CustomName, param.Description, param.FlowScheme, param.Entity, param.EntityType, flowInstance, param.UserId, param.UserName);
}
/// <summary>
/// 审核流程
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="param"></param>
public void PermitFlow<T>(PermitFlowParam param) where T : MesEntityBase, new()
{
if (param.FlowId == Guid.Empty)
throw new Exception("参数异常");
//var entityService = ServiceUtils.GetCommonService<T>();
//var flowInstanceOperationHistoryService = ServiceUtils.GetCommonService<T_PF_FLOW_INSTANCE_OPER_HIS>();
//var flowInstanceTransitionHistoryService = ServiceUtils.GetCommonService<T_PF_FLOW_INSTANCE_TRANS_HIS>();
var flowInstance = this.GetEntity<T_PF_FLOW_INSTANCE>(param.FlowId);
if (flowInstance == null)
throw new Exception("无效流程");
var entity = flowInstance.EntityId == null ? null : this.GetEntity<T>(flowInstance.EntityId.Value);
if (entity == null)
throw new Exception("无效的实体");
var curUserId = param.UserId;
var curUserName = param.UserName;
if (string.IsNullOrEmpty(curUserId))
{
curUserId = Infrastructure.Api.AppContext.CurrentSession.UserId;
curUserName = this.GetEntityByRedis<T_FM_USER>(curUserId, flowInstance.ORG_ID ?? Guid.Empty)?.NAME;
}
PPFlowPermitStatusEnum permitStatusEnum = (PPFlowPermitStatusEnum)param.PermitStatus;
if (permitStatusEnum == PPFlowPermitStatusEnum. || permitStatusEnum == PPFlowPermitStatusEnum.)
{
T_PF_FLOW_INSTANCE_TRANS_HIS flowInstanceTransitionHistory = null;
T_PF_FLOW_INSTANCE_OPER_HIS flowInstanceOperationHistory = new T_PF_FLOW_INSTANCE_OPER_HIS
{
InstanceId = flowInstance.ID,
CreateUserId = curUserId,
CreateUserName = curUserName,
CreateDate = DateTime.Now,
ORG_ID = flowInstance.ORG_ID
};//操作记录
FlowRuntime wfruntime = new FlowRuntime(flowInstance, entity);
var tag = new Tag
{
UserName = curUserName,
UserId = curUserId,
Description = param.Description
};
#region
if (flowInstance.ActivityType == 0)//当前节点是会签节点
{
tag.Taged = 1;
wfruntime.MakeTagNode(wfruntime.runtimeModel.currentNodeId, tag);//标记会签节点状态
string verificationNodeId = ""; //寻找当前登陆用户可审核的节点Id
List<string> nodelist = wfruntime.GetCountersigningNodeIdList(wfruntime.runtimeModel.currentNodeId);
StringBuilder sb = new StringBuilder();
foreach (string item in nodelist)
{
var makerList = GetMakerList(wfruntime.runtimeModel.nodes[item], flowInstance.ORG_ID);
if (makerList == "-1") continue;
if (makerList == "1")
throw new Exception("会签节点的审核者不能为所有人,请查看流程设计是否有问题!");
if (string.IsNullOrEmpty(verificationNodeId))
{
if (makerList.Split(',').Any(one => curUserId == one))
{
verificationNodeId = item;
}
else
{
sb.Append(makerList);
sb.Append(',');
}
}
else
{
sb.Append(makerList);
sb.Append(',');
}
}
if (!string.IsNullOrEmpty(verificationNodeId))
{
if (permitStatusEnum == PPFlowPermitStatusEnum.)
{
tag.Taged = 1;
flowInstanceOperationHistory.Content = "【" + wfruntime.runtimeModel.nodes[verificationNodeId].name + "】【" + DateTime.Now.ToString("yyyy-MM-dd HH:mm") + "】同意,备注:" + param.Description;
}
else
{
tag.Taged = -1;
flowInstanceOperationHistory.Content = "【" + wfruntime.runtimeModel.nodes[verificationNodeId].name + "】【" + DateTime.Now.ToString("yyyy-MM-dd HH:mm") + "】不同意,备注:" + param.Description;
}
wfruntime.MakeTagNode(verificationNodeId, tag);//标记审核节点状态
string confluenceres = wfruntime.NodeConfluence(verificationNodeId, tag);
switch (confluenceres)
{
case "-1"://不通过
flowInstance.OrderStatus = (int)PFFlowInstanceOrderStatusEnum.;
flowInstance.MakerList = "-1";
break;
case "1"://等待,当前节点还是会签开始节点,不跳转
if (sb.Length > 0)
sb.Length--;
flowInstance.MakerList = sb.ToString();
break;
default://通过
flowInstance.PreviousId = flowInstance.ActivityId;
flowInstance.ActivityId = wfruntime.runtimeModel.nextNodeId;
flowInstance.ActivityType = wfruntime.runtimeModel.nextNodeType;//-1无法运行,0会签开始,1会签结束,2一般节点,4流程运行结束
flowInstance.ActivityName = wfruntime.runtimeModel.nextNode.name;
flowInstance.OrderStatus = (wfruntime.runtimeModel.nextNodeType
== 4 ? (int)PFFlowInstanceOrderStatusEnum. : (int)PFFlowInstanceOrderStatusEnum.);
flowInstance.MakerList = (wfruntime.runtimeModel.nextNodeType == (int)PFFlowInstanceOrderStatusEnum. ? "" : GetMakerList(wfruntime, flowInstance.ORG_ID));//当前节点可执行的人信息
flowInstance.ActivityEditable = wfruntime.GetNodePermitEditable(flowInstance.ActivityId);
#region
flowInstanceTransitionHistory = new T_PF_FLOW_INSTANCE_TRANS_HIS
{
InstanceId = flowInstance.ID,
CreateUserId = curUserId,
CreateUserName = curUserName,
FromNodeId = wfruntime.runtimeModel.currentNodeId,
FromNodeName = wfruntime.runtimeModel.currentNode.name,
FromNodeType = wfruntime.runtimeModel.currentNodeType,
ToNodeId = wfruntime.runtimeModel.nextNodeId,
ToNodeName = wfruntime.runtimeModel.nextNode.name,
ToNodeType = wfruntime.runtimeModel.nextNodeType,
IsFinish = wfruntime.runtimeModel.nextNodeType == 4 ? 1 : 0,
TransitionSate = 0,
ORG_ID = flowInstance.ORG_ID
};
#endregion
break;
}
if (wfruntime.runtimeModel.nextNodeType == 4)//结束节点
{
tag.Taged = 1;
wfruntime.MakeTagNode(wfruntime.runtimeModel.nextNodeId, tag);
}
}
else
{
return;
//throw (new Exception("审核异常,找不到审核节点"));
}
}
#endregion
#region
else//一般审核
{
if (flowInstance.MakerList != "1" && !flowInstance.MakerList.Contains(curUserId)) return;
if (permitStatusEnum == PPFlowPermitStatusEnum.)
{
tag.Taged = 1;
wfruntime.MakeTagNode(wfruntime.runtimeModel.currentNodeId, tag);
if (wfruntime.runtimeModel.nextNodeType == 4)//结束节点
{
wfruntime.MakeTagNode(wfruntime.runtimeModel.nextNodeId, tag);
}
flowInstance.PreviousId = flowInstance.ActivityId;
flowInstance.ActivityId = wfruntime.runtimeModel.nextNodeId;
flowInstance.ActivityType = wfruntime.runtimeModel.nextNodeType;
flowInstance.ActivityName = wfruntime.runtimeModel.nextNode.name;
flowInstance.MakerList = wfruntime.runtimeModel.nextNodeType == (int)PFFlowInstanceOrderStatusEnum. ? "" : GetMakerList(wfruntime, flowInstance.ORG_ID);//当前节点可执行的人信息
flowInstance.OrderStatus = (wfruntime.runtimeModel.nextNodeType == 4 ?
(int)PFFlowInstanceOrderStatusEnum. : (int)PFFlowInstanceOrderStatusEnum.);
flowInstance.ActivityEditable = wfruntime.GetNodePermitEditable(flowInstance.ActivityId);
if (wfruntime.runtimeModel.nextNodeType == 0)//会签重置下个节点的审批状态
{
List<string> _nodelist = wfruntime.GetCountersigningNodeIdList(wfruntime.runtimeModel.nextNodeId);
wfruntime.ClearTagNode(wfruntime.runtimeModel.nextNodeId);
foreach (string item in _nodelist)
{
wfruntime.ClearTagNode(item);
}
}
#region
flowInstanceTransitionHistory = new T_PF_FLOW_INSTANCE_TRANS_HIS
{
InstanceId = flowInstance.ID,
CreateUserId = curUserId,
CreateUserName = curUserName,
FromNodeId = wfruntime.runtimeModel.currentNodeId,
FromNodeName = wfruntime.runtimeModel.currentNode.name,
FromNodeType = wfruntime.runtimeModel.currentNodeType,
ToNodeId = wfruntime.runtimeModel.nextNodeId,
ToNodeName = wfruntime.runtimeModel.nextNode.name,
ToNodeType = wfruntime.runtimeModel.nextNodeType,
IsFinish = wfruntime.runtimeModel.nextNodeType == 4 ? 1 : 0,
TransitionSate = 0,
ORG_ID = flowInstance.ORG_ID
};
#endregion
flowInstanceOperationHistory.Content = "【" + wfruntime.runtimeModel.currentNode.name
+ "】【" + DateTime.Now.ToString("yyyy-MM-dd HH:mm") + "】同意,备注:" + param.Description;
}
else
{
flowInstance.OrderStatus = (int)PFFlowInstanceOrderStatusEnum.; //表示该节点不同意
tag.Taged = -1;
wfruntime.MakeTagNode(wfruntime.runtimeModel.currentNodeId, tag);
flowInstanceOperationHistory.Content = "【"
+ wfruntime.runtimeModel.currentNode.name + "】【"
+ DateTime.Now.ToString("yyyy-MM-dd HH:mm") + "】不同意,备注:"
+ param.Description;
}
}
#endregion
if (flowInstance.OrderStatus == (int)PFFlowInstanceOrderStatusEnum.)
{
entity.FLOW_STATUS = (int)PPFlowStatusEnum.;
}
else if (flowInstance.OrderStatus == (int)PFFlowInstanceOrderStatusEnum.)
{
entity.FLOW_STATUS = (int)PPFlowStatusEnum.;
}
else
{
entity.FLOW_STATUS = (int)PPFlowStatusEnum.;
}
flowInstance.EntityFlowStatus = entity.FLOW_STATUS;
flowInstance.SchemeContent = JsonHelper.Serialize(wfruntime.runtimeModel.schemeContentJson);
UnifiedCommit(() =>
{
this.UpdateEntityNoCommit(flowInstance);
this.UpdateEntityNoCommit(entity);
this.AddEntityNoCommit(flowInstanceOperationHistory);
if (flowInstanceTransitionHistory != null)
this.AddEntityNoCommit(flowInstanceTransitionHistory);
});
}
else
{
if (flowInstance.MakerList != "1" && !flowInstance.MakerList.Contains(curUserId)) return;
T_PF_FLOW_INSTANCE_TRANS_HIS flowInstanceTransitionHistory = null;
T_PF_FLOW_INSTANCE_OPER_HIS flowInstanceOperationHistory = null;
FlowRuntime wfruntime = new FlowRuntime(flowInstance, entity);
string resnode = "";
if (string.IsNullOrEmpty(param.NodeRejectStep))
{
resnode = wfruntime.RejectNode();
}
else
{
resnode = param.NodeRejectStep;
}
var tag = new Tag
{
Description = param.Description,
Taged = 0,
UserId = curUserId,
UserName = curUserName,
};
wfruntime.MakeTagNode(wfruntime.runtimeModel.currentNodeId, tag);
foreach (dynamic item in wfruntime.runtimeModel.schemeContentJson.nodes)
{
if (item.id == wfruntime.runtimeModel.currentNodeId)
{
item.setInfo.ConfluenceOk = 0;
}
}
//wfruntime.runtimeModel.schemeContentJson.nodes[wfruntime.runtimeModel.currentNodeId].setInfo.ConfluenceOk = 0;//会签重置为0
flowInstance.OrderStatus = (int)PFFlowInstanceOrderStatusEnum.;//4表示驳回需要申请者重新提交表单
if (resnode != "")
{
wfruntime.MakeTagNode(resnode, tag);
flowInstance.PreviousId = flowInstance.ActivityId;
flowInstance.ActivityId = resnode;
flowInstance.ActivityType = wfruntime.GetNodeType(resnode);
flowInstance.ActivityName = wfruntime.runtimeModel.nodes[resnode].name;
flowInstance.MakerList = GetMakerList(wfruntime, wfruntime.runtimeModel.nodes[resnode], flowInstance.ORG_ID);//当前节点可执行的人信息
flowInstance.ActivityEditable = wfruntime.GetNodePermitEditable(flowInstance.ActivityId);
#region
flowInstanceTransitionHistory = new T_PF_FLOW_INSTANCE_TRANS_HIS
{
InstanceId = flowInstance.ID,
CreateUserId = curUserId,
CreateUserName = curUserName,
FromNodeId = wfruntime.runtimeModel.currentNodeId,
FromNodeName = wfruntime.runtimeModel.currentNode.name,
FromNodeType = wfruntime.runtimeModel.currentNodeType,
ToNodeId = resnode,
ToNodeName = wfruntime.runtimeModel.nodes[resnode].name,
ToNodeType = wfruntime.GetNodeType(resnode),
IsFinish = wfruntime.GetNodeType(resnode) == 4 ? 1 : 0,
TransitionSate = 1,
ORG_ID = flowInstance.ORG_ID
};
#endregion
}
flowInstanceOperationHistory = new T_PF_FLOW_INSTANCE_OPER_HIS
{
InstanceId = flowInstance.ID,
CreateUserId = curUserId,
CreateUserName = curUserName,
CreateDate = DateTime.Now,
Content = "【"
+ wfruntime.runtimeModel.currentNode.name
+ "】【" + DateTime.Now.ToString("yyyy-MM-dd HH:mm") + "】驳回,备注:"
+ param.Description,
ORG_ID = flowInstance.ORG_ID
};
entity.FLOW_STATUS = (int)PPFlowStatusEnum.;
if (wfruntime.GetNodeType(flowInstance.ActivityId) == 3)//开始节点
{
//entity.FLOW_STATUS = (int)PPFlowStatusEnum.未送审;
entity.FLOW_SEND_STATUS = (int)PPFlowSendStatusEnum.;
}
flowInstance.SchemeContent = JsonHelper.Serialize(wfruntime.runtimeModel.schemeContentJson);
UnifiedCommit(() =>
{
this.UpdateEntityNoCommit(flowInstance);
this.UpdateEntityNoCommit(entity);
this.AddEntityNoCommit(flowInstanceOperationHistory);
if (flowInstanceTransitionHistory != null)
this.AddEntityNoCommit(flowInstanceTransitionHistory);
});
}
}
/// <summary>
/// 审核流程
/// </summary>
/// <param name="param"></param>
public void PermitFlowSimple(PermitFlowParam param)
{
var flowInstance = this.GetEntity<T_PF_FLOW_INSTANCE>(param.FlowId);
if (flowInstance == null)
throw new Exception("无效流程");
if (string.IsNullOrEmpty(flowInstance.EntityTypeFullName))
throw new Exception("数据异常");
MethodInfo methodInfo = this.GetType().GetMethod("PermitFlow", BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static);
try
{
var types = new Type[] { APT.Infrastructure.Core.Refctor.ReflectHelper.FindTypeInCurrentDomain(flowInstance.EntityTypeFullName) };
var method = methodInfo.MakeGenericMethod(types);
method.Invoke(this, new object[] { param });
}
catch (Exception ex)
{
if (ex.InnerException != null)
throw ex.InnerException;
throw ex;
}
}
public PagedResultDto<T_PF_FLOW_INSTANCE> QueryFlowInstance(KeywordPageFilter pageFilter)
{
PagedResultDto<T_PF_FLOW_INSTANCE> list = null;
PPFlowQueryFlowInstanceTypeEnum type = pageFilter.Parameter1 == null ? PPFlowQueryFlowInstanceTypeEnum. :
(PPFlowQueryFlowInstanceTypeEnum)Convert.ToInt32(pageFilter.Parameter1);
var userId = pageFilter.Keyword;
if (string.IsNullOrEmpty(userId))
userId = Infrastructure.Api.AppContext.CurrentSession.UserId;
if (string.IsNullOrEmpty(userId))
throw new Exception("人员不允许为空");
if (type == PPFlowQueryFlowInstanceTypeEnum.) //待办事项
{
list = this.GetOrderPageEntities<T_PF_FLOW_INSTANCE>(u => u.MakerList == "1" || u.MakerList.Contains(userId), pageFilter);
}
else if (type == PPFlowQueryFlowInstanceTypeEnum.) //已办事项(即我参与过的流程)
{
//var flowInstanceService = ServiceUtils.GetCommonService<T_PF_FLOW_INSTANCE_TRANS_HIS>();
//var instances = this.GetOrderPageEntities<T_PF_FLOW_INSTANCE_TRANS_HIS>(u => u.CreateUserId == userId)
// .Select(u => u.InstanceId).Distinct().ToList();
list = this.GetOrderPageEntities<T_PF_FLOW_INSTANCE>(u => u.TransitionHistorys.Any(x => x.CreateUserId == userId), pageFilter);
}
else //我的流程
{
list = this.GetOrderPageEntities<T_PF_FLOW_INSTANCE>(u => u.CreateUserId == userId, pageFilter);
}
List<Guid> userIdList = new List<Guid>();
Dictionary<Guid, List<Guid>> itemUserId = new Dictionary<Guid, List<Guid>>();
foreach (var item in list.Items)
{
if (item.MakerList != "1" && item.MakerList != "-1" && !string.IsNullOrEmpty(item.MakerList))
{
var usrId = item.MakerList.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(i => new Guid(i)).ToList();
itemUserId.Add(item.ID, usrId);
userIdList.AddRange(usrId);
}
}
var users = this.GetEntities<T_FM_USER>(x => userIdList.Contains(x.ID));
foreach (var item in list.Items)
{
if (!string.IsNullOrEmpty(item.MakerList))
{
if (item.MakerList == "1")
item.Vir_MakerName = "全部人员";
else if (item.MakerList != "-1")
{
//var useList = this.GetEntities<T_FM_USER>(t => item.MakerList.Contains(t.ID.ToString())).ToList();
if (itemUserId.ContainsKey(item.ID))
{
var theUser = users.Where(i => itemUserId[item.ID].Contains(i.ID)).Select(i => i.NAME).ToArray();
item.Vir_MakerName = string.Join(',', theUser);
}
//用户
}
}
}
return list;
}
/// <summary>获取流程模板/summary>
/// <param name="filter"></param>
/// <returns></returns>
public FlowSchemeResponse GetFlowScheme(KeywordFilter filter)
{
if (string.IsNullOrEmpty(filter.Keyword))
throw new Exception("参数异常");
//var flowSchemeService = ServiceUtils.GetCommonService<T_PF_FLOW_SCHEME>();
FlowSchemeResponse response = new FlowSchemeResponse();
var flowScheme = this.GetEntity<T_PF_FLOW_SCHEME>(filter.Keyword);
response.Scheme = flowScheme;
if (flowScheme.FrmId != null && flowScheme.FrmId != Guid.Empty)
response.Form = GetForm(flowScheme.FrmId.Value);
return response;
}
/// <summary>
/// 获取流程
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
public FlowResponse GetFlow(KeywordFilter filter)
{
if (string.IsNullOrEmpty(filter.Keyword))
throw new Exception("参数异常");
//var flowInstanceService = ServiceUtils.GetCommonService<T_PF_FLOW_INSTANCE>();
//var flowInstanceOperationHistoryService = ServiceUtils.GetCommonService<T_PF_FLOW_INSTANCE_OPER_HIS>();
FlowResponse response = new FlowResponse();
var flowInstance = this.GetEntity<T_PF_FLOW_INSTANCE>(new Guid(filter.Keyword));
if (flowInstance.EntityId != null && flowInstance.EntityId != Guid.Empty && !string.IsNullOrEmpty(flowInstance.EntityTypeFullName))
{
//var comService = typeof(APT.Infrastructure.Core.CommonService);
var methodInfo = this.GetType().GetMethod("GetMyEntity", BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static);
var entityType = APT.Infrastructure.Core.Refctor.ReflectHelper.FindTypeInCurrentDomain(flowInstance.EntityTypeFullName);
response.Entity = methodInfo.MakeGenericMethod(new Type[] { entityType }).Invoke(this, new object[] { flowInstance.EntityId.Value });
}
response.Flow = flowInstance;
if (flowInstance.FrmId != null && flowInstance.FrmId != Guid.Empty)
response.Form = GetForm(flowInstance.FrmId.Value);
response.OperationHistorys = this.GetEntities<T_PF_FLOW_INSTANCE_OPER_HIS>(t => t.InstanceId == flowInstance.ID).OrderBy(t => t.CREATE_TIME).ToList();
return response;
}
#endregion
public T GetMyEntity<T>(Guid id) where T : MesEntityBase, new()
{
return this.GetEntity<T>(id.ToString());
}
public T GetEntity<T>(Guid id) where T : MesEntityBase, new()
{
return this.GetEntity<T>(id.ToString());
}
private T_PF_FORM GetForm(Guid id)
{
return this.GetEntity<T_PF_FORM>(id.ToString());
}
/// <summary>
/// 寻找该节点执行人
/// </summary>
/// <param name="wfruntime"></param>
/// <returns></returns>
private string GetMakerList(FlowRuntime wfruntime, Guid? orgId)
{
if (wfruntime.runtimeModel.nextNodeId == "-1")
{
throw (new Exception("无法寻找到下一个节点"));
}
return GetMakerList(wfruntime, wfruntime.runtimeModel.nodes[wfruntime.runtimeModel.nextNodeId], orgId);
}
private string ArrayToString(dynamic data, string Str)
{
if (data == null) return Str;
string resStr = Str;
foreach (var item in data)
{
if (resStr != "")
{
resStr += ",";
}
resStr += item.ToString();
}
return resStr;
}
private string GetMakerList(FlowNode node, Guid? orgId)
{
string makerList = "";
if (node.setInfo == null)
{
makerList = "-1";
}
else
{
if (node.setInfo.NodeDesignate == FlowSetInfo.ALL_USER)//所有成员
{
makerList = "1";
}
else if (node.setInfo.NodeDesignate == FlowSetInfo.SPECIAL_USER)//指定成员
{
makerList = ArrayToString(node.setInfo.NodeDesignateData.users, makerList);
if (makerList == "")
{
makerList = "-1";
}
}
else if (node.setInfo.NodeDesignate == FlowSetInfo.SPECIAL_ROLE) //指定角色
{
var users = this.UserService.GetUsersByRoles(node.setInfo.NodeDesignateData.roles, orgId).Select(t => t.ID).ToList();
makerList = ArrayToString(users, makerList);
if (makerList == "")
{
makerList = "-1";
}
}
}
return makerList;
}
/// <summary>
/// 寻找该节点执行人
/// </summary>
/// <param name="node"></param>
/// <returns></returns>
private string GetMakerList(FlowRuntime wfruntime, FlowNode node, Guid? orgId)
{
if (node == null)
return "-1";
var type = wfruntime.GetNodeType(node.id);
string makerList = "";
if (type == 0)//如果是会签节点
{
List<string> _nodelist = wfruntime.GetCountersigningNodeIdList(node.id);
string _makerList = "";
foreach (string item in _nodelist)
{
_makerList = GetMakerList(wfruntime.runtimeModel.nodes[item], orgId);
if (_makerList == "-1")
{
throw (new Exception("无法寻找到会签节点的审核者,请查看流程设计是否有问题!"));
}
if (_makerList == "1")
{
throw (new Exception("会签节点的审核者不能为所有人,请查看流程设计是否有问题!"));
}
if (makerList != "")
{
makerList += ",";
}
makerList += _makerList;
}
}
else if (type == 3 || type == 4)//开始节点 结束节点
{
makerList = "-1";
}
else
{
makerList = GetMakerList(node, orgId);
if (makerList == "-1")
{
throw (new Exception("无法寻找到节点的审核者,请查看流程设计是否有问题!"));
}
}
return makerList;
}
private string GetTypeFullName(Type type)
{
string basetypeFullName = string.Empty;
if (string.Compare(type.Namespace, "System.Data.Entity.DynamicProxies", true) == 0)
basetypeFullName = type.BaseType.FullName;
else
basetypeFullName = type.FullName;
string moduleName = string.Empty;
int dllIndex = basetypeFullName.IndexOf("APT.ECM.Domain", StringComparison.OrdinalIgnoreCase);
if (dllIndex > -1)
moduleName = "APT.ECM.Domain";
else
moduleName = " APT.ECM.Domain";
return basetypeFullName + "," + moduleName;
}
private void CheckSendFlow<T>(T_PF_FLOW_SCHEME flowScheme, T obj) where T : MesEntityBase, new()
{
if (obj.FLOW_SEND_STATUS == (int)PPFlowSendStatusEnum.)
throw new Exception("该资料已送审过了,不允许重新送审");
}
private SendFlowResult<T> DoSendFlow<T>(string code, Guid? orgId, string customName, string description, T_PF_FLOW_SCHEME flowScheme, T entity, int entityType, T_PF_FLOW_INSTANCE flowInstance, string userId, string userName) where T : MesEntityBase, new()
{
if (string.IsNullOrEmpty(code))
throw new Exception("流程代码不允许为空");
if (flowScheme == null)
throw new Exception("无效流程模板");
if (entity == null)
throw new Exception("无效实体");
SendFlowResult<T> result = new SendFlowResult<T>();
if (flowScheme.Disabled == (int)PPFlowSchemeDisabledEnum.)
{
entity.FLOW_SEND_STATUS = (int)PPFlowSendStatusEnum.;
entity.FLOW_STATUS = (int)PPFlowStatusEnum.;
result.Entity = entity;
return result;
}
var curUserId = string.IsNullOrEmpty(userId) ? Infrastructure.Api.AppContext.CurrentSession.UserId : userId;
var typFullName = entity.GetType().Name;
var user = this.GetEntityByRedis<T_FM_USER>(curUserId, orgId ?? Guid.Empty);
bool isCreateFlowInstance = false;
if (flowInstance == null)
{
isCreateFlowInstance = true;
string entityCode = string.Empty;
Type type = typeof(T);
PropertyInfo propertyInfo = type.GetProperty("CODE"); //获取指定名称的属性
if (propertyInfo != null)
{
object tmp = propertyInfo.GetValue(entity, null); //获取属性值
if (tmp != null)
entityCode = tmp.ToString();
}
flowInstance = new T_PF_FLOW_INSTANCE();
flowInstance.FrmId = flowScheme.PermitFrmId != null ? flowScheme.PermitFrmId : flowScheme.FrmId;//优先取审核时的表单ID
flowInstance.SchemeContent = flowScheme.SchemeContent;
flowInstance.InstanceSchemeId = flowScheme.ID;
flowInstance.Code = code;
flowInstance.CustomName = string.IsNullOrEmpty(customName) ? DateTime.Now.ToString("yyyy-MM-dd") + "_" + flowScheme.SchemeName + "_" + entityCode : customName;
flowInstance.Description = description == null ? string.Empty : description;
flowInstance.EntityTypeFullName = typFullName;
flowInstance.EntityId = entity.ID;
flowInstance.ORG_ID = orgId;
flowInstance.EntityType = entityType;
flowInstance.CreateUserName = user?.NAME;
}
else//重新送审时清空
{
flowInstance.ActivityId = string.Empty;
flowInstance.ActivityType = 0;
flowInstance.ActivityName = string.Empty;
flowInstance.PreviousId = string.Empty;
flowInstance.MakerList = string.Empty;
flowInstance.OrderStatus = 0;
flowInstance.ActivityEditable = 0;
}
//创建运行实例
var wfruntime = new FlowRuntime(flowInstance, entity);
#region
flowInstance.ActivityId = wfruntime.runtimeModel.nextNodeId;
flowInstance.ActivityType = wfruntime.GetNextNodeType();//-1无法运行,0会签开始,1会签结束,2一般节点,4流程运行结束
flowInstance.ActivityName = wfruntime.runtimeModel.nextNode.name;
flowInstance.PreviousId = wfruntime.runtimeModel.currentNodeId;
flowInstance.CreateUserId = curUserId;
flowInstance.CreateUserName = user?.NAME;
flowInstance.MakerList = (wfruntime.GetNextNodeType() != 4 ? GetMakerList(wfruntime, flowInstance.ORG_ID) : "");//当前节点可执行的人信息
flowInstance.OrderStatus = (wfruntime.GetNextNodeType() == 4 ?
(int)PFFlowInstanceOrderStatusEnum. : (int)PFFlowInstanceOrderStatusEnum.);
flowInstance.ActivityEditable = wfruntime.GetNodePermitEditable(flowInstance.ActivityId);
#endregion
#region
entity.FLOW_SEND_STATUS = (int)PPFlowSendStatusEnum.;
entity.FLOW_STATUS = (int)PPFlowStatusEnum.;
entity.FLOW_ID = flowInstance.ID;
#endregion
flowInstance.EntityFlowStatus = entity.FLOW_STATUS;
#region
T_PF_FLOW_INSTANCE_OPER_HIS processOperationHistoryEntity = new T_PF_FLOW_INSTANCE_OPER_HIS
{
InstanceId = flowInstance.ID,
CreateUserId = curUserId,
CreateUserName = user?.NAME,
CreateDate = DateTime.Now,
ORG_ID = orgId,
Content = isCreateFlowInstance ? ("【创建】"
+ user?.NAME
+ "创建了一个流程进程【"
+ flowInstance.Code + "/"
+ flowInstance.CustomName + "】") : ("【送审】"
+ user?.NAME
+ "送审了一个流程进程【"
+ flowInstance.Code + "/"
+ flowInstance.CustomName + "】")
};
#endregion
#region
T_PF_FLOW_INSTANCE_TRANS_HIS processTransitionHistoryEntity = new T_PF_FLOW_INSTANCE_TRANS_HIS
{
InstanceId = flowInstance.ID,
FromNodeId = wfruntime.runtimeModel.currentNodeId,
FromNodeName = wfruntime.runtimeModel.currentNode.name,
FromNodeType = wfruntime.runtimeModel.currentNodeType,
ToNodeId = wfruntime.runtimeModel.nextNodeId,
ToNodeName = wfruntime.runtimeModel.nextNode.name,
ToNodeType = wfruntime.runtimeModel.nextNodeType,
IsFinish = wfruntime.runtimeModel.nextNodeType == 4 ? 1 : 0,
TransitionSate = 0,
CreateUserId = curUserId,
CreateUserName = user?.NAME,
ORG_ID = orgId,
};
#endregion
result.Entity = entity;
result.FlowInstance = flowInstance;
result.FlowInstanceOperationHistory = processOperationHistoryEntity;
result.FlowInstanceTransitionHistory = processTransitionHistoryEntity;
return result;
}
}
}