luojing 5 лет назад
Родитель
Сommit
6c8d028234
29 измененных файлов с 2307 добавлено и 0 удалено
  1. 118 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/factory/PermissionSettingFactory.java
  2. 99 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/factory/PersonCardFactory.java
  3. 10 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/PermissionSettingJaxrsFilter.java
  4. 10 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/PersonCardJaxrsFilter.java
  5. 73 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/permissionsetting/ActionCreate.java
  6. 49 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/permissionsetting/ActionDelete.java
  7. 45 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/permissionsetting/ActionGet.java
  8. 43 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/permissionsetting/ActionList.java
  9. 95 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/permissionsetting/ActionUpdate.java
  10. 108 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/permissionsetting/BaseAction.java
  11. 13 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/permissionsetting/ExceptionDenyCreateRole.java
  12. 12 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/permissionsetting/ExceptionNameEmpty.java
  13. 12 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/permissionsetting/ExceptionPersonCardNotExist.java
  14. 126 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/permissionsetting/PermissionSettingAction.java
  15. 84 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/personcard/ActionCreate.java
  16. 48 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/personcard/ActionDelete.java
  17. 44 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/personcard/ActionGet.java
  18. 42 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/personcard/ActionList.java
  19. 39 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/personcard/ActionListMyGroupTypes.java
  20. 128 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/personcard/ActionListPaging.java
  21. 141 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/personcard/ActionListPagingWithGroup.java
  22. 97 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/personcard/ActionUpdate.java
  23. 107 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/personcard/BaseAction.java
  24. 13 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/personcard/ExceptionDenyCreateRole.java
  25. 12 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/personcard/ExceptionNameEmpty.java
  26. 12 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/personcard/ExceptionPersonCardNotExist.java
  27. 181 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/personcard/PersonCardAction.java
  28. 212 0
      o2server/x_organization_core_entity/src/main/java/com/x/organization/core/entity/PermissionSetting.java
  29. 334 0
      o2server/x_organization_core_entity/src/main/java/com/x/organization/core/entity/PersonCard.java

+ 118 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/factory/PermissionSettingFactory.java

@@ -0,0 +1,118 @@
+package com.x.organization.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.stream.Collectors;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Order;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.x.base.core.project.cache.ApplicationCache;
+import com.x.organization.assemble.control.AbstractFactory;
+import com.x.organization.assemble.control.Business;
+import com.x.organization.core.entity.Group;
+import com.x.organization.core.entity.PermissionSetting;
+import com.x.organization.core.entity.PermissionSetting_;
+import com.x.organization.core.entity.PersistenceProperties;
+
+import net.sf.ehcache.Element;
+
+public class PermissionSettingFactory extends AbstractFactory {
+
+	public PermissionSettingFactory(Business business) throws Exception {
+		super(business);
+		cache = ApplicationCache.instance().getCache(PermissionSetting.class);
+	}
+
+	public PermissionSetting pick(String flag) throws Exception {
+		if (StringUtils.isEmpty(flag)) {
+			return null;
+		}
+		PermissionSetting o = null;
+		Element element = cache.get(flag);
+		if (null != element) {
+			if (null != element.getObjectValue()) {
+				o = (PermissionSetting) element.getObjectValue();
+			}
+		} else {
+			o = this.pickObject(flag);
+			cache.put(new Element(flag, o));
+		}
+		return o;
+	}
+	public List<PermissionSetting> pick(List<String> flags) throws Exception {
+		List<PermissionSetting> list = new ArrayList<>();
+		for (String str : flags) {
+			Element element = cache.get(str);
+			if (null != element) {
+				if (null != element.getObjectValue()) {
+					list.add((PermissionSetting) element.getObjectValue());
+				}
+			} else {
+				PermissionSetting o = this.pickObject(str);
+				cache.put(new Element(str, o));
+				if (null != o) {
+					list.add(o);
+				}
+			}
+		}
+		return list;
+	}
+	
+	private PermissionSetting pickObject(String flag) throws Exception {
+		PermissionSetting o = this.entityManagerContainer().flag(flag, PermissionSetting.class);
+		if (o != null) {
+			this.entityManagerContainer().get(PermissionSetting.class).detach(o);
+		} else {
+			String name = flag;
+			Matcher matcher = PersistenceProperties.PermissionSetting.distinguishedName_pattern.matcher(flag);
+			if (matcher.find()) {
+				name = matcher.group(1);
+				String unique = matcher.group(2);
+				o = this.entityManagerContainer().flag(unique, PermissionSetting.class);
+				if (null != o) {
+					this.entityManagerContainer().get(PermissionSetting.class).detach(o);
+				}
+			}
+			if (null == o) {
+				EntityManager em = this.entityManagerContainer().get(PermissionSetting.class);
+				CriteriaBuilder cb = em.getCriteriaBuilder();
+				CriteriaQuery<PermissionSetting> cq = cb.createQuery(PermissionSetting.class);
+				Root<PermissionSetting> root = cq.from(PermissionSetting.class);
+				Predicate p = cb.equal(root.get(PermissionSetting_.id), name);
+				List<PermissionSetting> os = em.createQuery(cq.select(root).where(p).distinct(true)).getResultList();
+				if (os.size() == 1) {
+					o = os.get(0);
+					em.detach(o);
+				}
+			}
+		}
+		return o;
+	}
+	public List<String> fetchAllIdsByCreator() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(PermissionSetting.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<PermissionSetting> root = cq.from(PermissionSetting.class);
+		cq.select(root.get(PermissionSetting_.id)).orderBy(cb.asc(root.get(PermissionSetting_.createTime)));
+		return em.createQuery(cq).getResultList();
+	}
+	/*
+	public List<String> fetchAllGroupTypeByCreator(String distinguishName) throws Exception {
+		EntityManager em = this.entityManagerContainer().get(PermissionSetting.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<PermissionSetting> root = cq.from(PermissionSetting.class);
+		Predicate p = cb.equal(root.get(PermissionSetting_.distinguishedName), distinguishName);
+		cq.select(root.get(PermissionSetting_.groupType)).where(p).distinct(true);
+		return em.createQuery(cq).getResultList();
+	}*/
+}

+ 99 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/factory/PersonCardFactory.java

@@ -0,0 +1,99 @@
+package com.x.organization.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.stream.Collectors;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Order;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.x.base.core.project.cache.ApplicationCache;
+import com.x.organization.assemble.control.AbstractFactory;
+import com.x.organization.assemble.control.Business;
+import com.x.organization.core.entity.PersistenceProperties;
+import com.x.organization.core.entity.PersonCard;
+import com.x.organization.core.entity.PersonCard_;
+
+import net.sf.ehcache.Element;
+
+public class PersonCardFactory extends AbstractFactory {
+
+	public PersonCardFactory(Business business) throws Exception {
+		super(business);
+		cache = ApplicationCache.instance().getCache(PersonCard.class);
+	}
+
+	public PersonCard pick(String flag) throws Exception {
+		if (StringUtils.isEmpty(flag)) {
+			return null;
+		}
+		PersonCard o = null;
+		Element element = cache.get(flag);
+		if (null != element) {
+			if (null != element.getObjectValue()) {
+				o = (PersonCard) element.getObjectValue();
+			}
+		} else {
+			o = this.pickObject(flag);
+			cache.put(new Element(flag, o));
+		}
+		return o;
+	}
+	
+	private PersonCard pickObject(String flag) throws Exception {
+		PersonCard o = this.entityManagerContainer().flag(flag, PersonCard.class);
+		if (o != null) {
+			this.entityManagerContainer().get(PersonCard.class).detach(o);
+		} else {
+			String name = flag;
+			Matcher matcher = PersistenceProperties.PersonCard.distinguishedName_pattern.matcher(flag);
+			if (matcher.find()) {
+				name = matcher.group(1);
+				String unique = matcher.group(2);
+				o = this.entityManagerContainer().flag(unique, PersonCard.class);
+				if (null != o) {
+					this.entityManagerContainer().get(PersonCard.class).detach(o);
+				}
+			}
+			if (null == o) {
+				EntityManager em = this.entityManagerContainer().get(PersonCard.class);
+				CriteriaBuilder cb = em.getCriteriaBuilder();
+				CriteriaQuery<PersonCard> cq = cb.createQuery(PersonCard.class);
+				Root<PersonCard> root = cq.from(PersonCard.class);
+				Predicate p = cb.equal(root.get(PersonCard_.name), name);
+				List<PersonCard> os = em.createQuery(cq.select(root).where(p).distinct(true)).getResultList();
+				if (os.size() == 1) {
+					o = os.get(0);
+					em.detach(o);
+				}
+			}
+		}
+		return o;
+	}
+	public List<String> fetchAllIdsByCreator(String distinguishName) throws Exception {
+		EntityManager em = this.entityManagerContainer().get(PersonCard.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<PersonCard> root = cq.from(PersonCard.class);
+		Predicate p = cb.equal(root.get(PersonCard_.distinguishedName), distinguishName);
+		cq.select(root.get(PersonCard_.id)).where(p).orderBy(cb.asc(root.get(PersonCard_.orderNumber)));
+		return em.createQuery(cq).getResultList();
+	}
+	public List<String> fetchAllGroupTypeByCreator(String distinguishName) throws Exception {
+		EntityManager em = this.entityManagerContainer().get(PersonCard.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<PersonCard> root = cq.from(PersonCard.class);
+		Predicate p = cb.equal(root.get(PersonCard_.distinguishedName), distinguishName);
+		cq.select(root.get(PersonCard_.groupType)).where(p).distinct(true);
+		return em.createQuery(cq).getResultList();
+	}
+}

+ 10 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/PermissionSettingJaxrsFilter.java

@@ -0,0 +1,10 @@
+package com.x.organization.assemble.control.jaxrs;
+
+import javax.servlet.annotation.WebFilter;
+
+import com.x.base.core.project.jaxrs.ManagerUserJaxrsFilter;
+
+@WebFilter(urlPatterns = "/jaxrs/permissionsetting/*", asyncSupported = true)
+public class PermissionSettingJaxrsFilter extends ManagerUserJaxrsFilter {
+
+}

+ 10 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/PersonCardJaxrsFilter.java

@@ -0,0 +1,10 @@
+package com.x.organization.assemble.control.jaxrs;
+
+import javax.servlet.annotation.WebFilter;
+
+import com.x.base.core.project.jaxrs.ManagerUserJaxrsFilter;
+
+@WebFilter(urlPatterns = "/jaxrs/personcard/*", asyncSupported = true)
+public class PersonCardJaxrsFilter extends ManagerUserJaxrsFilter {
+
+}

+ 73 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/permissionsetting/ActionCreate.java

@@ -0,0 +1,73 @@
+package com.x.organization.assemble.control.jaxrs.permissionsetting;
+
+import java.util.Date;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.entity.annotation.CheckPersistType;
+import com.x.base.core.project.x_message_assemble_communicate;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.cache.ApplicationCache;
+import com.x.base.core.project.connection.ActionResponse;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WoId;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.DateTools;
+import com.x.base.core.project.tools.ListTools;
+import com.x.organization.assemble.control.Business;
+import com.x.organization.assemble.control.ThisApplication;
+import com.x.organization.assemble.control.message.OrgBodyMessage;
+import com.x.organization.assemble.control.message.OrgMessage;
+import com.x.organization.assemble.control.message.OrgMessageFactory;
+import com.x.organization.core.entity.PermissionSetting;
+ 
+
+class ActionCreate extends BaseAction {
+	private static Logger logger = LoggerFactory.getLogger(ActionCreate.class);
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, JsonElement jsonElement) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<Wo> result = new ActionResult<>();
+			
+			Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
+			Business business = new Business(emc);
+			PermissionSetting permission = new PermissionSetting();					
+			Wi.copier.copy(wi, permission);
+			emc.beginTransaction(PermissionSetting.class);
+			emc.persist(permission, CheckPersistType.all);
+			emc.commit();
+			ApplicationCache.notify(PermissionSetting.class);  
+			
+			/**创建 组织变更org消息通信 */
+			OrgMessageFactory  orgMessageFactory = new OrgMessageFactory();
+			orgMessageFactory.createMessageCommunicate("add", "permissionSetting", permission, effectivePerson);
+			
+			Wo wo = new Wo();
+			wo.setId(permission.getId());
+			result.setData(wo);
+			return result;
+		}
+	}
+
+	public static class Wo extends WoId {
+	}
+
+	public static class Wi extends PermissionSetting {
+
+		private static final long serialVersionUID = -6314932919066148113L;
+
+		static WrapCopier<Wi, PermissionSetting> copier = WrapCopierFactory.wi(Wi.class, PermissionSetting.class, null,
+				ListTools.toList(JpaObject.FieldsUnmodify));
+
+	}
+	
+
+
+}

+ 49 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/permissionsetting/ActionDelete.java

@@ -0,0 +1,49 @@
+package com.x.organization.assemble.control.jaxrs.permissionsetting;
+
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.annotation.CheckRemoveType;
+import com.x.base.core.project.cache.ApplicationCache;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WoId;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.organization.assemble.control.Business;
+import com.x.organization.assemble.control.message.OrgMessageFactory;
+import com.x.organization.core.entity.PermissionSetting;
+
+
+class ActionDelete extends BaseAction {
+	private static Logger logger = LoggerFactory.getLogger(ActionDelete.class);
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String flag) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<Wo> result = new ActionResult<>();
+			Business business = new Business(emc);
+			PermissionSetting permission = business.permissionSetting().pick(flag);
+			if (null == permission) {
+				throw new ExceptionPersonCardNotExist(flag); 
+			}
+
+			emc.beginTransaction(PermissionSetting.class);
+			permission = emc.find(permission.getId(), PermissionSetting.class);
+			emc.remove(permission, CheckRemoveType.all);
+			emc.commit();
+			ApplicationCache.notify(PermissionSetting.class);
+			
+			/**创建 组织变更org消息通信 */
+			OrgMessageFactory  orgMessageFactory = new OrgMessageFactory();
+			orgMessageFactory.createMessageCommunicate("delete", "permissionSetting", permission, effectivePerson);
+			
+			Wo wo = new Wo();
+			wo.setId(permission.getId());
+			result.setData(wo);
+			return result;
+		}
+	}
+
+	public static class Wo extends WoId {
+	}
+
+
+}

+ 45 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/permissionsetting/ActionGet.java

@@ -0,0 +1,45 @@
+package com.x.organization.assemble.control.jaxrs.permissionsetting;
+
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.cache.ApplicationCache;
+import com.x.base.core.project.exception.ExceptionEntityNotExist;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.tools.ListTools;
+import com.x.organization.assemble.control.Business;
+import com.x.organization.core.entity.PermissionSetting;
+
+
+import net.sf.ehcache.Element;
+
+class ActionGet extends BaseAction {
+
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String flag) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			ActionResult<Wo> result = new ActionResult<>();
+			PermissionSetting permssion = emc.find(flag, PermissionSetting.class);
+			if (null == permssion) {
+				throw new ExceptionPersonCardNotExist(flag); 
+			}
+			Wo wo = Wo.copier.copy(permssion);
+			result.setData(wo);
+			
+			return result;
+		}
+	}
+	public static class Wo extends WoPermissionSettingAbstract {
+		private static final long serialVersionUID = 5661133561098715100L;
+		public static WrapCopier<PermissionSetting, Wo> copier = WrapCopierFactory.wo(PermissionSetting.class, Wo.class, null,
+				JpaObject.FieldsInvisible);
+	}
+
+}

+ 43 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/permissionsetting/ActionList.java

@@ -0,0 +1,43 @@
+package com.x.organization.assemble.control.jaxrs.permissionsetting;
+
+import java.util.List;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.organization.assemble.control.Business;
+import com.x.organization.core.entity.PermissionSetting;
+import com.x.organization.core.entity.PersonCard;
+
+
+class ActionList extends BaseAction {
+
+	private static Logger logger = LoggerFactory.getLogger(ActionList.class);
+
+
+
+	// 列出所有个人通讯录设置配置。
+	ActionResult<List<Wo>> MyExecute(EffectivePerson effectivePerson) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<List<Wo>> result = new ActionResult<>();
+			Business business = new Business(emc);
+			List<String> ids = business.permissionSetting().fetchAllIdsByCreator();
+			List<Wo> wos = Wo.copier.copy(emc.list(PermissionSetting.class,true, ids));
+			result.setData(wos);
+			return result;
+		}
+	}
+
+	public static class Wo extends WoPermissionSettingAbstract {
+		private static final long serialVersionUID = 1276641320278402941L;
+		static WrapCopier<PermissionSetting, Wo> copier = WrapCopierFactory.wo(PermissionSetting.class, Wo.class, null, JpaObject.FieldsInvisible);
+	}
+
+}

+ 95 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/permissionsetting/ActionUpdate.java

@@ -0,0 +1,95 @@
+package com.x.organization.assemble.control.jaxrs.permissionsetting;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.reflect.FieldUtils;
+import org.apache.commons.beanutils.PropertyUtils;
+import java.lang.reflect.Field;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.entity.annotation.CheckPersistType;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.cache.ApplicationCache;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ListTools;
+import com.x.organization.assemble.control.Business;
+import com.x.organization.assemble.control.message.OrgMessageFactory;
+import com.x.organization.core.entity.PermissionSetting;
+import com.x.organization.core.entity.PersonCard;
+
+
+
+public class ActionUpdate extends BaseAction{
+	private static Logger logger = LoggerFactory.getLogger(ActionUpdate.class);
+
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String cardid, JsonElement jsonElement) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<Wo> result = new ActionResult<>();
+			Business business = new Business(emc);
+			Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
+			PermissionSetting permission = business.permissionSetting().pick(cardid);
+			
+			if (null == permission) {
+				throw new ExceptionPersonCardNotExist(cardid);
+			}
+			Wi.copier.copy(wi, permission);
+			emc.beginTransaction(PermissionSetting.class);
+			
+			PermissionSetting entityPerson = emc.find(cardid, PermissionSetting.class);
+			if (null == permission.getId() || StringUtils.isBlank(entityPerson.getId())) {
+				entityPerson.setId(cardid);
+				throw new ExceptionPersonCardNotExist(cardid);
+			}
+			
+			permission.copyTo(entityPerson); 	
+			
+			emc.check(entityPerson, CheckPersistType.all);
+			emc.commit();
+			ApplicationCache.notify(PermissionSetting.class);
+			
+			OrgMessageFactory  orgMessageFactory = new OrgMessageFactory();
+			orgMessageFactory.createMessageCommunicate("modfiy", "PermissionSetting", permission, effectivePerson);
+			
+			Wo wo = new Wo();
+			wo.setId(permission.getId());
+			result.setData(wo);
+			return result;
+		}
+	}
+
+	static class Wi extends PermissionSetting {
+		private static final long serialVersionUID = -4714395467753481398L;
+		static WrapCopier<Wi, PermissionSetting> copier = WrapCopierFactory.wi(Wi.class, PermissionSetting.class, null, ListTools.toList(JpaObject.FieldsUnmodify));
+	}
+
+	public static class Wo extends WoPermissionSettingAbstract {
+		private static final long serialVersionUID = 7871578639804765941L;
+		static WrapCopier<PermissionSetting, Wo> copier = WrapCopierFactory.wo(PermissionSetting.class, Wo.class, null, JpaObject.FieldsUnmodify);
+	}
+	
+	/*public void copyTo(Object a,Object o, boolean ignoreNull) throws Exception {
+		List<String> list = new ArrayList<String>();
+		Collection<String> excludes = list;
+		for (Field fld : FieldUtils.getAllFields(a.getClass())) {
+			if (!excludes.contains(fld.getName())) {
+				if (PropertyUtils.isReadable(a, fld.getName()) && PropertyUtils.isWriteable(o, fld.getName())) {
+					Object value = PropertyUtils.getProperty(a, fld.getName());
+					if (ignoreNull && (null == value)) {
+						value = PropertyUtils.getProperty(o, fld.getName());
+					}
+					PropertyUtils.setProperty(o, fld.getName(), value);
+				}
+			}
+		}
+	}*/
+}

+ 108 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/permissionsetting/BaseAction.java

@@ -0,0 +1,108 @@
+package com.x.organization.assemble.control.jaxrs.permissionsetting;
+
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.gson.GsonPropertyObject;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.base.core.project.organization.OrganizationDefinition;
+import com.x.organization.assemble.control.Business;
+import com.x.organization.core.entity.PermissionSetting;
+import com.x.organization.core.entity.PersonCard;
+import com.x.organization.core.entity.Role;
+
+abstract class BaseAction extends StandardJaxrsAction {
+
+	
+	public static class WoPermissionSettingAbstract extends PermissionSetting {
+
+		private static final long serialVersionUID = 8148720363115902733L;
+	}
+	
+	// 初始化信息
+		public PersonCard initDefaultValue(EffectivePerson effectivePerson, PersonCard personCard,PersonCard newCard) {
+		    //System.out.println("personCard_groupType="+personCard.getStatus());
+		    //System.out.println("newCard_groupType="+newCard);
+			return personCard;
+		}
+	
+	
+	/** 如果唯一标识不为空,要检查唯一标识是否唯一 */
+	protected boolean uniqueDuplicateWhenNotEmpty(Business business, Role role) throws Exception {
+		if (StringUtils.isNotEmpty(role.getUnique())) {
+			if (business.entityManagerContainer().duplicateWithFlags(role.getId(), Role.class, role.getUnique())) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	public static class WoRoleAbstract extends Role {
+
+		private static final long serialVersionUID = 8148720363115902733L;
+		@FieldDescribe("对角色的操作权限")
+		private Control control = new Control();
+
+		public Control getControl() {
+			return control;
+		}
+
+		public void setControl(Control control) {
+			this.control = control;
+		}
+	}
+
+	public static class Control extends GsonPropertyObject {
+
+		private Boolean allowEdit = false;
+		private Boolean allowDelete = false;
+
+		public Boolean getAllowEdit() {
+			return allowEdit;
+		}
+
+		public void setAllowEdit(Boolean allowEdit) {
+			this.allowEdit = allowEdit;
+		}
+
+		public Boolean getAllowDelete() {
+			return allowDelete;
+		}
+
+		public void setAllowDelete(Boolean allowDelete) {
+			this.allowDelete = allowDelete;
+		}
+
+	}
+
+	protected <T extends WoRoleAbstract> void updateControl(EffectivePerson effectivePerson, Business business,
+			List<T> list) throws Exception {
+		if (effectivePerson.isManager() || business.hasAnyRole(effectivePerson,
+				OrganizationDefinition.OrganizationManager, OrganizationDefinition.RoleManager)) {
+			for (T t : list) {
+				t.getControl().setAllowDelete(true);
+				t.getControl().setAllowEdit(true);
+			}
+		} else {
+			for (T t : list) {
+				t.getControl().setAllowDelete(false);
+				t.getControl().setAllowEdit(false);
+			}
+		}
+	}
+
+	protected <T extends WoRoleAbstract> void updateControl(EffectivePerson effectivePerson, Business business, T t)
+			throws Exception {
+		if (effectivePerson.isManager() || business.hasAnyRole(effectivePerson,
+				OrganizationDefinition.OrganizationManager, OrganizationDefinition.RoleManager)) {
+			t.getControl().setAllowDelete(true);
+			t.getControl().setAllowEdit(true);
+		} else {
+			t.getControl().setAllowDelete(false);
+			t.getControl().setAllowEdit(false);
+		}
+	}
+}

+ 13 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/permissionsetting/ExceptionDenyCreateRole.java

@@ -0,0 +1,13 @@
+package com.x.organization.assemble.control.jaxrs.permissionsetting;
+
+import com.x.base.core.project.exception.PromptException;
+import com.x.base.core.project.http.EffectivePerson;
+
+class ExceptionDenyCreateRole extends PromptException {
+
+	private static final long serialVersionUID = 4132300948670472899L;
+
+	ExceptionDenyCreateRole(EffectivePerson effectivePerson, String name) {
+		super("{} 不能创建角色:{}, 权限不足.", effectivePerson.getDistinguishedName(), name);
+	}
+}

+ 12 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/permissionsetting/ExceptionNameEmpty.java

@@ -0,0 +1,12 @@
+package com.x.organization.assemble.control.jaxrs.permissionsetting;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionNameEmpty extends PromptException {
+
+	private static final long serialVersionUID = 4132300948670472899L;
+
+	ExceptionNameEmpty() {
+		super("姓名不能为空.");
+	}
+}

+ 12 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/permissionsetting/ExceptionPersonCardNotExist.java

@@ -0,0 +1,12 @@
+package com.x.organization.assemble.control.jaxrs.permissionsetting;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionPersonCardNotExist extends PromptException {
+
+	private static final long serialVersionUID = 4132300948670472899L;
+
+	ExceptionPersonCardNotExist(String flag) {
+		super("通讯录设置配置, 不存在.", flag);
+	}
+}

+ 126 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/permissionsetting/PermissionSettingAction.java

@@ -0,0 +1,126 @@
+package com.x.organization.assemble.control.jaxrs.permissionsetting;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.container.AsyncResponse;
+import javax.ws.rs.container.Suspended;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.project.annotation.JaxrsDescribe;
+import com.x.base.core.project.annotation.JaxrsMethodDescribe;
+import com.x.base.core.project.annotation.JaxrsParameterDescribe;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.http.HttpMediaType;
+import com.x.base.core.project.jaxrs.ResponseFactory;
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+
+
+@Path("permissionsetting")
+@JaxrsDescribe("通讯录权限设置")
+public class PermissionSettingAction extends StandardJaxrsAction {
+
+	private static Logger logger = LoggerFactory.getLogger(PermissionSettingAction.class);
+	
+	@JaxrsMethodDescribe(value = "获取通讯录配置.", action = ActionGet.class)
+	@GET
+	@Path("{flag}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void get(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			@JaxrsParameterDescribe("名片标识") @PathParam("flag") String flag) {
+		ActionResult<ActionGet.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionGet().execute(effectivePerson, flag);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+	@JaxrsMethodDescribe(value = "创建通讯录权限设置.", action = ActionCreate.class)
+	@POST
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void create(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			JsonElement jsonElement) {
+		ActionResult<ActionCreate.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionCreate().execute(effectivePerson, jsonElement);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, jsonElement);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+	
+	@JaxrsMethodDescribe(value = "更新通讯录配置.", action = ActionUpdate.class)
+	@PUT
+	@Path("{flag}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void update(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			@JaxrsParameterDescribe("名片标识") @PathParam("flag") String flag, JsonElement jsonElement) {
+		ActionResult<ActionUpdate.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionUpdate().execute(effectivePerson, flag, jsonElement);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, jsonElement);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result)); 
+	}
+
+	@JaxrsMethodDescribe(value = "删除通讯录设置配置.", action = ActionDelete.class)
+	@DELETE
+	@Path("{flag}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void delete(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			@JaxrsParameterDescribe("通讯录配置标识") @PathParam("flag") String flag) {
+		ActionResult<ActionDelete.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionDelete().execute(effectivePerson, flag);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+	
+	@JaxrsMethodDescribe(value = "获取所有通讯录设置配置", action = ActionList.class)
+	@GET
+	@Path("list")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void list(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request) {
+		ActionResult<List<ActionList.Wo>> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionList().MyExecute(effectivePerson);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+	
+}

+ 84 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/personcard/ActionCreate.java

@@ -0,0 +1,84 @@
+package com.x.organization.assemble.control.jaxrs.personcard;
+
+import java.util.Date;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.entity.annotation.CheckPersistType;
+import com.x.base.core.project.x_message_assemble_communicate;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.cache.ApplicationCache;
+import com.x.base.core.project.connection.ActionResponse;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WoId;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.DateTools;
+import com.x.base.core.project.tools.ListTools;
+import com.x.organization.assemble.control.Business;
+import com.x.organization.assemble.control.ThisApplication;
+import com.x.organization.assemble.control.message.OrgBodyMessage;
+import com.x.organization.assemble.control.message.OrgMessage;
+import com.x.organization.assemble.control.message.OrgMessageFactory;
+import com.x.organization.core.entity.PersonCard;
+
+
+class ActionCreate extends BaseAction {
+	private static Logger logger = LoggerFactory.getLogger(ActionCreate.class);
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, JsonElement jsonElement) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<Wo> result = new ActionResult<>();
+			
+			Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
+			Business business = new Business(emc);
+			PersonCard personCard = new PersonCard();
+			
+			if (StringUtils.isEmpty(wi.getName())) {
+				throw new ExceptionNameEmpty(); 
+			}  
+			
+			Wi.copier.copy(wi, personCard);
+			personCard.setDistinguishedName(effectivePerson.getDistinguishedName());
+			if(personCard.getGroupType().equals("")){
+				personCard.setGroupType("默认分组");
+			}
+			personCard.setInputTime(DateTools.format(new Date()));
+		
+			emc.beginTransaction(PersonCard.class);
+			emc.persist(personCard, CheckPersistType.all);
+			emc.commit();
+			ApplicationCache.notify(PersonCard.class);  
+			
+			/**创建 组织变更org消息通信 */
+			OrgMessageFactory  orgMessageFactory = new OrgMessageFactory();
+			orgMessageFactory.createMessageCommunicate("add", "personpersonal", personCard, effectivePerson);
+			
+			Wo wo = new Wo();
+			wo.setId(personCard.getId());
+			result.setData(wo);
+			return result;
+		}
+	}
+
+	public static class Wo extends WoId {
+	}
+
+	public static class Wi extends PersonCard {
+
+		private static final long serialVersionUID = -6314932919066148113L;
+
+		static WrapCopier<Wi, PersonCard> copier = WrapCopierFactory.wi(Wi.class, PersonCard.class, null,
+				ListTools.toList(JpaObject.FieldsUnmodify, "pinyin", "pinyinInitial","distinguishedName","inputTime"));
+
+	}
+	
+
+
+}

+ 48 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/personcard/ActionDelete.java

@@ -0,0 +1,48 @@
+package com.x.organization.assemble.control.jaxrs.personcard;
+
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.annotation.CheckRemoveType;
+import com.x.base.core.project.cache.ApplicationCache;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WoId;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.organization.assemble.control.Business;
+import com.x.organization.assemble.control.message.OrgMessageFactory;
+import com.x.organization.core.entity.PersonCard;
+
+class ActionDelete extends BaseAction {
+	private static Logger logger = LoggerFactory.getLogger(ActionDelete.class);
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String flag) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<Wo> result = new ActionResult<>();
+			Business business = new Business(emc);
+			PersonCard personCard = business.personCard().pick(flag);
+			if (null == personCard) {
+				throw new ExceptionPersonCardNotExist(flag);
+			}
+
+			emc.beginTransaction(PersonCard.class);
+			personCard = emc.find(personCard.getId(), PersonCard.class);
+			emc.remove(personCard, CheckRemoveType.all);
+			emc.commit();
+			ApplicationCache.notify(PersonCard.class);
+			
+			/**创建 组织变更org消息通信 */
+			OrgMessageFactory  orgMessageFactory = new OrgMessageFactory();
+			orgMessageFactory.createMessageCommunicate("delete", "personCard", personCard, effectivePerson);
+			
+			Wo wo = new Wo();
+			wo.setId(personCard.getId());
+			result.setData(wo);
+			return result;
+		}
+	}
+
+	public static class Wo extends WoId {
+	}
+
+
+}

+ 44 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/personcard/ActionGet.java

@@ -0,0 +1,44 @@
+package com.x.organization.assemble.control.jaxrs.personcard;
+
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.cache.ApplicationCache;
+import com.x.base.core.project.exception.ExceptionEntityNotExist;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.tools.ListTools;
+import com.x.organization.assemble.control.Business;
+import com.x.organization.core.entity.PersonCard;
+
+import net.sf.ehcache.Element;
+
+class ActionGet extends BaseAction {
+
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String flag) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			ActionResult<Wo> result = new ActionResult<>();
+			PersonCard personCard = emc.find(flag, PersonCard.class);
+			if (null == personCard) {
+				throw new ExceptionPersonCardNotExist(flag);
+			}
+			Wo wo = Wo.copier.copy(personCard);
+			result.setData(wo);
+			
+			return result;
+		}
+	}
+	public static class Wo extends WoPersonCardAbstract {
+		private static final long serialVersionUID = 5661133561098715100L;
+		public static WrapCopier<PersonCard, Wo> copier = WrapCopierFactory.wo(PersonCard.class, Wo.class, null,
+				JpaObject.FieldsInvisible);
+	}
+
+}

+ 42 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/personcard/ActionList.java

@@ -0,0 +1,42 @@
+package com.x.organization.assemble.control.jaxrs.personcard;
+
+import java.util.List;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.organization.assemble.control.Business;
+import com.x.organization.core.entity.PersonCard;
+
+
+class ActionList extends BaseAction {
+
+	private static Logger logger = LoggerFactory.getLogger(ActionList.class);
+
+
+
+	// 列出创建是当前登录用户的所有线索,并且按照创建时间倒序排列。
+	ActionResult<List<Wo>> MyExecute(EffectivePerson effectivePerson) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<List<Wo>> result = new ActionResult<>();
+			Business business = new Business(emc);
+			List<String> ids = business.personCard().fetchAllIdsByCreator(effectivePerson.getDistinguishedName());
+			List<Wo> wos = Wo.copier.copy(emc.list(PersonCard.class,true, ids));
+			result.setData(wos);
+			return result;
+		}
+	}
+
+	public static class Wo extends WoPersonCardAbstract {
+		private static final long serialVersionUID = 1276641320278402941L;
+		static WrapCopier<PersonCard, Wo> copier = WrapCopierFactory.wo(PersonCard.class, Wo.class, null, JpaObject.FieldsInvisible);
+	}
+
+}

+ 39 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/personcard/ActionListMyGroupTypes.java

@@ -0,0 +1,39 @@
+package com.x.organization.assemble.control.jaxrs.personcard;
+
+import java.util.List;
+
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WoId;
+
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.organization.assemble.control.Business;
+
+
+
+class ActionListMyGroupTypes extends BaseAction {
+
+	private static Logger logger = LoggerFactory.getLogger(ActionListMyGroupTypes.class);
+
+	// 列出当前登录用户的所有分组。
+	ActionResult<String[]> MyExecute(EffectivePerson effectivePerson) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<String[]> result = new ActionResult<>();
+			Business business = new Business(emc);
+			List<String> groupTypeList = business.personCard().fetchAllGroupTypeByCreator(effectivePerson.getDistinguishedName());
+			String[] groupStrings = new String[groupTypeList.size()];
+			result.setData(groupTypeList.toArray(groupStrings));
+			result.setCount(new Long((long)groupTypeList.size()));
+			return result;
+		}
+	}
+
+	public static class Wo extends WoId {
+	}
+	
+
+}

+ 128 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/personcard/ActionListPaging.java

@@ -0,0 +1,128 @@
+package com.x.organization.assemble.control.jaxrs.personcard;
+
+import java.util.Date;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Order;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import javax.persistence.metamodel.SingularAttribute;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.gson.GsonPropertyObject;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.organization.assemble.control.Business;
+import com.x.organization.assemble.control.jaxrs.personcard.ActionList.Wo;
+import com.x.organization.core.entity.PersonCard;
+import com.x.organization.core.entity.PersonCard_;
+
+
+class ActionListPaging extends BaseAction {
+
+	private static Logger logger = LoggerFactory.getLogger(ActionListPaging.class);
+	//SingularAttribute<JpaObject, Date> defaultOrder = PersonCard_.createTime;   
+
+	// 线索分页查询,具备多个字段的like查询(无权限控制)
+	ActionResult<List<Wo>> Execute_Paging_like(EffectivePerson effectivePerson, Integer adjustPage, Integer adjustPageSize, JsonElement jsonElement)
+			throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<List<Wo>> result = new ActionResult<>();
+			Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
+			Business business = new Business(emc);
+			List<PersonCard> os = this.list(effectivePerson, business, adjustPage, adjustPageSize, wi.getKey());
+			List<Wo> wos = Wo.copier.copy(os);
+			result.setData(wos);
+			result.setCount(this.count(effectivePerson, business, wi.getKey()));
+			return result;
+		}
+	}
+
+	private List<PersonCard> list(EffectivePerson effectivePerson, Business business, Integer adjustPage, Integer adjustPageSize, String keyString) throws Exception {
+		EntityManager em = business.entityManagerContainer().get(PersonCard.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<PersonCard> cq = cb.createQuery(PersonCard.class);
+		Root<PersonCard> root = cq.from(PersonCard.class);
+
+		Order _order = cb.asc(root.get(PersonCard_.orderNumber));
+		Predicate pe = cb.equal(root.get(PersonCard_.distinguishedName), effectivePerson.getDistinguishedName());
+		if (StringUtils.isNotEmpty(keyString)) {
+			String key = StringUtils.trim(StringUtils.replaceEach(keyString, new String[] { "\u3000", "?", "%" }, new String[] { " ", "", "" }));
+			if (StringUtils.isNotEmpty(key)) {
+				Predicate p = cb.or(cb.like(root.get(PersonCard_.name), "%" + key + "%"), cb.like(root.get(PersonCard_.status), "%" + key + "%"),
+						cb.like(root.get(PersonCard_.mobile), "%" + key + "%"), cb.like(root.get(PersonCard_.officePhone), "%" + key + "%"),
+						cb.like(root.get(PersonCard_.pinyin), "%" + key + "%"), cb.like(root.get(PersonCard_.pinyinInitial), "%" + key + "%"),
+						cb.like(root.get(PersonCard_.groupType), "%" + key + "%"));
+				p = cb.and(p,pe);
+
+					cq.select(root).where(p).orderBy(cb.asc(root.get(PersonCard_.orderNumber))); 
+			} else {
+					cq.select(root).where(pe).orderBy(cb.asc(root.get(PersonCard_.orderNumber)));				
+			}
+
+		} else {
+				cq.select(root).where(pe).orderBy(cb.asc(root.get(PersonCard_.orderNumber)));
+		}
+		return em.createQuery(cq).setFirstResult((adjustPage - 1) * adjustPageSize).setMaxResults(adjustPageSize).getResultList();
+	}
+
+	private Long count(EffectivePerson effectivePerson, Business business, String keyString) throws Exception {
+		EntityManager em = business.entityManagerContainer().get(PersonCard.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<PersonCard> root = cq.from(PersonCard.class);
+
+		// cq.select(cb.count(root));
+		Predicate pe = cb.equal(root.get(PersonCard_.distinguishedName), effectivePerson.getDistinguishedName());
+		if (StringUtils.isNotEmpty(keyString)) {
+			String key = StringUtils.trim(StringUtils.replace(keyString, "\u3000", " "));
+			if (StringUtils.isNotEmpty(key)) {
+				
+				Predicate p = cb.or(cb.like(root.get(PersonCard_.name), "%" + key + "%"), cb.like(root.get(PersonCard_.status), "%" + key + "%"),
+						cb.like(root.get(PersonCard_.mobile), "%" + key + "%"), cb.like(root.get(PersonCard_.officePhone), "%" + key + "%"),
+						cb.like(root.get(PersonCard_.pinyin), "%" + key + "%"), cb.like(root.get(PersonCard_.pinyinInitial), "%" + key + "%"),
+						cb.like(root.get(PersonCard_.groupType), "%" + key + "%"));
+				p = cb.and(p,pe);
+				cq.select(cb.count(root)).where(p);
+			} else {
+				cq.select(cb.count(root)).where(pe);
+			}
+		} else {
+			cq.select(cb.count(root)).where(pe);
+		}
+		return em.createQuery(cq).getSingleResult();
+	}
+
+	public static class Wo extends WoPersonCardAbstract {
+		private static final long serialVersionUID = 1276641320278402941L;
+		static WrapCopier<PersonCard, Wo> copier = WrapCopierFactory.wo(PersonCard.class, Wo.class, null, JpaObject.FieldsInvisible);
+	}
+
+	public static class Wi extends GsonPropertyObject {
+		@FieldDescribe("匹配关键字:姓名,手机号,电话,姓名拼音,分组,状态")
+		private String key;
+
+		public String getKey() {
+			return key;
+		}
+
+		public void setKey(String key) {
+			this.key = key;
+		}
+
+	}
+
+}

+ 141 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/personcard/ActionListPagingWithGroup.java

@@ -0,0 +1,141 @@
+package com.x.organization.assemble.control.jaxrs.personcard;
+
+import java.util.Date;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Order;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import javax.persistence.metamodel.SingularAttribute;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.gson.GsonPropertyObject;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.organization.assemble.control.Business;
+import com.x.organization.assemble.control.jaxrs.personcard.ActionList.Wo;
+import com.x.organization.core.entity.PersonCard;
+import com.x.organization.core.entity.PersonCard_;
+
+
+class ActionListPagingWithGroup extends BaseAction {
+
+	private static Logger logger = LoggerFactory.getLogger(ActionListPagingWithGroup.class);
+	//SingularAttribute<JpaObject, Date> defaultOrder = PersonCard_.createTime; 
+
+	// 线索分页查询,具备多个字段的like查询(无权限控制)
+	ActionResult<List<Wo>> Execute_Paging_groupType(EffectivePerson effectivePerson, Integer adjustPage, Integer adjustPageSize, JsonElement jsonElement)
+			throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<List<Wo>> result = new ActionResult<>();
+			Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
+			Business business = new Business(emc);
+			List<PersonCard> os = this.list(effectivePerson, business, adjustPage, adjustPageSize,wi.getGroupType(),wi.getKey());
+			List<Wo> wos = Wo.copier.copy(os);
+			result.setData(wos);
+			result.setCount(this.count(effectivePerson, business,wi.getGroupType(), wi.getKey()));
+			return result;
+		}
+	}
+
+	private List<PersonCard> list(EffectivePerson effectivePerson, Business business, Integer adjustPage, Integer adjustPageSize, String grouptype, String keyString) throws Exception {
+		EntityManager em = business.entityManagerContainer().get(PersonCard.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<PersonCard> cq = cb.createQuery(PersonCard.class);
+		Root<PersonCard> root = cq.from(PersonCard.class);
+
+		Order _order = cb.asc(root.get(PersonCard_.orderNumber));
+		Predicate pe = cb.equal(root.get(PersonCard_.distinguishedName), effectivePerson.getDistinguishedName());
+		if(StringUtils.isNotEmpty(grouptype)){
+			pe = cb.and(pe,cb.equal(root.get(PersonCard_.groupType),grouptype));
+		}
+		
+		if (StringUtils.isNotEmpty(keyString)) {
+			String key = StringUtils.trim(StringUtils.replaceEach(keyString, new String[] { "\u3000", "?", "%" }, new String[] { " ", "", "" }));
+			if (StringUtils.isNotEmpty(key)) {
+				Predicate p = cb.or(cb.like(root.get(PersonCard_.name), "%" + key + "%"), cb.like(root.get(PersonCard_.status), "%" + key + "%"),
+						cb.like(root.get(PersonCard_.mobile), "%" + key + "%"), cb.like(root.get(PersonCard_.officePhone), "%" + key + "%"),
+						cb.like(root.get(PersonCard_.pinyin), "%" + key + "%"), cb.like(root.get(PersonCard_.pinyinInitial), "%" + key + "%"));
+				p = cb.and(p,pe);
+					cq.select(root).where(p).orderBy(cb.asc(root.get(PersonCard_.orderNumber)));
+			} else {
+					cq.select(root).where(pe).orderBy(cb.asc(root.get(PersonCard_.orderNumber)));				
+			} 
+
+		} else {
+				cq.select(root).where(pe).orderBy(cb.asc(root.get(PersonCard_.orderNumber)));
+		}
+		return em.createQuery(cq).setFirstResult((adjustPage - 1) * adjustPageSize).setMaxResults(adjustPageSize).getResultList();
+	}
+
+	private Long count(EffectivePerson effectivePerson, Business business,String grouptype ,String keyString) throws Exception {
+		EntityManager em = business.entityManagerContainer().get(PersonCard.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<PersonCard> root = cq.from(PersonCard.class);
+
+		// cq.select(cb.count(root));
+		Predicate pe = cb.equal(root.get(PersonCard_.distinguishedName), effectivePerson.getDistinguishedName());
+		if(StringUtils.isNotEmpty(grouptype)){
+			pe = cb.and(pe,cb.equal(root.get(PersonCard_.groupType),grouptype));
+		}
+		if (StringUtils.isNotEmpty(keyString)) {
+			String key = StringUtils.trim(StringUtils.replace(keyString, "\u3000", " "));
+			if (StringUtils.isNotEmpty(key)) {
+				Predicate p = cb.or(cb.like(root.get(PersonCard_.name), "%" + key + "%"), cb.like(root.get(PersonCard_.status), "%" + key + "%"),
+						cb.like(root.get(PersonCard_.mobile), "%" + key + "%"), cb.like(root.get(PersonCard_.officePhone), "%" + key + "%"),
+						cb.like(root.get(PersonCard_.pinyin), "%" + key + "%"), cb.like(root.get(PersonCard_.pinyinInitial), "%" + key + "%"));
+				p = cb.and(p,pe);
+				cq.select(cb.count(root)).where(p);
+			} else {
+				cq.select(cb.count(root)).where(pe);
+			}
+		} else {
+			cq.select(cb.count(root)).where(pe);
+		}
+		return em.createQuery(cq).getSingleResult();
+	}
+
+	public static class Wo extends WoPersonCardAbstract {
+		private static final long serialVersionUID = 1276641320278402941L;
+		static WrapCopier<PersonCard, Wo> copier = WrapCopierFactory.wo(PersonCard.class, Wo.class, null, JpaObject.FieldsInvisible);
+	}
+
+	public static class Wi extends GsonPropertyObject {
+		@FieldDescribe("匹配关键字")
+		private String key;
+		
+		@FieldDescribe("分组名称")
+		private String groupType;
+
+		public String getKey() {
+			return key;
+		}
+
+		public void setKey(String key) {
+			this.key = key;
+		}
+		public String getGroupType() {
+			return groupType;
+		}
+
+		public void setGroupType(String groupType) {
+			this.groupType = groupType;
+		}
+
+	}
+
+}

+ 97 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/personcard/ActionUpdate.java

@@ -0,0 +1,97 @@
+package com.x.organization.assemble.control.jaxrs.personcard;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.reflect.FieldUtils;
+import org.apache.commons.beanutils.PropertyUtils;
+import java.lang.reflect.Field;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.entity.annotation.CheckPersistType;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.cache.ApplicationCache;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ListTools;
+import com.x.organization.assemble.control.Business;
+import com.x.organization.assemble.control.message.OrgMessageFactory;
+import com.x.organization.core.entity.PersonCard;
+
+
+
+public class ActionUpdate extends BaseAction{
+	private static Logger logger = LoggerFactory.getLogger(ActionUpdate.class);
+
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String cardid, JsonElement jsonElement) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<Wo> result = new ActionResult<>();
+			Business business = new Business(emc);
+			Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
+			PersonCard personCard = business.personCard().pick(cardid);
+			
+			if (null == personCard) {
+				throw new ExceptionPersonCardNotExist(cardid);
+			}
+			Wi.copier.copy(wi, personCard);
+			emc.beginTransaction(PersonCard.class);
+			
+			PersonCard entityPerson = emc.find(cardid, PersonCard.class);
+			if (null == personCard.getId() || StringUtils.isBlank(entityPerson.getId())) {
+				entityPerson.setId(cardid);
+				throw new ExceptionPersonCardNotExist(cardid);
+			}
+			
+			personCard.copyTo(entityPerson); 	
+			if(entityPerson.getGroupType().equals("")){
+				entityPerson.setGroupType("默认分组");
+			}
+			
+			emc.check(entityPerson, CheckPersistType.all);
+			emc.commit();
+			ApplicationCache.notify(PersonCard.class);
+			
+			OrgMessageFactory  orgMessageFactory = new OrgMessageFactory();
+			orgMessageFactory.createMessageCommunicate("modfiy", "personCard", personCard, effectivePerson);
+			
+			Wo wo = new Wo();
+			wo.setId(personCard.getId());
+			result.setData(wo);
+			return result;
+		}
+	}
+
+	static class Wi extends PersonCard {
+		private static final long serialVersionUID = -4714395467753481398L;
+		static WrapCopier<Wi, PersonCard> copier = WrapCopierFactory.wi(Wi.class, PersonCard.class, null, ListTools.toList(JpaObject.FieldsUnmodify, "pinyin", "pinyinInitial","distinguishedName","inputTime","orderNumber"));
+	}
+
+	public static class Wo extends WoPersonCardAbstract {
+		private static final long serialVersionUID = 7871578639804765941L;
+		static WrapCopier<PersonCard, Wo> copier = WrapCopierFactory.wo(PersonCard.class, Wo.class, null, JpaObject.FieldsUnmodify);
+	}
+	
+	/*public void copyTo(Object a,Object o, boolean ignoreNull) throws Exception {
+		List<String> list = new ArrayList<String>();
+		Collection<String> excludes = list;
+		for (Field fld : FieldUtils.getAllFields(a.getClass())) {
+			if (!excludes.contains(fld.getName())) {
+				if (PropertyUtils.isReadable(a, fld.getName()) && PropertyUtils.isWriteable(o, fld.getName())) {
+					Object value = PropertyUtils.getProperty(a, fld.getName());
+					if (ignoreNull && (null == value)) {
+						value = PropertyUtils.getProperty(o, fld.getName());
+					}
+					PropertyUtils.setProperty(o, fld.getName(), value);
+				}
+			}
+		}
+	}*/
+}

+ 107 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/personcard/BaseAction.java

@@ -0,0 +1,107 @@
+package com.x.organization.assemble.control.jaxrs.personcard;
+
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.gson.GsonPropertyObject;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.base.core.project.organization.OrganizationDefinition;
+import com.x.organization.assemble.control.Business;
+import com.x.organization.core.entity.PersonCard;
+import com.x.organization.core.entity.Role;
+
+abstract class BaseAction extends StandardJaxrsAction {
+
+	
+	public static class WoPersonCardAbstract extends PersonCard {
+
+		private static final long serialVersionUID = 8148720363115902733L;
+	}
+	
+	// 初始化信息
+		public PersonCard initDefaultValue(EffectivePerson effectivePerson, PersonCard personCard,PersonCard newCard) {
+		    //System.out.println("personCard_groupType="+personCard.getStatus());
+		    //System.out.println("newCard_groupType="+newCard);
+			return personCard;
+		}
+	
+	
+	/** 如果唯一标识不为空,要检查唯一标识是否唯一 */
+	protected boolean uniqueDuplicateWhenNotEmpty(Business business, Role role) throws Exception {
+		if (StringUtils.isNotEmpty(role.getUnique())) {
+			if (business.entityManagerContainer().duplicateWithFlags(role.getId(), Role.class, role.getUnique())) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	public static class WoRoleAbstract extends Role {
+
+		private static final long serialVersionUID = 8148720363115902733L;
+		@FieldDescribe("对角色的操作权限")
+		private Control control = new Control();
+
+		public Control getControl() {
+			return control;
+		}
+
+		public void setControl(Control control) {
+			this.control = control;
+		}
+	}
+
+	public static class Control extends GsonPropertyObject {
+
+		private Boolean allowEdit = false;
+		private Boolean allowDelete = false;
+
+		public Boolean getAllowEdit() {
+			return allowEdit;
+		}
+
+		public void setAllowEdit(Boolean allowEdit) {
+			this.allowEdit = allowEdit;
+		}
+
+		public Boolean getAllowDelete() {
+			return allowDelete;
+		}
+
+		public void setAllowDelete(Boolean allowDelete) {
+			this.allowDelete = allowDelete;
+		}
+
+	}
+
+	protected <T extends WoRoleAbstract> void updateControl(EffectivePerson effectivePerson, Business business,
+			List<T> list) throws Exception {
+		if (effectivePerson.isManager() || business.hasAnyRole(effectivePerson,
+				OrganizationDefinition.OrganizationManager, OrganizationDefinition.RoleManager)) {
+			for (T t : list) {
+				t.getControl().setAllowDelete(true);
+				t.getControl().setAllowEdit(true);
+			}
+		} else {
+			for (T t : list) {
+				t.getControl().setAllowDelete(false);
+				t.getControl().setAllowEdit(false);
+			}
+		}
+	}
+
+	protected <T extends WoRoleAbstract> void updateControl(EffectivePerson effectivePerson, Business business, T t)
+			throws Exception {
+		if (effectivePerson.isManager() || business.hasAnyRole(effectivePerson,
+				OrganizationDefinition.OrganizationManager, OrganizationDefinition.RoleManager)) {
+			t.getControl().setAllowDelete(true);
+			t.getControl().setAllowEdit(true);
+		} else {
+			t.getControl().setAllowDelete(false);
+			t.getControl().setAllowEdit(false);
+		}
+	}
+}

+ 13 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/personcard/ExceptionDenyCreateRole.java

@@ -0,0 +1,13 @@
+package com.x.organization.assemble.control.jaxrs.personcard;
+
+import com.x.base.core.project.exception.PromptException;
+import com.x.base.core.project.http.EffectivePerson;
+
+class ExceptionDenyCreateRole extends PromptException {
+
+	private static final long serialVersionUID = 4132300948670472899L;
+
+	ExceptionDenyCreateRole(EffectivePerson effectivePerson, String name) {
+		super("{} 不能创建角色:{}, 权限不足.", effectivePerson.getDistinguishedName(), name);
+	}
+}

+ 12 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/personcard/ExceptionNameEmpty.java

@@ -0,0 +1,12 @@
+package com.x.organization.assemble.control.jaxrs.personcard;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionNameEmpty extends PromptException {
+
+	private static final long serialVersionUID = 4132300948670472899L;
+
+	ExceptionNameEmpty() {
+		super("姓名不能为空.");
+	}
+}

+ 12 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/personcard/ExceptionPersonCardNotExist.java

@@ -0,0 +1,12 @@
+package com.x.organization.assemble.control.jaxrs.personcard;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionPersonCardNotExist extends PromptException {
+
+	private static final long serialVersionUID = 4132300948670472899L;
+
+	ExceptionPersonCardNotExist(String flag) {
+		super("个人名片:{}, 不存在.", flag);
+	}
+}

+ 181 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/personcard/PersonCardAction.java

@@ -0,0 +1,181 @@
+package com.x.organization.assemble.control.jaxrs.personcard;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.container.AsyncResponse;
+import javax.ws.rs.container.Suspended;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.project.annotation.JaxrsDescribe;
+import com.x.base.core.project.annotation.JaxrsMethodDescribe;
+import com.x.base.core.project.annotation.JaxrsParameterDescribe;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.http.HttpMediaType;
+import com.x.base.core.project.jaxrs.ResponseFactory;
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+
+
+@Path("personcard")
+@JaxrsDescribe("个人通讯录操作")
+public class PersonCardAction extends StandardJaxrsAction {
+
+	private static Logger logger = LoggerFactory.getLogger(PersonCardAction.class);
+	
+	@JaxrsMethodDescribe(value = "获取个人名片.", action = ActionGet.class)
+	@GET
+	@Path("{flag}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void get(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			@JaxrsParameterDescribe("名片标识") @PathParam("flag") String flag) {
+		ActionResult<ActionGet.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionGet().execute(effectivePerson, flag);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+	@JaxrsMethodDescribe(value = "创建名片.", action = ActionCreate.class)
+	@POST
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void create(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			JsonElement jsonElement) {
+		ActionResult<ActionCreate.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionCreate().execute(effectivePerson, jsonElement);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, jsonElement);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+	@JaxrsMethodDescribe(value = "更新个人名片.", action = ActionUpdate.class)
+	@PUT
+	@Path("{flag}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void update(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			@JaxrsParameterDescribe("名片标识") @PathParam("flag") String flag, JsonElement jsonElement) {
+		ActionResult<ActionUpdate.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionUpdate().execute(effectivePerson, flag, jsonElement);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, jsonElement);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result)); 
+	}
+
+	@JaxrsMethodDescribe(value = "删除个人名片.", action = ActionDelete.class)
+	@DELETE
+	@Path("{flag}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void delete(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			@JaxrsParameterDescribe("名片标识") @PathParam("flag") String flag) {
+		ActionResult<ActionDelete.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionDelete().execute(effectivePerson, flag);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+	
+	@JaxrsMethodDescribe(value = "获取当前登录人的所有名片", action = ActionList.class)
+	@GET
+	@Path("mylist")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void mylist(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request) {
+		ActionResult<List<ActionList.Wo>> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionList().MyExecute(effectivePerson);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+	
+	@JaxrsMethodDescribe(value = "获取当前登录人的名片.分页", action = ActionListPaging.class)
+	@PUT
+	@Path("listpaging/page/{page}/size/{size}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void ListPaging(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			@JaxrsParameterDescribe("页码") @PathParam("page") Integer page, @JaxrsParameterDescribe("每页几条") @PathParam("size") Integer size,
+			@JaxrsParameterDescribe("姓名,手机号,电话,姓名拼音,分组,状态") JsonElement jsonElement) {
+		ActionResult<List<ActionListPaging.Wo>> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionListPaging().Execute_Paging_like(effectivePerson, page, size, jsonElement);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+	
+	@JaxrsMethodDescribe(value = "按分组查询当前登录人的名片.分页", action = ActionListPagingWithGroup.class) 
+	@PUT
+	@Path("listpagingwithgroup/page/{page}/size/{size}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8) 
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void ListPagingWithGroupType(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			@JaxrsParameterDescribe("页码") @PathParam("page") Integer page, @JaxrsParameterDescribe("每页几条") @PathParam("size") Integer size,
+			@JaxrsParameterDescribe("匹配关键字(分组)") JsonElement jsonElement) {
+		ActionResult<List<ActionListPagingWithGroup.Wo>> result = new ActionResult<>(); 
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionListPagingWithGroup().Execute_Paging_groupType(effectivePerson, page, size, jsonElement);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);  
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+	
+	@JaxrsMethodDescribe(value = "列出当前用户的所有分组", action = ActionListMyGroupTypes.class) 
+	@GET
+	@Path("listgrouptypes")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8) 
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void ListGroupTypes(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request) {
+		ActionResult<String[]> result = new ActionResult<>(); 
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionListMyGroupTypes().MyExecute(effectivePerson);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);  
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+	
+}

+ 212 - 0
o2server/x_organization_core_entity/src/main/java/com/x/organization/core/entity/PermissionSetting.java

@@ -0,0 +1,212 @@
+package com.x.organization.core.entity;
+
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.OrderColumn;
+import javax.persistence.Table;
+
+import javax.persistence.UniqueConstraint;
+
+import org.apache.openjpa.persistence.PersistentCollection;
+import org.apache.openjpa.persistence.jdbc.ContainerTable;
+import org.apache.openjpa.persistence.jdbc.ElementColumn;
+import org.apache.openjpa.persistence.jdbc.ElementIndex;
+import org.apache.openjpa.persistence.jdbc.Index;
+
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.entity.SliceJpaObject;
+import com.x.base.core.entity.annotation.CheckPersist;
+import com.x.base.core.entity.annotation.ContainerEntity;
+import com.x.base.core.entity.annotation.Flag;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.tools.DateTools;
+
+@Entity
+@ContainerEntity
+@Table(name = PersistenceProperties.PermissionSetting.table, uniqueConstraints = {
+		@UniqueConstraint(name = PersistenceProperties.PermissionSetting.table + JpaObject.IndexNameMiddle
+				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,
+						JpaObject.CREATETIMECOLUMN, JpaObject.UPDATETIMECOLUMN, JpaObject.SEQUENCECOLUMN }) })
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+public class PermissionSetting extends SliceJpaObject {
+
+	public static final String HIDDENMOBILESYMBOL = "***********";
+
+	private static final long serialVersionUID = 5733185578089403629L;
+
+	private static final String TABLE = PersistenceProperties.PermissionSetting.table;
+
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	@FieldDescribe("数据库主键,自动生成.")
+	@Id
+	@Column(length = length_id, name = ColumnNamePrefix + id_FIELDNAME)
+	private String id = createId();
+
+	/* 以上为 JpaObject 默认字段 */
+
+	public void onPersist() throws Exception {
+	}
+
+	/* 更新运行方法 */
+
+	/* Entity 默认字段结束 */
+
+	public static final String excludeUnit_FIELDNAME = "excludeUnit";
+	@FieldDescribe("不允许被查询单位.")
+	@PersistentCollection(fetch = FetchType.EAGER)
+	@OrderColumn(name = ORDERCOLUMNCOLUMN)
+	@ContainerTable(name = TABLE + ContainerTableNameMiddle + excludeUnit_FIELDNAME, joinIndex = @Index(name = TABLE
+	+ IndexNameMiddle + excludeUnit_FIELDNAME + JoinIndexNameSuffix))
+	@ElementColumn(length = JpaObject.length_id, name = ColumnNamePrefix + excludeUnit_FIELDNAME)
+	@ElementIndex(name = TABLE + IndexNameMiddle + excludeUnit_FIELDNAME + ElementIndexNameSuffix)
+	@CheckPersist(allowEmpty = true)
+	private List<String> excludeUnit;
+
+	public static final String excludePerson_FIELDNAME = "excludePerson";
+	@FieldDescribe("不允许被查询个人.")
+	@PersistentCollection(fetch = FetchType.EAGER)
+	@OrderColumn(name = ORDERCOLUMNCOLUMN)
+	@ContainerTable(name = TABLE + ContainerTableNameMiddle + excludePerson_FIELDNAME, joinIndex = @Index(name = TABLE
+	+ IndexNameMiddle + excludePerson_FIELDNAME + JoinIndexNameSuffix))
+	@ElementColumn(length = JpaObject.length_id, name = ColumnNamePrefix + excludePerson_FIELDNAME)
+	@ElementIndex(name = TABLE + IndexNameMiddle + excludePerson_FIELDNAME + ElementIndexNameSuffix)
+	@CheckPersist(allowEmpty = true)
+	private List<String> excludePerson;
+	
+	public static final String limitQueryOuter_FIELDNAME = "limitQueryOuter";
+	@FieldDescribe("限制查看外部门.")
+	@PersistentCollection(fetch = FetchType.EAGER)
+	@OrderColumn(name = ORDERCOLUMNCOLUMN)
+	@ContainerTable(name = TABLE + ContainerTableNameMiddle + limitQueryOuter_FIELDNAME, joinIndex = @Index(name = TABLE
+	+ IndexNameMiddle + limitQueryOuter_FIELDNAME + JoinIndexNameSuffix))
+	@ElementColumn(length = JpaObject.length_id, name = ColumnNamePrefix + limitQueryOuter_FIELDNAME)
+	@ElementIndex(name = TABLE + IndexNameMiddle + limitQueryOuter_FIELDNAME + ElementIndexNameSuffix)
+	@CheckPersist(allowEmpty = true)
+	private List<String> limitQueryOuter;
+	
+	public static final String limitQueryAll_FIELDNAME = "limitQueryAll";
+	@FieldDescribe("限制查看所有人")
+	@PersistentCollection(fetch = FetchType.EAGER)
+	@OrderColumn(name = ORDERCOLUMNCOLUMN)
+	@ContainerTable(name = TABLE + ContainerTableNameMiddle + limitQueryAll_FIELDNAME, joinIndex = @Index(name = TABLE
+	+ IndexNameMiddle + limitQueryAll_FIELDNAME + JoinIndexNameSuffix))
+	@ElementColumn(length = JpaObject.length_id, name = ColumnNamePrefix + limitQueryAll_FIELDNAME)
+	@ElementIndex(name = TABLE + IndexNameMiddle + limitQueryAll_FIELDNAME + ElementIndexNameSuffix)
+	@CheckPersist(allowEmpty = true)
+	private List<String> limitQueryAll;		
+	
+	public static final String explain_FIELDNAME = "explain";
+	@FieldDescribe("描述.")
+	@Column(length = JpaObject.length_255B, name = ColumnNamePrefix + explain_FIELDNAME)
+	@Index(name = TABLE + IndexNameMiddle + explain_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	private String explain;
+	
+	public static final String status_FIELDNAME = "status";
+	@FieldDescribe("状态.草稿,发布")
+	@Column(length = length_255B, name = ColumnNamePrefix + status_FIELDNAME)
+	@Index(name = TABLE + IndexNameMiddle + status_FIELDNAME)
+	@CheckPersist(allowEmpty = false)
+	private String status;
+	
+	public static final String extend1_FIELDNAME = "extend1";
+	@Flag
+	@FieldDescribe("extend1扩展字段.")
+	@Column(length = length_255B, name = ColumnNamePrefix + extend1_FIELDNAME)
+	@Index(name = TABLE + IndexNameMiddle + extend1_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	private String extend1;
+
+	public static final String extend2_FIELDNAME = "extend2";
+	@Flag
+	@FieldDescribe("extend2扩展字段.")
+	@Column(length = length_255B, name = ColumnNamePrefix + extend2_FIELDNAME)
+	@Index(name = TABLE + IndexNameMiddle + extend2_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	private String extend2;
+	
+	public static final String extend3_FIELDNAME = "extend3";
+	@Flag
+	@FieldDescribe("extend3扩展字段.")
+	@Column(length = length_255B, name = ColumnNamePrefix + extend3_FIELDNAME)
+	@Index(name = TABLE + IndexNameMiddle + extend3_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	private String extend3;
+	
+	public List<String> getExcludeUnit() {
+		return excludeUnit;
+	}
+
+	public void setExcludeUnit(List<String> excludeUnit) {
+		this.excludeUnit = excludeUnit;
+	}
+
+	public List<String> getExcludePerson() {
+		return excludePerson;
+	}
+	public void setExcludePerson(List<String> excludePerson) {
+		this.excludePerson = excludePerson;
+	}	
+	
+	public List<String> getLimitQueryOuter() {
+		return limitQueryOuter;
+	}
+
+	public void setLimitQueryOuter(List<String> limitQueryOuter) {
+		this.limitQueryOuter = limitQueryOuter;
+	}	
+	
+	public List<String> getLimitQueryAll() {
+		return limitQueryAll;
+	}
+	public void setLimitQueryAll(List<String> limitQueryAll) {
+		this.limitQueryAll = limitQueryAll;
+	}
+	public String getExplain() {
+		return explain;
+	}
+	public void setExplain(String explain) {
+		this.explain = explain;
+	}
+	
+	public String getStatus() {
+		return status;
+	}
+	public void setStatus(String status) {
+		this.status = status;
+	}
+	
+	public String getExtend1() {
+		return extend1;
+	}
+
+	public void setExtend1(String extend1) {
+		this.extend1 = extend1;
+	}
+	public String getExtend2() {
+		return extend2;
+	}
+	public void setExtend2(String extend2) {
+		this.extend2 = extend2;
+	}
+	public String getExtend3() {
+		return extend3;
+	}
+	public void setExtend3(String extend3) {
+		this.extend3 = extend3;
+	}
+
+}

+ 334 - 0
o2server/x_organization_core_entity/src/main/java/com/x/organization/core/entity/PersonCard.java

@@ -0,0 +1,334 @@
+package com.x.organization.core.entity;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.Lob;
+import javax.persistence.OrderColumn;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.persistence.UniqueConstraint;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateUtils;
+import org.apache.openjpa.persistence.PersistentCollection;
+import org.apache.openjpa.persistence.jdbc.ContainerTable;
+import org.apache.openjpa.persistence.jdbc.ElementColumn;
+import org.apache.openjpa.persistence.jdbc.ElementIndex;
+import org.apache.openjpa.persistence.jdbc.Index;
+
+import com.github.stuxuhai.jpinyin.PinyinFormat;
+import com.github.stuxuhai.jpinyin.PinyinHelper;
+import com.x.base.core.entity.AbstractPersistenceProperties;
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.entity.SliceJpaObject;
+import com.x.base.core.entity.annotation.CheckPersist;
+import com.x.base.core.entity.annotation.CheckRemove;
+import com.x.base.core.entity.annotation.CitationExist;
+import com.x.base.core.entity.annotation.CitationNotExist;
+import com.x.base.core.entity.annotation.ContainerEntity;
+import com.x.base.core.entity.annotation.Flag;
+import com.x.base.core.entity.type.GenderType;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.tools.DateTools;
+import com.x.base.core.project.tools.StringTools;
+
+@Entity
+@ContainerEntity
+@Table(name = PersistenceProperties.PersonCard.table, uniqueConstraints = {
+		@UniqueConstraint(name = PersistenceProperties.PersonCard.table + JpaObject.IndexNameMiddle
+				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,
+						JpaObject.CREATETIMECOLUMN, JpaObject.UPDATETIMECOLUMN, JpaObject.SEQUENCECOLUMN }) })
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+public class PersonCard extends SliceJpaObject {
+
+	public static final String HIDDENMOBILESYMBOL = "***********";
+
+	private static final long serialVersionUID = 5733185578089403629L;
+
+	private static final String TABLE = PersistenceProperties.PersonCard.table;
+
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	@FieldDescribe("数据库主键,自动生成.")
+	@Id
+	@Column(length = length_id, name = ColumnNamePrefix + id_FIELDNAME)
+	private String id = createId();
+
+	/* 以上为 JpaObject 默认字段 */
+
+	public void onPersist() throws Exception {
+		this.pinyin = StringUtils.lowerCase(PinyinHelper.convertToPinyinString(name, "", PinyinFormat.WITHOUT_TONE));
+		this.pinyinInitial = StringUtils.lowerCase(PinyinHelper.getShortPinyin(name));
+		/** 生成默认排序号 */
+		if (null == this.orderNumber) {
+			this.orderNumber = DateTools.timeOrderNumber();
+		}
+		/*if (null == this.groupType || "" == this.groupType) {
+			this.groupType = "默认分组";
+		}*/
+	}
+
+	/* 更新运行方法 */
+
+	/* Entity 默认字段结束 */
+	
+	public static final String name_FIELDNAME = "name";
+	@FieldDescribe("名称,可重名.")
+	@Column(length = length_255B, name = ColumnNamePrefix + name_FIELDNAME)
+	@Index(name = TABLE + IndexNameMiddle + name_FIELDNAME)
+	@CheckPersist(allowEmpty = false, simplyString = false)
+	private String name;
+
+	public static final String genderType_FIELDNAME = "genderType";
+	@FieldDescribe("性别.男:m,女:f,未知:d")
+	@Enumerated(EnumType.STRING)
+	@Column(length = GenderType.length, name = ColumnNamePrefix + genderType_FIELDNAME)
+	@Index(name = TABLE + IndexNameMiddle + genderType_FIELDNAME)
+	@CheckPersist(allowEmpty = false)
+	private GenderType genderType;
+	
+	public static final String groupType_FIELDNAME = "groupType";
+	@FieldDescribe("所属分组.")
+	@Column(length = JpaObject.length_255B, name = ColumnNamePrefix + groupType_FIELDNAME)
+	@Index(name = TABLE + IndexNameMiddle + groupType_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	private String groupType;
+
+
+	public static final String pinyin_FIELDNAME = "pinyin";
+	@FieldDescribe("name拼音,自动生成")
+	@Column(length = length_255B, name = ColumnNamePrefix + pinyin_FIELDNAME)
+	@Index(name = TABLE + IndexNameMiddle + pinyin_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	private String pinyin;
+
+	public static final String pinyinInitial_FIELDNAME = "pinyinInitial";
+	@FieldDescribe("name拼音首字母,自动生成")
+	@Column(length = AbstractPersistenceProperties.organization_name_length, name = ColumnNamePrefix
+			+ pinyinInitial_FIELDNAME)
+	@Index(name = TABLE + IndexNameMiddle + pinyinInitial_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	private String pinyinInitial;
+	
+	public static final String distinguishedName_FIELDNAME = "distinguishedName";
+	@Flag
+	@FieldDescribe("录入人,@P结尾.")
+	@Column(length = length_255B, name = ColumnNamePrefix + distinguishedName_FIELDNAME)
+	@Index(name = TABLE + IndexNameMiddle + distinguishedName_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	private String distinguishedName;
+
+	public static final String orderNumber_FIELDNAME = "orderNumber";
+	@FieldDescribe("排序号,升序排列,为空在最后")
+	@Column(name = ColumnNamePrefix + orderNumber_FIELDNAME)
+	@Index(name = TABLE + IndexNameMiddle + orderNumber_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	private Integer orderNumber;
+
+	public static final String mobile_FIELDNAME = "mobile";
+	@Flag
+	@FieldDescribe("必填,手机号.")
+	@Column(length = JpaObject.length_32B, name = ColumnNamePrefix + mobile_FIELDNAME)
+	/** 其他地区手机号不一致,所以这里使用外部校验,不使用mobileString */
+	@Index(name = TABLE + IndexNameMiddle + mobile_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	private String mobile;
+
+	public static final String officePhone_FIELDNAME = "officePhone";
+	@FieldDescribe("办公电话.")
+	@Column(length = JpaObject.length_32B, name = ColumnNamePrefix + officePhone_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	private String officePhone;
+	
+	public static final String address_FIELDNAME = "address";
+	@FieldDescribe("地址.")
+	@Column(length = JpaObject.length_255B, name = ColumnNamePrefix + address_FIELDNAME)
+	@Index(name = TABLE + IndexNameMiddle + address_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	private String address;
+	
+	public static final String description_FIELDNAME = "description";
+	@FieldDescribe("备注.")
+	@Column(length = JpaObject.length_255B, name = ColumnNamePrefix + description_FIELDNAME)
+	@Index(name = TABLE + IndexNameMiddle + description_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	private String description;
+	
+	public static final String extend1_FIELDNAME = "extend1";
+	@Flag
+	@FieldDescribe("extend1扩展字段.")
+	@Column(length = length_255B, name = ColumnNamePrefix + extend1_FIELDNAME)
+	@Index(name = TABLE + IndexNameMiddle + extend1_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	private String extend1;
+
+	public static final String extend2_FIELDNAME = "extend2";
+	@Flag
+	@FieldDescribe("extend2扩展字段.")
+	@Column(length = length_255B, name = ColumnNamePrefix + extend2_FIELDNAME)
+	@Index(name = TABLE + IndexNameMiddle + extend2_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	private String extend2;
+	
+	public static final String extend3_FIELDNAME = "extend3";
+	@Flag
+	@FieldDescribe("extend3扩展字段.")
+	@Column(length = length_255B, name = ColumnNamePrefix + extend3_FIELDNAME)
+	@Index(name = TABLE + IndexNameMiddle + extend3_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	private String extend3;
+
+	public static final String inputTime_FIELDNAME = "inputTime";
+	@FieldDescribe("录入时间.")
+	@Index(name = TABLE + IndexNameMiddle + inputTime_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	@Column(length = length_255B, name = ColumnNamePrefix + inputTime_FIELDNAME)
+	private String inputTime;
+	
+	public static final String status_FIELDNAME = "status";
+	@FieldDescribe("状态.草稿,发布")
+	@Column(length = length_255B, name = ColumnNamePrefix + status_FIELDNAME)
+	@Index(name = TABLE + IndexNameMiddle + status_FIELDNAME)
+	@CheckPersist(allowEmpty = false)
+	private String status;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	public String getGroupType() {
+		return groupType;
+	}
+
+	public void setGroupType(String groupType) {
+		this.groupType = groupType;
+	}
+
+	public String getMobile() {
+		return mobile;
+	}
+
+	public void setMobile(String mobile) {
+		this.mobile = mobile;
+	}
+
+	public String getPinyin() {
+		return pinyin;
+	}
+
+	public void setPinyin(String pinyin) {
+		this.pinyin = pinyin;
+	}
+
+	public String getPinyinInitial() {
+		return pinyinInitial;
+	}
+
+	public void setPinyinInitial(String pinyinInitial) {
+		this.pinyinInitial = pinyinInitial;
+	}
+	public String getDistinguishedName() {
+		return distinguishedName;
+	}
+
+	public void setDistinguishedName(String distinguishedName) {
+		this.distinguishedName = distinguishedName;
+	}
+
+	public GenderType getGenderType() {
+		return genderType;
+	}
+
+	public void setGenderType(GenderType genderType) {
+		this.genderType = genderType;
+	}
+
+	public String getOfficePhone() {
+		return officePhone;
+	}
+
+	public void setOfficePhone(String officePhone) {
+		this.officePhone = officePhone;
+	}
+
+	public Integer getOrderNumber() {
+		return orderNumber;
+	}
+
+	public void setOrderNumber(Integer orderNumber) {
+		this.orderNumber = orderNumber;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}	
+	public String getAddress() {
+		return address;
+	}
+
+	public void setAddress(String address) {
+		this.address = address;
+	}	
+
+	public String getExtend1() {
+		return extend1;
+	}
+
+	public void setExtend1(String extend1) {
+		this.extend1 = extend1;
+	}
+	public String getExtend2() {
+		return extend2;
+	}
+	public void setExtend2(String extend2) {
+		this.extend2 = extend2;
+	}
+	public String getExtend3() {
+		return extend3;
+	}
+	public void setExtend3(String extend3) {
+		this.extend3 = extend3;
+	}
+	
+
+	public String getInputTime() {
+		return inputTime;
+	}
+
+	public void setInputTime(String inputTime) {
+		this.inputTime = inputTime;
+	}
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+
+}