不论在政府、公司或者学校,都离不开组织机构,有了组织才因而有了秩序,社会也才因此而安定。因而在企业级项目中,经常会涉及到组织机构的设计和开发,良好的组织机构框架设计不仅有利于系统权限的实现和管理,也大大提高了用户管理企业的效率。因此组织机构的设计在大型企业项目中是非常的一个设计环节。先来说说组织机构的一些基本概念。
组织结构的种类及特点
1、直线制
直线制是一种最简单的集权式组织结构形式,又称军队式结构。其领导关系按垂直系统建立,不设立专门的职能机构,自上而下形同直线。
优点:结构简单、指挥系统清晰、统一;责权关系明确;横向联系少,内部协调容易;信息沟通迅速,解决问题及时,管理效率比较高。
缺点:缺乏专业化的管理分工,经营管理事务依赖于少数几个人。当企业规模扩大时,管理工作会超过个人能力所限,不利于集中精力研究企业管理的重大问题。
适用范围:规模较小或业务活动简单、稳定的企业。
2、直线职能制
直线职能制是一种以直线制结构为基础,在厂长(经理)领导下设置相应的职能部门,实行厂长(经理)统一指挥于职能部门参谋、指导相结合的组织结构形式。
特点:厂长(经理)对业务和职能部门均实行垂直式领导,各级直线管理人员在职权范围内对直接下属有指挥和命令的权力,并对此承担全部责任。职能管理部门是厂长(经理)的参谋和助手,没有直接指挥权,它与业务部门的关系只是一种指导关系,而非领导关系。
适用范围:规模中等的企业。随着规模的进一步扩大,将倾向于更多的分权。
3、事业部制
事业部制也成分权制结构,是一种在直线职能制基础上演变而成的现代企业组织结构。事业部制结构遵循“集中决策,分散经营”的总原则,实行集中决策指导下的分散经营,按产品、地区和顾客等标志将企业划分为若干相对独立的经营单位,分别组成事业部。各事业部可根据需要设置相应的职能部门。
优点:权力下放,有利于管理高层人员从日常行政事务中摆脱出来,集中精力考虑重大战略问题。各事业部主管拥有很大的自主权,有助于增强其责任感,发挥主动性和创造性,提高企业经营适应能力。各事业部集中从事某一方面的经营活动,实现高度专业化,整个企业可以容纳若干经营特点有很大差别的事业部,形成大型联合企业。各事业部经营责任和权限明确,物质利益与经营状况紧密挂钩。
缺点:容易造成机构重叠,管理人员膨胀。各事业部独立性强,考虑问题时容易忽视企业整体利益。
适用范围:规模大、业务多样化、市场环境差异大、要求具有较强适应性的企业。
4、矩阵制
矩阵制是由职能部门系列和为完成某一临时任务而组建的项目小组系列组成,它的最大特点在于具有双道命令系统。
优点:将企业横向、纵向进行了很好的联合。能在不增加人员的前提下,将不同部门专业人员集中起来。较好地解决了组织结构相对稳定和管理任务多变之间的矛盾。实现了企业综合管理与专业管理的结合。
缺点:组织关系比较复杂
5、分公司与子公司的异同
子公司:受集团或母公司控制,但在法律上独立的法人企业。
特点:有自己的公司名称和董事会,有对立的法人财产,可以以自己名义从事业务和民事诉讼活动。
分公司:母公司的分支机构或附属机构。
特点:在法律和经济上均无独立性,不是独立的法人企业。没有自己的独立名称和董事会,资产是母公司资产的一部分;在资不抵债情况下,母公司对其债务负责。
笔者不才,对十分复杂的组织机构的设计还无能为力,但我总结出一个扩展性良好,能满足一般组织机构结果的要求(介于直线制和矩阵制之间),希望能对大家有所帮助。
本例概述
本例组织机构由组织(Organization)、部门(Department)、人员(People)组成。其中,组织可有子组织、部门、人员,部门可有子部门、人员,人员可有子人员。
设计图
代码
Organization.java
package com.entity; import java.util.Set; public class Organization { private int id; private String name; // 自关联映射-获取父节点对象 private Organization parentOrg; // 自关联映射-获取子节点对象 private Set<Organization> childrenOrgs; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Organization getParentOrg() { return parentOrg; } public void setParentOrg(Organization parentOrg) { this.parentOrg = parentOrg; } public Set<Organization> getChildrenOrgs() { return childrenOrgs; } public void setChildrenOrgs(Set<Organization> childrenOrgs) { this.childrenOrgs = childrenOrgs; } }
Organization.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2012-2-24 10:31:51 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="com.entity.Organization" table="ORGANIZATION"> <id name="id" type="int"> <column name="ID" /> <generator class="native" /> </id> <discriminator type="string"> <column name="TYPE"></column> </discriminator> <property name="name" type="java.lang.String"> <column name="NAME" /> </property> <many-to-one name="parentOrg" class="com.entity.Organization" lazy="false"> <column name="PID" /> </many-to-one> <set name="childrenOrgs" inverse="true"> <key> <column name="PID" /> </key> <one-to-many class="com.entity.Organization" /> </set> </class> </hibernate-mapping>
Department.java
package com.entity; public class Department extends Organization { private String numbers; public String getNumbers() { return numbers; } public void setNumbers(String numbers) { this.numbers = numbers; } }
Department.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2012-2-24 10:31:51 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <subclass name="com.entity.Department" extends="com.entity.Organization" discriminator-value="Department"> <property name="numbers" type="java.lang.String"> <column name="NUMBERS" /> </property> </subclass> </hibernate-mapping>
People.java
package com.entity; public class People extends Organization { private String sex; private int age; public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
People.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2012-2-24 10:31:51 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <subclass name="com.entity.People" extends="com.entity.Organization" discriminator-value="People"> <property name="sex" type="java.lang.String"> <column name="SEX" /> </property> <property name="age" type="int"> <column name="AGE" /> </property> </subclass> </hibernate-mapping>
OrgManagerTest.java
package com.test; import java.util.Iterator; import java.util.Set; import junit.framework.TestCase; import org.hibernate.Session; import com.HibernateUtils; import com.entity.Department; import com.entity.Organization; import com.entity.People; public class OrgManagerTest extends TestCase { public void testAddOrg() { Session session = HibernateUtils.getSession(); Organization org = new Organization(); org.setName("父组织1"); Organization org2 = new Organization(); org2.setName("子组织1父组织2"); org2.setParentOrg(org); Organization org3 = new Organization(); org3.setName("子组织2"); org3.setParentOrg(org); Department dep = new Department(); dep.setName("子部门1父部门1"); dep.setNumbers("1000"); dep.setParentOrg(org2); Department dep2 = new Department(); dep2.setName("子部门2"); dep2.setNumbers("1001"); dep2.setParentOrg(dep); People people = new People(); people.setName("子人员1父人员1"); people.setAge(12); people.setSex("女"); people.setParentOrg(dep2); People people2 = new People(); people2.setName("子人员2"); people2.setAge(20); people2.setSex("男"); people2.setParentOrg(people); Department dep3 = new Department(); dep3.setName("子部门3"); dep3.setNumbers("1011"); dep3.setParentOrg(dep2); try { session.beginTransaction(); session.save(org); session.save(org2); session.save(org3); session.save(dep); session.save(dep2); session.save(people); session.save(people2); session.save(dep3); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); session.getTransaction().rollback(); } finally { HibernateUtils.closeSession(session); } } public void testLoadOrg() { Session session = HibernateUtils.getSession(); try { session.beginTransaction(); // People people = (People) session.get(People.class, 6); // // 多态查询。强制转换时一定要将子类的lazy属性设为false // Department department = (Department) people.getParentOrg(); // System.out.println(department.getName() + ", " + department.getNumbers()); // Set childPeoples = people.getChildrenOrgs(); // for (Iterator<People> iter = childPeoples.iterator(); iter.hasNext();) { // People childPeple = iter.next(); // System.out.println(childPeple.getName() + ", " + childPeple.getAge()); // } // 与部门中既有子部门,又有子人员的类似情况时获取子节点对象的方式。 Department dep = (Department) session.load(Department.class, 5); Set children = dep.getChildrenOrgs(); for (Iterator iter = children.iterator(); iter.hasNext();) { Object obj = iter.next(); if (obj instanceof Department) { Department childDep = (Department) obj; System.out.println(childDep.getName() + ", " + childDep.getNumbers()); } if (obj instanceof People) { People people = (People) obj; System.out.println(people.getName() + ", " + people.getAge()); } } session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); session.getTransaction().rollback(); } finally { HibernateUtils.closeSession(session); } } }
表结构
总结
生成的表结构对在页面展现树形结构非常方便。这里笔者将组织机构下的所有成员都放在了一张表上,如果不利于与其他表进行关联或者各成员的字段很多或者需要单独维护等等,也可一个成员一张表来存储。这种设计能满足较复杂的组织机构(不是直线制,即组织下只能有部门而不能有人员),又能方便扩展,是一种轻量级的、敏捷级的组织机构设计。
另外这里涉及到的关键知识点有:hibernate自关联映射、继承映射、多态查询,oracle树形表结构设计,以及组织机构的一些基本概念。关于这些知识点笔者在这里就不多介绍了,不理解的多多百度下吧。