public ActionResult GetInstanceByID()
        {
            string ID = Request["ID"] as string;
            int    t  = int.Parse(Request["type"]);
            int    id;

            if (t == 0)
            {
                id = int.Parse(Session["InstanceID"] as string);
            }
            else
            {
                id = int.Parse(Session["SelectedInstanceID"] as string);
            }
            //当前流程实例
            var data = WF_InstanceBLL.GetEntities(u => u.ID == id).Select(u => new
            {
                u.ID,
                u.InstanceName,
                u.WF_TempID,
                u.StartTime,
                u.StartBy,
                u.Content,
            }
                                                                          ).FirstOrDefault();

            string callback          = Request["callback"];
            JavaScriptSerializer jss = new JavaScriptSerializer();

            string json = jss.Serialize(data);

            return(JavaScript(callback + "(" + json + ")"));
        }
        public ActionResult GetMyUnCheck()
        {
            var runEnum      = (short)WFStepEnum.UnProecess;
            var instanceEnum = (short)WF_InstanceEnum.Processing;

            var Steps = WF_StepBLL.GetEntities(s => s.StepStaus == runEnum && s.ProcessBy == LoginUser.ID).ToList();

            //当前待审批的所有Id
            var instanceIds = (from s in Steps
                               select s.WF_InstanceID).Distinct();
            //获取当前待审批流程的数据
            var data = WF_InstanceBLL.GetEntities(u => instanceIds.Contains(u.ID) && u.Status == instanceEnum).Select(u => new
            {
                u.ID,
                u.InstanceName,
                u.WF_TempID,
                u.StartTime,
                u.StartBy,
                u.Status
            }).ToList();


            string callback          = Request["callback"];
            JavaScriptSerializer jss = new JavaScriptSerializer();
            string json = jss.Serialize(data);

            return(JavaScript(callback + "(" + json + ")"));
        }
 public ActionResult ShowInstance(int id)
 {
     Session["InstanceID"] = id.ToString();
     ViewData.Model        = WF_InstanceBLL.GetEntities(u => u.ID == id).FirstOrDefault();
     //获得所有用户
     ViewBag.AllUsers = UserInfoBLL.GetEntities(u => u.DelFlag == DelFlag).ToList();
     return(View());
 }
        //自己发起的流程
        public ActionResult ShowMyCheck()
        {
            var data = WF_InstanceBLL.GetEntities(i => i.StartBy == LoginUser.ID).ToList();

            //获得所有用户
            ViewBag.AllUsers = UserInfoBLL.GetEntities(u => u.DelFlag == DelFlag).ToList();
            return(View(data));
        }
        public ActionResult GetCurrentInstanceStepID()
        {
            int id          = int.Parse(Session["SelectedInstanceID"] as string);
            var data        = WF_InstanceBLL.GetEntities(u => u.ID == id).FirstOrDefault();
            var currentStep = data.WF_Step.Where(s => s.StepStaus == 0).FirstOrDefault();

            string callback          = Request["callback"];
            JavaScriptSerializer jss = new JavaScriptSerializer();

            string json = jss.Serialize(currentStep.ID.ToString());

            return(JavaScript(callback + "(" + json + ")"));
        }
        //显示已经审批(还没结束的流程)
        public ActionResult ShowMyChecked()
        {
            var runEnum = (short)WFStepEnum.Processed;

            var Steps = WF_StepBLL.GetEntities(s => s.StepStaus == runEnum && s.ProcessBy == LoginUser.ID).ToList();

            //当前已经审批的所有Id
            var instanceIds = (from s in Steps
                               select s.WF_InstanceID).Distinct();
            var data = WF_InstanceBLL.GetEntities(u => instanceIds.Contains(u.ID)).ToList();

            //获得所有用户
            ViewBag.AllUsers = UserInfoBLL.GetEntities(u => u.DelFlag == DelFlag).ToList();
            return(View(data));
        }
        //审批当前流程
        /// <summary>
        /// 审批
        /// </summary>
        /// <param name="stepId">当前审批步骤id</param>
        /// <param name="isPass">是否通过</param>
        /// <param name="Comment">审批意见</param>
        /// <param name="flowTo">流转到谁</param>
        /// <returns></returns>
        public ActionResult DoCheck(int stepId, bool isPass, string Comment, int flowTo)
        {
            //1.更新当前步骤

            var step = WF_StepBLL.GetEntities(u => u.ID == stepId).FirstOrDefault();

            step.ProcessResult  = isPass ? "通过" : "不通过";
            step.StepStaus      = (short)WFStepEnum.Processed;
            step.ProcessContent = Comment;

            step.ProcessTime = DateTime.Now;
            WF_StepBLL.Update(step);
            //初始化下一个步骤
            WF_Step nextStep = new WF_Step();

            nextStep.IsEndStep   = false;
            nextStep.IsStartStep = false;
            nextStep.ProcessBy   = flowTo;

            nextStep.SubTime       = DateTime.Now;
            nextStep.ProcessResult = string.Empty;

            nextStep.StepStaus     = (short)WFStepEnum.UnProecess;
            nextStep.StepName      = string.Empty;
            nextStep.WF_InstanceID = step.WF_InstanceID;
            nextStep.ProcessTime   = DateTime.Now;

            nextStep.ProcessContent = string.Empty;
            WF_StepBLL.Add(nextStep);


            //根据流程类型 来初始化对应流程 反射 实现

            var wfinstance = WF_InstanceBLL.GetEntities(u => u.ID == step.WF_InstanceID).FirstOrDefault();
            var wftemp     = WF_TempBLL.GetEntities(u => u.ID == wfinstance.WF_TempID).FirstOrDefault();
            //让书签继续往下执行
            var Value = isPass ? 1 : 0;

            WorkflowApplicationHelper.ResumeBookMark(
                //new FincallActivity(),
                Assembly.Load("HeiMa8.OA.WorkFlow").CreateInstance(wftemp.ActityType) as Activity,
                step.WF_Instance.WFInstanceId,
                step.StepName,
                Value);
            return(Content("ok"));
        }
        //审批的情况
        public ActionResult ShowCheck(int id)
        {
            Session["SelectedInstanceID"] = id.ToString();
            //当前流程的详情
            var data = WF_InstanceBLL.GetEntities(u => u.ID == id).FirstOrDefault();

            ViewData.Model = data;
            var currentStep = data.WF_Step.Where(s => s.StepStaus == 0).FirstOrDefault();

            //获得所有用户
            ViewBag.AllUsers   = UserInfoBLL.GetEntities(u => u.DelFlag == DelFlag).ToList();
            ViewData["flowTo"] = UserInfoBLL.GetEntities(u => u.DelFlag == DelFlag).ToList()
                                 .Select(u => new SelectListItem {
                Selected = false, Text = u.UName, Value = u.ID + ""
            });
            return(View());
        }
        public ActionResult GetMyCheck()
        {
            string callback          = Request["callback"];
            JavaScriptSerializer jss = new JavaScriptSerializer();
            //获取当前用户发起的流程
            var data = WF_InstanceBLL.GetEntities(i => i.StartBy == LoginUser.ID).Select(u => new
            {
                u.ID,
                u.InstanceName,
                u.WF_TempID,
                u.StartTime,
                u.StartBy,
                u.Status
            }).ToList();
            string json = jss.Serialize(data);

            return(JavaScript(callback + "(" + json + ")"));
        }
        public ActionResult GetAllTypeCount()
        {
            #region 获取当前用户发起的流程个数 MyCheckCount

            var MyCheckCount = WF_InstanceBLL.GetEntities(i => i.StartBy == LoginUser.ID).ToList().Count;

            #endregion

            #region 获取当前用户已审批的流程个数 MyCheckedCount

            var runEnum = (short)WFStepEnum.Processed;

            var Steps = WF_StepBLL.GetEntities(s => s.StepStaus == runEnum && s.ProcessBy == LoginUser.ID).ToList();

            //当前已经审批的所有Id
            var instanceIds = (from s in Steps
                               select s.WF_InstanceID).Distinct();
            var MyCheckedCount = WF_InstanceBLL.GetEntities(u => instanceIds.Contains(u.ID)).ToList().Count;

            #endregion

            #region 获取当前用户待审批的流程个数 MyUnCheckCount

            var runEnumed    = (short)WFStepEnum.UnProecess;
            var instanceEnum = (short)WF_InstanceEnum.Processing;

            var Stepsed = WF_StepBLL.GetEntities(s => s.StepStaus == runEnumed && s.ProcessBy == LoginUser.ID).ToList();


            //当前待审批的所有Id
            var instanceIdsed = (from s in Stepsed
                                 select s.WF_InstanceID).Distinct();
            var MyUnCheckCount = WF_InstanceBLL.GetEntities(u => instanceIdsed.Contains(u.ID) && u.Status == instanceEnum).ToList().Count;
            #endregion

            string callback          = Request["callback"];
            JavaScriptSerializer jss = new JavaScriptSerializer();
            var    data = new { CheckCount = MyCheckCount, CheckedCount = MyCheckedCount, UnCheckCount = MyUnCheckCount };
            string json = jss.Serialize(data);
            return(JavaScript(callback + "(" + json + ")"));
        }
        public ActionResult Add(WF_Instance instance, int id, int flowTo)
        {
            var CurrentUserId = LoginUser.ID;

            //1->在工作流实例表中添加一条数据
            instance.DelFlag   = DelFlag;
            instance.StartTime = DateTime.Now;
            instance.FilePath  = string.Empty;

            instance.StartBy   = CurrentUserId; //当前用户 也就是发起人
            instance.Level     = 0;             //紧急程度
            instance.Status    = (short)WF_InstanceEnum.Processing;
            instance.WF_TempID = id;

            //WF_TempBLL.Add(instance);
            WF_InstanceBLL.Add(instance);


            //2->在步骤表里面添加两条步骤
            //2->1 一个当前已处理的步骤
            WF_Step startStep = new WF_Step();

            startStep.WF_InstanceID  = instance.ID;
            startStep.SubTime        = DateTime.Now;
            startStep.StepName       = "提交申请表单";
            startStep.IsEndStep      = false;
            startStep.IsStartStep    = true;
            startStep.ProcessBy      = CurrentUserId;
            startStep.ProcessContent = "提交申请";
            startStep.ProcessResult  = "通过";
            startStep.ProcessTime    = DateTime.Now;
            startStep.StepStaus      = (short)WFStepEnum.Processed;
            WF_StepBLL.Add(startStep);

            //2->2 下一步谁审批的步骤 。项目经理审批
            WF_Step nextStep = new WF_Step();

            nextStep.WF_InstanceID  = instance.ID;
            nextStep.SubTime        = DateTime.Now;
            nextStep.ProcessTime    = DateTime.Now;
            nextStep.ProcessContent = string.Empty;

            nextStep.IsStartStep = false;
            nextStep.IsEndStep   = false;
            nextStep.ProcessBy   = flowTo;

            nextStep.ProcessResult = "";
            nextStep.StepName      = "";
            nextStep.StepStaus     = (short)WFStepEnum.UnProecess;
            WF_StepBLL.Add(nextStep);

            //3->启动工作流
            //根据流程类型 来初始化对应流程 spring 实现
            //通过容器创建一个对象 依赖注入只能在子类中实现
            // IApplicationContext ctx = ContextRegistry.GetContext();
            var wftemp = WF_TempBLL.GetEntities(u => u.ID == id).FirstOrDefault();
            //Activity activityType = ctx.GetObject(wftemp.ActityType.Split('.')[3]) as Activity;

            var wfApp = WorkflowApplicationHelper.CreateWorkflowApp(
                //new FincallActivity(),
                Assembly.Load("HeiMa8.OA.WorkFlow").CreateInstance(wftemp.ActityType) as Activity,
                null);

            instance.WFInstanceId = wfApp.Id;
            WF_InstanceBLL.Update(instance);


            return(Content("ok"));
        }