1180 lines
		
	
	
		
			55 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			1180 lines
		
	
	
		
			55 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
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;
 | 
						||
        }
 | 
						||
 | 
						||
    }
 | 
						||
} |