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