/// <summary>
        /// 复制流程,从“已启用”或“已升级”的流程进入设计,需要先复制一份流程供设计
        /// 状态为“新增”,版本为当前最高版本 + 1
        /// </summary>
        public SysProcess CopyProcess()
        {
            SysProcess result;

            using (System.Transactions.TransactionScope ts = new System.Transactions.TransactionScope())
            {
                using (BizDataContext db = new BizDataContext())
                {
                    //新流程
                    SysProcess newP = _process.ConvertTo <SysProcess>();
                    newP.ProcessId = db.GetNextIdentity();

                    //版本处理
                    newP.ProcessStatus = (int)ProcessState.Created;
                    string maxVersion = db.Set <SysProcess>().Where(p => p.ProcessType == _process.ProcessType).OrderByDescending(p => p.ProcessVersion).First().ProcessVersion;
                    newP.ProcessVersion = (maxVersion.ToInt() + 1).ToString();

                    result = newP;
                    db.Insert(newP);

                    //新流程参与人
                    var ppList = db.Set <SysProcessParticipant>().Where(p => p.ProcessId == _process.ProcessId).ToList();
                    Dictionary <long?, SysProcessParticipant> tempPpDict = new Dictionary <long?, SysProcessParticipant>();
                    foreach (var pp in ppList)
                    {
                        SysProcessParticipant newPp = pp.ConvertTo <SysProcessParticipant>();
                        newPp.ParticipantId = db.GetNextIdentity();
                        newPp.ProcessId     = newP.ProcessId;

                        tempPpDict[pp.ParticipantId] = newPp; //记录原始ID和新对象的关系
                    }
                    foreach (var newPp in tempPpDict.Values)
                    {
                        if (newPp.Param_ParticipantId != null) //通过刚才记录的关系找到实际的值
                        {
                            newPp.Param_ParticipantId = tempPpDict[newPp.Param_ParticipantId].ParticipantId;
                        }
                        db.Insert(newPp);
                    }

                    //新活动
                    var aList = db.Set <SysActivity>().Where(p => p.ProcessId == _process.ProcessId).ToList();
                    Dictionary <long?, SysActivity> tempADict = new Dictionary <long?, SysActivity>();
                    foreach (var a in aList)
                    {
                        SysActivity newA = a.ConvertTo <SysActivity>();
                        newA.ActivityId = db.GetNextIdentity();
                        newA.ProcessId  = newP.ProcessId;

                        tempADict[a.ActivityId] = newA;//记录原始ID和新对象的关系
                        db.Insert(newA);

                        //新活动参与人
                        var apList = db.Set <SysActivityParticipant>().Where(p => p.ActivityId == a.ActivityId).ToList();
                        foreach (var ap in apList)
                        {
                            SysActivityParticipant newAp = ap.ConvertTo <SysActivityParticipant>();
                            newAp.ActivityParticipantId = db.GetNextIdentity();
                            newAp.ActivityId            = newA.ActivityId;
                            newAp.ParticipantId         = tempPpDict[newAp.ParticipantId].ParticipantId; //通过刚才记录的关系找到实际的值
                            db.Insert(newAp);
                        }
                    }

                    //连接线
                    var tList = db.Set <SysTransition>().Where(p => p.ProcessId == _process.ProcessId).ToList();
                    foreach (var t in tList)
                    {
                        SysTransition newT = t.ConvertTo <SysTransition>();
                        newT.TransitionId = db.GetNextIdentity();
                        newT.ProcessId    = newP.ProcessId;

                        //通过刚才记录的关系找到实际的值
                        newT.PreActivityId  = tempADict[newT.PreActivityId].ActivityId;
                        newT.PostActivityId = tempADict[newT.PostActivityId].ActivityId;

                        db.Insert(newT);
                    }

                    //表单活动权限
                    var fpList = db.Set <SysFormPrivilege>().Where(p => p.ProcessId == _process.ProcessId).ToList();
                    foreach (var fp in fpList)
                    {
                        SysFormPrivilege newFp = fp.ConvertTo <SysFormPrivilege>();
                        newFp.PrivilegeId = db.GetNextIdentity();
                        newFp.ProcessId   = newP.ProcessId;
                        newFp.ActivityId  = tempADict[newFp.ActivityId].ActivityId;//通过刚才记录的关系找到实际的值

                        db.Insert(newFp);
                    }
                }
                ts.Complete();
            }
            return(result);
        }
        /// <summary>
        /// 保存
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnSave_Click(object sender, EventArgs e)
        {
            try
            {
                //现有配置
                var fpDict = this.DataHelper.Set <SysFormPrivilege>()
                             .Where(p => p.ProcessId == this.ProcessId && p.ActivityId == this.SelectedActivityId &&
                                    p.FormId == this.FormId).ToList().ToDictionary(p => p.FormFieldId);

                using (System.Transactions.TransactionScope ts = new System.Transactions.TransactionScope())
                {
                    using (BizDataContext db = new BizDataContext())
                    {
                        foreach (RepeaterItem section in rSection.Items)
                        {
                            Repeater rField = section.FindControl("rField") as Repeater;
                            foreach (RepeaterItem field in rField.Items)
                            {
                                var hf          = field.FindControl("hf") as HiddenField;
                                var ccInvisible = field.FindControl("ccInvisible") as RadioButton;
                                var ccReadOnly  = field.FindControl("ccReadOnly") as RadioButton;
                                var ccReadWrite = field.FindControl("ccReadWrite") as RadioButton;

                                if (hf != null && ccInvisible != null && ccReadOnly != null && ccReadWrite != null)
                                {
                                    var id = hf.Value.ToLong();
                                    FormFieldPrivilege privilege = FormFieldPrivilege.Invisible;
                                    if (ccReadOnly.Checked)
                                    {
                                        privilege = FormFieldPrivilege.ReadOnly;
                                    }
                                    else if (ccReadWrite.Checked)
                                    {
                                        privilege = FormFieldPrivilege.ReadWrite;
                                    }

                                    if (fpDict.ContainsKey(id))
                                    {
                                        var fp = fpDict[id];
                                        if (fp.DisplayPrivilege != (int)privilege)
                                        {
                                            fp.DisplayPrivilege = (int)privilege;
                                            db.UpdatePartial(fp, p => new { p.DisplayPrivilege });
                                        }
                                    }
                                    else
                                    {
                                        SysFormPrivilege fp = new SysFormPrivilege()
                                        {
                                            PrivilegeId      = db.GetNextIdentity(),
                                            FormFieldId      = id,
                                            FormId           = this.FormId,
                                            ProcessId        = this.ProcessId,
                                            ActivityId       = this.SelectedActivityId,
                                            DisplayPrivilege = (int)privilege,
                                            CreateTime       = DateTime.Now,
                                            CreateUserId     = this.LoginUserID,
                                        };
                                        db.Insert(fp);
                                    }
                                }
                            }
                        }
                    }
                    ts.Complete();
                }

                this.AjaxAlertAndEnableButton("保存成功");
            }
            catch (Exception ex)
            {
                this.AjaxAlertAndEnableButton(ex);
            }
        }