예제 #1
0
        private static Dictionary <string, PC.SCSimpleObject> PrepareParentsList(string navOu)
        {
            Dictionary <string, PC.SCSimpleObject> result = null;

            if (navOu != PC.SCOrganization.RootOrganizationID)
            {
                Dictionary <string, PC.SCSimpleObjectCollection> parents = PC.Adapters.SCSnapshotAdapter.Instance.LoadAllParentsInfo(true, navOu);

                if (parents != null && parents.ContainsKey(navOu))
                {
                    Dictionary <string, PC.SCSimpleObject> queue = parents[navOu].ToDictionary();

                    result = parents[navOu].ToDictionary();
                }
            }
            else
            {
                PC.SCOrganization root = PC.SCOrganization.GetRoot();

                result = new Dictionary <string, PC.SCSimpleObject>()
                {
                    { root.ID, root.ToSimpleObject() }
                };
            }

            return(result);
        }
예제 #2
0
        private void DoMoveToOrg(string orgKey, List <string> groupKeys, IList <object> errors)
        {
            try
            {
                PC.SCOrganization org = (PC.SCOrganization)DbUtil.GetEffectiveObject(orgKey, string.Format("指定的组织(ID:{0})无效", orgKey));
                var grps = DbUtil.LoadObjects(groupKeys.ToArray());

                foreach (PC.SCBase item in grps)
                {
                    try
                    {
                        if (item is PC.SCGroup && item.Status == SchemaObjectStatus.Normal)
                        {
                            PC.Executors.SCObjectOperations.InstanceWithPermissions.MoveObjectToOrganization(null, item, org);
                        }
                        else
                        {
                            errors.Add(string.Format("{0}不是有效的群组,已跳过", item.ToDescription()));
                        }
                    }
                    catch (Exception ex)
                    {
                        WebUtility.ShowClientError(ex);
                        errors.Add(ex);
                    }
                }
            }
            catch (Exception ex)
            {
                WebUtility.ShowClientError(ex);
                errors.Add(ex);
            }

            this.InnerRefreshList();             // 必须的
        }
예제 #3
0
		/// <summary>
		/// 获取全局(根)组织
		/// </summary>
		/// <returns>一个表示根的<see cref="SCOrganization"/>的实例。</returns>
		public static SCOrganization GetRoot()
		{
			SCOrganization result = new SCOrganization();

			result.ID = RootOrganizationID;
			result.Name = RootOrganizationName;

			return result;
		}
예제 #4
0
        private static PC.SCOrganization FillAdditionProperties(PC.SCOrganization org)
        {
            //testOrg.Properties["DepartmentRank"].StringValue = ((int)DepartmentRankType.MinGanJiBie).ToString();
            //testOrg.Properties["DepartmentType"].StringValue = ((int)DepartmentTypeDefine.XuNiJiGou).ToString();
            //testOrg.Properties["DepartmentClass"].StringValue = ((int)DepartmentClassType.QiTaJiGou).ToString();
            //testOrg.Properties["CustomsCode"].StringValue = "Some more";

            return(org);
        }
예제 #5
0
        /// <summary>
        /// 获取全局(根)组织
        /// </summary>
        /// <returns>一个表示根的<see cref="SCOrganization"/>的实例。</returns>
        public static SCOrganization GetRoot()
        {
            SCOrganization result = new SCOrganization();

            result.ID   = RootOrganizationID;
            result.Name = RootOrganizationName;

            return(result);
        }
예제 #6
0
        protected void DoDeepFileUpload(HttpPostedFile file, MCS.Web.WebControls.UploadProgressResult result)
        {
            if (Path.GetExtension(file.FileName).ToLower() != ".xml")
            {
                throw new InvalidDataException("上传的文件类型错误");
            }

            string oguId = Request.Form["parentId"];

            if (string.IsNullOrEmpty(oguId))
            {
                throw new HttpException("没有使用parentId");
            }

            Util.EnsureOperationSafe();

            PC.SCOrganization parent = oguId == PC.SCOrganization.RootOrganizationID ? PC.SCOrganization.GetRoot() : (PC.SCOrganization)DbUtil.GetEffectiveObject(oguId, "当前组织不存在或已删除");

            ImportExecutor executor = new ImportExecutor(file, result);

            if (Request.Form["includeAcl"] == "includeAcl")
            {
                executor.AddAction(new OguAclImportAction(parent)
                {
                });
            }

            if (Request.Form["includeUser"] == "includeUser")
            {
                executor.AddAction(new OguUserImportAction(parent)
                {
                    IncludeSecretaries = Request.Form["includeSecretary"] == "includeSecretary"
                });
            }

            if (Request.Form["includeGroup"] == "includeGroup")
            {
                executor.AddAction(new OguGroupImportAction(parent)
                {
                    IncludeConditions = Request.Form["includeGroupConditions"] == "includeGroupConditions",
                    IncludeMembers    = Request.Form["includeGroupMembers"] == "includeGroupMembers"
                });
            }

            executor.AddAction(new OguFullImportAction(parent)
            {
                IncludeOrganizations   = this.Request.Form["includeOrg"] == "includeOrg",
                IncludeAcl             = this.Request.Form["includeAcl"] == "includeAcl",
                IncludeUser            = this.Request.Form["includeUser"] == "includeUser",
                IncludeSecretaries     = this.Request.Form["includeSecretary"] == "includeSecretary",
                IncludeGroup           = this.Request.Form["includeGroup"] == "includeGroup",
                IncludeGroupConditions = this.Request.Form["includeGroupConditions"] == "includeGroupConditions",
                IncludeGroupMembers    = this.Request.Form["includeGroupMembers"] == "includeGroupMembers"
            });

            executor.Execute();
        }
예제 #7
0
        private static void InitGroups()
        {
            PC.SCOrganization org = (PC.SCOrganization)PC.Adapters.SchemaObjectAdapter.Instance.LoadByCodeName(c =>
            {
                SchemaStrict(c, "O.", PC.StandardObjectSchemaType.Organizations);
            }, DateTime.MinValue, "流程管理部").First();


            PC.SCGroup grp1 = new PC.SCGroup()
            {
                Name        = "DemoGroup",
                CodeName    = "DemoGroup",
                DisplayName = "DemoGroup",
                Creator     = CastUser(Wangli),
                ID          = "BA4E965E-8A35-4986-B5EA-7631D9368FFF",
                Status      = SchemaObjectStatus.Normal,
            };

            Facade.AddGroup(grp1, org);

            org = (PC.SCOrganization)PC.Adapters.SchemaObjectAdapter.Instance.LoadByCodeName(c =>
            {
                SchemaStrict(c, "O.", PC.StandardObjectSchemaType.Organizations);
            }, DateTime.MinValue, "beijingYuanlian").First();

            grp1 = new PC.SCGroup()
            {
                Name        = "群组A",
                CodeName    = "groupA",
                DisplayName = "群组A",
                Creator     = CastUser(Wangli),
                ID          = "CA093A1E-B207-48DB-B3B2-B085A81DA36A",
                Status      = SchemaObjectStatus.Normal,
            };

            Facade.AddGroup(grp1, org);

            grp1 = new PC.SCGroup()
            {
                Name        = "群组B",
                CodeName    = "groupB",
                DisplayName = "群组B",
                Creator     = CastUser(Wangli),
                ID          = "A465FFC8-A742-41F3-A1B6-0D40FC5EA3D5",
                Status      = SchemaObjectStatus.Normal,
            };

            org = (PC.SCOrganization)PC.Adapters.SchemaObjectAdapter.Instance.LoadByCodeName(c =>
            {
                SchemaStrict(c, "O.", PC.StandardObjectSchemaType.Organizations);
            }, DateTime.MinValue, "yuanyangAobei").First();

            Facade.AddGroup(grp1, org);
        }
예제 #8
0
        private PC.SCOrganization CreateOU(PC.SCOrganization ou, PC.SCOrganization parent)
        {
            var ouSelf = (PC.SCOrganization)PC.Adapters.SchemaObjectAdapter.Instance.Load(ou.ID);

            if (ouSelf == null)
            {
                Facade.AddOrganization(ou, parent);
                ouSelf = ou;
            }

            return(ouSelf);
        }
예제 #9
0
		protected void GenRoots(object sender, EventArgs e)
		{
			var root = SCOrganization.GetRoot();
			for (int i = 0; i < 20; i++)
			{
				SCOrganization org = new SCOrganization();
				org.ID = UuidHelper.NewUuidString();
				org.Name = org.ID;
				org.DisplayName = org.ID;
				org.CreateDate = DateTime.MinValue;
				org.CodeName = org.ID;
				PC.Executors.SCObjectOperations.InstanceWithPermissions.AddOrganization(org, root);
			}
		}
		public void SchemaOrganizationToXml()
		{
			SCOrganization org = SCObjectGenerator.PrepareOrganizationObject();

			XElement orgElem = new XElement("Root").AddChildElement("Object");

			org.ToXElement(orgElem);

			Console.WriteLine(orgElem.Parent.ToString());

			SCOrganization orgDeserialized = new SCOrganization();

			orgDeserialized.FromXElement(orgElem);

			Assert.AreEqual(org.ID, orgDeserialized.ID);
			Assert.AreEqual(org.Name, orgDeserialized.Name);
		}
예제 #11
0
        private static OrgTreeNode PrepareOguTree(SCOrganization organization)
        {
            OrgTreeNode node = new OrgTreeNode(organization);
            ProcessProgress.Current.Increment();
            ProcessProgress.Current.Response(string.Format("已经处理了{0}个组织", ProcessProgress.Current.CurrentStep));

            foreach (SchemaObjectBase obj in organization.CurrentChildren)
            {
                if (obj is SCOrganization)
                {
                    ProcessProgress.Current.MaxStep += 1;
                    node.Children.Add(PrepareOguTree((SCOrganization)obj));
                }
            }

            return node;
        }
예제 #12
0
        protected override void OnPreRender(EventArgs e)
        {
            bool godMode = Util.SuperVisiorMode;

            if (this.mainView.ActiveViewIndex == 1)
            {
                this.panMode.Attributes["class"]      = string.Empty;
                this.toggleButton.Attributes["title"] = "切换为列表模式";

                PC.SCOrganization root         = PC.SCOrganization.GetRoot();
                DeluxeTreeNode    rootTreeNode = CreateTreeNode(root.ID, root.Name, root.DisplayName, string.Empty, false, false);

                rootTreeNode.Expanded = true;
                this.tree.Nodes.Add(rootTreeNode);

                rootTreeNode.ChildNodesLoadingType = ChildNodesLoadingTypeDefine.Normal;

                Dictionary <string, PC.SCSimpleObject> parentsList = PrepareParentsList(PC.SCOrganization.RootOrganizationID);

                var pmLimitString = this.Request.QueryString.Get("permission");

                var requiredPermissions = pmLimitString != null?pmLimitString.Split(',') : null;

                var excludeID = this.Request.QueryString["superOf"];

                var exceptID = this.Request.QueryString["exceptOrg"];

                PrepareTreeNodeRecursively(root.ToSimpleObject(), rootTreeNode, parentsList, godMode, DateTime.MinValue, requiredPermissions, excludeID, exceptID);

                this.tree.CallBackContext = godMode ? "godMode" : "general";
            }
            else
            {
                this.panMode.Attributes["class"]      = "pc-listmode";
                this.toggleButton.Attributes["title"] = "切换为分层模式";
            }

            this.hfMode.Value   = this.mainView.ActiveViewIndex.ToString();
            this.hfGod.Value    = godMode ? "1" : "0";
            this.hfSingle.Value = this.Request["mode"] == "single" ? "1" : string.Empty;

            base.OnPreRender(e);
        }
예제 #13
0
        internal void CalculateFullPathAndGlobalSort(SchemaObjectBase parent, SchemaObjectBase child)
        {
            this.InnerSort = ((ISCRelationContainer)parent).GetCurrentMaxInnerSort() + 1;

            string parentGlobalSort = "000000";
            string parentFullPath   = ((ISCQualifiedNameObject)parent).GetQualifiedName();

            if (parent.ID == SCOrganization.GetRoot().ID)
            {
                parentGlobalSort = string.Empty;
                parentFullPath   = string.Empty;
            }
            else
            {
                if (parent.CurrentParentRelations.Count > 0)
                {
                    if (parent.CurrentParentRelations[0].FullPath.IsNotEmpty())
                    {
                        parentFullPath = parent.CurrentParentRelations[0].FullPath;
                    }

                    if (parent.CurrentParentRelations[0].GlobalSort.IsNotEmpty())
                    {
                        parentGlobalSort = parent.CurrentParentRelations[0].GlobalSort;
                    }
                }
            }

            string childName = ((ISCQualifiedNameObject)child).GetQualifiedName();

            if (parentFullPath.IsNotEmpty())
            {
                this.FullPath = parentFullPath + "\\" + childName;
            }
            else
            {
                this.FullPath = childName;
            }

            this.GlobalSort = parentGlobalSort + string.Format("{0:000000}", this.InnerSort);
        }
예제 #14
0
        public void FillDetails()
        {
            SchemaObjectCollection allObjs = ToSchemaObjects();

            this.ForEach(sor =>
            {
                sor.Detail = allObjs[sor.ID];

                if (sor.Detail == null)
                {
                    if (string.Compare(SCOrganization.RootOrganizationID, sor.ID, true) == 0)
                    {
                        sor.Detail = SCOrganization.GetRoot();
                    }
                    else
                    {
                        throw new ObjectNotFoundException("Can not find matching detail of object (ID:" + sor.ID + "), there may have data errors");
                    }
                }
            });
        }
예제 #15
0
        /// <summary>
        /// 得到根对象的实例
        /// </summary>
        /// <returns></returns>
        public static SCObjectAndRelation GetRoot()
        {
            SCOrganization   root         = SCOrganization.GetRoot();
            SCRelationObject rootRelation = SCOrganization.GetRootRelationObject();

            SCObjectAndRelation result = new SCObjectAndRelation();

            result.ID          = root.ID;
            result.Name        = root.Name;
            result.CodeName    = root.CodeName;
            result.DisplayName = root.DisplayName;
            result.SchemaType  = root.SchemaType;
            result.Status      = root.Status;

            result.Default    = rootRelation.Default;
            result.InnerSort  = rootRelation.InnerSort;
            result.GlobalSort = rootRelation.GlobalSort;
            result.ParentID   = rootRelation.ParentID;
            result.FullPath   = rootRelation.FullPath;

            return(result);
        }
예제 #16
0
		private static SCRelationObject UpdateRelation(SCOrganization org, SCUser user)
		{
			SCOrganization root = SCOrganization.GetRoot();

			SCRelationObject orgRelation = new SCRelationObject(root, org);

			SCRelationObject relation = new SCRelationObject(org, user);

			SCActionContext.Current.DoActions(() =>
			{
				using (TransactionScope scope = TransactionScopeFactory.Create())
				{
					SchemaObjectAdapter.Instance.Update(org);
					SchemaRelationObjectAdapter.Instance.Update(orgRelation);
					SchemaObjectAdapter.Instance.Update(user);
					SchemaRelationObjectAdapter.Instance.Update(relation);

					scope.Complete();
				}
			});

			return relation;
		}
예제 #17
0
            public override void ExecuteEachOrganization(SCObjectSet objectSet, IImportContext context, IDictionary <string, PC.SchemaObjectBase> knownObjects, PC.SCOrganization org, Dictionary <string, IList <PC.SCOrganization> > orgToOrgRelations, Dictionary <string, IList <PC.SCUser> > orgToUserRelations, Dictionary <string, IList <PC.SCGroup> > orgToGroupRelations)
            {
                if (orgToUserRelations.ContainsKey(org.ID))
                {
                    var users = orgToUserRelations[org.ID];

                    if (users.Count > 0)
                    {
                        context.SetStatus(Owner.currentSteps, Owner.allSteps, string.Format("正在查找 {0} 中的用户", org.ToDescription()));
                    }

                    for (int i = 0; i < users.Count; i++)
                    {
                        var user = users[i];
                        try
                        {
                            if (this.importedUsers.ContainsKey(user.ID) == false)
                            {
                                context.SetSubStatusAndLog(i + 1, users.Count, string.Format("正在向组织 {0} 导入用户 {1}", org.Name, user.Name));

                                PC.Executors.SCObjectOperations.Instance.AddUser(user, org);
                                this.importedUsers.Add(user.ID, user);

                                if (knownObjects.ContainsKey(user.ID) == false)
                                {
                                    knownObjects.Add(user.ID, user);
                                }
                            }
                            else
                            {
                                context.SetSubStatusAndLog(i + 1, users.Count, string.Format("正在向组织 {0} 添加用户 {1}", org.Name, user.Name));
                                PC.Executors.SCObjectOperations.Instance.AddUserToOrganization(user, org);

                                if (knownObjects.ContainsKey(user.ID) == false)
                                {
                                    knownObjects.Add(user.ID, user);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            context.AppendLog(string.Format("向组织 {0} 导入用户 {1} 时出错:", org.Name, user.Name, ex.ToString()));
                        }
                    }
                }
            }
예제 #18
0
 /// <summary>
 /// 在递归的每个组织中调用一次
 /// </summary>
 /// <param name="objectSet"></param>
 /// <param name="context"></param>
 /// <param name="knownObjects"></param>
 /// <param name="relation"></param>
 /// <param name="orgToOrgRelations"></param>
 /// <param name="orgToUserRelations"></param>
 /// <param name="orgToGroupRelations"></param>
 public abstract void ExecuteEachOrganization(SCObjectSet objectSet, IImportContext context, IDictionary <string, PC.SchemaObjectBase> knownObjects, PC.SCOrganization org, Dictionary <string, IList <PC.SCOrganization> > orgToOrgRelations, Dictionary <string, IList <PC.SCUser> > orgToUserRelations, Dictionary <string, IList <PC.SCGroup> > orgToGroupRelations);
예제 #19
0
            public override void ExecutePostOperation(SCObjectSet objectSet, IImportContext context, IDictionary <string, PC.SchemaObjectBase> knownObjects, PC.SCOrganization org, Dictionary <string, IList <PC.SCOrganization> > orgToOrgRelations, Dictionary <string, IList <PC.SCUser> > orgToUserRelations, Dictionary <string, IList <PC.SCGroup> > orgToGroupRelations)
            {
                if (this.ImportSecretaries)
                {
                    var allUsers           = this.importedUsers.Values.ToArray();
                    var reducedMemberships = ImportService.Instance.FilterMembership(objectSet.Membership, m => Util.IsUser(m.MemberSchemaType) && Util.IsUser(m.ContainerSchemaType)).ToList();

                    if (reducedMemberships.Count > 0)
                    {
                        int count = reducedMemberships.Count;
                        int step  = 0;
                        context.SetStatus(Owner.currentSteps, Owner.allSteps, "正在查找人员秘书");

                        foreach (var r in reducedMemberships)
                        {
                            step++;
                            try
                            {
                                if (this.importedUsers.ContainsKey(r.ContainerID))
                                {
                                    var boss = this.importedUsers[r.ContainerID];

                                    // 导入的用户是上司的
                                    ImportService.Instance.WithEffectObject <PC.SCUser>(r.ID, knownObjects, secretary =>
                                    {
                                        context.SetSubStatusAndLog(step, count, string.Format("正在替 {0} 添加秘书 {1}", boss.Name, secretary.Name));
                                        PC.Executors.SCObjectOperations.Instance.AddSecretaryToUser(secretary, boss);
                                    }, null);
                                }
                                else if (this.importedUsers.ContainsKey(r.ID))
                                {
                                    var secretary = this.importedUsers[r.ID];

                                    // 作为秘书的
                                    ImportService.Instance.WithEffectObject <PC.SCUser>(r.ContainerID, knownObjects, boss =>
                                    {
                                        context.SetSubStatusAndLog(step, count, string.Format("正在替 {0} 添加秘书 {1}", boss.Name, secretary.Name));
                                        PC.Executors.SCObjectOperations.Instance.AddSecretaryToUser(secretary, boss);
                                    }, null);
                                }
                            }
                            catch (Exception ex)
                            {
                                context.SetSubStatusAndLog(step, count, string.Format("未能完成添加秘书操作:{0}", ex.ToString()));
                            }
                        }
                    }
                }
            }
예제 #20
0
 public OguImportAction(PC.SCOrganization parent)
 {
     this.Parent = parent;
 }
예제 #21
0
            public override void ExecuteEachOrganization(SCObjectSet objectSet, IImportContext context, IDictionary <string, PC.SchemaObjectBase> knownObjects, PC.SCOrganization org, Dictionary <string, IList <PC.SCOrganization> > orgToOrgRelations, Dictionary <string, IList <PC.SCUser> > orgToUserRelations, Dictionary <string, IList <PC.SCGroup> > orgToGroupRelations)
            {
                if (objectSet.HasAcls)
                {
                    context.SetStatus(Owner.currentSteps, Owner.allSteps, string.Format("正在寻找 {0} 的ACL。", org.ToDescription()));

                    var allAcls = ImportService.Instance.FilterAcls(objectSet.Acls, acl => acl.ContainerID == org.ID && acl.Status == SchemaObjectStatus.Normal).ToList();

                    var summaryName = org.ToDescription();

                    try
                    {
                        var newContainer = new PC.Permissions.SCAclContainer(org);

                        foreach (var acl in allAcls)
                        {
                            ImportService.Instance.WithEffectObject <PC.SchemaObjectBase>(acl.MemberID, knownObjects, role =>
                            {
                                newContainer.Members.Add(acl.ContainerPermission, role);
                            }, null);
                        }

                        var oldMembers = PC.Adapters.SCAclAdapter.Instance.LoadByContainerID(org.ID, DateTime.MinValue);

                        if (oldMembers != null)
                        {
                            newContainer.Members.MergeChangedItems(oldMembers);
                        }

                        context.SetStatusAndLog(Owner.currentSteps, Owner.allSteps, string.Format("正在替换 {0} 的ACL:", summaryName));

                        PC.Adapters.SCAclAdapter.Instance.Update(newContainer);
                    }
                    catch (Exception ex)
                    {
                        context.AppendLogFormat("对象 {0} 的ACL操作失败,原因是:{1}\r\n", summaryName, ex.Message);
                    }
                }
            }
예제 #22
0
		private static void DeleteProgressNextStepDestroyUsers(PostProgressDoPostedDataEventArgs e, SCOrganization parent)
		{
			(e.Steps.Count > 0).FalseThrow<InvalidOperationException>("没有选择要删除的对象");

			var objectsToDelete = DbUtil.LoadObjects((from string id in e.Steps select id).ToArray());

			ProcessProgress.Current.Output.WriteLine("准备执行操作");
			PC.Executors.SCObjectOperations.InstanceWithPermissions.DeleteObjectsRecursively(objectsToDelete, parent);
			ProcessProgress.Current.Output.WriteLine("准备删除当前级别选定的人员……");

			foreach (var item in objectsToDelete)
			{
				if (item is PC.SCUser)
				{
					try
					{
						PC.Executors.SCObjectOperations.InstanceWithPermissions.DeleteUser((PC.SCUser)item, null, false);
						ProcessProgress.Current.Output.WriteLine("已删除用户{0}(ID:{1})", ((PC.SCUser)item).Name, item.ID); ;
					}
					catch (Exception ex)
					{
						ProcessProgress.Current.Output.WriteLine("删除用户{0}(ID:{1})时发生错误:{2}", ((PC.SCUser)item).Name, item.ID, ex.ToString()); ;
					}
				}
			}

			ProcessProgress.Current.Output.WriteLine("完毕");

			e.Result.CloseWindow = false;
			e.Result.ProcessLog = ProcessProgress.Current.GetDefaultOutput();
		}
예제 #23
0
            public override void ExecuteEachOrganization(SCObjectSet objectSet, IImportContext context, IDictionary <string, PC.SchemaObjectBase> knownObjects, PC.SCOrganization org, Dictionary <string, IList <PC.SCOrganization> > orgToOrgRelations, Dictionary <string, IList <PC.SCUser> > orgToUserRelations, Dictionary <string, IList <PC.SCGroup> > orgToGroupRelations)
            {
                if (orgToGroupRelations.ContainsKey(org.ID))
                {
                    var groups = orgToGroupRelations[org.ID];

                    if (groups.Count > 0)
                    {
                        context.SetStatus(Owner.currentSteps, Owner.allSteps, string.Format("正在查找 {0} 中的群组", org.ToDescription()));
                    }

                    for (int i = 0; i < groups.Count; i++)
                    {
                        var group = groups[i];
                        try
                        {
                            context.SetSubStatusAndLog(i + 1, groups.Count, string.Format("正在向组织 {0} 添加群组 {1}", org.Name, group.Name));

                            PC.Executors.SCObjectOperations.Instance.AddGroup(group, org);

                            knownObjects.Add(group.ID, group);

                            this.DoImportMembers(objectSet, context, knownObjects, group);

                            this.DoImportConditions(objectSet, context, group);
                        }
                        catch (Exception ex)
                        {
                            context.AppendLog(string.Format("向组织 {0} 导入群组 {1} 时出错:", org.ToDescription(), group.Name, ex.ToString()));
                        }
                    }
                }
            }
예제 #24
0
        public override SCObjectSet Execute(HttpRequest req)
        {
            string[] ids = req.Form.GetValues("id");

            if (ids == null && ids.Length < 0)
            {
                throw new HttpException("当获组织机构对象时,必须提供ID参数");
            }

            SCObjectSet objectSet = new SCObjectSet();

            objectSet.Scope = "OguObjects";

            WhereSqlClauseBuilder where = new WhereSqlClauseBuilder();
            where.AppendItem("Status", (int)SchemaObjectStatus.Normal);

            ConnectiveSqlClauseCollection conditios = new ConnectiveSqlClauseCollection(where, VersionStrategyQuerySqlBuilder.Instance.TimePointToBuilder());

            {
                string parentId = req.Form["ParentId"];
                if (string.IsNullOrEmpty(parentId))
                {
                    throw new HttpException("当获取组织机构对象时,必须提供ParentId参数");
                }

                PC.SCOrganization parentObj = parentId == PC.SCOrganization.RootOrganizationID ? PC.SCOrganization.GetRoot() : (PC.SCOrganization)PC.Adapters.SchemaObjectAdapter.Instance.Load(parentId);
                if (parentObj == null || parentObj.Status != SchemaObjectStatus.Normal)
                {
                    throw new HttpException("指定的父级对象不存在或者已删除");
                }

                InSqlClauseBuilder idIn = new InSqlClauseBuilder("ID");
                idIn.AppendItem(ids);
                conditios.Add(idIn);

                objectSet.Objects = PC.Adapters.SchemaObjectAdapter.Instance.Load(conditios);

                objectSet.Relations = this.FilterChildren(PC.Adapters.SchemaRelationObjectAdapter.Instance.LoadByParentID(parentId), ids);

                // 保存对象的下级关系(如果有)
                objectSet.Membership = ExportQueryHelper.LoadFullMemberships(ids);

                // 如果含有群组,导出群组的条件
                string[] groupIds = (from PC.SchemaObjectBase o in objectSet.Objects where o is PC.SCGroup select o.ID).ToArray();

                if (groupIds.Length > 0)
                {
                    var conditions = ExportQueryHelper.LoadConditions(groupIds);
                    if (conditions.Count > 0)
                    {
                        objectSet.Conditions = conditions;
                    }
                }

                // 如果含有组织,导出组织的Acl
                string[] orgIds = (from PC.SchemaObjectBase o in objectSet.Objects where o is PC.SCOrganization select o.ID).ToArray();

                objectSet.Acls = ExportQueryHelper.LoadAclsFor(orgIds);
            }

            return(objectSet);
        }
예제 #25
0
        private void DoHierarchicalAction(SCObjectSet objectSet, IImportContext context, IDictionary <string, PC.SchemaObjectBase> knownObjects, Dictionary <string, IList <PC.SCOrganization> > orgToOrgRelations, Dictionary <string, IList <PC.SCUser> > orgToUserRelations, Dictionary <string, IList <PC.SCGroup> > orgToGroupRelations, PC.SCOrganization currentParent, HierarchicalAction actionAdapter)
        {
            // 爬树
            PC.SchemaObjectCollection objects = objectSet.Objects;

            if (orgToOrgRelations.ContainsKey(currentParent.ID))
            {
                var childList = orgToOrgRelations[currentParent.ID];

                for (int i = 0; i < childList.Count; i++)
                {
                    this.currentSteps++;

                    var org = childList[i];

                    System.Diagnostics.Debug.WriteLine("正在处理组织" + org.Name);

                    actionAdapter.ExecuteEachOrganization(objectSet, context, knownObjects, org, orgToOrgRelations, orgToUserRelations, orgToGroupRelations);

                    this.DoHierarchicalAction(objectSet, context, knownObjects, orgToOrgRelations, orgToUserRelations, orgToGroupRelations, org, actionAdapter);
                }
            }
        }
예제 #26
0
        /// <summary>
        /// 准备组织
        /// </summary>
        /// <param name="objectSet"></param>
        /// <param name="context"></param>
        /// <param name="knownObjects">向其中写入已经确认存在于数据库中的项</param>
        /// <param name="orgToOrgRelations">组织关系</param>
        /// <param name="allSteps"></param>
        /// <param name="currentSteps"></param>
        /// <param name="currentParent"></param>
        /// <param name="checkOnly"><see langword="true"/>表示只检查组织关系,不实际导入。</param>
        /// <returns></returns>
        private bool PrepareOrganizations(SCObjectSet objectSet, IImportContext context, IDictionary <string, PC.SchemaObjectBase> knownObjects, Dictionary <string, IList <PC.SCOrganization> > orgToOrgRelations, PC.SCOrganization currentParent, bool checkOnly)
        {
            bool valid = true;

            PC.SchemaObjectCollection objects = objectSet.Objects;

            if (orgToOrgRelations.ContainsKey(currentParent.ID))
            {
                var childList = orgToOrgRelations[currentParent.ID];

                for (int i = 0; i < childList.Count; i++)
                {
                    this.currentSteps++;

                    var org = childList[i];

                    try
                    {
                        // 导入该组织
                        if (checkOnly == false)
                        {
                            var msg = string.Format("正在导入组织{0}", org.ToDescription());
                            context.AppendLog(msg);
                            context.SetStatus(this.currentSteps, this.allSteps, msg);
                            PC.Executors.SCObjectOperations.Instance.AddOrganization(org, currentParent);

                            if (knownObjects.ContainsKey(org.ID) == false)
                            {
                                knownObjects.Add(org.ID, org);
                            }
                        }
                        else
                        {
                            context.SetStatus(this.currentSteps, this.allSteps, string.Format("正在校验组织 {0} ", org.ToDescription()));

                            if (Util.IsNullOrDeleted(PC.Adapters.SchemaObjectAdapter.Instance.Load(org.ID)))
                            {
                                context.AppendLog(string.Format("组织 {0} 不存在,导入时将排除此组织及子对象", org.ToDescription()));
                                valid = false;
                                childList.RemoveAt(i);
                                i--;
                                continue;
                            }
                            else if (Util.IsNullOrDeleted(PC.Adapters.SchemaRelationObjectAdapter.Instance.Load(currentParent.ID, org.ID)))
                            {
                                context.AppendLog(string.Format("组织 {0} 已存在,但已被移至其他位置,导入时将排除此组织及子对象。", org.ToDescription()));
                                valid = false;
                                childList.RemoveAt(i);
                                i--;
                                continue;
                            }
                            else
                            {
                                if (knownObjects.ContainsKey(org.ID) == false)
                                {
                                    knownObjects.Add(org.ID, org);
                                }
                            }
                        }

                        valid &= this.PrepareOrganizations(objectSet, context, knownObjects, orgToOrgRelations, org, checkOnly);
                    }
                    catch (Exception ex)
                    {
                        context.AppendLog(string.Format("导入组织 {0} 时出现错误,已跳过了该组织及子对象:{1}", org.ToDescription(), ex.ToString()));
                        valid = false;
                        childList.RemoveAt(i);
                        i--;
                    }
                }
            }

            return(valid);
        }
		public OUTransferExecutor(string orgKey, string[] src, string[] target)
			: base(src, target)
		{
			orgKey.NullCheck("orgKey");
			this.parent = (SCOrganization)DbUtil.GetEffectiveObject(orgKey, null);
		}
예제 #28
0
        private static void InitUsers()
        {
            PC.SCOrganization org = (PC.SCOrganization)PC.Adapters.SchemaObjectAdapter.Instance.LoadByCodeName(c =>
            {
                SchemaStrict(c, "O.", PC.StandardObjectSchemaType.Organizations);
            }, DateTime.MinValue, "流程管理部").First();

            PC.SCUser user1 = FillAdditionProperties(new PC.SCUser()
            {
                Name        = "樊海云",
                DisplayName = "樊海云",
                CodeName    = "fanhy",
                FirstName   = "海云",
                LastName    = "樊",
                Status      = SchemaObjectStatus.Normal,
                ID          = "3210EEA0-9E13-44E3-A321-D7693BD0911F",
                Creator     = CastUser(Wangli),
            });

            PC.SCUser user2 = FillAdditionProperties(new PC.SCUser()
            {
                Name        = "杨睿1",
                DisplayName = "杨睿(集团流程管理部)",
                CodeName    = "yangrui1",
                FirstName   = "睿1",
                LastName    = "杨",
                Status      = SchemaObjectStatus.Normal,
                ID          = "766DFF51-6A29-43B2-95D9-D33456E536F9",
                Creator     = CastUser(Wangli),
            });

            user2.Properties["Mail"].StringValue = "*****@*****.**";

            PC.SCUser user3 = FillAdditionProperties(new PC.SCUser()
            {
                Name        = "刘闽辉",
                DisplayName = "刘闽辉",
                CodeName    = "liumh",
                FirstName   = "闽辉",
                LastName    = "刘",
                Status      = SchemaObjectStatus.Normal,
                ID          = "3729DAC3-80E0-476C-8C4A-264E0F67BBC2",
                Creator     = CastUser(Wangli),
            });

            user3.Properties["Mail"].StringValue = "*****@*****.**";

            Facade.AddUser(user1, org);
            Facade.AddUser(user2, org);
            Facade.AddUser(user3, org);

            PC.Adapters.UserPasswordAdapter.Instance.SetPassword(user3.ID, PC.Adapters.UserPasswordAdapter.GetPasswordType(), "password");

            PC.SCUser userOther = FillAdditionProperties(new PC.SCUser()
            {
                Name        = "王立臣",
                DisplayName = "王立臣",
                CodeName    = "wanglch",
                FirstName   = "立臣",
                LastName    = "王",
                Status      = SchemaObjectStatus.Normal,
                ID          = "587200E1-3EC4-43B2-8F3A-167E20F41D09",
                Creator     = CastUser(Wangli),
            });

            userOther.Properties["Mail"].StringValue = "*****@*****.**";


            PC.SCOrganization orgOther = (PC.SCOrganization)PC.Adapters.SchemaObjectAdapter.Instance.LoadByCodeName(c =>
            {
                SchemaStrict(c, "O.", PC.StandardObjectSchemaType.Organizations);
            }, DateTime.MinValue, "costEngineer").First();

            Facade.AddUser(userOther, orgOther);

            orgOther = (PC.SCOrganization)PC.Adapters.SchemaObjectAdapter.Instance.LoadByCodeName(c =>
            {
                SchemaStrict(c, "O.", PC.StandardObjectSchemaType.Organizations);
            }, DateTime.MinValue, "beijingYuanlianExecutives").First();

            Facade.AddUserToOrganization(user3, orgOther);

            orgOther = (PC.SCOrganization)PC.Adapters.SchemaObjectAdapter.Instance.LoadByCodeName(c =>
            {
                SchemaStrict(c, "O.", PC.StandardObjectSchemaType.Organizations);
            }, DateTime.MinValue, "养老地产业务发展中心").First();

            userOther = FillAdditionProperties(new PC.SCUser()
            {
                Name        = "赵林",
                DisplayName = "赵林",
                CodeName    = "zhaolin1",
                FirstName   = "林",
                LastName    = "赵",
                Status      = SchemaObjectStatus.Normal,
                ID          = "D1C28431-DD5D-496E-865B-85C6D89ED3D6",
                Creator     = CastUser(Wangli),
            });

            userOther.Properties["Mail"].StringValue = "*****@*****.**";

            Facade.AddUser(userOther, orgOther);

            userOther = FillAdditionProperties(new PC.SCUser()
            {
                Name        = "李业明",
                DisplayName = "李业明",
                CodeName    = "liyem",
                FirstName   = "业明",
                LastName    = "李",
                Status      = SchemaObjectStatus.Normal,
                ID          = "B36CC307-1D92-4D27-B670-A4301006BF0B",
                Creator     = CastUser(Wangli),
            });

            userOther.Properties["Mail"].StringValue = "*****@*****.**";

            Facade.AddUser(userOther, orgOther);

            userOther = FillAdditionProperties(new PC.SCUser()
            {
                Name        = "张帅一",
                DisplayName = "张帅一",
                CodeName    = "zhangshuaiy",
                FirstName   = "帅一",
                LastName    = "张",
                Status      = SchemaObjectStatus.Normal,
                ID          = "EF68CDD1-3FD3-418A-8D4D-98F2E02FB2CA",
                Creator     = CastUser(Wangli),
            });

            userOther.Properties["Mail"].StringValue = "*****@*****.**";

            Facade.AddUser(userOther, org);                    //主职

            Facade.AddUserToOrganization(userOther, orgOther); //兼职

            Facade.SetUserDefaultOrganization(userOther, org); //确保主职


            userOther = FillAdditionProperties(new PC.SCUser()
            {
                Name        = "陈科",
                DisplayName = "陈科",
                CodeName    = "chenke",
                FirstName   = "科",
                LastName    = "陈",
                Status      = SchemaObjectStatus.Normal,
                ID          = "E8F71526-23A2-4A39-A8AC-F79A2D255D1A",
                Creator     = CastUser(Wangli),
            });

            userOther.Properties["Mail"].StringValue = "*****@*****.**";

            orgOther = (PC.SCOrganization)PC.Adapters.SchemaObjectAdapter.Instance.LoadByCodeName(c =>
            {
                SchemaStrict(c, "O.", PC.StandardObjectSchemaType.Organizations);
            }, DateTime.MinValue, "costEngineer").First();

            Facade.AddUser(userOther, orgOther);

            // 独立部门开始

            userOther = FillAdditionProperties(new PC.SCUser()
            {
                Name        = "王发平",
                DisplayName = "王发平",
                CodeName    = "wangfaping",
                FirstName   = "发平",
                LastName    = "王",
                Status      = SchemaObjectStatus.Normal,
                ID          = "2B67F7D0-9362-401F-977F-3E267E87298B",
                Creator     = CastUser(Wangli),
            });

            userOther.Properties["Mail"].StringValue = "*****@*****.**";

            orgOther = (PC.SCOrganization)PC.Adapters.SchemaObjectAdapter.Instance.LoadByCodeName(c =>
            {
                SchemaStrict(c, "O.", PC.StandardObjectSchemaType.Organizations);
            }, DateTime.MinValue, "yuanyangAobei").First();

            Facade.AddUser(userOther, orgOther);

            userOther = FillAdditionProperties(new PC.SCUser()
            {
                Name        = "金戈",
                DisplayName = "金戈",
                CodeName    = "jinge",
                FirstName   = "戈",
                LastName    = "金",
                Status      = SchemaObjectStatus.Normal,
                ID          = "1688EB81-0FFB-4072-B26B-6DB571DCC391",
                Creator     = CastUser(Wangli),
            });

            userOther.Properties["Mail"].StringValue = "*****@*****.**";

            Facade.AddUser(userOther, orgOther);

            userOther = FillAdditionProperties(new PC.SCUser()
            {
                Name        = "范晓君",
                DisplayName = "范晓君",
                CodeName    = "fanxiaojun",
                FirstName   = "晓君",
                LastName    = "范",
                Status      = SchemaObjectStatus.Normal,
                ID          = "165EE11A-76ED-4C91-BD02-4AB6703F8FFA",
                Creator     = CastUser(Wangli),
            });

            userOther.Properties["Mail"].StringValue = "*****@*****.**";

            orgOther = (PC.SCOrganization)PC.Adapters.SchemaObjectAdapter.Instance.LoadByCodeName(c =>
            {
                SchemaStrict(c, "O.", PC.StandardObjectSchemaType.Organizations);
            }, DateTime.MinValue, "beijingSOIC").First();

            Facade.AddUser(userOther, orgOther);

            userOther = FillAdditionProperties(new PC.SCUser()
            {
                Name        = "高根",
                DisplayName = "高根",
                CodeName    = "gaogen",
                FirstName   = "根",
                LastName    = "高",
                Status      = SchemaObjectStatus.Normal,
                ID          = "81987195-756E-4FDA-868E-E4177096B212",
                Creator     = CastUser(Wangli),
            });

            userOther.Properties["Mail"].StringValue = "*****@*****.**";

            Facade.AddUser(userOther, orgOther);

            userOther = FillAdditionProperties(new PC.SCUser()
            {
                Name        = "胡瑞雪",
                DisplayName = "胡瑞雪",
                CodeName    = "hurx",
                FirstName   = "瑞雪",
                LastName    = "胡",
                Status      = SchemaObjectStatus.Normal,
                ID          = "4FD109E4-FFC5-487C-B99B-DB20B6A0B2B9",
                Creator     = CastUser(Wangli),
            });

            userOther.Properties["Mail"].StringValue = "*****@*****.**";

            orgOther = (PC.SCOrganization)PC.Adapters.SchemaObjectAdapter.Instance.LoadByCodeName(c =>
            {
                SchemaStrict(c, "O.", PC.StandardObjectSchemaType.Organizations);
            }, DateTime.MinValue, "beijingSOI").First();

            Facade.AddUser(userOther, orgOther);
        }
예제 #29
0
        public override SCObjectSet Execute(HttpRequest req)
        {
            string parentId = req.Form["ParentId"];

            if (string.IsNullOrEmpty(parentId))
            {
                throw new HttpException("当获取深度组织机构对象时,必须提供ParentId参数");
            }

            PC.SCOrganization parentObj = parentId == PC.SCOrganization.RootOrganizationID ? PC.SCOrganization.GetRoot() : (PC.SCOrganization)PC.Adapters.SchemaObjectAdapter.Instance.Load(parentId);
            if (parentObj == null || parentObj.Status != SchemaObjectStatus.Normal)
            {
                throw new HttpException("指定的父级对象不存在或者已删除");
            }

            List <string> ids;

            string[] requestIds = req.Form.GetValues("id");
            if (requestIds == null || requestIds.Length == 0)
            {
                PC.SCSimpleRelationObjectCollection allChildren = PC.Adapters.SchemaRelationObjectAdapter.Instance.LoadAllChildrenRelationsRecursively(parentObj);
                ids = new List <string>(allChildren.Count);
                allChildren.ForEach(so => ids.Add(so.ID));
            }
            else
            {
                PC.SCSimpleRelationObjectCollection allChildren = new PC.SCSimpleRelationObjectCollection();
                ids = new List <string>();

                var directRelations = ExportQueryHelper.LoadRelations(parentId, requestIds);

                foreach (var item in directRelations)
                {
                    ids.Add(item.ID);
                }

                var selectedObjects = DbUtil.LoadObjects(ids.ToArray());
                foreach (var item in selectedObjects)
                {
                    var subRelations = PC.Adapters.SchemaRelationObjectAdapter.Instance.LoadAllChildrenRelationsRecursively(item);
                    subRelations.ForEach(m => ids.Add(m.ID));
                }
            }

            SCObjectSet set = new SCObjectSet();

            if (ids.Count > 0)
            {
                set.Objects = DbUtil.LoadObjects(ids.ToArray());
                set.Objects.Distinct((m, n) => m.ID == n.ID);

                var objIds = set.Objects.ToIDArray();

                set.Relations = ExportQueryHelper.LoadFullRelations(objIds);
                set.Relations.Distinct((a, b) => a.ID == b.ID && a.ParentID == b.ParentID);

                set.Membership = ExportQueryHelper.LoadFullMemberships(objIds);
                set.Membership.Distinct((a, b) => a.ID == b.ID && a.ContainerID == b.ContainerID);

                set.Acls = ExportQueryHelper.LoadAclsFor(objIds);

                set.Conditions = ExportQueryHelper.LoadConditions(objIds);
            }

            set.Scope = "OguFull";
            return(set);
        }
예제 #30
0
 public OguOrganizationImportAction(PC.SCOrganization parent)
     : base(parent)
 {
 }
예제 #31
0
		private static void DeleteProgressNextStep(PostProgressDoPostedDataEventArgs e, SCOrganization parent)
		{
			(e.Steps.Count > 0).FalseThrow<InvalidOperationException>("没有选择要删除的对象");

			var objectsToDelete = DbUtil.LoadObjects((from string id in e.Steps select id).ToArray());

			ProcessProgress.Current.Output.WriteLine("准备执行操作");
			PC.Executors.SCObjectOperations.InstanceWithPermissions.DeleteObjectsRecursively(objectsToDelete, parent);
			ProcessProgress.Current.Output.WriteLine("完毕");

			e.Result.CloseWindow = false;
			e.Result.ProcessLog = ProcessProgress.Current.GetDefaultOutput();
		}