roo00 il y a 6 ans
Parent
commit
9b42e8689f
100 fichiers modifiés avec 2207 ajouts et 798 suppressions
  1. 94 3
      o2server/x_base_core_project/src/main/java/com/x/base/core/container/EntityManagerContainer.java
  2. 1 0
      o2server/x_base_core_project/src/main/java/com/x/base/core/container/factory/PersistenceXmlHelper.java
  3. 2 2
      o2server/x_base_core_project/src/main/java/com/x/base/core/container/factory/SliceEntityManagerContainerFactory.java
  4. 1 1
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/annotation/ModuleCategory.java
  5. 30 0
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Config.java
  6. 6 0
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/exception/ExceptionAccessDenied.java
  7. 18 18
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/http/ActionResult.java
  8. 8 6
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/jaxrs/StandardJaxrsAction.java
  9. 7 1
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/message/MessageConnector.java
  10. 1 1
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/organization/Empower.java
  11. 16 16
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/organization/EmpowerLog.java
  12. 37 5
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/queue/AbstractQueue.java
  13. 1 1
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/queue/QueueProcessThread.java
  14. 23 1
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/DateTools.java
  15. 46 17
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/ListTools.java
  16. 1 27
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_attendance_assemble_control.java
  17. 1 1
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_bbs_core_entity.java
  18. 1 1
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_cms_assemble_control.java
  19. 2 17
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_organization_assemble_express.java
  20. 2 2
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_organization_assemble_personal.java
  21. 0 42
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_processplatform_assemble_bam.java
  22. 4 3
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_processplatform_assemble_designer.java
  23. 2 46
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_processplatform_service_processing.java
  24. 3 35
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_query_assemble_designer.java
  25. 1 1
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_query_service_processing.java
  26. 6 5
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_teamwork_assemble_control.java
  27. 13 0
      o2server/x_base_core_project/src/test/java/com/x/base/core/project/test/list/TestClient.java
  28. 8 0
      o2server/x_base_core_project/src/test/java/test/com/x/base/core/project/TestClient.java
  29. 3 0
      o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/service/BBSUserInfoService.java
  30. 9 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/Business.java
  31. 46 4
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/factory/AppInfoFactory.java
  32. 0 2
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/factory/DocumentCommendFactory.java
  33. 84 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/factory/DocumentCommentCommendFactory.java
  34. 12 2
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/factory/DocumentCommentInfoFactory.java
  35. 1 1
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/appinfo/ActionListAll.java
  36. 91 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/appinfo/ActionListAllAppType.java
  37. 3 3
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/appinfo/ActionListWhatICanManage.java
  38. 137 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/appinfo/ActionListWhatICanManageWithAppType.java
  39. 41 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/appinfo/AppInfoAction.java
  40. 111 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/comment/ActionGet.java
  41. 2 4
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/comment/ActionListNextWithFilter.java
  42. 1 1
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/comment/ActionListPageWithFilter.java
  43. 1 1
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/comment/ActionListPrevWithFilter.java
  44. 63 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/comment/ActionPersistCommend.java
  45. 55 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/comment/ActionPersistUnCommend.java
  46. 13 1
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/comment/ActionSave.java
  47. 4 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/comment/BaseAction.java
  48. 65 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/comment/DocumentCommentInfoAction.java
  49. 2 2
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/comment/WrapInQueryDocumentCommentInfo.java
  50. 122 65
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/document/ActionPersistSaveDocument.java
  51. 1 1
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/document/DocumentAction.java
  52. 8 8
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/view/ActionListNextPageViewData.java
  53. 17 2
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/AppInfoService.java
  54. 31 13
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/AppInfoServiceAdv.java
  55. 6 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/CmsBatchOperationProcessService.java
  56. 87 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/CommentCommendPersistService.java
  57. 54 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/CommentCommendQueryService.java
  58. 122 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/CommentCommendService.java
  59. 4 4
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/DocumentCommentInfoQueryService.java
  60. 12 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/DocumentCommentInfoService.java
  61. 3 36
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/DocumentPersistService.java
  62. 8 7
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/PermissionOperateService.java
  63. 14 4
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/PermissionQueryService.java
  64. 8 5
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/ReviewService.java
  65. 1 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/common/excel/reader/Excel2007Reader.java
  66. 15 0
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/AppInfo.java
  67. 43 95
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/CmsPermissionService.java
  68. 109 0
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/DocumentCommentCommend.java
  69. 33 3
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/DocumentCommentInfo.java
  70. 4 0
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/PersistenceProperties.java
  71. 1 0
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/query/Row.java
  72. 130 64
      o2server/x_console/src/main/java/com/x/server/console/NodeAgent.java
  73. 1 0
      o2server/x_console/src/main/java/com/x/server/console/action/ActionConfig.java
  74. 16 14
      o2server/x_console/src/main/java/com/x/server/console/action/ActionRestoreData.java
  75. 22 25
      o2server/x_console/src/main/java/com/x/server/console/server/JettySeverTools.java
  76. 4 6
      o2server/x_console/src/main/java/com/x/server/console/server/application/ApplicationServerTools.java
  77. 0 126
      o2server/x_console/src/main/java/com/x/server/console/server/center/CenterServerTools3.java
  78. 0 1
      o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/attachment/ActionCreateFormProcessPlatform.java
  79. 0 1
      o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/building/ActionCreate.java
  80. 0 1
      o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/building/ActionGet.java
  81. 0 2
      o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/meeting/ActionAccept.java
  82. 54 0
      o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/meeting/ActionCheckIn.java
  83. 109 0
      o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/meeting/ActionCheckinCode.java
  84. 0 3
      o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/meeting/ActionConfirmDeny.java
  85. 0 2
      o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/meeting/ActionCreate.java
  86. 0 1
      o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/meeting/ActionGet.java
  87. 0 3
      o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/meeting/ActionListForwardMonthAll.java
  88. 0 7
      o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/meeting/ActionManualCompleted.java
  89. 0 3
      o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/meeting/ActionReject.java
  90. 4 0
      o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/meeting/BaseAction.java
  91. 36 0
      o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/meeting/MeetingAction.java
  92. 0 2
      o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/room/ActionDelete.java
  93. 0 4
      o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/room/ActionEdit.java
  94. 0 2
      o2server/x_meeting_core_entity/src/main/java/com/x/meeting/core/entity/Building.java
  95. 37 1
      o2server/x_meeting_core_entity/src/main/java/com/x/meeting/core/entity/Meeting.java
  96. 0 2
      o2server/x_meeting_core_entity/src/main/java/com/x/meeting/core/entity/Room.java
  97. 4 4
      o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/CacheFactory.java
  98. 4 4
      o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/ActionApplication.java
  99. 2 2
      o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/EmpowerJaxrsFilter.java
  100. 2 2
      o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/EmpowerLogJaxrsFilter.java

+ 94 - 3
o2server/x_base_core_project/src/main/java/com/x/base/core/container/EntityManagerContainer.java

@@ -51,12 +51,11 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 	}
 
 	public void persist(JpaObject o) throws Exception {
-		// o.onPersist();
+		//o.onPersist();
 		this.get(o.getClass()).persist(o);
 	}
 
 	public void persist(JpaObject o, CheckPersistType type) throws Exception {
-		// o.onPersist();
 		if (!type.equals(CheckPersistType.none)) {
 			check(o, type);
 		}
@@ -76,7 +75,7 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 
 	@SuppressWarnings("unchecked")
 	public void check(JpaObject jpa, CheckPersistType checkPersistType) throws Exception {
-		/** 运行方法进行字段处理 */
+		jpa.onPersist();
 		for (Entry<Field, CheckPersist> entry : entityManagerContainerFactory.getCheckPersistFields(jpa.getClass())
 				.entrySet()) {
 			Field field = entry.getKey();
@@ -1390,4 +1389,96 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 		return list;
 	}
 
+	/* 仅在单一数据库可用 */
+	public <T extends JpaObject, W extends GsonPropertyObject> List<W> fetchEqualAndEqualDescPaging(Class<T> clz,
+			WrapCopier<T, W> copier, String equalAttribute, Object equalValue, String otherEqualAttribute,
+			Object otherEqualValue, Integer page, Integer count, String orderAttribute) throws Exception {
+		List<T> os = fetchEqualAndEqualDescPaging(clz, copier.getCopyFields(), equalAttribute, equalValue,
+				otherEqualAttribute, otherEqualValue, page, count, orderAttribute);
+		return copier.copy(os);
+	}
+
+	/* 仅在单一数据库可用 */
+	public <T extends JpaObject> List<T> fetchEqualAndEqualDescPaging(Class<T> clz, String equalAttribute,
+			Object equalValue, String otherEqualAttribute, Object otherEqualValue, Integer page, Integer count,
+			String orderAttribute) throws Exception {
+		return fetchEqualAndEqualDescPaging(clz, JpaObject.singularAttributeField(clz, true, true), equalAttribute,
+				equalValue, otherEqualAttribute, otherEqualValue, page, count, orderAttribute);
+	}
+
+	/* 仅在单一数据库可用 */
+	public <T extends JpaObject, W extends GsonPropertyObject> List<T> fetchEqualAndEqualDescPaging(Class<T> clz,
+			List<String> fetchAttributes, String equalAttribute, Object equalValue, String otherEqualAttribute,
+			Object otherEqualValue, Integer page, Integer pageSize, String orderAttribute) throws Exception {
+		List<T> list = new ArrayList<>();
+		int max = (pageSize == null || pageSize < 1 || pageSize > MAX_PAGESIZE) ? DEFAULT_PAGESIZE : pageSize;
+		int startPosition = (page == null || page < 1) ? 0 : (page - 1) * max;
+		List<String> fields = ListTools.trim(fetchAttributes, true, true, JpaObject.id_FIELDNAME);
+		EntityManager em = this.get(clz);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Tuple> cq = cb.createQuery(Tuple.class);
+		Root<T> root = cq.from(clz);
+		List<Selection<?>> selections = new ArrayList<>();
+		for (String str : fields) {
+			selections.add(root.get(str));
+		}
+		Predicate p = cb.equal(root.get(equalAttribute), equalValue);
+		p = cb.and(p, cb.equal(root.get(otherEqualAttribute), otherEqualValue));
+		cq.multiselect(selections).where(p).orderBy(cb.desc(root.get(orderAttribute)));
+		for (Tuple o : em.createQuery(cq).setFirstResult(startPosition).setMaxResults(max).getResultList()) {
+			T t = clz.newInstance();
+			for (int i = 0; i < fields.size(); i++) {
+				PropertyUtils.setProperty(t, fields.get(i), o.get(selections.get(i)));
+			}
+			list.add(t);
+		}
+		return list;
+	}
+
+	/* 仅在单一数据库可用 */
+	public <T extends JpaObject, W extends GsonPropertyObject> List<W> fetchEqualAndNotEqualDescPaging(Class<T> clz,
+			WrapCopier<T, W> copier, String equalAttribute, Object equalValue, String otherNotEqualAttribute,
+			Object otherNotEqualValue, Integer page, Integer count, String orderAttribute) throws Exception {
+		List<T> os = fetchEqualAndNotEqualDescPaging(clz, copier.getCopyFields(), equalAttribute, equalValue,
+				otherNotEqualAttribute, otherNotEqualValue, page, count, orderAttribute);
+		return copier.copy(os);
+	}
+
+	/* 仅在单一数据库可用 */
+	public <T extends JpaObject> List<T> fetchEqualAndNotEqualDescPaging(Class<T> clz, String equalAttribute,
+			Object equalValue, String otherNotEqualAttribute, Object otherNotEqualValue, Integer page, Integer count,
+			String orderAttribute) throws Exception {
+		return fetchEqualAndNotEqualDescPaging(clz, JpaObject.singularAttributeField(clz, true, true), equalAttribute,
+				equalValue, otherNotEqualAttribute, otherNotEqualValue, page, count, orderAttribute);
+	}
+
+	/* 仅在单一数据库可用 */
+	public <T extends JpaObject, W extends GsonPropertyObject> List<T> fetchEqualAndNotEqualDescPaging(Class<T> clz,
+			List<String> fetchAttributes, String equalAttribute, Object equalValue, String otherNotEqualAttribute,
+			Object otherNotEqualValue, Integer page, Integer pageSize, String orderAttribute) throws Exception {
+		List<T> list = new ArrayList<>();
+		int max = (pageSize == null || pageSize < 1 || pageSize > MAX_PAGESIZE) ? DEFAULT_PAGESIZE : pageSize;
+		int startPosition = (page == null || page < 1) ? 0 : (page - 1) * max;
+		List<String> fields = ListTools.trim(fetchAttributes, true, true, JpaObject.id_FIELDNAME);
+		EntityManager em = this.get(clz);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Tuple> cq = cb.createQuery(Tuple.class);
+		Root<T> root = cq.from(clz);
+		List<Selection<?>> selections = new ArrayList<>();
+		for (String str : fields) {
+			selections.add(root.get(str));
+		}
+		Predicate p = cb.equal(root.get(equalAttribute), equalValue);
+		p = cb.and(p, cb.notEqual(root.get(otherNotEqualAttribute), otherNotEqualValue));
+		cq.multiselect(selections).where(p).orderBy(cb.desc(root.get(orderAttribute)));
+		for (Tuple o : em.createQuery(cq).setFirstResult(startPosition).setMaxResults(max).getResultList()) {
+			T t = clz.newInstance();
+			for (int i = 0; i < fields.size(); i++) {
+				PropertyUtils.setProperty(t, fields.get(i), o.get(selections.get(i)));
+			}
+			list.add(t);
+		}
+		return list;
+	}
+
 }

+ 1 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/container/factory/PersistenceXmlHelper.java

@@ -132,6 +132,7 @@ public class PersistenceXmlHelper {
 		properties.put("openjpa.QueryCompilationCache", "false");
 		properties.put("openjpa.LockManager", "none");
 		properties.put("openjpa.jdbc.ResultSetType", "scroll-insensitive");
+		properties.put("openjpa.Multithreaded", "true");
 		/* 如果启用本地初始化会导致classLoad的问题 */
 		properties.put("openjpa.DynamicEnhancementAgent", "false");
 		properties.put("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=false)");

+ 2 - 2
o2server/x_base_core_project/src/main/java/com/x/base/core/container/factory/SliceEntityManagerContainerFactory.java

@@ -76,7 +76,7 @@ public abstract class SliceEntityManagerContainerFactory {
 	}
 
 	protected SliceEntityManagerContainerFactory(String source) throws Exception {
-		Set<Class<? extends JpaObject>> classes = this.listUitClass(source);
+		Set<Class<? extends JpaObject>> classes = this.listUnitClass(source);
 		for (Class<? extends JpaObject> clz : classes) {
 			checkPersistFieldMap.put(clz, this.loadCheckPersistField(clz));
 			checkRemoveFieldMap.put(clz, this.loadCheckRemoveField(clz));
@@ -131,7 +131,7 @@ public abstract class SliceEntityManagerContainerFactory {
 		return map;
 	}
 
-	private Set<Class<? extends JpaObject>> listUitClass(String source) throws Exception {
+	private Set<Class<? extends JpaObject>> listUnitClass(String source) throws Exception {
 		try {
 			Set<Class<? extends JpaObject>> classes = new HashSet<>();
 			URL url;

+ 1 - 1
o2server/x_base_core_project/src/main/java/com/x/base/core/project/annotation/ModuleCategory.java

@@ -2,7 +2,7 @@ package com.x.base.core.project.annotation;
 
 public enum ModuleCategory {
 
-	CUSTOM, OFFICIAL;
+	CUSTOM, OFFICIAL, CLOUD;
 
 	public static int lengh = 16;
 }

+ 30 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Config.java

@@ -186,6 +186,16 @@ public class Config {
 		return new File(base(), DIR_CUSTOM_JARS);
 	}
 
+	public static File dir_custom_jars(Boolean force) throws Exception {
+		File dir = new File(base(), DIR_CUSTOM_JARS);
+		if (force) {
+			if ((!dir.exists()) || dir.isFile()) {
+				FileUtils.forceMkdir(dir);
+			}
+		}
+		return dir;
+	}
+
 	public static File dir_dynamic() throws Exception {
 		return new File(base(), DIR_DYNAMIC);
 	}
@@ -370,10 +380,30 @@ public class Config {
 		return new File(base(), DIR_STORE);
 	}
 
+	public static File dir_store(Boolean force) throws Exception {
+		File dir = new File(base(), DIR_STORE);
+		if (force) {
+			if ((!dir.exists()) || dir.isFile()) {
+				FileUtils.forceMkdir(dir);
+			}
+		}
+		return dir;
+	}
+
 	public static File dir_store_jars() throws Exception {
 		return new File(base(), DIR_STORE_JARS);
 	}
 
+	public static File dir_store_jars(Boolean force) throws Exception {
+		File dir = new File(base(), DIR_STORE_JARS);
+		if (force) {
+			if ((!dir.exists()) || dir.isFile()) {
+				FileUtils.forceMkdir(dir);
+			}
+		}
+		return dir;
+	}
+
 	public static void flush() {
 		if (null != INSTANCE) {
 			synchronized (Config.class) {

+ 6 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/project/exception/ExceptionAccessDenied.java

@@ -1,5 +1,7 @@
 package com.x.base.core.project.exception;
 
+import java.util.Objects;
+
 import com.x.base.core.entity.JpaObject;
 import com.x.base.core.project.http.EffectivePerson;
 
@@ -20,4 +22,8 @@ public class ExceptionAccessDenied extends PromptException {
 				(null == jpa) ? null : jpa.getClass().getName(), (null == jpa) ? null : jpa.getId());
 	}
 
+	public ExceptionAccessDenied(EffectivePerson effectivePerson, String message) {
+		super("用户:{} 权限不足, {}.", effectivePerson.getDistinguishedName(), Objects.toString(message, ""));
+	}
+
 }

+ 18 - 18
o2server/x_base_core_project/src/main/java/com/x/base/core/project/http/ActionResult.java

@@ -32,9 +32,9 @@ public class ActionResult<T> implements Serializable {
 
 	protected Long size = -1L;
 
-	protected Long page = -1L;
-
-	protected Long pageSize = -1L;
+//	protected Long page = -1L;
+//
+//	protected Long pageSize = -1L;
 
 	protected Long count = 0L;
 
@@ -167,20 +167,20 @@ public class ActionResult<T> implements Serializable {
 		return message;
 	}
 
-	public Long getPage() {
-		return page;
-	}
-
-	public void setPage(Long page) {
-		this.page = page;
-	}
-
-	public Long getPageSize() {
-		return pageSize;
-	}
-
-	public void setPageSize(Long pageSize) {
-		this.pageSize = pageSize;
-	}
+//	public Long getPage() {
+//		return page;
+//	}
+//
+//	public void setPage(Long page) {
+//		this.page = page;
+//	}
+
+//	public Long getPageSize() {
+//		return pageSize;
+//	}
+//
+//	public void setPageSize(Long pageSize) {
+//		this.pageSize = pageSize;
+//	}
 
 }

+ 8 - 6
o2server/x_base_core_project/src/main/java/com/x/base/core/project/jaxrs/StandardJaxrsAction.java

@@ -12,7 +12,6 @@ import javax.persistence.Query;
 import org.apache.commons.beanutils.PropertyUtils;
 import org.apache.commons.collections4.map.ListOrderedMap;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.cxf.jaxb.MarshallerAwareXMLWriter;
 
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
@@ -1006,11 +1005,14 @@ public abstract class StandardJaxrsAction extends AbstractJaxrsAction {
 		return result;
 	}
 
-	public void setPage(ActionResult<?> result, Integer page, Integer pageSize) {
-		result.setPage((page == null || page < 1) ? 1L : pageSize);
-		result.setPageSize((pageSize == null || pageSize < 1 || pageSize > EntityManagerContainer.MAX_PAGESIZE)
-				? EntityManagerContainer.DEFAULT_PAGESIZE.longValue()
-				: pageSize);
+	public Integer adjustPage(Integer page) {
+		return (page == null || page < 1) ? 1 : page;
+	}
+
+	public Integer adjustSize(Integer pageSize) {
+		return (pageSize == null || pageSize < 1 || pageSize > EntityManagerContainer.MAX_PAGESIZE)
+				? EntityManagerContainer.DEFAULT_PAGESIZE.intValue()
+				: pageSize;
 	}
 
 }

+ 7 - 1
o2server/x_base_core_project/src/main/java/com/x/base/core/project/message/MessageConnector.java

@@ -30,6 +30,8 @@ public class MessageConnector {
 	/* 有新的工作通过消息节点 */
 	public static final String TYPE_ACTIVITY_MESSAGE = "activity_message";
 
+	public static final String TYPE_WORK_TO_WORKCOMPLETED = "work_to_workCompleted";
+
 	public static final String TYPE_WORK_CREATE = "work_create";
 
 	public static final String TYPE_WORK_DELETE = "work_delete";
@@ -38,6 +40,8 @@ public class MessageConnector {
 
 	public static final String TYPE_WORKCOMPLETED_DELETE = "workCompleted_delete";
 
+	public static final String TYPE_TASK_TO_TASKCOMPLETED = "task_to_taskCompleted";
+
 	public static final String TYPE_TASK_CREATE = "task_create";
 
 	public static final String TYPE_TASK_DELETE = "task_delete";
@@ -52,6 +56,8 @@ public class MessageConnector {
 
 	public static final String TYPE_TASKCOMPLETED_DELETE = "taskCompleted_delete";
 
+	public static final String TYPE_READ_TO_READCOMPLETED = "read_to_readCompleted";
+
 	public static final String TYPE_READ_CREATE = "read_create";
 
 	public static final String TYPE_READ_DELETE = "read_delete";
@@ -63,7 +69,7 @@ public class MessageConnector {
 	public static final String TYPE_REVIEW_CREATE = "review_create";
 
 	public static final String TYPE_REVIEW_DELETE = "review_delete";
-	
+
 	public static final String TYPE_ATTACHMENT_CREATE = "attachment_create";
 
 	public static final String TYPE_ATTACHMENT_DELETE = "attachment_delete";

+ 1 - 1
o2server/x_base_core_project/src/main/java/com/x/base/core/project/organization/Trust.java → o2server/x_base_core_project/src/main/java/com/x/base/core/project/organization/Empower.java

@@ -3,7 +3,7 @@ package com.x.base.core.project.organization;
 import com.x.base.core.project.annotation.FieldDescribe;
 import com.x.base.core.project.gson.GsonPropertyObject;
 
-public class Trust extends GsonPropertyObject {
+public class Empower extends GsonPropertyObject {
 
 	@FieldDescribe("身份")
 	private String fromIdentity;

+ 16 - 16
o2server/x_base_core_project/src/main/java/com/x/base/core/project/organization/TrustLog.java → o2server/x_base_core_project/src/main/java/com/x/base/core/project/organization/EmpowerLog.java

@@ -5,7 +5,7 @@ import java.util.Date;
 import com.x.base.core.project.annotation.FieldDescribe;
 import com.x.base.core.project.gson.GsonPropertyObject;
 
-public class TrustLog extends GsonPropertyObject {
+public class EmpowerLog extends GsonPropertyObject {
 
 	@FieldDescribe("身份.")
 	private String fromIdentity;
@@ -52,77 +52,77 @@ public class TrustLog extends GsonPropertyObject {
 	@FieldDescribe("标题.")
 	private String title;
 
-	public TrustLog setFromIdentity(String fromIdentity) {
+	public EmpowerLog setFromIdentity(String fromIdentity) {
 		this.fromIdentity = fromIdentity;
 		return this;
 	}
 
-	public TrustLog setToIdentity(String toIdentity) {
+	public EmpowerLog setToIdentity(String toIdentity) {
 		this.toIdentity = toIdentity;
 		return this;
 	}
 
-	public TrustLog setApplication(String application) {
+	public EmpowerLog setApplication(String application) {
 		this.application = application;
 		return this;
 	}
 
-	public TrustLog setApplicationName(String applicationName) {
+	public EmpowerLog setApplicationName(String applicationName) {
 		this.applicationName = applicationName;
 		return this;
 	}
 
-	public TrustLog setApplicationAlias(String applicationAlias) {
+	public EmpowerLog setApplicationAlias(String applicationAlias) {
 		this.applicationAlias = applicationAlias;
 		return this;
 	}
 
-	public TrustLog setProcessName(String processName) {
+	public EmpowerLog setProcessName(String processName) {
 		this.processName = processName;
 		return this;
 	}
 
-	public TrustLog setProcessAlias(String processAlias) {
+	public EmpowerLog setProcessAlias(String processAlias) {
 		this.processAlias = processAlias;
 		return this;
 	}
 
-	public TrustLog setProcess(String process) {
+	public EmpowerLog setProcess(String process) {
 		this.process = process;
 		return this;
 	}
 
-	public TrustLog setTitle(String title) {
+	public EmpowerLog setTitle(String title) {
 		this.title = title;
 		return this;
 	}
 
-	public TrustLog setJob(String job) {
+	public EmpowerLog setJob(String job) {
 		this.job = job;
 		return this;
 	}
 
-	public TrustLog setWork(String work) {
+	public EmpowerLog setWork(String work) {
 		this.work = work;
 		return this;
 	}
 
-	public TrustLog setTrustTime(Date trustTime) {
+	public EmpowerLog setTrustTime(Date trustTime) {
 		this.trustTime = trustTime;
 		return this;
 	}
 
-	public TrustLog setActivity(String activity) {
+	public EmpowerLog setActivity(String activity) {
 		this.activity = activity;
 		return this;
 	}
 
-	public TrustLog setActivityName(String activityName) {
+	public EmpowerLog setActivityName(String activityName) {
 		this.activityName = activityName;
 		return this;
 	}
 
-	public TrustLog setActivityAlias(String activityAlias) {
+	public EmpowerLog setActivityAlias(String activityAlias) {
 		this.activityAlias = activityAlias;
 		return this;
 	}

+ 37 - 5
o2server/x_base_core_project/src/main/java/com/x/base/core/project/queue/AbstractQueue.java

@@ -1,9 +1,12 @@
 package com.x.base.core.project.queue;
 
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.LinkedBlockingQueue;
 
+import com.google.common.base.Objects;
 import com.google.gson.Gson;
 import com.x.base.core.project.gson.XGsonBuilder;
 import com.x.base.core.project.logger.Logger;
@@ -23,6 +26,26 @@ public abstract class AbstractQueue<T> {
 
 	private String className = this.getClass().getName();
 
+	private List<Object> executings = new CopyOnWriteArrayList<>();
+
+	public boolean executing(T t) {
+		if (null == t) {
+			return false;
+		} else {
+			return executings.contains(t);
+		}
+	}
+
+	public boolean contains(T t) {
+		if (null == t) {
+			return false;
+		}
+		if (this.queue.contains(t)) {
+			return true;
+		}
+		return this.executing(t);
+	}
+
 	/**
 	 * 标识自己,将会传入到执行线程中使用
 	 */
@@ -47,10 +70,6 @@ public abstract class AbstractQueue<T> {
 		logger.info(className + " new fixed thread pool with max thread count : " + count);
 	}
 
-	public boolean contains(T t) {
-		return this.queue.contains(t);
-	}
-
 	public void send(T t) throws Exception {
 		queue.put(t);
 	}
@@ -68,16 +87,29 @@ public abstract class AbstractQueue<T> {
 					try {
 						o = queue.take();
 						if (null != o) {
+							executings.add(o);
 							if (o instanceof StopSignal) {
 								turn = false;
 								break;
 							}
 							logger.debug("queue class: {} execute on message: {}.", className, gson.toJson(o));
 							// 从线程池中获取空闲线程执行QueueProcessThread操作
-							executorService.execute(new QueueProcessThread(abstractQueue, o));
+							if (fixedSize <= 1) {
+								execute((T) o);
+							} else {
+								executorService.execute(new QueueProcessThread(abstractQueue, o));
+							}
 						}
 					} catch (Exception e) {
 						e.printStackTrace();
+					} finally {
+						try {
+							if (null != o) {
+								executings.remove(o);
+							}
+						} catch (Exception e) {
+							e.printStackTrace();
+						}
 					}
 				}
 			}

+ 1 - 1
o2server/x_base_core_project/src/main/java/com/x/base/core/project/queue/QueueProcessThread.java

@@ -2,7 +2,7 @@ package com.x.base.core.project.queue;
 
 public class QueueProcessThread<T> implements Runnable {
 
-	private T o = null;;
+	private T o = null;
 
 	private AbstractQueue<T> queue = null;
 

+ 23 - 1
o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/DateTools.java

@@ -514,5 +514,27 @@ public class DateTools {
 		Date date = new Date();
 		return DateUtils.addMinutes(date, minutes);
 	}
-
+	
+	/**
+	 * 根据需求调整年份
+	 * @param startTime
+	 * @param yearAdjust
+	 * @param monthAdjust
+	 * @param dayAdjust
+	 * @return
+	 */
+	public static  Date getDateAfterYearAdjust( Date startTime, Integer yearAdjust, Integer monthAdjust, Integer dayAdjust) {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime( startTime );
+		if ((null != yearAdjust) && (yearAdjust != 0)) {
+			calendar.add(Calendar.YEAR, yearAdjust );
+		}
+		if ((null != monthAdjust) && (monthAdjust != 0)) {
+			calendar.add(Calendar.MONTH, monthAdjust );
+		}
+		if ((null != dayAdjust) && (dayAdjust != 0)) {
+			calendar.add(Calendar.DATE, dayAdjust );
+		}
+		return calendar.getTime();
+	}
 }

+ 46 - 17
o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/ListTools.java

@@ -179,7 +179,7 @@ public class ListTools {
 				arrayList.add(t);
 			}
 		}
-		
+
 		return arrayList;
 	}
 
@@ -351,6 +351,7 @@ public class ListTools {
 		return result;
 	}
 
+	@SuppressWarnings("unchecked")
 	public static <T> List<T> toList(T... ts) {
 		List<T> list = new ArrayList<>();
 		for (T t : ts) {
@@ -359,6 +360,7 @@ public class ListTools {
 		return list;
 	}
 
+	@SuppressWarnings("unchecked")
 	public static <T> List<T> toList(List<T> list, T... ts) {
 		List<T> os = new ArrayList<>();
 		if (!isEmpty(list)) {
@@ -518,8 +520,6 @@ public class ListTools {
 		return false;
 	}
 
-
-
 	public static String toStringJoin(Object obj, String separator) {
 		if (isList(obj)) {
 			return StringUtils.join((List<?>) obj, separator);
@@ -535,19 +535,48 @@ public class ListTools {
 			return obj.toString();
 		}
 	}
-	
-	/**
-	 * 去重
-	 * @param list
-	 */
-	private static void removeDuplicate(List<String> list) {
-	    List<String> result = new ArrayList<String>(list.size());
-	    for (String str : list) {
-	        if (!result.contains(str)) {
-	            result.add(str);
-	        }
-	    }
-	    list.clear();
-	    list.addAll(result);
+
+	/* 根据属性进行配对 */
+	public static <T, W> Map<T, W> pairWithProperty(List<T> ts, String tProperty, List<W> ws, String wProperty)
+			throws Exception {
+		Map<T, W> map = new LinkedHashMap<>();
+		if ((null != ts) && (null != ws) && StringUtils.isNotEmpty(tProperty) && StringUtils.isNotEmpty(wProperty)) {
+			for (T t : ts) {
+				if (null != t) {
+					W w = findWithProperty(ws, wProperty, PropertyUtils.getProperty(t, tProperty));
+					if (null != w) {
+						map.put(t, w);
+					}
+				}
+			}
+		}
+		return map;
+	}
+
+	public static List<String> addStringToList( String source, List<String> targetList ){
+		if( targetList == null ) {
+			targetList = new ArrayList<>();
+		}
+		if( StringUtils.isEmpty( source )) {
+			return targetList;
+		}
+		if( !targetList.contains( source )) {
+			targetList.add( source );
+		}
+		return targetList;
 	}
+
+	public static List<String> removeStringFromList( String source, List<String> targetList ){
+		if( targetList == null ) {
+			targetList = new ArrayList<>();
+		}
+		if( StringUtils.isEmpty( source )) {
+			return targetList;
+		}
+		if( targetList.contains( source )) {
+			targetList.remove( source );
+		}
+		return targetList;
+	}
+
 }

+ 1 - 27
o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_attendance_assemble_control.java

@@ -14,32 +14,6 @@ import com.x.base.core.project.annotation.ModuleType;
 		"com.x.attendance.entity.AttendanceWorkPlace", "com.x.attendance.entity.StatisticPersonForMonth",
 		"com.x.attendance.entity.StatisticTopUnitForDay", "com.x.attendance.entity.StatisticTopUnitForMonth",
 		"com.x.attendance.entity.StatisticUnitForDay", "com.x.attendance.entity.StatisticUnitForMonth" }, storeJars = {
-				"x_attendance_core_entity", "x_organization_core_express",
-				"x_organization_core_entity" })
+				"x_attendance_core_entity", "x_organization_core_express", "x_organization_core_entity" })
 public class x_attendance_assemble_control extends Deployable {
-
-	public x_attendance_assemble_control() {
-		super();
-//		dependency.containerEntities.add("com.x.attendance.entity.AttendanceAdmin");
-//		dependency.containerEntities.add("com.x.attendance.entity.AttendanceAppealInfo");
-//		dependency.containerEntities.add("com.x.attendance.entity.AttendanceDetail");
-//		dependency.containerEntities.add("com.x.attendance.entity.AttendanceDetailMobile");
-//		dependency.containerEntities.add("com.x.attendance.entity.AttendanceEmployeeConfig");
-//		dependency.containerEntities.add("com.x.attendance.entity.AttendanceImportFileInfo");
-//		dependency.containerEntities.add("com.x.attendance.entity.AttendanceScheduleSetting");
-//		dependency.containerEntities.add("com.x.attendance.entity.AttendanceSetting");
-//		dependency.containerEntities.add("com.x.attendance.entity.AttendanceSelfHoliday");
-//		dependency.containerEntities.add("com.x.attendance.entity.AttendanceStatisticalCycle");
-//		dependency.containerEntities.add("com.x.attendance.entity.AttendanceStatisticRequireLog");
-//		dependency.containerEntities.add("com.x.attendance.entity.AttendanceWorkDayConfig");
-//		dependency.containerEntities.add("com.x.attendance.entity.AttendanceWorkPlace");
-//		dependency.containerEntities.add("com.x.attendance.entity.StatisticPersonForMonth");
-//		dependency.containerEntities.add("com.x.attendance.entity.StatisticTopUnitForDay");
-//		dependency.containerEntities.add("com.x.attendance.entity.StatisticTopUnitForMonth");
-//		dependency.containerEntities.add("com.x.attendance.entity.StatisticUnitForDay");
-//		dependency.containerEntities.add("com.x.attendance.entity.StatisticUnitForMonth");
-//		dependency.storeJars.add(x_attendance_core_entity.class.getSimpleName());
-//		dependency.storeJars.add(x_organization_core_express.class.getSimpleName());
-//		dependency.storeJars.add(x_organization_core_entity.class.getSimpleName());
-	}
 }

+ 1 - 1
o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_bbs_core_entity.java

@@ -5,6 +5,6 @@ import com.x.base.core.project.annotation.ModuleCategory;
 import com.x.base.core.project.annotation.ModuleType;
 
 @Module(type = ModuleType.ENTITY, category = ModuleCategory.OFFICIAL, name = "论坛实体类", packageName = "com.x.bbs.entity")
-public class x_bbs_core_entity extends com.x.base.core.project.tools.Crypto {
+public class x_bbs_core_entity extends Compilable {
 
 }

+ 1 - 1
o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_cms_assemble_control.java

@@ -17,7 +17,7 @@ import com.x.base.core.project.annotation.ModuleType;
 		"com.x.processplatform.core.entity.content.Attachment", "com.x.query.core.entity.Item",
 		"com.x.query.core.entity.View", "com.x.cms.core.entity.ReadRemind", "com.x.cms.core.entity.DocumentCommend",
 		"com.x.cms.core.entity.DocumentCommentInfo", "com.x.cms.core.entity.CmsBatchOperation", "com.x.cms.core.entity.Review",
-		"com.x.cms.core.entity.DocumentCommentContent"}, storageTypes = {
+		"com.x.cms.core.entity.DocumentCommentContent", "com.x.cms.core.entity.DocumentCommentCommend"}, storageTypes = {
 				StorageType.cms, StorageType.processPlatform }, storeJars = { "x_processplatform_core_entity",
 						"x_organization_core_entity", "x_organization_core_express", "x_cms_core_entity",
 						"x_query_core_entity", "x_query_core_express" })

+ 2 - 17
o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_organization_assemble_express.java

@@ -9,22 +9,7 @@ import com.x.base.core.project.annotation.ModuleType;
 		"com.x.organization.core.entity.Person", "com.x.organization.core.entity.PersonAttribute",
 		"com.x.organization.core.entity.Identity", "com.x.organization.core.entity.Unit",
 		"com.x.organization.core.entity.UnitAttribute", "com.x.organization.core.entity.UnitDuty",
-		"com.x.organization.core.entity.accredit.Trust",
-		"com.x.organization.core.entity.accredit.TrustLog" }, storeJars = { "x_organization_core_entity" })
+		"com.x.organization.core.entity.accredit.Empower",
+		"com.x.organization.core.entity.accredit.EmpowerLog" }, storeJars = { "x_organization_core_entity" })
 public class x_organization_assemble_express extends Deployable {
-
-//	public x_organization_assemble_express() {
-//		super();
-//		dependency.containerEntities.add("com.x.organization.core.entity.Group");
-//		dependency.containerEntities.add("com.x.organization.core.entity.Role");
-//		dependency.containerEntities.add("com.x.organization.core.entity.Person");
-//		dependency.containerEntities.add("com.x.organization.core.entity.PersonAttribute");
-//		dependency.containerEntities.add("com.x.organization.core.entity.Identity");
-//		dependency.containerEntities.add("com.x.organization.core.entity.Unit");
-//		dependency.containerEntities.add("com.x.organization.core.entity.UnitAttribute");
-//		dependency.containerEntities.add("com.x.organization.core.entity.UnitDuty");
-//		dependency.containerEntities.add("com.x.organization.core.entity.accredit.Trust");
-//		dependency.containerEntities.add("com.x.organization.core.entity.accredit.TrustLog");
-//		dependency.storeJars.add(x_organization_core_entity.class.getSimpleName());
-//	}
 }

+ 2 - 2
o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_organization_assemble_personal.java

@@ -10,8 +10,8 @@ import com.x.base.core.project.annotation.ModuleType;
 		"com.x.organization.core.entity.Identity", "com.x.organization.core.entity.Unit",
 		"com.x.organization.core.entity.UnitAttribute", "com.x.organization.core.entity.UnitDuty",
 		"com.x.organization.core.entity.Custom", "com.x.organization.core.entity.Definition",
-		"com.x.organization.core.entity.accredit.Trust",
-		"com.x.organization.core.entity.accredit.TrustLog" }, storeJars = { "x_organization_core_entity",
+		"com.x.organization.core.entity.accredit.Empower",
+		"com.x.organization.core.entity.accredit.EmpowerLog" }, storeJars = { "x_organization_core_entity",
 				"x_organization_core_express" })
 public class x_organization_assemble_personal extends Deployable {
 

+ 0 - 42
o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_processplatform_assemble_bam.java

@@ -25,46 +25,4 @@ import com.x.base.core.project.annotation.ModuleType;
 		"com.x.query.core.entity.Item" }, storeJars = { "x_organization_core_entity", "x_organization_core_express",
 				"x_portal_core_entity", "x_processplatform_core_entity", "x_query_core_entity" })
 public class x_processplatform_assemble_bam extends Deployable {
-
-//	public x_processplatform_assemble_bam() {
-//		super();
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.content.Attachment");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.content.Read");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.content.ReadCompleted");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.content.Review");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.content.SerialNumber");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.content.Task");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.content.TaskCompleted");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.content.Work");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.content.WorkCompleted");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.content.WorkLog");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Agent");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Application");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.ApplicationDict");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.ApplicationDictItem");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Begin");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Cancel");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Choice");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Delay");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Embed");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.End");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Form");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Invoke");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Manual");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Merge");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Message");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Parallel");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Process");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Route");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Script");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Service");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Split");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.QueryView");
-//		dependency.containerEntities.add("com.x.query.core.entity.Item");
-//		dependency.storeJars.add(x_organization_core_entity.class.getSimpleName());
-//		dependency.storeJars.add(x_organization_core_express.class.getSimpleName());
-//		dependency.storeJars.add(x_portal_core_entity.class.getSimpleName());
-//		dependency.storeJars.add(x_processplatform_core_entity.class.getSimpleName());
-//		dependency.storeJars.add(x_query_core_entity.class.getSimpleName());
-//	}
 }

+ 4 - 3
o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_processplatform_assemble_designer.java

@@ -25,9 +25,10 @@ import com.x.base.core.project.annotation.ModuleType;
 		"com.x.processplatform.core.entity.element.End", "com.x.processplatform.core.entity.element.ApplicationDict",
 		"com.x.processplatform.core.entity.element.ApplicationDictItem",
 		"com.x.processplatform.core.entity.element.QueryView", "com.x.processplatform.core.entity.element.QueryStat",
-		"com.x.processplatform.core.entity.element.Projection", "com.x.query.core.entity.Item" }, storeJars = {
-				"x_organization_core_entity", "x_organization_core_express", "x_processplatform_core_entity",
-				"x_query_core_entity" }, storageTypes = { StorageType.processPlatform })
+		"com.x.processplatform.core.entity.element.Projection", "com.x.query.core.entity.Item",
+		"com.x.query.dynamic.entity.*" }, storeJars = { "x_organization_core_entity", "x_organization_core_express",
+				"x_processplatform_core_entity", "x_query_core_entity" }, dynamicJars = {
+						"x_query_dynamic_entity" }, storageTypes = { StorageType.processPlatform })
 public class x_processplatform_assemble_designer extends Deployable {
 
 //	public x_processplatform_assemble_designer() {

+ 2 - 46
o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_processplatform_service_processing.java

@@ -29,51 +29,7 @@ import com.x.base.core.project.annotation.ModuleType;
 		"com.x.processplatform.core.entity.log.ProcessingError", "com.x.query.core.entity.Item",
 		"com.x.query.dynamic.entity.*" }, storageTypes = { StorageType.processPlatform }, storeJars = {
 				"x_organization_core_entity", "x_organization_core_express", "x_processplatform_core_entity",
-				"x_query_core_entity" })
-public class x_processplatform_service_processing extends ServiceA {
+				"x_query_core_entity" }, dynamicJars = { "x_query_dynamic_entity" })
+public class x_processplatform_service_processing extends Deployable {
 
-//	public x_processplatform_service_processing() {
-//		super();
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.content.Attachment");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.content.TaskCompleted");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.content.ReadCompleted");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.content.Review");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.content.Hint");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.content.WorkCompleted");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.content.WorkLog");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.content.Task");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.content.Work");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.content.Read");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.content.SerialNumber");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.End");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Application");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.ApplicationDict");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.ApplicationDictItem");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Script");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Cancel");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Merge");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Route");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Choice");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Invoke");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Manual");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Parallel");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Begin");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Split");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Message");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Process");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Service");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Agent");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Delay");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.File");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Form");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.FormField");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.element.Embed");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.log.ProcessingError");
-//		dependency.containerEntities.add("com.x.query.core.entity.Item");
-//		dependency.storageTypes.add(StorageType.processPlatform.toString());
-//		dependency.storeJars.add(x_organization_core_entity.class.getSimpleName());
-//		dependency.storeJars.add(x_organization_core_express.class.getSimpleName());
-//		dependency.storeJars.add(x_processplatform_core_entity.class.getSimpleName());
-//		dependency.storeJars.add(x_query_core_entity.class.getSimpleName());
-//	}
 }

+ 3 - 35
o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_query_assemble_designer.java

@@ -13,45 +13,13 @@ import com.x.base.core.project.annotation.ModuleType;
 		"com.x.query.core.entity.neural.Model", "com.x.query.core.entity.schema.Table",
 		"com.x.query.core.entity.schema.Statement", "com.x.processplatform.core.entity.content.Review",
 		"com.x.processplatform.core.entity.content.Work", "com.x.processplatform.core.entity.content.WorkCompleted",
+		"com.x.processplatform.core.entity.content.Task", "com.x.processplatform.core.entity.content.TaskCompleted",
+		"com.x.processplatform.core.entity.content.Read", "com.x.processplatform.core.entity.content.ReadCompleted",
 		"com.x.processplatform.core.entity.content.Attachment", "com.x.cms.core.entity.Document",
-		"com.x.cms.core.entity.AppInfo", "com.x.cms.core.entity.CategoryInfo",
+		"com.x.cms.core.entity.AppInfo", "com.x.cms.core.entity.CategoryInfo", "com.x.cms.core.entity.Review",
 		"com.x.query.dynamic.entity.*" }, storageTypes = { StorageType.processPlatform }, storeJars = {
 				"x_query_core_entity", "x_organization_core_entity", "x_organization_core_express",
 				"x_processplatform_core_entity", "x_cms_core_entity",
 				"x_query_core_express" }, dynamicJars = { "x_query_dynamic_entity" })
 public class x_query_assemble_designer extends Deployable {
-
-//	public x_query_assemble_designer() {
-//		super();
-//		dependency.containerEntities.add("com.x.query.core.entity.Item");
-//		dependency.containerEntities.add("com.x.query.core.entity.Query");
-//		dependency.containerEntities.add("com.x.query.core.entity.View");
-//		dependency.containerEntities.add("com.x.query.core.entity.Stat");
-//		dependency.containerEntities.add("com.x.query.core.entity.Reveal");
-//		dependency.containerEntities.add("com.x.query.core.entity.neural.Entry");
-//		dependency.containerEntities.add("com.x.query.core.entity.neural.InText");
-//		dependency.containerEntities.add("com.x.query.core.entity.neural.OutText");
-//		dependency.containerEntities.add("com.x.query.core.entity.neural.InValue");
-//		dependency.containerEntities.add("com.x.query.core.entity.neural.OutValue");
-//		dependency.containerEntities.add("com.x.query.core.entity.neural.Model");
-//		dependency.containerEntities.add("com.x.query.core.entity.schema.Table");
-//		dependency.containerEntities.add("com.x.query.core.entity.schema.Statement");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.content.Review");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.content.Work");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.content.WorkCompleted");
-//		dependency.containerEntities.add("com.x.processplatform.core.entity.content.Attachment");
-//		dependency.containerEntities.add("com.x.cms.core.entity.Document");
-//		dependency.containerEntities.add("com.x.cms.core.entity.AppInfo");
-//		dependency.containerEntities.add("com.x.cms.core.entity.CategoryInfo");
-//		dependency.containerEntities.add("com.x.query.dynamic.entity.*");
-//		dependency.storageTypes.add(StorageType.processPlatform.toString());
-//		dependency.storeJars.add(x_query_core_entity.class.getSimpleName());
-//		dependency.storeJars.add(x_organization_core_entity.class.getSimpleName());
-//		dependency.storeJars.add(x_organization_core_express.class.getSimpleName());
-//		dependency.storeJars.add(x_processplatform_core_entity.class.getSimpleName());
-//		dependency.storeJars.add(x_cms_core_entity.class.getSimpleName());
-//		dependency.storeJars.add(x_query_core_express.class.getSimpleName());
-//		dependency.dynamicJars.add("x_query_dynamic_entity");
-//	}
-
 }

+ 1 - 1
o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_query_service_processing.java

@@ -20,7 +20,7 @@ import com.x.base.core.project.annotation.ModuleType;
 		"com.x.cms.core.entity.CategoryInfo" }, storageTypes = { StorageType.processPlatform,
 				StorageType.cms }, storeJars = { "x_query_core_entity", "x_organization_core_entity",
 						"x_organization_core_express", "x_processplatform_core_entity", "x_cms_core_entity" })
-public class x_query_service_processing extends ServiceA {
+public class x_query_service_processing extends Deployable {
 
 //	public x_query_service_processing() {
 //		super();

+ 6 - 5
o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_teamwork_assemble_control.java

@@ -4,19 +4,20 @@ import com.x.base.core.project.annotation.Module;
 import com.x.base.core.project.annotation.ModuleCategory;
 import com.x.base.core.project.annotation.ModuleType;
 
-@Module(type = ModuleType.ASSEMBLE, category = ModuleCategory.OFFICIAL, name = "工作任务管理", packageName = "com.x.teamwork.assemble.control", containerEntities = {
-		"com.x.teamwork.core.entity.Chat", "com.x.teamwork.core.entity.ChatContent",
-		"com.x.teamwork.core.entity.Dynamic", "com.x.teamwork.core.entity.DynamicDetail",
+@Module(type = ModuleType.ASSEMBLE, category = ModuleCategory.OFFICIAL, name = "工作任务管理", packageName = "com.x.teamwork.assemble.control", 
+containerEntities = {
 		"com.x.teamwork.core.entity.Project", "com.x.teamwork.core.entity.ProjectDetail",
 		"com.x.teamwork.core.entity.ProjectExtFieldRele", "com.x.teamwork.core.entity.ProjectGroup",
 		"com.x.teamwork.core.entity.ProjectGroupRele", "com.x.teamwork.core.entity.Task",
 		"com.x.teamwork.core.entity.TaskGroup", "com.x.teamwork.core.entity.TaskGroupRele",
-		"com.x.teamwork.core.entity.TaskDetail", "com.x.teamwork.core.entity.TaskList",
+		"com.x.teamwork.core.entity.TaskDetail", "com.x.teamwork.core.entity.TaskExtField", "com.x.teamwork.core.entity.TaskList",
 		"com.x.teamwork.core.entity.TaskListRele", "com.x.teamwork.core.entity.TaskRelevance",
 		"com.x.teamwork.core.entity.TaskView", "com.x.teamwork.core.entity.SystemConfig",
 		"com.x.teamwork.core.entity.SystemConfigLobValue", "com.x.teamwork.core.entity.Review",
 		"com.x.teamwork.core.entity.BatchOperation", "com.x.teamwork.core.entity.TaskTag", 
-		"com.x.teamwork.core.entity.TaskTagRele", "com.x.teamwork.core.entity.Attachment"}, storeJars = { "x_organization_core_entity",
+		"com.x.teamwork.core.entity.TaskTagRele", "com.x.teamwork.core.entity.Attachment",
+		"com.x.teamwork.core.entity.Chat", "com.x.teamwork.core.entity.ChatContent",
+		"com.x.teamwork.core.entity.Dynamic", "com.x.teamwork.core.entity.DynamicDetail" }, storeJars = { "x_organization_core_entity",
 		"x_organization_core_express", "x_teamwork_core_entity" })
 public class x_teamwork_assemble_control extends Deployable {
 

+ 13 - 0
o2server/x_base_core_project/src/test/java/com/x/base/core/project/test/list/TestClient.java

@@ -0,0 +1,13 @@
+package com.x.base.core.project.test.list;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+
+public class TestClient {
+
+
+ 
+
+}

+ 8 - 0
o2server/x_base_core_project/src/test/java/test/com/x/base/core/project/TestClient.java

@@ -1,6 +1,7 @@
 package test.com.x.base.core.project;
 
 import java.lang.reflect.Field;
+import java.util.concurrent.ConcurrentLinkedQueue;
 
 import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.lang3.reflect.FieldUtils;
@@ -28,4 +29,11 @@ public class TestClient {
 		String aaa = "d:\\a\\b\\c.d";
 		System.out.println(FilenameUtils.getName(aaa));
 	}
+
+	@Test
+	public void test2() {
+
+		ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>();
+
+	}
 }

+ 3 - 0
o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/service/BBSUserInfoService.java

@@ -274,6 +274,9 @@ public class BBSUserInfoService {
 						userInfo.setPermissionContent( permissionContent );
 						userInfo.setPopularity(popularity);
 						userInfo.setCredit( credit );
+						if( userInfo.getLastVisitTime() == null ) {
+							userInfo.setLastVisitTime( userInfo.getUpdateTime() );
+						}
 						emc.check( userInfo, CheckPersistType.all );
 					}else{
 						emc.remove( userInfo, CheckRemoveType.all );

+ 9 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/Business.java

@@ -18,6 +18,7 @@ import com.x.cms.assemble.control.factory.CategoryExtFactory;
 import com.x.cms.assemble.control.factory.CategoryInfoFactory;
 import com.x.cms.assemble.control.factory.CmsBatchOperationFactory;
 import com.x.cms.assemble.control.factory.DocumentCommendFactory;
+import com.x.cms.assemble.control.factory.DocumentCommentCommendFactory;
 import com.x.cms.assemble.control.factory.DocumentCommentInfoFactory;
 import com.x.cms.assemble.control.factory.DocumentFactory;
 import com.x.cms.assemble.control.factory.DocumentViewRecordFactory;
@@ -73,9 +74,17 @@ public class Business {
 	private FormFieldFactory formFieldFactory;
 	private CmsBatchOperationFactory cmsBatchOperationFactory;
 	private DocumentCommendFactory documentCommendFactory;
+	private DocumentCommentCommendFactory documentCommentCommendFactory;
 	private DocumentCommentInfoFactory documentCommentInfoFactory;
 	private ReviewFactory reviewFactory;
 
+	public DocumentCommentCommendFactory documentCommentCommendFactory() throws Exception {
+		if (null == this.documentCommentCommendFactory) {
+			this.documentCommentCommendFactory = new DocumentCommentCommendFactory(this);
+		}
+		return documentCommentCommendFactory;
+	}
+	
 	public ReviewFactory reviewFactory() throws Exception {
 		if (null == this.reviewFactory) {
 			this.reviewFactory = new ReviewFactory(this);

+ 46 - 4
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/factory/AppInfoFactory.java

@@ -18,6 +18,7 @@ import com.x.cms.assemble.control.AbstractFactory;
 import com.x.cms.assemble.control.Business;
 import com.x.cms.core.entity.AppInfo;
 import com.x.cms.core.entity.AppInfo_;
+import com.x.cms.core.entity.tools.CriteriaBuilderTools;
 
 /**
  * 应用信息表基础功能服务类
@@ -51,16 +52,26 @@ public class AppInfoFactory extends AbstractFactory {
 		return em.createQuery(cq).getResultList();
 	}
 	
-	public List<AppInfo> listAll(String documentType) throws Exception {
+	public List<AppInfo> listAll( String appType, String documentType) throws Exception {
 		EntityManager em = this.entityManagerContainer().get(AppInfo.class);
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<AppInfo> cq = cb.createQuery(AppInfo.class);
 		Root<AppInfo> root = cq.from(AppInfo.class);
+		Predicate p = null;
 		if (StringUtils.isNotEmpty(documentType) && !"全部".equals(documentType)) {
-			Predicate p = cb.equal(root.get(AppInfo_.documentType), documentType);
-			return em.createQuery(cq.where(p)).getResultList();
+			p = CriteriaBuilderTools.predicate_and(cb, p, cb.equal(root.get(AppInfo_.documentType), documentType) );
 		}
-		return em.createQuery(cq).getResultList();
+		if (StringUtils.isNotEmpty(appType) &&!StringUtils.equals( "未分类",appType )) {
+			p = CriteriaBuilderTools.predicate_and(cb, p, cb.equal(root.get(AppInfo_.appType), appType) );
+		}
+		if (StringUtils.isNotEmpty(appType) &&StringUtils.equals( "未分类",appType )) {
+			p = CriteriaBuilderTools.predicate_and(cb, p, 
+					CriteriaBuilderTools.predicate_or(
+							cb, cb.isNull(root.get(AppInfo_.appType)), 
+							cb.equal(root.get(AppInfo_.appType), ""))
+			);
+		}
+		return em.createQuery(cq.where(p)).getResultList();
 	}
 
 	public List<String> listLike(String keyStr) throws Exception {
@@ -471,4 +482,35 @@ public class AppInfoFactory extends AbstractFactory {
 		}
 		return o;
 	}
+
+	public List<String> listAllAppType() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(AppInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AppInfo> root = cq.from(AppInfo.class);
+		Predicate p = cb.isNotNull( root.get(AppInfo_.appType));
+		cq.select(root.get(AppInfo_.appType)).distinct(true);
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+
+	public Long countAppInfoWithAppType(String type) throws Exception {
+		EntityManager em = this.entityManagerContainer().get(AppInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<AppInfo> root = cq.from(AppInfo.class);
+		Predicate p = cb.equal( root.get(AppInfo_.appType), type );
+		cq.select(cb.count(root));
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	public Long countAppInfoWithOutAppType() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(AppInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<AppInfo> root = cq.from(AppInfo.class);
+		Predicate p = cb.isNull( root.get(AppInfo_.appType) );
+		p = cb.or( p, cb.equal( root.get(AppInfo_.appType), ""));
+		cq.select(cb.count(root));
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
 }

+ 0 - 2
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/factory/DocumentCommendFactory.java

@@ -39,7 +39,6 @@ public class DocumentCommendFactory extends AbstractFactory {
 		Root<DocumentCommend> root = cq.from( DocumentCommend.class );
 		Predicate p = cb.equal(root.get( DocumentCommend_.commendPerson), personName );
 		cq.select( root.get( DocumentCommend_.id) ).where(p);
-		cq.orderBy( cb.desc( root.get( DocumentCommend_.createTime ) ) );
 		return em.createQuery( cq ).setMaxResults(maxCount).getResultList();
 	}
 
@@ -53,7 +52,6 @@ public class DocumentCommendFactory extends AbstractFactory {
 		Root<DocumentCommend> root = cq.from( DocumentCommend.class );
 		Predicate p = cb.equal(root.get( DocumentCommend_.documentId), docId );
 		cq.select( root.get( DocumentCommend_.id) ).where(p);
-		cq.orderBy( cb.desc( root.get( DocumentCommend_.createTime ) ) );
 		return em.createQuery( cq ).setMaxResults(maxCount).getResultList();
 	}
 	

+ 84 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/factory/DocumentCommentCommendFactory.java

@@ -0,0 +1,84 @@
+package com.x.cms.assemble.control.factory;
+
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import com.x.base.core.project.exception.ExceptionWhen;
+import com.x.cms.assemble.control.AbstractFactory;
+import com.x.cms.assemble.control.Business;
+import com.x.cms.core.entity.DocumentCommentCommend;
+import com.x.cms.core.entity.DocumentCommentCommend_;
+
+/**
+ * 文档评论点赞基础功能服务类
+ * 
+ * @author O2LEE
+ */
+public class DocumentCommentCommendFactory extends AbstractFactory {
+	
+	public DocumentCommentCommendFactory(Business business) throws Exception {
+		super(business);
+	}
+
+	public DocumentCommentCommend get( String id ) throws Exception {
+		return this.entityManagerContainer().find(id, DocumentCommentCommend.class, ExceptionWhen.none);
+	}
+
+	public List<String> listWithPerson( String personName, Integer maxCount ) throws Exception {
+		if( maxCount == null || maxCount == 0 ) {
+			maxCount = 10;
+		}
+		EntityManager em = this.entityManagerContainer().get( DocumentCommentCommend.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class );
+		Root<DocumentCommentCommend> root = cq.from( DocumentCommentCommend.class );
+		Predicate p = cb.equal(root.get( DocumentCommentCommend_.commendPerson), personName );
+		cq.select( root.get( DocumentCommentCommend_.id) ).where(p);
+		return em.createQuery( cq ).setMaxResults(maxCount).getResultList();
+	}
+	
+	public List<String> listCommentIdsWithPerson( String personName, Integer maxCount ) throws Exception {
+		if( maxCount == null || maxCount == 0 ) {
+			maxCount = 10;
+		}
+		EntityManager em = this.entityManagerContainer().get( DocumentCommentCommend.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class );
+		Root<DocumentCommentCommend> root = cq.from( DocumentCommentCommend.class );
+		Predicate p = cb.equal(root.get( DocumentCommentCommend_.commendPerson), personName );
+		cq.select( root.get( DocumentCommentCommend_.commentId) ).where(p);
+		return em.createQuery( cq ).setMaxResults(maxCount).getResultList();
+	}
+
+	public List<String> listIdsByDocumentComment( String comment, Integer maxCount ) throws Exception {
+		if( maxCount == null || maxCount == 0 ) {
+			maxCount = 10;
+		}
+		EntityManager em = this.entityManagerContainer().get( DocumentCommentCommend.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class );
+		Root<DocumentCommentCommend> root = cq.from( DocumentCommentCommend.class );
+		Predicate p = cb.equal(root.get( DocumentCommentCommend_.commentId), comment );
+		cq.select( root.get( DocumentCommentCommend_.id) ).where(p);
+		return em.createQuery( cq ).setMaxResults(maxCount).getResultList();
+	}
+	
+	public List<String> listIdsByDocumentCommentAndPerson( String commentId, String personName, Integer maxCount ) throws Exception {
+		if( maxCount == null || maxCount == 0 ) {
+			maxCount = 10;
+		}
+		EntityManager em = this.entityManagerContainer().get( DocumentCommentCommend.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class );
+		Root<DocumentCommentCommend> root = cq.from( DocumentCommentCommend.class );
+		Predicate p = cb.equal(root.get( DocumentCommentCommend_.commentId), commentId );
+		p = cb.and( p, cb.equal(root.get( DocumentCommentCommend_.commendPerson), personName ) );
+		cq.select( root.get( DocumentCommentCommend_.id) ).where(p);
+		return em.createQuery( cq ).setMaxResults(maxCount).getResultList();
+	}
+}

+ 12 - 2
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/factory/DocumentCommentInfoFactory.java

@@ -60,6 +60,17 @@ public class DocumentCommentInfoFactory extends AbstractFactory {
 		return em.createQuery(cq.where(p)).getResultList();
 	}
 	
+	public Integer getMaxOrder(String documentId) throws Exception {
+		EntityManager em = this.entityManagerContainer().get( DocumentCommentInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Integer> cq = cb.createQuery( Integer.class );
+		Root<DocumentCommentInfo> root = cq.from( DocumentCommentInfo.class );
+		Predicate p = cb.equal(root.get( DocumentCommentInfo_.documentId ), documentId );
+		cq.select( cb.max( root.get( DocumentCommentInfo_.orderNumber )));
+		Integer max = em.createQuery(cq.where(p)).getSingleResult();
+		return max == null ? 0 : max;
+	}
+	
 	public List<String> listWithPerson( String personName ) throws Exception {
 		EntityManager em = this.entityManagerContainer().get( DocumentCommentInfo.class );
 		CriteriaBuilder cb = em.getCriteriaBuilder();
@@ -151,6 +162,5 @@ public class DocumentCommentInfoFactory extends AbstractFactory {
 			cq.orderBy( orderWithField );
 		}
 		return em.createQuery(cq.where(p)).setMaxResults( maxCount).getResultList();
-	}
-	
+	}	
 }

+ 1 - 1
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/appinfo/ActionListAll.java

@@ -33,7 +33,7 @@ public class ActionListAll extends BaseAction {
 			result.setData( wos );
 		} else {
 			try {
-				appInfoList = appInfoServiceAdv.listAll("全部");
+				appInfoList = appInfoServiceAdv.listAll( null, "全部");
 			} catch (Exception e) {
 				check = false;
 				Exception exception = new ExceptionAppInfoProcess( e, "查询所有应用栏目信息对象时发生异常" );

+ 91 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/appinfo/ActionListAllAppType.java

@@ -0,0 +1,91 @@
+package com.x.cms.assemble.control.jaxrs.appinfo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.x.base.core.project.annotation.FieldDescribe;
+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 net.sf.ehcache.Element;
+
+public class ActionListAllAppType extends BaseAction {
+
+	private static  Logger logger = LoggerFactory.getLogger( ActionListAllAppType.class );
+
+	@SuppressWarnings("unchecked")
+	protected ActionResult<List<Wo>> execute( HttpServletRequest request, EffectivePerson effectivePerson ) throws Exception {
+		ActionResult<List<Wo>> result = new ActionResult<>();
+		List<Wo> wos = null;
+		List<String> appTypes = null;
+		Boolean check = true;
+		
+		String cacheKey = ApplicationCache.concreteCacheKey( "allType" );
+		Element element = cache.get( cacheKey );
+		
+		if ((null != element) && ( null != element.getObjectValue()) ) {
+			wos = ( List<Wo> ) element.getObjectValue();
+			result.setData( wos );
+		} else {
+			wos = new ArrayList<>();
+			try {
+				appTypes = appInfoServiceAdv.listAllAppType();
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new ExceptionAppInfoProcess( e, "查询所有应用栏目信息对象时发生异常" );
+				result.error( exception );
+				logger.error( e, effectivePerson, request, null);
+			}
+			if( check ){
+				if( appTypes != null && !appTypes.isEmpty() ){
+					for( String type : appTypes ) {
+						wos.add( new Wo( type, appInfoServiceAdv.countAppInfoWithAppType( type )));
+					}
+				}
+				
+				Long outTypeCount = appInfoServiceAdv.countAppInfoWithOutAppType();
+				if( outTypeCount != null && outTypeCount > 0 ) {
+					wos.add( new Wo( "未分类", outTypeCount ));
+				}
+				
+				cache.put(new Element( cacheKey, wos ));
+				result.setData( wos );
+			}
+		}
+		return result;
+	}
+	
+	public static class Wo {
+		@FieldDescribe("栏目类别名称")
+		private String appType;
+		
+		@FieldDescribe("栏目数量")
+		private Long count;
+		
+		public Wo( String _appType, Long _count ) {
+			this.appType = _appType;
+			this.count = _count;
+		}
+		
+		public String getAppType() {
+			return appType;
+		}
+		public void setAppType(String appType) {
+			this.appType = appType;
+		}
+		public Long getCount() {
+			return count;
+		}
+		public void setCount(Long count) {
+			this.count = count;
+		}
+		
+		
+	}
+	
+}

+ 3 - 3
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/appinfo/ActionListWhatICanManage.java

@@ -22,7 +22,7 @@ public class ActionListWhatICanManage extends BaseAction {
 	private static  Logger logger = LoggerFactory.getLogger(ActionListWhatICanManage.class);
 
 	@SuppressWarnings("unchecked")
-	protected ActionResult<List<Wo>> execute(HttpServletRequest request, EffectivePerson effectivePerson) throws Exception {
+	protected ActionResult<List<Wo>> execute( HttpServletRequest request, EffectivePerson effectivePerson ) throws Exception {
 		ActionResult<List<Wo>> result = new ActionResult<>();
 		List<Wo> wos = null;
 		List<AppInfo> appInfoList = null;
@@ -52,7 +52,7 @@ public class ActionListWhatICanManage extends BaseAction {
 			if (check) {
 				if (isXAdmin) {
 					try {
-						appInfoList = appInfoServiceAdv.listAll("全部");
+						appInfoList = appInfoServiceAdv.listAll( null, "全部");
 					} catch (Exception e) {
 						check = false;
 						Exception exception = new ExceptionAppInfoProcess(e, "查询所有应用栏目信息对象时发生异常");
@@ -63,7 +63,7 @@ public class ActionListWhatICanManage extends BaseAction {
 					try {
 						List<String> unitNames = userManagerService.listUnitNamesWithPerson( personName );
 						List<String> groupNames = userManagerService.listGroupNamesByPerson( personName );
-						app_ids = permissionQueryService.listManageableAppIdsByPerson( personName, unitNames, groupNames, "全部", 1000 );
+						app_ids = permissionQueryService.listManageableAppIdsByPerson( personName, unitNames, groupNames, null, "全部", 1000 );
 						if (app_ids != null && !app_ids.isEmpty()) {
 							try {
 								appInfoList = appInfoServiceAdv.list( app_ids );

+ 137 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/appinfo/ActionListWhatICanManageWithAppType.java

@@ -0,0 +1,137 @@
+package com.x.cms.assemble.control.jaxrs.appinfo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+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.base.core.project.tools.SortTools;
+import com.x.cms.core.entity.AppInfo;
+import com.x.cms.core.entity.CategoryInfo;
+
+import net.sf.ehcache.Element;
+
+public class ActionListWhatICanManageWithAppType extends BaseAction {
+
+	private static  Logger logger = LoggerFactory.getLogger(ActionListWhatICanManageWithAppType.class);
+
+	@SuppressWarnings("unchecked")
+	protected ActionResult<List<Wo>> execute( HttpServletRequest request, EffectivePerson effectivePerson, String appType ) throws Exception {
+		ActionResult<List<Wo>> result = new ActionResult<>();
+		List<Wo> wos = null;
+		List<AppInfo> appInfoList = null;
+		List<CategoryInfo> catacoryList = null;
+		List<WoCategory> wrapOutCatacoryList = null;
+		List<String> app_ids = null;
+		Boolean isXAdmin = false;
+		Boolean check = true;
+		String personName = effectivePerson.getDistinguishedName();
+		
+		try {
+			isXAdmin = userManagerService.isManager(request, effectivePerson );
+		} catch (Exception e) {
+			check = false;
+			Exception exception = new ExceptionAppInfoProcess(e, "系统在检查用户是否是平台管理员时发生异常。Name:" + personName);
+			result.error(exception);
+			logger.error(e, effectivePerson, request, null);
+		}
+		String cacheKey = ApplicationCache.concreteCacheKey(personName, "manage", "appType", appType,  isXAdmin);
+		Element element = cache.get(cacheKey);
+
+		if ((null != element) && (null != element.getObjectValue())) {
+			wos = (List<Wo>) element.getObjectValue();
+			result.setData(wos);
+		} else {
+			if (check) {
+				if (isXAdmin) {
+					try {
+						appInfoList = appInfoServiceAdv.listAll( appType, "全部");
+					} catch (Exception e) {
+						check = false;
+						Exception exception = new ExceptionAppInfoProcess(e, "查询所有应用栏目信息对象时发生异常");
+						result.error(exception);
+						logger.error(e, effectivePerson, request, null);
+					}
+				} else {
+					try {
+						List<String> unitNames = userManagerService.listUnitNamesWithPerson( personName );
+						List<String> groupNames = userManagerService.listGroupNamesByPerson( personName );
+						app_ids = permissionQueryService.listManageableAppIdsByPerson( personName, unitNames, groupNames, appType, "全部", 1000 );
+						if (app_ids != null && !app_ids.isEmpty()) {
+							try {
+								appInfoList = appInfoServiceAdv.list( app_ids );
+							} catch (Exception e) {
+								check = false;
+								Exception exception = new ExceptionAppInfoProcess(e, "系统根据ID列表查询应用栏目信息对象时发生异常。");
+								result.error(exception);
+								logger.error(e, effectivePerson, request, null);
+							}
+						}
+					} catch (Exception e) {
+						check = false;
+						Exception exception = new ExceptionAppInfoProcess(e,
+								"系统在根据用户权限查询所有管理的栏目信息时发生异常。Name:" + personName);
+						result.error(exception);
+						logger.error(e, effectivePerson, request, null);
+					}
+				}
+			}
+			if (check) {
+				if (appInfoList != null && !appInfoList.isEmpty()) {
+					try {
+						wos = Wo.copier.copy(appInfoList);
+						SortTools.asc( wos, "appInfoSeq");
+						cache.put(new Element(cacheKey, wos));
+						result.setData(wos);
+					} catch (Exception e) {
+						check = false;
+						Exception exception = new ExceptionAppInfoProcess(e, "将查询出来的应用栏目信息对象转换为可输出的数据信息时发生异常。");
+						result.error(exception);
+						logger.error(e, effectivePerson, request, null);
+					}
+				}
+			}
+			if (check) {
+				if ( wos != null && wos.size() > 0) {
+					List<String> query_categoryList = null;
+					for ( Wo wo : wos ) {
+						query_categoryList = new ArrayList<>();				
+						if( ListTools.isNotEmpty( wo.getCategoryList() )) {
+							for( String categoryId : wo.getCategoryList() ) {
+								if( categoryId != null && !"null".equalsIgnoreCase( categoryId.trim() ) ) {
+									query_categoryList.add( categoryId );
+								}
+							}
+						}
+						try {
+							catacoryList = categoryInfoServiceAdv.list( query_categoryList );
+							if ( catacoryList != null && !catacoryList.isEmpty() ) {
+								try {
+									wrapOutCatacoryList = WoCategory.copier.copy( catacoryList );
+									wo.setWrapOutCategoryList( wrapOutCatacoryList );
+								} catch (Exception e) {
+									check = false;
+									Exception exception = new ExceptionAppInfoProcess(e, "将查询出来的分类信息对象转换为可输出的数据信息时发生异常。");
+									result.error(exception);
+									logger.error(e, effectivePerson, request, null);
+								}
+							}
+						} catch (Exception e) {
+							check = false;
+							Exception exception = new ExceptionAppInfoProcess(e, "系统根据ID列表查询分类信息对象时发生异常。");
+							result.error(exception);
+							logger.error(e, effectivePerson, request, null);
+						}
+					}
+				}
+			}
+		}
+		return result;
+	}
+}

+ 41 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/appinfo/AppInfoAction.java

@@ -239,6 +239,26 @@ public class AppInfoAction extends StandardJaxrsAction {
 		return ResponseFactory.getDefaultActionResultResponse(result);
 	}
 
+	@JaxrsMethodDescribe(value = "获取所有的栏目分类信息列表.", action = ActionListAllAppType.class)
+	@GET
+	@Path("list/appType")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response listAllAppType(@Context HttpServletRequest request ) {
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		ActionResult<List<ActionListAllAppType.Wo>> result = new ActionResult<>();
+		try {
+			result = new ActionListAllAppType().execute(request, effectivePerson);
+		} catch (Exception e) {
+			result = new ActionResult<>();
+			Exception exception = new ExceptionAppInfoProcess(e,
+					"系统在获取所有的栏目分类信息列表时发生异常。Name:" + effectivePerson.getDistinguishedName());
+			result.error(exception);
+			logger.error(e, effectivePerson, request, null);
+		}
+		return ResponseFactory.getDefaultActionResultResponse(result);
+	}
+	
 	@JaxrsMethodDescribe(value = "获取用户有权限管理的所有信息栏目信息列表.", action = ActionListWhatICanManage.class)
 	@GET
 	@Path("list/manage")
@@ -258,6 +278,27 @@ public class AppInfoAction extends StandardJaxrsAction {
 		}
 		return ResponseFactory.getDefaultActionResultResponse(result);
 	}
+	
+	@JaxrsMethodDescribe(value = "根据栏目类别名称获取用户有权限管理的所有信息栏目信息列表.", action = ActionListWhatICanManageWithAppType.class)
+	@GET
+	@Path("list/manage/type/{appType}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response listWhatICanManageWithAppType(@Context HttpServletRequest request,
+			@JaxrsParameterDescribe("栏目类别") @PathParam("appType") String appType ) {
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		ActionResult<List<BaseAction.Wo>> result = new ActionResult<>();
+		try {
+			result = new ActionListWhatICanManageWithAppType().execute(request, effectivePerson, appType);
+		} catch (Exception e) {
+			result = new ActionResult<>();
+			Exception exception = new ExceptionAppInfoProcess(e,
+					"系统在根据栏目类别名称获取用户有权限管理的所有信息栏目信息列表时发生异常。Name:" + effectivePerson.getDistinguishedName());
+			result.error(exception);
+			logger.error(e, effectivePerson, request, null);
+		}
+		return ResponseFactory.getDefaultActionResultResponse(result);
+	}
 
 	@JaxrsMethodDescribe(value = "获取用户有权限访问到的所有信息栏目信息列表.", action = ActionListAll.class)
 	@GET

+ 111 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/comment/ActionGet.java

@@ -0,0 +1,111 @@
+package com.x.cms.assemble.control.jaxrs.comment;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.lang3.StringUtils;
+
+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.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.cms.core.entity.DocumentCommentInfo;
+
+import net.sf.ehcache.Element;
+
+public class ActionGet extends BaseAction {
+
+	private static  Logger logger = LoggerFactory.getLogger( ActionGet.class );
+	
+	protected ActionResult<Wo> execute( HttpServletRequest request, EffectivePerson effectivePerson, String id ) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		Wo wo = null;
+		DocumentCommentInfo appInfo = null;
+		Boolean check = true;
+		
+		if( StringUtils.isEmpty(id) ){
+			check = false;
+			Exception exception = new ExceptionCommentIdForQueryEmpty();
+			result.error( exception );
+		}
+		
+		String cacheKey = ApplicationCache.concreteCacheKey( id );
+		Element element = commentInfoCache.get( cacheKey );
+		
+		if (( null != element ) && ( null != element.getObjectValue()) ) {
+			wo = ( Wo ) element.getObjectValue();
+			result.setData( wo );
+		} else {
+			if( check ){
+				try {
+					appInfo = documentCommentInfoQueryService.get(id);
+					if( appInfo == null ){
+						check = false;
+						Exception exception = new ExceptionCommentNotExists( id );
+						result.error( exception );
+					}
+				} catch (Exception e) {
+					check = false;
+					Exception exception = new CommentQueryException( e, "根据指定id查询应用栏目信息对象时发生异常。ID:" + id );
+					result.error( exception );
+					logger.error( e, effectivePerson, request, null);
+				}
+			}
+			if( check ){
+				try {
+					wo = Wo.copier.copy( appInfo );
+					if( wo != null ) {
+						wo.setContent( documentCommentInfoQueryService.getCommentContent(id));
+					}
+					commentInfoCache.put(new Element( cacheKey, wo ));
+					result.setData( wo );
+				} catch (Exception e) {
+					Exception exception = new CommentQueryException( e, "将查询出来的应用栏目信息对象转换为可输出的数据信息时发生异常。" );
+					result.error( exception );
+					logger.error( e, effectivePerson, request, null);
+				}
+			}
+		}
+		
+		return result;
+	}
+	
+public static class Wo extends DocumentCommentInfo {
+		
+		private Long rank;
+
+		@FieldDescribe("内容")
+		private String content = "";
+		
+		public String getContent() {
+			return content;
+		}
+
+		public void setContent(String content) {
+			this.content = content;
+		}
+		
+		public Long getRank() {
+			return rank;
+		}
+
+		public void setRank(Long rank) {
+			this.rank = rank;
+		}
+
+		private static final long serialVersionUID = -5076990764713538973L;
+
+		public static List<String> Excludes = new ArrayList<String>();
+
+		static WrapCopier<DocumentCommentInfo, Wo> copier = WrapCopierFactory.wo( DocumentCommentInfo.class, Wo.class, null, ListTools.toList(JpaObject.FieldsInvisible));
+
+	}
+}

+ 2 - 4
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/comment/ActionListNextWithFilter.java

@@ -53,19 +53,17 @@ public class ActionListNextWithFilter extends BaseAction {
 		if( check ) {
 			queryFilter = wrapIn.getQueryFilter();
 		}
-		
 		if( check ) {
-			cacheKey = ApplicationCache.concreteCacheKey( "ActionListNext", effectivePerson.getDistinguishedName(), flag, count, 
+			cacheKey = ApplicationCache.concreteCacheKey( "ActionListNextWithFilter", effectivePerson.getDistinguishedName(), flag, count, 
 					wrapIn.getOrderField(), wrapIn.getOrderType(), 	queryFilter.getContentSHA1() );
 			element = commentInfoCache.get( cacheKey );
-			
 			if ((null != element) && (null != element.getObjectValue())) {
 				resultObject = (ResultObject) element.getObjectValue();
 				result.setCount( resultObject.getTotal() );
 				result.setData( resultObject.getWos() );
 			} else {
 				try {	
-					Long total = documentCommentInfoQueryService.countWithFilter( effectivePerson, queryFilter );					
+					Long total = documentCommentInfoQueryService.countWithFilter( effectivePerson, queryFilter );
 					List<DocumentCommentInfo>  documentCommentInfoList = documentCommentInfoQueryService.listWithFilter( effectivePerson, count, flag, wrapIn.getOrderField(), wrapIn.getOrderType(), queryFilter );
 					
 					if( ListTools.isNotEmpty( documentCommentInfoList )) {

+ 1 - 1
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/comment/ActionListPageWithFilter.java

@@ -51,7 +51,7 @@ public class ActionListPageWithFilter extends BaseAction {
 		
 		if( check ) {
 			
-			cacheKey = ApplicationCache.concreteCacheKey( "ActionListNext", effectivePerson.getDistinguishedName(), 
+			cacheKey = ApplicationCache.concreteCacheKey( "ActionListPageWithFilter", effectivePerson.getDistinguishedName(), 
 					pageNum, count, wrapIn.getOrderField(), wrapIn.getOrderType(), queryFilter.getContentSHA1() );
 			element = commentInfoCache.get( cacheKey );
 		}

+ 1 - 1
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/comment/ActionListPrevWithFilter.java

@@ -55,7 +55,7 @@ public class ActionListPrevWithFilter extends BaseAction {
 		}
 		
 		if( check ) {
-			cacheKey = ApplicationCache.concreteCacheKey( "ActionListPrev", effectivePerson.getDistinguishedName(), 
+			cacheKey = ApplicationCache.concreteCacheKey( "ActionListPrevWithFilter", effectivePerson.getDistinguishedName(), 
 					flag, count, wrapIn.getOrderField(), wrapIn.getOrderType(), queryFilter.getContentSHA1() );
 			element = commentInfoCache.get( cacheKey );
 			

+ 63 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/comment/ActionPersistCommend.java

@@ -0,0 +1,63 @@
+package com.x.cms.assemble.control.jaxrs.comment;
+
+import javax.servlet.http.HttpServletRequest;
+
+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.cms.core.entity.Document;
+import com.x.cms.core.entity.DocumentCommentCommend;
+import com.x.cms.core.entity.DocumentCommentInfo;
+
+public class ActionPersistCommend extends BaseAction {
+
+	private static  Logger logger = LoggerFactory.getLogger(ActionPersistCommend.class);
+
+	protected ActionResult<Wo> execute(HttpServletRequest request, String id, EffectivePerson effectivePerson ) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		DocumentCommentInfo comment = null;
+		Boolean check = true;
+
+		if (check) {
+			try {
+				comment = documentCommentInfoQueryService.get( id );
+				if (null == comment) {
+					check = false;
+					Exception exception = new ExceptionDocumentNotExists(id);
+					result.error(exception);
+					throw exception;
+				}
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new ExceptionCommentQuery(e, "文档评论信息获取操作时发生异常。Id:" + id + ", Name:" + effectivePerson.getDistinguishedName());
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+
+		if (check) {
+			try {				
+				DocumentCommentCommend commentCommend = commentCommendPersistService.create( effectivePerson.getDistinguishedName(), id );
+				Wo wo = new Wo();
+				wo.setId( commentCommend.getId() );
+				result.setData( wo );				
+			} catch (Exception e) {
+				Exception exception = new ExceptionCommentPersist(e, "给文档评论点赞时时发生异常。Id:" + id);
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+				throw exception;
+			}
+		}
+
+		ApplicationCache.notify( Document.class );
+
+		return result;
+	}
+	
+	public static class Wo extends WoId {
+
+	}
+}

+ 55 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/comment/ActionPersistUnCommend.java

@@ -0,0 +1,55 @@
+package com.x.cms.assemble.control.jaxrs.comment;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+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.cms.core.entity.Document;
+
+public class ActionPersistUnCommend extends BaseAction {
+
+	private static  Logger logger = LoggerFactory.getLogger(ActionPersistUnCommend.class);
+
+	protected ActionResult<Wo> execute(HttpServletRequest request, String commentId, EffectivePerson effectivePerson ) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		Boolean check = true;
+
+		if (check) {
+			try {				
+				List<String> ids = commentCommendPersistService.deleteWithCommentId( commentId, effectivePerson.getDistinguishedName() );		
+				Wo wo = new Wo();
+				wo.setIds( ids );
+				result.setData( wo );				
+			} catch (Exception e) {
+				Exception exception = new ExceptionCommentPersist(e, "系统根据个人和文档评论ID删除点赞信息时发生异常。commentId:" + commentId );
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+				throw exception;
+			}
+		}
+
+		ApplicationCache.notify( Document.class );		
+		
+		return result;
+	}
+	
+	public static class Wo {
+		
+		private List<String> ids = null;
+
+		public List<String> getIds() {
+			return ids;
+		}
+
+		public void setIds(List<String> ids) {
+			this.ids = ids;
+		}
+		
+		
+	}
+}

+ 13 - 1
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/comment/ActionSave.java

@@ -29,6 +29,7 @@ public class ActionSave extends BaseAction {
 		try {
 			wi = this.convertToWrapIn( jsonElement, Wi.class );
 			documentCommentInfo = Wi.copier.copy(wi);
+			documentCommentInfo.setId( wi.getId());;
 			documentCommentInfo.setCreatorName( effectivePerson.getDistinguishedName() );
 			documentCommentInfo.setAuditorName( "" );
 			documentCommentInfo.setCommentAuditStatus( "通过" );			
@@ -81,6 +82,9 @@ public class ActionSave extends BaseAction {
 
 	public static class Wi {
 		
+		@FieldDescribe("评论ID")
+		private String id = "";
+		
 		@FieldDescribe("文档ID")
 		private String documentId = "";
 
@@ -96,7 +100,15 @@ public class ActionSave extends BaseAction {
 		@FieldDescribe("是否私信评论")
 		private Boolean isPrivate = false;
 		
-		public static WrapCopier<Wi, DocumentCommentInfo> copier = WrapCopierFactory.wi( Wi.class, DocumentCommentInfo.class, null, null );
+		public static WrapCopier<Wi, DocumentCommentInfo> copier = WrapCopierFactory.wi( Wi.class, DocumentCommentInfo.class, null, null );		
+		
+		public String getId() {
+			return id;
+		}
+
+		public void setId(String id) {
+			this.id = id;
+		}
 
 		public String getDocumentId() {
 			return documentId;

+ 4 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/comment/BaseAction.java

@@ -2,10 +2,12 @@ package com.x.cms.assemble.control.jaxrs.comment;
 
 import com.x.base.core.project.cache.ApplicationCache;
 import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.cms.assemble.control.service.CommentCommendPersistService;
 import com.x.cms.assemble.control.service.DocumentCommentInfoPersistService;
 import com.x.cms.assemble.control.service.DocumentCommentInfoQueryService;
 import com.x.cms.assemble.control.service.DocumentQueryService;
 import com.x.cms.core.entity.DocumentCommentInfo;
+
 import net.sf.ehcache.Ehcache;
 
 public class BaseAction extends StandardJaxrsAction {
@@ -17,4 +19,6 @@ public class BaseAction extends StandardJaxrsAction {
 	protected 	DocumentCommentInfoQueryService documentCommentInfoQueryService = new DocumentCommentInfoQueryService();
 	
 	protected DocumentQueryService documentInfoServiceAdv = new DocumentQueryService();
+	
+	protected CommentCommendPersistService commentCommendPersistService = new CommentCommendPersistService();
 }

+ 65 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/comment/DocumentCommentInfoAction.java

@@ -5,6 +5,7 @@ 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;
@@ -14,6 +15,7 @@ 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 javax.ws.rs.core.Response;
 
 import com.google.gson.JsonElement;
 import com.x.base.core.project.annotation.JaxrsDescribe;
@@ -33,6 +35,25 @@ public class DocumentCommentInfoAction extends StandardJaxrsAction {
 
 	private Logger logger = LoggerFactory.getLogger(DocumentCommentInfoAction.class);
 
+	@JaxrsMethodDescribe(value = "根据标识获取评论信息对象.", action = ActionGet.class)
+	@GET
+	@Path("{id}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response get(@Context HttpServletRequest request, @JaxrsParameterDescribe("评论ID") @PathParam("id") String id) {
+		EffectivePerson effectivePerson = this.effectivePerson( request );
+		ActionResult<ActionGet.Wo> result = new ActionResult<>();
+		try {
+			result = new ActionGet().execute( request, effectivePerson, id );
+		} catch (Exception e) {
+			result = new ActionResult<>();
+			Exception exception = new ExceptionCommentQuery(e, "根据指定ID查询评论信息对象时发生异常。id:" + id );
+			result.error(exception);
+			logger.error(e, effectivePerson, request, null);
+		}
+		return ResponseFactory.getDefaultActionResultResponse(result);
+	}
+	
 	@JaxrsMethodDescribe(value = "列示评论信息,按页码分页.", action = ActionListPageWithFilter.class)
 	@PUT
 	@Path("list/{page}/size/{size}")
@@ -129,4 +150,48 @@ public class DocumentCommentInfoAction extends StandardJaxrsAction {
 		}
 		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
 	}
+	
+	@JaxrsMethodDescribe(value = "文档评论点赞.", action = ActionPersistCommend.class)
+	@GET
+	@Path("{id}/commend")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response persist_commend( @Context HttpServletRequest request, 
+			@JaxrsParameterDescribe("评论ID") @PathParam("id") String id ) {
+		EffectivePerson effectivePerson = this.effectivePerson( request );
+		ActionResult<ActionPersistCommend.Wo> result = new ActionResult<>();
+		Boolean check = true;
+		if( check ){
+			try {
+				result = new ActionPersistCommend().execute( request, id, effectivePerson );
+			} catch (Exception e) {
+				result = new ActionResult<>();
+				result.error( e );
+				logger.error( e, effectivePerson, request, null);
+			}
+		}
+		return ResponseFactory.getDefaultActionResultResponse(result);
+	}
+	
+	@JaxrsMethodDescribe(value = "取消文档评论点赞.", action = ActionPersistUnCommend.class)
+	@GET
+	@Path("{id}/uncommend")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response persist_unCommend( @Context HttpServletRequest request, 
+			@JaxrsParameterDescribe("评论ID") @PathParam("id") String id ) {
+		EffectivePerson effectivePerson = this.effectivePerson( request );
+		ActionResult<ActionPersistUnCommend.Wo> result = new ActionResult<>();
+		Boolean check = true;
+		if( check ){
+			try {
+				result = new ActionPersistUnCommend().execute( request, id, effectivePerson );
+			} catch (Exception e) {
+				result = new ActionResult<>();
+				result.error( e );
+				logger.error( e, effectivePerson, request, null);
+			}
+		}
+		return ResponseFactory.getDefaultActionResultResponse(result);
+	}
 }

+ 2 - 2
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/comment/WrapInQueryDocumentCommentInfo.java

@@ -12,10 +12,10 @@ import com.x.cms.core.entity.tools.filter.term.LikeTerm;
 public class WrapInQueryDocumentCommentInfo {
 	
 	@FieldDescribe("用于排列的属性.")
-	private String orderField = "createTime";
+	private String orderField = "orderNumber";
 
 	@FieldDescribe("排序方式:DESC | ASC.")
-	private String orderType = "DESC";
+	private String orderType = "ASC";
 	
 	@FieldDescribe("搜索条件:栏目ID")
 	private String appId;

+ 122 - 65
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/document/ActionPersistSaveDocument.java

@@ -47,10 +47,10 @@ public class ActionPersistSaveDocument extends BaseAction {
 
 		try {
 			wi = this.convertToWrapIn( jsonElement, Wi.class );
-			identity = wi.getIdentity();
-			if( StringUtils.isEmpty( identity ) ) {
-				identity = wi.getCreatorIdentity();
-			}
+			document = Wi.copier.copy(wi);
+			document.setId( wi.getId() ); //继承传入的ID
+			
+			identity = wi.getIdentity();	
 		} catch (Exception e ) {
 			check = false;
 			Exception exception = new ExceptionDocumentInfoProcess( e, "系统在将JSON信息转换为对象时发生异常。");
@@ -87,15 +87,16 @@ public class ActionPersistSaveDocument extends BaseAction {
 
 		if (check) {
 			try {
-				appInfo = appInfoServiceAdv.get( wi.getAppId() );
-				if (appInfo == null) {
+				categoryInfo = categoryInfoServiceAdv.get( wi.getCategoryId() );
+				if (categoryInfo == null) {
 					check = false;
-					Exception exception = new ExceptionAppInfoNotExists(wi.getAppId());
+					Exception exception = new ExceptionCategoryInfoNotExists(wi.getCategoryId());
 					result.error(exception);
 				}
 			} catch (Exception e) {
 				check = false;
-				Exception exception = new ExceptionDocumentInfoProcess(e, "系统在根据ID查询应用栏目信息时发生异常!ID:" + wi.getAppId());
+				Exception exception = new ExceptionDocumentInfoProcess(e,
+						"系统在根据ID查询分类信息时发生异常!ID:" + wi.getCategoryId());
 				result.error(exception);
 				logger.error(e, effectivePerson, request, null);
 			}
@@ -103,21 +104,20 @@ public class ActionPersistSaveDocument extends BaseAction {
 
 		if (check) {
 			try {
-				categoryInfo = categoryInfoServiceAdv.get( wi.getCategoryId() );
-				if (categoryInfo == null) {
+				appInfo = appInfoServiceAdv.get( categoryInfo.getAppId() );
+				if (appInfo == null) {
 					check = false;
-					Exception exception = new ExceptionCategoryInfoNotExists(wi.getCategoryId());
+					Exception exception = new ExceptionAppInfoNotExists(categoryInfo.getAppId());
 					result.error(exception);
 				}
 			} catch (Exception e) {
 				check = false;
-				Exception exception = new ExceptionDocumentInfoProcess(e,
-						"系统在根据ID查询分类信息时发生异常!ID:" + wi.getCategoryId());
+				Exception exception = new ExceptionDocumentInfoProcess(e, "系统在根据ID查询应用栏目信息时发生异常!ID:" + categoryInfo.getAppId());
 				result.error(exception);
 				logger.error(e, effectivePerson, request, null);
 			}
 		}
-
+		
 		// 查询分类设置的编辑表单
 		if (check) {
 			if ( StringUtils.isEmpty(categoryInfo.getFormId() )) {
@@ -135,8 +135,8 @@ public class ActionPersistSaveDocument extends BaseAction {
 					Exception exception = new ExceptionFormForEditNotExists(categoryInfo.getFormId());
 					result.error(exception);
 				} else {
-					wi.setForm(form.getId());
-					wi.setFormName(form.getName());
+					document.setForm(form.getId());
+					document.setFormName(form.getName());
 				}
 			} catch (Exception e) {
 				check = false;
@@ -156,8 +156,8 @@ public class ActionPersistSaveDocument extends BaseAction {
 						Exception exception = new ExceptionFormForReadNotExists(categoryInfo.getReadFormId());
 						result.error(exception);
 					} else {
-						wi.setReadFormId(form.getId());
-						wi.setReadFormName(form.getName());
+						document.setReadFormId(form.getId());
+						document.setReadFormName(form.getName());
 					}
 				} catch (Exception e) {
 					check = false;
@@ -170,45 +170,42 @@ public class ActionPersistSaveDocument extends BaseAction {
 		}
 
 		if (check) {
-			wi.setDocumentType( categoryInfo.getDocumentType() );
-			wi.setAppId(categoryInfo.getAppId());
-			wi.setAppAlias( appInfo.getAppAlias());
-			wi.setAppName(appInfo.getAppName());
-			wi.setCategoryName(categoryInfo.getCategoryName());
-			wi.setCategoryId(categoryInfo.getId());
-			wi.setCategoryAlias(categoryInfo.getCategoryAlias());
-			if( StringUtils.isEmpty( wi.getDocumentType() ) ) {
-				wi.setDocumentType( categoryInfo.getDocumentType() );
-			}
-			if( !"信息".equals(wi.getDocumentType()) && !"数据".equals( wi.getDocumentType() )) {
-				wi.setDocumentType( "信息" );
-			}
-			if (wi.getPictureList() != null && !wi.getPictureList().isEmpty()) {
-				wi.setHasIndexPic(true);
+			//补充部分信息
+//			document.setCategoryId(categoryInfo.getId());	
+			document.setAppId(appInfo.getId());					
+			document.setDocumentType( categoryInfo.getDocumentType() );	
+			document.setAppAlias( appInfo.getAppAlias());
+			document.setAppName(appInfo.getAppName());
+			document.setCategoryName(categoryInfo.getCategoryName());
+			document.setCategoryAlias(categoryInfo.getCategoryAlias());
+			document.setDocumentType( categoryInfo.getDocumentType() );
+			
+			if( !"信息".equals(document.getDocumentType()) && !"数据".equals( document.getDocumentType() )) {
+				document.setDocumentType( "信息" );
 			}
 		}
 
 		if (check) {
 			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 				if ( identity != null) {
-					wi.setCreatorIdentity( identity );
-					wi.setCreatorPerson( userManagerService.getPersonNameWithIdentity( identity ) );
-					wi.setCreatorUnitName( userManagerService.getUnitNameByIdentity( identity ) );
-					wi.setCreatorTopUnitName( userManagerService.getTopUnitNameByIdentity( identity ) );
+					document.setCreatorIdentity( identity );
+					document.setCreatorPerson( userManagerService.getPersonNameWithIdentity( identity ) );
+					document.setCreatorUnitName( userManagerService.getUnitNameByIdentity( identity ) );
+					document.setCreatorTopUnitName( userManagerService.getTopUnitNameByIdentity( identity ) );
 				} else {
 					if ("xadmin".equalsIgnoreCase(effectivePerson.getDistinguishedName())) {
-						wi.setCreatorIdentity("xadmin");
-						wi.setCreatorPerson("xadmin");
-						wi.setCreatorUnitName("xadmin");
-						wi.setCreatorTopUnitName("xadmin");
+						document.setCreatorIdentity("xadmin");
+						document.setCreatorPerson("xadmin");
+						document.setCreatorUnitName("xadmin");
+						document.setCreatorTopUnitName("xadmin");
 					} else {
 						//取第一个身份
 						identity = userManagerService.getIdentityWithPerson(effectivePerson.getDistinguishedName());
 						if(StringUtils.isNotEmpty(identity)) {
-							wi.setCreatorIdentity( identity );
-							wi.setCreatorPerson( effectivePerson.getDistinguishedName() );
-							wi.setCreatorUnitName( userManagerService.getUnitNameByIdentity( identity ) );
-							wi.setCreatorTopUnitName( userManagerService.getTopUnitNameByIdentity( identity ) );
+							document.setCreatorIdentity( identity );
+							document.setCreatorPerson( effectivePerson.getDistinguishedName() );
+							document.setCreatorUnitName( userManagerService.getUnitNameByIdentity( identity ) );
+							document.setCreatorTopUnitName( userManagerService.getTopUnitNameByIdentity( identity ) );
 						}else {
 							Exception exception = new ExceptionPersonHasNoIdentity(effectivePerson.getDistinguishedName());
 							result.error(exception);
@@ -227,7 +224,7 @@ public class ActionPersistSaveDocument extends BaseAction {
 				if( wi.getDocData() != null ) {
 					dataJson = XGsonBuilder.instance().toJsonTree( wi.getDocData() );
 				}
-				document = documentPersistService.save( wi, dataJson );
+				document = documentPersistService.save( document, dataJson );
 				ApplicationCache.notify(Document.class);
 
 				Wo wo = new Wo();
@@ -322,11 +319,7 @@ public class ActionPersistSaveDocument extends BaseAction {
 		
 		if (check) {
 			try {//将读者以及作者信息持久化到数据库中
-				if( "published".equals( document.getDocStatus() )) {
-					documentPersistService.refreshDocumentPermission( document.getId(), wi.getReaderList(), wi.getAuthorList() );
-				}else {
-					documentPersistService.refreshDocumentPermission( document.getId(), null, null );
-				}
+				documentPersistService.refreshDocumentPermission( document.getId(), wi.getReaderList(), wi.getAuthorList() );
 			} catch (Exception e) {
 				check = false;
 				Exception exception = new ExceptionDocumentInfoProcess(e, "系统在核对文档访问管理权限信息时发生异常!");
@@ -337,42 +330,106 @@ public class ActionPersistSaveDocument extends BaseAction {
 		return result;
 	}
 
-	public static class Wi extends Document {
+	public static class Wi{
+		
+		@FieldDescribe("ID,非必填,更新时必填写,不然就是新增文档")
+		private String id;
 		
-		private static final long serialVersionUID = -5076990764713538973L;
+		@FieldDescribe("文档标题,<font style='color:red'>必填</font>")
+		private String title;
 
-		public static WrapCopier<Wi, Document> copier = WrapCopierFactory.wi( Wi.class, Document.class, null, JpaObject.FieldsUnmodify);
+		@FieldDescribe("分类ID,<font style='color:red'>必填</font>")
+		private String categoryId;
 		
-		@FieldDescribe( "文档操作者身份." )
+		@FieldDescribe( "文档操作者身份,如果不传入则取登录者信息。" )
 		private String identity = null;
+
+		@FieldDescribe("文档摘要,非必填")
+		private String summary;
+
+		@FieldDescribe("文档状态: published | draft | checking | error,非必填,默认为draft")
+		private String docStatus = "draft";
+
+		@FieldDescribe("首页图片列表,非必填")
+		private List<String> pictureList = null;		
 		
-		@FieldDescribe( "数据的路径列表." )
+		@FieldDescribe( "数据的路径列表,非必填" )
 		private String[] dataPaths = null;
 		
-		@FieldDescribe( "启动流程的JobId." )
+		@FieldDescribe( "启动流程的JobId,非必填" )
 		private String wf_jobId = null;
 		
-		@FieldDescribe( "启动流程的WorkId." )
+		@FieldDescribe( "启动流程的WorkId,非必填" )
 		private String wf_workId = null;
 		
-		@FieldDescribe( "启动流程的附件列表." )
+		@FieldDescribe( "启动流程的附件列表,非必填" )
 		private String[] wf_attachmentIds = null;	
 		
-		@FieldDescribe( "文档数据." )
+		@FieldDescribe( "文档数据,非必填" )
 		private Map<?, ?> docData = null;
 		
-		@FieldDescribe( "文档读者." )
+		@FieldDescribe( "文档读者,非必填:{'permission':'读者', 'permissionObjectType':'组织', 'permissionObjectCode':'组织全称', 'permissionObjectName':'组织全称'}" )
 		private List<PermissionInfo> readerList = null;
 		
-		@FieldDescribe( "文档编辑者." )
+		@FieldDescribe( "文档编辑者,非必填:{'permission':'读者', 'permissionObjectType':'组织', 'permissionObjectCode':'组织全称', 'permissionObjectName':'组织全称'}" )
 		private List<PermissionInfo> authorList = null;
 		
-		@FieldDescribe( "图片列表." )
+		@FieldDescribe( "图片列表,非必填" )
 		private List<String> cloudPictures = null;
 		
-		@FieldDescribe( "不修改权限(跳过权限设置,保留原来的设置)." )
-		private Boolean skipPermission  = false;
+		@FieldDescribe( "不修改权限(跳过权限设置,保留原来的设置),非必填" )
+		private Boolean skipPermission  = false;	
+
+		public static WrapCopier<Wi, Document> copier = WrapCopierFactory.wi( Wi.class, Document.class, null, JpaObject.FieldsUnmodify);
 		
+		public String getId() {
+			return id;
+		}
+
+		public void setId(String id) {
+			this.id = id;
+		}
+
+		public String getSummary() {
+			return summary;
+		}
+
+		public void setSummary(String summary) {
+			this.summary = summary;
+		}
+
+		public String getTitle() {
+			return title;
+		}
+
+		public void setTitle(String title) {
+			this.title = title;
+		}
+
+		public String getCategoryId() {
+			return categoryId;
+		}
+
+		public void setCategoryId(String categoryId) {
+			this.categoryId = categoryId;
+		}
+
+		public String getDocStatus() {
+			return docStatus;
+		}
+
+		public void setDocStatus(String docStatus) {
+			this.docStatus = docStatus;
+		}
+
+		public List<String> getPictureList() {
+			return pictureList;
+		}
+
+		public void setPictureList(List<String> pictureList) {
+			this.pictureList = pictureList;
+		}
+
 		public String getIdentity() {
 			return identity;
 		}

+ 1 - 1
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/document/DocumentAction.java

@@ -62,7 +62,7 @@ public class DocumentAction extends StandardJaxrsAction{
 		return ResponseFactory.getDefaultActionResultResponse(result);
 	}
 	
-	@JaxrsMethodDescribe(value = "指修改指定文档的数据.", action = ActionPersistBatchModifyData.class)
+	@JaxrsMethodDescribe(value = "指修改指定文档的数据", action = ActionPersistBatchModifyData.class)
 	@PUT
 	@Path("batch/data/modify")
 	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)

+ 8 - 8
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/view/ActionListNextPageViewData.java

@@ -56,7 +56,7 @@ public class ActionListNextPageViewData extends BaseAction {
 		List<String> sortableFieldNames = null;
 		QueryFilter queryFilter = null;
 		
-		if( pageSize <= 0){
+		if( pageSize <= 0 || pageSize == null ){
 			pageSize = 12;
 		}
 		
@@ -276,14 +276,14 @@ public class ActionListNextPageViewData extends BaseAction {
 									add2List = true;
 								}
 								if( add2List ) {
-									docIds.add( review.getDocId() );
+									if( !docIds.contains( review.getDocId() )) {
+										docIds.add( review.getDocId() );
+										searchResultList.add( documentQueryService.get(  review.getDocId()  ));
+										if( searchResultList.size() >= pageSize ) {
+											break;
+										}
+									}
 								}
-								if( searchResultList.size() >= pageSize ) {
-									break;
-								}
-							}
-							if( ListTools.isNotEmpty( docIds )) {
-								searchResultList = documentQueryService.list( docIds );
 							}
 						}
 					}

+ 17 - 2
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/AppInfoService.java

@@ -24,9 +24,9 @@ public class AppInfoService {
 		return business.getAppInfoFactory().listAllIds(documentType);
 	}
 	
-	public List<AppInfo> listAll(EntityManagerContainer emc, String documentType) throws Exception {
+	public List<AppInfo> listAll(EntityManagerContainer emc, String appType, String documentType) throws Exception {
 		Business business = new Business( emc );
-		return business.getAppInfoFactory().listAll(documentType);
+		return business.getAppInfoFactory().listAll( appType, documentType);
 	}
 	
 	public void delete( EntityManagerContainer emc, String id ) throws Exception {
@@ -181,5 +181,20 @@ public class AppInfoService {
 		Business business = new Business( emc );
 		return business.getAppInfoFactory().listAppInfoByAppAlias( appAliases );
 	}
+
+	public List<String> listAllAppType(EntityManagerContainer emc ) throws Exception {
+		Business business = new Business( emc );
+		return business.getAppInfoFactory().listAllAppType();
+	}
+
+	public Long countAppInfoWithAppType(EntityManagerContainer emc, String type) throws Exception {
+		Business business = new Business( emc );
+		return business.getAppInfoFactory().countAppInfoWithAppType( type );
+	}
+	
+	public Long countAppInfoWithOutAppType(EntityManagerContainer emc ) throws Exception {
+		Business business = new Business( emc );
+		return business.getAppInfoFactory().countAppInfoWithOutAppType( );
+	}
 	
 }

+ 31 - 13
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/AppInfoServiceAdv.java

@@ -64,21 +64,10 @@ public class AppInfoServiceAdv {
 			throw e;
 		}
 	}
-	
-//	public void delete(String id, EffectivePerson currentPerson, String documentType, Integer maxCount ) throws Exception {
-//		if (id == null || id.isEmpty()) {
-//			throw new Exception("id is null.");
-//		}
-//		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-//			appInfoService.delete(emc, id, documentType, maxCount);
-//		} catch (Exception e) {
-//			throw e;
-//		}
-//	}
 
-	public List<AppInfo> listAll(String documentType) throws Exception {
+	public List<AppInfo> listAll( String appType, String documentType) throws Exception {
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			return appInfoService.listAll(emc, documentType);
+			return appInfoService.listAll(emc, appType, documentType);
 		} catch (Exception e) {
 			throw e;
 		}
@@ -394,5 +383,34 @@ public class AppInfoServiceAdv {
 		} catch (Exception e) {
 			throw e;
 		}
+	}
+
+	/**
+	 * 获取系统内已经存在的所有的栏目类别
+	 * @return
+	 * @throws Exception 
+	 */
+	public List<String> listAllAppType() throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			return appInfoService.listAllAppType(emc);
+		} catch (Exception e) {
+			throw e;
+		}
+	}
+
+	public Long countAppInfoWithAppType(String type) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			return appInfoService.countAppInfoWithAppType(emc, type);
+		} catch (Exception e) {
+			throw e;
+		}
+	}	
+	
+	public Long countAppInfoWithOutAppType() throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			return appInfoService.countAppInfoWithOutAppType(emc );
+		} catch (Exception e) {
+			throw e;
+		}
 	}	
 }

+ 6 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/CmsBatchOperationProcessService.java

@@ -109,6 +109,7 @@ public class CmsBatchOperationProcessService {
 			Integer maxQueryCount = 1000;
 			Long count = business.getDocumentFactory().countByAppId(appId);
 			Long maxTimes = count/maxQueryCount + 2;
+			AppInfo appInfo = emc.find(appId, AppInfo.class );
 			logger.info( "refreshDocumentReviewInAppInfo -> There are '" + count +"' document need refresh review, need to process '" + maxTimes + "' times ......" );
 			for( int i=0; i<=maxTimes; i++ ) {
 				ids = business.getDocumentFactory().listReviewedIdsByAppId( appId, maxQueryCount );
@@ -121,6 +122,11 @@ public class CmsBatchOperationProcessService {
 					for( Document document : documentList ) {
 						emc.beginTransaction(Document.class );
 						document.setReviewed( false );
+						document.setAppName( appInfo.getAppName() );
+						document.setAppAlias( appInfo.getAppAlias() );
+						if( StringUtils.isEmpty( document.getAppAlias() )) {
+							document.setAppAlias( appInfo.getAppName() );
+						}
 						emc.check( document, CheckPersistType.all );
 						emc.commit();						
 						cmsBatchOperationPersistService.addOperation( 

+ 87 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/CommentCommendPersistService.java

@@ -0,0 +1,87 @@
+package com.x.cms.assemble.control.service;
+
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.project.tools.ListTools;
+import com.x.cms.core.entity.DocumentCommentCommend;
+import com.x.cms.core.entity.DocumentCommentInfo;
+
+/**
+ * 文档点赞信息持久化管理的服务类
+ * 
+ * @author O2LEE
+ */
+public class CommentCommendPersistService {
+	
+	private CommentCommendService commentCommendService = new CommentCommendService();
+	
+	public DocumentCommentCommend create( DocumentCommentCommend commentCommend ) throws Exception {
+		if( commentCommend == null ){
+			throw new Exception("wrapIn document commend is null!");
+		}
+		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
+			return commentCommendService.create(emc, commentCommend );
+		} catch ( Exception e ) {
+			throw e;
+		}
+	}
+	
+	public DocumentCommentCommend create( String personName, String commentId ) throws Exception {
+		if( StringUtils.isEmpty( commentId ) ){
+			throw new Exception("commentId can not empty!");
+		}
+		if( StringUtils.isEmpty( personName ) ){
+			throw new Exception("personName can not empty!");
+		}
+		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
+			DocumentCommentInfo comment = emc.find( commentId, DocumentCommentInfo.class );
+			if(comment != null  ) {
+				DocumentCommentCommend commentCommend = new DocumentCommentCommend();
+				commentCommend.setCommendPerson( personName );
+				commentCommend.setDocumentId( comment.getDocumentId() );
+				commentCommend.setCommentId( comment.getId());
+				return commentCommendService.create(emc, commentCommend );
+			}else {
+				throw new Exception("comment not exists! ID=" + commentId );
+			}
+		} catch ( Exception e ) {
+			throw e;
+		}
+	}
+	
+	public List<String> deleteWithCommentId( String commentId, String personName ) throws Exception {
+		if( StringUtils.isEmpty( commentId ) ){
+			throw new Exception("commentId is empty!");
+		}
+		if( StringUtils.isEmpty( personName ) ){
+			throw new Exception("personName is empty!");
+		}
+		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
+			List<String> ids = commentCommendService.listIdsByDocumentCommentAndPerson(emc, commentId, personName, 999 );
+			if( ListTools.isNotEmpty( ids ) ) {
+				return commentCommendService.delete(emc, ids );
+			}else {
+				return null;
+			}
+			
+		} catch ( Exception e ) {
+			throw e;
+		}
+	}
+	
+	public DocumentCommentCommend delete( String id ) throws Exception {
+		if( StringUtils.isEmpty( id ) ){
+			throw new Exception("id is empty!");
+		}
+		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
+			return commentCommendService.delete(emc, id);
+		} catch ( Exception e ) {
+			throw e;
+		}
+	}
+	
+}

+ 54 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/CommentCommendQueryService.java

@@ -0,0 +1,54 @@
+package com.x.cms.assemble.control.service;
+
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+
+/**
+ * 文档点赞信息查询管理的服务类
+ * 
+ * @author O2LEE
+ */
+public class CommentCommendQueryService {
+	
+	private CommentCommendService commnetCommendService = new CommentCommendService();
+	
+	public List<String> listIdsByDocumentCommentAndPerson( String commentId, String personName, Integer maxCount ) throws Exception {
+		if( StringUtils.isEmpty( commentId ) ){
+			return null;
+		}
+		if( StringUtils.isEmpty( personName ) ){
+			return null;
+		}
+		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
+			return commnetCommendService.listIdsByDocumentCommentAndPerson(emc, commentId, personName, maxCount);
+		} catch ( Exception e ) {
+			throw e;
+		}
+	}
+	
+	public List<String> listByComment( String commentId, Integer maxCount ) throws Exception {
+		if( StringUtils.isEmpty( commentId ) ){
+			return null;
+		}
+		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
+			return commnetCommendService.listByComment(emc, commentId, maxCount);
+		} catch ( Exception e ) {
+			throw e;
+		}
+	}
+	
+	public List<String> listWithPerson( String personName, Integer maxCount ) throws Exception {
+		if( StringUtils.isEmpty( personName ) ){
+			return null;
+		}
+		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
+			return commnetCommendService.listWithPerson(emc, personName, maxCount);
+		} catch ( Exception e ) {
+			throw e;
+		}
+	}
+}

+ 122 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/CommentCommendService.java

@@ -0,0 +1,122 @@
+package com.x.cms.assemble.control.service;
+
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.entity.annotation.CheckPersistType;
+import com.x.base.core.entity.annotation.CheckRemoveType;
+import com.x.base.core.project.tools.ListTools;
+import com.x.cms.assemble.control.Business;
+import com.x.cms.core.entity.Document;
+import com.x.cms.core.entity.DocumentCommentCommend;
+import com.x.cms.core.entity.DocumentCommentInfo;
+
+class CommentCommendService {
+
+	public List<String> listCommentIdsWithPerson( EntityManagerContainer emc, String personName, Integer maxCount ) throws Exception {
+		if( StringUtils.isEmpty( personName ) ){
+			return null;
+		}
+		Business business = new Business( emc );
+		return business.documentCommentCommendFactory().listCommentIdsWithPerson(personName, maxCount);
+	}
+	
+	public List<String> listIdsByDocumentCommentAndPerson( EntityManagerContainer emc, String commentId, String personName, Integer maxCount ) throws Exception {
+		if( StringUtils.isEmpty( commentId ) ){
+			return null;
+		}
+		if( StringUtils.isEmpty( personName ) ){
+			return null;
+		}
+		Business business = new Business( emc );
+		return business.documentCommentCommendFactory().listIdsByDocumentCommentAndPerson(commentId, personName, maxCount);
+	}
+	
+	public List<String> listByComment( EntityManagerContainer emc, String commentId, Integer maxCount ) throws Exception {
+		if( StringUtils.isEmpty( commentId ) ){
+			return null;
+		}
+		Business business = new Business( emc );
+		return business.documentCommentCommendFactory().listIdsByDocumentComment( commentId, maxCount );
+	}
+	
+	public List<String> listWithPerson( EntityManagerContainer emc, String personName, Integer maxCount ) throws Exception {
+		if( StringUtils.isEmpty( personName ) ){
+			return null;
+		}
+		Business business = new Business( emc );
+		return business.documentCommentCommendFactory().listWithPerson(personName, maxCount);
+	}
+
+	public DocumentCommentCommend create( EntityManagerContainer emc, DocumentCommentCommend commend ) throws Exception {
+		if( commend == null ){
+			throw new Exception("wrapIn documentCommentCommend is null!");
+		}
+		Business business = new Business( emc );
+		List<String> commendIds = null;
+		DocumentCommentCommend documentCommentCommend = null;
+		commendIds = business.documentCommentCommendFactory().listIdsByDocumentCommentAndPerson( commend.getCommentId(), commend.getCommendPerson(), 1 );
+		if( ListTools.isEmpty( commendIds ) ){
+			DocumentCommentInfo comment = emc.find( commend.getCommentId(), DocumentCommentInfo.class );
+			documentCommentCommend = new DocumentCommentCommend();
+			documentCommentCommend.setId( DocumentCommentCommend.createId() );
+			documentCommentCommend.setCommendPerson( commend.getCommendPerson() );
+			documentCommentCommend.setDocumentId( commend.getDocumentId() );
+			documentCommentCommend.setCommentId(commend.getCommentId());
+			emc.beginTransaction( DocumentCommentCommend.class );
+			if( comment != null ) {
+				emc.beginTransaction( DocumentCommentInfo.class );
+				comment.addCommendCount(1);
+				emc.check( comment, CheckPersistType.all );
+			}
+			emc.persist( documentCommentCommend, CheckPersistType.all );
+			emc.commit();
+		}else {
+			documentCommentCommend = emc.find( commendIds.get(0), DocumentCommentCommend.class );
+		}
+		return documentCommentCommend;		
+	}
+	
+	public DocumentCommentCommend delete( EntityManagerContainer emc, String id ) throws Exception {
+		if( StringUtils.isEmpty( id ) ){
+			throw new Exception("id is empty!");
+		}
+		DocumentCommentCommend documentCommentCommend = emc.find( id, DocumentCommentCommend.class );
+		if( documentCommentCommend != null ){
+			DocumentCommentInfo comment = emc.find( documentCommentCommend.getCommentId(), DocumentCommentInfo.class );
+			emc.beginTransaction( DocumentCommentCommend.class );
+			if( comment != null ) {
+				emc.beginTransaction( Document.class );
+				comment.subCommendCount(1);
+				emc.check( comment, CheckPersistType.all );
+			}
+			emc.remove( documentCommentCommend, CheckRemoveType.all );
+			emc.commit();
+		}
+		return documentCommentCommend;
+	}
+
+	public List<String> delete(EntityManagerContainer emc, List<String> ids ) throws Exception {
+		if( ListTools.isEmpty( ids ) ){
+			throw new Exception("ids is empty!");
+		}
+		List<DocumentCommentCommend> documentCommentCommends = emc.list( DocumentCommentCommend.class, ids  );
+		if( ListTools.isNotEmpty( documentCommentCommends )){
+			DocumentCommentInfo comment = null;
+			emc.beginTransaction( DocumentCommentCommend.class );
+			emc.beginTransaction( DocumentCommentInfo.class );
+			for( DocumentCommentCommend documentCommentCommend : documentCommentCommends ) {
+				comment = emc.find( documentCommentCommend.getCommentId(), DocumentCommentInfo.class );
+				if( comment != null ) {
+					comment.subCommendCount(1);
+					emc.check( comment, CheckPersistType.all );
+				}
+				emc.remove( documentCommentCommend, CheckRemoveType.all );
+			}
+			emc.commit();
+		}
+		return ids;		
+	}
+}

+ 4 - 4
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/DocumentCommentInfoQueryService.java

@@ -110,10 +110,10 @@ public class DocumentCommentInfoQueryService {
 		startNumber = pageSize * ( pageNum -1 );
 		
 		if( StringUtils.isEmpty( orderField ) ) { 
-			orderField = "createTime";
+			orderField = "orderNumber";
 		}
 		if( StringUtils.isEmpty( orderType ) ) { 
-			orderType = "desc";
+			orderType = "asc";
 		}
 		
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
@@ -151,10 +151,10 @@ public class DocumentCommentInfoQueryService {
 		if( pageSize == 0 ) { pageSize = 20; }
 		
 		if( StringUtils.isEmpty( orderField ) ) { 
-			orderField = "createTime";
+			orderField = "orderNumber";
 		}
 		if( StringUtils.isEmpty( orderType ) ) { 
-			orderType = "desc";
+			orderType = "asc";
 		}
 		
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {

+ 12 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/DocumentCommentInfoService.java

@@ -90,18 +90,28 @@ class DocumentCommentInfoService {
 		if( StringUtils.isEmpty( object.getId() )  ){
 			object.setId( DocumentCommentInfo.createId() );
 		}
+		
+		Business business = new Business(emc);		
 		documentCommentInfo = emc.find( object.getId(), DocumentCommentInfo.class );
 		documentCommentContent = emc.find( object.getId(), DocumentCommentContent.class );
 		document = emc.find( object.getId(), Document.class );
 		
 		emc.beginTransaction( DocumentCommentContent.class );
 		emc.beginTransaction( DocumentCommentInfo.class );
+		
+		Integer maxOrder = 0;
+		
 		if( documentCommentInfo == null ){ // 保存一个新的对象
+			maxOrder = business.documentCommentInfoFactory().getMaxOrder( object.getDocumentId() );
+			if( maxOrder == null ) {
+				maxOrder = 0;
+			}
 			documentCommentInfo = new DocumentCommentInfo();
 			object.copyTo( documentCommentInfo );
 			if( StringUtils.isNotEmpty( object.getId() ) ){
 				documentCommentInfo.setId( object.getId() );
 			}
+			documentCommentInfo.setOrderNumber( maxOrder + 1 );
 			emc.persist( documentCommentInfo, CheckPersistType.all);
 			//document 评论数加1
 			if( document != null ) {
@@ -110,10 +120,12 @@ class DocumentCommentInfoService {
 				emc.check( document, CheckPersistType.all );
 			}
 		}else{ //对象已经存在,更新对象信息
+			Integer orderNumber = documentCommentInfo.getOrderNumber();
 			if(StringUtils.isNotEmpty( documentCommentInfo.getCreatorName() )) {
 				object.setCreatorName(documentCommentInfo.getCreatorName());
 			}
 			object.copyTo( documentCommentInfo, JpaObject.FieldsUnmodify  );
+			object.setOrderNumber(orderNumber);
 			emc.check( documentCommentInfo, CheckPersistType.all );	
 		}
 		

+ 3 - 36
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/DocumentPersistService.java

@@ -31,7 +31,9 @@ public class DocumentPersistService {
 		if( document == null ){
 			throw new Exception("document is null!");
 		}
-		
+		if (document.getPictureList() != null && !document.getPictureList().isEmpty()) {
+			document.setHasIndexPic(true);
+		}
 		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
 			document.setModifyTime( new Date());	
 			document.setSequenceAppAlias( document.getAppAlias() + document.getId() );
@@ -295,41 +297,6 @@ public class DocumentPersistService {
 				CmsBatchOperationProcessService.OPT_OBJ_DOCUMENT, 
 				CmsBatchOperationProcessService.OPT_TYPE_PERMISSION,  docId,  docId, "刷新文档权限:ID=" +  docId );
 	}
-	
-	
-	
-//	/**
-//	 * 根据组织好的document对象更新数据库中文档的权限信息
-//	 * @param document
-//	 * @throws Exception
-//	 */
-//	public void updateAllPermission(Document document) throws Exception {
-//		if( document == null ){
-//			throw new Exception("document is null!");
-//		}
-//		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
-//			Document document_entity = emc.find( document.getId(), Document.class );
-//			if( document_entity != null ) {
-//				emc.beginTransaction( Document.class );
-//				document_entity.setAuthorPersonList( document.getAuthorPersonList() );
-//				document_entity.setAuthorUnitList( document.getAuthorUnitList() );
-//				document_entity.setAuthorGroupList( document.getAuthorGroupList() );
-//				document_entity.setReadPersonList( document.getReadPersonList() );
-//				document_entity.setReadUnitList( document.getReadUnitList() );
-//				document_entity.setReadGroupList( document.getReadGroupList() );
-//				document_entity.setManagerList( document.getManagerList() );
-//				if( StringUtils.isEmpty( document_entity.getDocumentType() )) {
-//					document_entity.setDocumentType( "信息" );
-//				}
-//				emc.check( document_entity, CheckPersistType.all );
-//				emc.commit();
-//			}
-//		} catch ( Exception e ) {
-//			throw e;
-//		}
-//	}
-
-	
 
 	/**
 	 * 根据组织好的权限信息列表更新指定文档的权限信息

+ 8 - 7
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/PermissionOperateService.java

@@ -53,6 +53,7 @@ public class PermissionOperateService {
 			for( PermissionInfo p : readerList ) {
 				new_permissionInfo = createPermissionInfo( PermissionName.READER, p.getPermissionObjectType(), p.getPermissionObjectName(), p.getPermissionObjectName() );
 				if( new_permissionInfo != null ) {
+					new_permissionInfo.setPermissionObjectCode( new_permissionInfo.getPermissionObjectName() );
 					permissionList.add( new_permissionInfo );
 				}
 			}
@@ -63,16 +64,17 @@ public class PermissionOperateService {
 			for( PermissionInfo p : authorList ) {
 				new_permissionInfo = createPermissionInfo( PermissionName.READER, p.getPermissionObjectType(), p.getPermissionObjectName(), p.getPermissionObjectName() );
 				if( new_permissionInfo != null ) {
+					new_permissionInfo.setPermissionObjectCode( new_permissionInfo.getPermissionObjectName() );
 					permissionList.add( new_permissionInfo );
 				}				
 				//添加作者信息,作者可以对文档进行编辑
 				new_permissionInfo = createPermissionInfo( PermissionName.AUTHOR, p.getPermissionObjectType(), p.getPermissionObjectName(), p.getPermissionObjectName() );
 				if( new_permissionInfo != null ) {
+					new_permissionInfo.setPermissionObjectCode( new_permissionInfo.getPermissionObjectName() );
 					permissionList.add( new_permissionInfo );
 				}
 			}
-		}
-		
+		}		
 		return permissionList;
 	}
 	
@@ -80,13 +82,13 @@ public class PermissionOperateService {
 	private PermissionInfo createPermissionInfo( String permission, String permissionObjectType, String permissionObjectCode, String permissionObjectName ) throws Exception {
 		//如果存在身份信息,将身份信息替换为个人信息
 		String personFlag = null;
-		if( StringUtil.isNotEmpty( permissionObjectCode ) && permissionObjectCode.indexOf("@I") > 0 ) {
+		if( StringUtil.isNotEmpty( permissionObjectCode ) && permissionObjectCode.endsWith("@I") ) {
 			//将身份转换为个人 @P
 			try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
 				personFlag = new Business(emc).organization().person().getWithIdentity( permissionObjectCode );
 			}
 			if( StringUtil.isNotEmpty( personFlag )  ) {
-				if( StringUtil.isNotEmpty( permissionObjectName ) && permissionObjectName.indexOf("@I") > 0 ) {
+				if( StringUtil.isNotEmpty( permissionObjectName ) && permissionObjectName.endsWith("@I")) {
 					permissionObjectName = personFlag;
 				}
 				return new PermissionInfo(permission, permissionObjectType, personFlag, permissionObjectName);
@@ -109,12 +111,11 @@ public class PermissionOperateService {
 		if( StringUtils.isEmpty(docId) ){
 			throw new Exception( "docId is empty!" );
 		}
-		
 		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
 			emc.beginTransaction( Document.class );
 			Document document = emc.find( docId, Document.class );		
 			
-			if( document != null ) {				
+			if( document != null ) {
 				//清空文档权限信息
 				document.setManagerList( null );
 				document.setReadPersonList( null );
@@ -125,7 +126,7 @@ public class PermissionOperateService {
 				document.setAuthorGroupList( null );
 				
 				if( ListTools.isNotEmpty( permissionList ) ){
-					for( PermissionInfo permission : permissionList ){
+					for( PermissionInfo permission : permissionList ){					
 						if( "管理".equals( permission.getPermission() )) {
 							document.addManagerList(permission.getPermissionObjectCode());
 						}else if( "读者".equals( permission.getPermission() ) || "阅读".equals( permission.getPermission() )) {

+ 14 - 4
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/PermissionQueryService.java

@@ -57,16 +57,20 @@ public class PermissionQueryService {
 
 	/**
 	 * 查询指定用户可以管理的所有栏目ID列表( with List copy )
-	 * @param emc
 	 * @param personName
+	 * @param unitNames
+	 * @param groupNames
+	 * @param appType
+	 * @param documentType
+	 * @param maxCount
 	 * @return
 	 * @throws Exception
 	 */
-	public List<String> listManageableAppIdsByPerson( String personName, List<String> unitNames, List<String> groupNames,
+	public List<String> listManageableAppIdsByPerson( String personName, List<String> unitNames, List<String> groupNames, String appType,
 			String documentType, Integer maxCount) throws Exception {
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 			return cmsPermissionService.listManageableAppIdsByPerson(
-					emc, personName, unitNames, groupNames, documentType, maxCount);
+					emc, personName, unitNames, groupNames, appType, documentType, maxCount);
 		} catch (Exception e) {
 			throw e;
 		}
@@ -147,10 +151,16 @@ public class PermissionQueryService {
 	 * @return
 	 */
 	public boolean hasDiffrentViewPermissionInAppInfo( AppInfo old_appInfo, AppInfo appInfo ) {
+		if( old_appInfo == null || appInfo == null ) {
+			return true;
+		}
 		if( !old_appInfo.getAllPeopleView().equals( appInfo.getAllPeopleView() ) ) {
 			return true;
 		}
-		if( !old_appInfo.getAnonymousAble().equals(appInfo.getAnonymousAble() ) ) {
+		if(old_appInfo.getAnonymousAble() != null &&  !old_appInfo.getAnonymousAble().equals( appInfo.getAnonymousAble() ) ) {
+			return true;
+		}
+		if(appInfo.getAnonymousAble() != null &&  !appInfo.getAnonymousAble().equals( old_appInfo.getAnonymousAble() ) ) {
 			return true;
 		}
 		if( !ListTools.isSameList( old_appInfo.getViewablePersonList(), appInfo.getViewablePersonList() )) {

+ 8 - 5
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/ReviewService.java

@@ -219,11 +219,11 @@ public class ReviewService {
 		if( document == null ) {
 			return false;
 		}
-		if( ListTools.isNotEmpty( document.getReadPersonList() ) ) {
-			if( !document.getReadPersonList().contains( "所有人" )) {
-				return true;
-			}
-		}
+//		if( ListTools.isNotEmpty( document.getReadPersonList() ) ) {
+//			if( !document.getReadPersonList().contains( "所有人" )) {
+//				return true;
+//			}
+//		}
 		if( ListTools.isNotEmpty( document.getReadUnitList() ) ) {
 			return true;
 		}
@@ -440,6 +440,9 @@ public class ReviewService {
 				if( !userManagerService.isTopUnit( objName ) || userManagerService.countTopUnit() > 1 ) {
 					persons  = userManagerService.listPersonWithUnit( objName );
 					permissionObjs = addListToList( permissionObjs, persons );
+				}else {
+					//如果是顶层组织,并且顶层组织只有一个
+					permissionObjs = addStringToList( permissionObjs, "*" );
 				}
 			}else if( objName.endsWith( "@G" ) ) {//将群组拆解为人员
 				persons  = userManagerService.listPersonWithGroup( objName );

+ 1 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/common/excel/reader/Excel2007Reader.java

@@ -158,6 +158,7 @@ public class Excel2007Reader extends DefaultHandler {
 		lastContents = "";
 	}
 
+	@SuppressWarnings("deprecation")
 	public void endElement(String uri, String localName, String name)
 			throws SAXException {
 		

+ 15 - 0
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/AppInfo.java

@@ -98,6 +98,12 @@ public class AppInfo extends SliceJpaObject {
 	@CheckPersist(allowEmpty = true)
 	private String appAlias;
 
+	public static final String appType_FIELDNAME = "appType";
+	@FieldDescribe("栏目类别")
+	@Column( length = JpaObject.length_255B, name = ColumnNamePrefix + appType_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	private String appType;
+	
 	public static final String documentType_FIELDNAME = "documentType";
 	@FieldDescribe("默认文档类型:信息 | 数据")
 	@Column( length = JpaObject.length_16B, name = ColumnNamePrefix + documentType_FIELDNAME)
@@ -291,6 +297,15 @@ public class AppInfo extends SliceJpaObject {
 	@CheckPersist(allowEmpty = true)
 	private List<String> manageableGroupList;
 
+	
+	public String getAppType() {
+		return appType;
+	}
+
+	public void setAppType(String appType) {
+		this.appType = appType;
+	}
+
 	/**
 	 * 获取栏目名称
 	 * 

+ 43 - 95
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/CmsPermissionService.java

@@ -1,7 +1,6 @@
 package com.x.cms.core.entity;
 
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
 
 import javax.persistence.EntityManager;
@@ -15,7 +14,7 @@ import org.apache.commons.lang3.StringUtils;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.project.tools.ListTools;
 import com.x.cms.core.entity.tools.CriteriaBuilderTools;
-import com.x.cms.core.entity.tools.DateOperation;
+import com.x.cms.core.entity.tools.filter.QueryFilter;
 
 /**
  * 对CMS栏目、分类、文档进行权限过滤查询,在CMS应用中会直接引用
@@ -25,14 +24,9 @@ import com.x.cms.core.entity.tools.DateOperation;
 public class CmsPermissionService{
 	
 	/**
-	 * 普通用戶的查詢,帶權限查詢
-	 * @param title
-	 * @param appIdList
+	 * 根据条件获取用户有权限访问的所有文档ID列表
+	 * @param emc
 	 * @param categoryIdList
-	 * @param publisherList
-	 * @param createDateList
-	 * @param publishDateList
-	 * @param statusList
 	 * @param personName
 	 * @param viewableDocIds
 	 * @param viewableCategoryIds
@@ -40,86 +34,30 @@ public class CmsPermissionService{
 	 * @return
 	 * @throws Exception
 	 */
-	public List<String> lisViewableDocIdsWithFilter( EntityManagerContainer emc, String title, List<String> appIdList, List<String> categoryIdList,
-			List<String> publisherList, List<String> createDateList, List<String> publishDateList,
-			List<String> statusList, String personName, List<String> unitNames, List<String> groupNames,
-			List<String> viewableDocIds, List<String> viewableCategoryIds, Integer maxResultCount ) throws Exception {
-		Date startDate = null;
-		Date endDate = null;
-		List<String> ids = new ArrayList<>();
-		List<Document> documents = null;
-		EntityManager em = emc.get( Document.class );
-		CriteriaBuilder cb = em.getCriteriaBuilder();
-		CriteriaQuery<Document> cq = cb.createQuery( Document.class );
-		Root<Document> root = cq.from( Document.class );
-		
-		Predicate p = cb.conjunction();
-		if( ListTools.isNotEmpty( viewableDocIds ) ){
-			p = cb.and( p, root.get( Document_.id ).in( viewableDocIds ));
-		}
-		if( ListTools.isNotEmpty( appIdList ) ){
-			p = cb.and( p, root.get( Document_.appId ).in( appIdList ));
-		}
-		if( ListTools.isNotEmpty( categoryIdList ) ){
-			p = cb.and( p, root.get( Document_.categoryId ).in( categoryIdList ));
-		}
-		if( ListTools.isNotEmpty( publisherList ) ){
-			p = cb.and( p, root.get( Document_.creatorPerson ).in( publisherList ));
-		}
-		if( StringUtils.isNotEmpty( title )){
-			p = cb.and( p, cb.like( root.get( Document_.title ), "%" + title + "%" ));
-		}
-		if( ListTools.isEmpty( statusList ) ){
-			p = cb.and( p, cb.equal(root.get( Document_.docStatus ), "published"));
-		}else{
-			p = cb.and( p, root.get( Document_.docStatus ).in( statusList ));
-		}
-		if( createDateList != null && !createDateList.isEmpty() ){
-			if ( createDateList.size() == 1 ) {// 从开始时间(yyyy-MM-DD),到现在				
-				startDate = DateOperation.getDateFromString( createDateList.get(0).toString() );
-				endDate = new Date();
-			}else if( createDateList.size() == 2 ){// 从开始时间到结束时间(yyyy-MM-DD)				
-				startDate = DateOperation.getDateFromString( createDateList.get(0).toString());
-				endDate = DateOperation.getDateFromString( createDateList.get(1).toString());
-			}
-			p = cb.and( p, cb.between( root.get( Document_.createTime ), startDate, endDate ) );
-		}
-		if( publishDateList != null && !publishDateList.isEmpty() ){
-			if ( publishDateList.size() == 1 ) {
-				// 从开始时间(yyyy-MM-DD),到现在
-				startDate = DateOperation.getDateFromString( publishDateList.get(0).toString() );
-				endDate = new Date();
-			}else if( publishDateList.size() == 2 ){
-				// 从开始时间到结束时间(yyyy-MM-DD)
-				startDate = DateOperation.getDateFromString( publishDateList.get(0).toString());
-				endDate = DateOperation.getDateFromString( publishDateList.get(1).toString());
-			}
-			p = cb.and( p, cb.between( root.get( Document_.publishTime ), startDate, endDate ) );
-		}
-		
-		cq.orderBy( cb.desc( root.get( Document_.publishTime ) ) );
+	public List<String> lisViewableDocIdsWithFilter( EntityManagerContainer emc, QueryFilter queryFilter, Integer maxResultCount ) throws Exception {
 		if( maxResultCount == null || maxResultCount == 0 ){
 			maxResultCount = 500;
 		}
-		documents = em.createQuery( cq.where( p ) ).setMaxResults( maxResultCount ).getResultList();
-		if( documents != null && !documents.isEmpty() ){
-			for( Document document : documents ){
-				if( !ids.contains( document.getId() )){
-					ids.add( document.getId() );
+		List<String> ids = new ArrayList<>();
+		List<Review> reviews = null;
+		EntityManager em = emc.get( Review.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Review> cq = cb.createQuery( Review.class );
+		Root<Review> root = cq.from( Review.class );
+		Predicate p = CriteriaBuilderTools.composePredicateWithQueryFilter( Review_.class, cb,  null, root, queryFilter );
+		cq.orderBy( cb.desc( root.get( Review_.publishTime ) ) );		
+		System.out.println(">>>>>>>>>>>SQL:" +  em.createQuery( cq.where( p ) ).setMaxResults( maxResultCount ).toString() );
+		reviews = em.createQuery( cq.where( p ) ).setMaxResults( maxResultCount ).getResultList();
+		if( reviews != null && !reviews.isEmpty() ){
+			for( Review review : reviews ){
+				if( !ids.contains( review.getDocId() )){
+					ids.add( review.getDocId() );
 				}
 			}
 		}
 		return ids;
 	}
 	
-	public List<String> lisViewableDocIdsWithFilter( EntityManagerContainer emc, List<String> categoryIdList,
-			String personName, List<String> unitNames, List<String> groupNames,
-			List<String> viewableDocIds, List<String> viewableCategoryIds, Integer maxResultCount ) throws Exception {
-		return lisViewableDocIdsWithFilter(
-				emc, null, null, categoryIdList, null, null, null, null, personName, unitNames, groupNames, 
-				viewableDocIds, viewableCategoryIds, maxResultCount );
-	}
-	
 	/**
 	 * 查询指定用户,组织,群组可以访问到的所有栏目ID列表(包含全员可以访问的栏目)
 	 * @param personName
@@ -143,7 +81,7 @@ public class CmsPermissionService{
 		if( !isAnonymous ) {
 			// 2、将用户自己为管理员的所有栏目ID列表添加到viewAbleAppInfoIds中
 			viewableAppInfoIds = addResultToSourceList( this.listManageableAppIdsByPerson(emc, personName, unitNames, groupNames, 
-					documentType, maxCount), viewableAppInfoIds );	
+					null, documentType, maxCount), viewableAppInfoIds );	
 			
 			// 3、将用户自己以及用户所在的组织、群组,有权限访问的所有栏目ID列表添加到viewAbleAppInfoIds中
 			addResultToSourceList( 
@@ -181,7 +119,7 @@ public class CmsPermissionService{
 		if( !isAnonymous ) {
 			// 2、用户可管理的栏目, 将用户自己为管理员的所有栏目ID列表添加到viewAbleAppInfoIds中
 			publishableAppInfoIds = addResultToSourceList( this.listManageableAppIdsByPerson( emc, personName, unitNames, groupNames, 
-					documentType, maxCount), publishableAppInfoIds );	
+					null, documentType, maxCount), publishableAppInfoIds );	
 			
 			// 3、用户有发布权限设置的栏目, 将用户自己以及用户所在的组织、群组,有权限访问的所有栏目ID列表添加到viewAbleAppInfoIds中
 			addResultToSourceList( 
@@ -220,15 +158,19 @@ public class CmsPermissionService{
 	 * 查询指定用户可以管理的所有栏目ID列表( with List copy )
 	 * @param emc
 	 * @param personName
+	 * @param unitNames
+	 * @param groupNames
+	 * @param appType
+	 * @param documentType
+	 * @param maxCount
 	 * @return
 	 * @throws Exception
 	 */
 	public List<String> listManageableAppIdsByPerson( EntityManagerContainer emc, String personName, List<String> unitNames, List<String> groupNames,
-			String documentType, Integer maxCount) throws Exception {
+			String appType, String documentType, Integer maxCount) throws Exception {
 		if( StringUtils.isEmpty( personName )){
 			throw new Exception( "personName is empty!" );
-		}
-		
+		}		
 		List<String> appInfoIds = null;
 		List<String> appInfoIds_out = new ArrayList<>();
 		EntityManager em = emc.get(AppInfo.class);
@@ -236,27 +178,33 @@ public class CmsPermissionService{
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<AppInfo> root = cq.from(AppInfo.class);
 		
-		Predicate p = cb.isNotNull(root.get( AppInfo_.id));
+		Predicate p = null;
+		if( StringUtils.isNotEmpty( appType ) && !StringUtils.equals( appType, "未分类")) {
+			p = CriteriaBuilderTools.predicate_and( cb, p, cb.equal( root.get( AppInfo_.appType), appType ));
+		}
+		if( StringUtils.isNotEmpty( appType ) && StringUtils.equals( appType, "未分类")) {
+			CriteriaBuilderTools.predicate_and(cb, p, 
+					CriteriaBuilderTools.predicate_or(
+							cb, cb.isNull(root.get(AppInfo_.appType)), 
+							cb.equal(root.get(AppInfo_.appType), ""))
+			);
+		}	
 		if( StringUtils.isNotEmpty( documentType) && !"全部".equals(documentType)) {
-			p = cb.equal( root.get( AppInfo_.documentType), documentType);
+			p = CriteriaBuilderTools.predicate_and( cb, p, cb.equal( root.get( AppInfo_.documentType), documentType) );
 		}
-		
 		Predicate p_permission = null;	
 		if( StringUtils.isNotEmpty( personName )) {
-			//可以管理的栏目,肯定可以发布信息
-			p_permission = CriteriaBuilderTools.predicate_or( cb, p_permission, cb.isMember( personName, root.get( AppInfo_.manageablePersonList )) );
-			
+			p_permission = CriteriaBuilderTools.predicate_or( cb, p_permission, cb.isMember( personName, root.get( AppInfo_.manageablePersonList )) );			
 		}
 		if( ListTools.isNotEmpty( unitNames )) {
-			p_permission = cb.or( p_permission,  root.get( AppInfo_.manageableUnitList).in(unitNames));
+			p_permission = CriteriaBuilderTools.predicate_or( cb, p_permission, cb.or( p_permission,  root.get( AppInfo_.manageableUnitList).in(unitNames)) );
 		}
 		if( ListTools.isNotEmpty( groupNames )) {
-			p_permission = cb.or( p_permission,  root.get( AppInfo_.manageableGroupList).in(groupNames));
+			p_permission = CriteriaBuilderTools.predicate_or( cb, p_permission, cb.or( p_permission,  root.get( AppInfo_.manageableGroupList).in(groupNames)) );
 		}
-		p = cb.and( p, p_permission );
+		p =  CriteriaBuilderTools.predicate_and( cb, p, p_permission);
 		
 		cq.select(root.get( AppInfo_.id ));
-		
 		appInfoIds =  em.createQuery(cq.where( p )).setMaxResults(maxCount).getResultList();
 		if( appInfoIds == null ) {
 			appInfoIds = new ArrayList<>();

+ 109 - 0
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/DocumentCommentCommend.java

@@ -0,0 +1,109 @@
+package com.x.cms.core.entity;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+
+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.project.annotation.FieldDescribe;
+
+/**
+ * 文档评论点赞
+ * 
+ * @author O2LEE
+ *
+ */
+@ContainerEntity
+@Entity
+@Table(name = PersistenceProperties.DocumentCommentCommend.table, uniqueConstraints = {
+		@UniqueConstraint(name = PersistenceProperties.DocumentCommentCommend.table + JpaObject.IndexNameMiddle
+				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,
+						JpaObject.CREATETIMECOLUMN, JpaObject.UPDATETIMECOLUMN, JpaObject.SEQUENCECOLUMN }) })
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+public class DocumentCommentCommend extends SliceJpaObject {
+
+	private static final long serialVersionUID = 3856138316794473794L;
+	private static final String TABLE = PersistenceProperties.DocumentCommentCommend.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();
+
+	public void onPersist() throws Exception {
+	}
+	/*
+	 * =============================================================================
+	 * ===== 以上为 JpaObject 默认字段
+	 * =============================================================================
+	 * =====
+	 */
+
+	/*
+	 * =============================================================================
+	 * ===== 以下为具体不同的业务及数据表字段要求
+	 * =============================================================================
+	 * =====
+	 */
+	public static final String documentId_FIELDNAME = "documentId";
+	@FieldDescribe("文档ID")
+	@Column(length = JpaObject.length_id, name = ColumnNamePrefix + documentId_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	@Index(name = TABLE + IndexNameMiddle + documentId_FIELDNAME)
+	private String documentId;
+	
+	public static final String commentId_FIELDNAME = "commentId";
+	@FieldDescribe("文档评论ID")
+	@Column(length = JpaObject.length_id, name = ColumnNamePrefix + commentId_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	@Index(name = TABLE + IndexNameMiddle + documentId_FIELDNAME)
+	private String commentId;
+
+	public static final String commendPerson_FIELDNAME = "commendPerson";
+	@FieldDescribe("点赞者")
+	@Column(length = JpaObject.length_255B, name = ColumnNamePrefix + commendPerson_FIELDNAME)
+	@CheckPersist(allowEmpty = false)
+	@Index(name = TABLE + IndexNameMiddle + commendPerson_FIELDNAME)
+	private String commendPerson;
+	
+	public String getCommentId() {
+		return commentId;
+	}
+
+	public void setCommentId(String commentId) {
+		this.commentId = commentId;
+	}
+
+	public String getDocumentId() {
+		return documentId;
+	}
+
+	public void setDocumentId(String documentId) {
+		this.documentId = documentId;
+	}
+
+	public String getCommendPerson() {
+		return commendPerson;
+	}
+
+	public void setCommendPerson(String commendPerson) {
+		this.commendPerson = commendPerson;
+	}	
+}

+ 33 - 3
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/DocumentCommentInfo.java

@@ -134,9 +134,23 @@ public class DocumentCommentInfo extends SliceJpaObject {
 
 	public static final String orderNumber_FIELDNAME = "orderNumber";
 	@FieldDescribe("排序号")
-	@Column(name = ColumnNamePrefix + orderNumber_FIELDNAME)
-	@CheckPersist(allowEmpty = true)
+	@Column(name = ColumnNamePrefix + orderNumber_FIELDNAME )
+	@CheckPersist( allowEmpty = true)
 	private Integer orderNumber = 1;
+	
+	public static final String commendCount_FIELDNAME = "commendCount";
+	@FieldDescribe("评论被赞次数")
+	@Column(name = ColumnNamePrefix + commendCount_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	private Long commendCount = 0L;
+	
+	public Long getCommendCount() {
+		return commendCount;
+	}
+
+	public void setCommendCount(Long commendCount) {
+		this.commendCount = commendCount;
+	}
 
 	public String getAppId() {
 		return appId;
@@ -233,5 +247,21 @@ public class DocumentCommentInfo extends SliceJpaObject {
 	public void setIsPrivate(Boolean isPrivate) {
 		this.isPrivate = isPrivate;
 	}
-
+	
+	public void addCommendCount(Integer count) {
+		if( this.commendCount == null ) {
+			this.commendCount = 0L;
+		}
+		this.commendCount = this.commendCount + count;
+	}
+	
+	public void subCommendCount(Integer count) {
+		if( this.commendCount == null ) {
+			this.commendCount = 0L;
+		}
+		this.commendCount = this.commendCount - count;
+		if( this.commendCount < 0 ) {
+			this.commendCount = 0L;
+		}
+	}
 }

+ 4 - 0
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/PersistenceProperties.java

@@ -88,6 +88,10 @@ public final class PersistenceProperties extends AbstractPersistenceProperties {
 		public static final String table = "CMS_DOCUMENT_COMMEND";
 	}
 	
+	public static class DocumentCommentCommend {
+		public static final String table = "CMS_DOCUMENT_COMMENTCOMMEND";
+	}
+	
 	public static class CmsBatchOperation {
 		public static final String table = "CMS_BATCH_OPERATION";
 	}

+ 1 - 0
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/query/Row.java

@@ -18,6 +18,7 @@ public class Row extends GsonPropertyObject {
 		data = new LinkedHashMap<String, Object>();
 	}
 
+	@SuppressWarnings("deprecation")
 	public Double getAsDouble(String key) {
 		Object o = this.data.get(key);
 		String val = Objects.toString(o, "");

+ 130 - 64
o2server/x_console/src/main/java/com/x/server/console/NodeAgent.java

@@ -13,7 +13,9 @@ import java.util.regex.Pattern;
 
 import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.io.IOUtils;
+import org.apache.commons.io.filefilter.WildcardFileFilter;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -24,7 +26,6 @@ import org.eclipse.jetty.server.handler.HandlerList;
 import org.eclipse.jetty.server.handler.gzip.GzipHandler;
 
 import com.x.base.core.project.annotation.Module;
-import com.x.base.core.project.annotation.ModuleCategory;
 import com.x.base.core.project.annotation.ModuleType;
 import com.x.base.core.project.config.Config;
 import com.x.base.core.project.gson.XGsonBuilder;
@@ -67,7 +68,8 @@ public class NodeAgent extends Thread {
 						}
 						matcher = redeploy_pattern.matcher(commandObject.getCommand());
 						if (matcher.find()) {
-							String result = this.redeploy(matcher.group(1), commandObject.getBody());
+							byte[] bytes = Base64.decodeBase64(commandObject.getBody());
+							String result = this.redeploy(matcher.group(1), bytes);
 							IOUtils.write(result, outputStream, DefaultCharset.charset_utf_8);
 						}
 					}
@@ -81,53 +83,78 @@ public class NodeAgent extends Thread {
 		}
 	}
 
-	private String redeploy(String name, String body) {
+	private String redeploy(String name, byte[] bytes) {
 		String result = "success";
 		try {
 			logger.print("redeploy:{}.", name);
-			ClassInfo classInfo = this.scanModuleClassInfo(name);
-			if (null == classInfo) {
-				throw new Exception(String.format("module not exist:%s.", name));
-			}
-			Class<?> cls = Class.forName(classInfo.getName());
-			Module module = cls.getAnnotation(Module.class);
-			byte[] bytes = Base64.decodeBase64(body);
-			if (Objects.equals(module.type(), ModuleType.ASSEMBLE)
-					|| Objects.equals(module.type(), ModuleType.SERVICE)) {
-				File war = null;
-				File dir = new File(Config.dir_servers_applicationServer_work(), cls.getSimpleName());
-				if (Objects.equals(ModuleCategory.OFFICIAL, module.category())) {
-					war = new File(Config.dir_store(), cls.getSimpleName() + ".war");
-				} else if (Objects.equals(ModuleCategory.CUSTOM, module.category())) {
-					war = new File(Config.dir_custom(), cls.getSimpleName() + ".war");
-				}
-				FileUtils.writeByteArrayToFile(war, bytes, false);
-				this.redeployAssembleAServiceA(cls, war, dir);
-			} else if (Objects.equals(module.type(), ModuleType.CENTER)) {
-				File war = new File(Config.dir_store(), cls.getSimpleName() + ".war");
-				FileUtils.writeByteArrayToFile(war, bytes);
-				File dir = new File(Config.dir_servers_centerServer_work(), cls.getSimpleName());
-				this.redeployAssembleC(cls, war, dir);
-			} else if (Objects.equals(module.type(), ModuleType.BASE)
-					|| Objects.equals(module.type(), ModuleType.ENTITY)
-					|| Objects.equals(module.type(), ModuleType.EXPRESS)) {
-				File jar = null;
-				if (Objects.equals(ModuleCategory.OFFICIAL, module.category())) {
-					jar = new File(Config.dir_store_jars(), cls.getSimpleName() + ".jar");
-				} else if (Objects.equals(ModuleCategory.CUSTOM, module.category())) {
-					jar = new File(Config.dir_custom(), cls.getSimpleName() + ".jar");
-				}
-				FileUtils.writeByteArrayToFile(jar, bytes);
-				this.redeployCoreA(cls);
+			switch (this.type(name)) {
+			case "storeWar":
+				storeWar(name, bytes);
+				break;
+			case "storeJar":
+				storeJar(name, bytes);
+				break;
+			case "customWar":
+				customWar(name, bytes);
+				break;
+			case "customJar":
+				customJar(name, bytes);
+				break;
 			}
 		} catch (Exception e) {
+			e.printStackTrace();
 			result = e.getMessage();
 		}
 		return result;
 	}
 
-	private boolean redeployCoreA(Class<?> cls) throws Exception {
-		List<ClassInfo> classInfos = this.listModuleDependencyWith(cls.getSimpleName());
+	private void storeWar(String simpleName, byte[] bytes) throws Exception {
+		ClassInfo classInfo = this.scanModuleClassInfo(simpleName);
+		Class<?> cls = Class.forName(classInfo.getName());
+		Module module = cls.getAnnotation(Module.class);
+		File war = new File(Config.dir_store(), cls.getSimpleName() + ".war");
+		FileUtils.writeByteArrayToFile(war, bytes);
+		if (Objects.equals(module.type(), ModuleType.CENTER)) {
+			File dir = new File(Config.dir_servers_centerServer_work(), cls.getSimpleName());
+			if (Servers.centerServerIsRunning()) {
+				GzipHandler gzipHandler = (GzipHandler) Servers.centerServer.getHandler();
+				HandlerList hanlderList = (HandlerList) gzipHandler.getHandler();
+				for (Handler handler : hanlderList.getHandlers()) {
+					if (QuickStartWebApp.class.isAssignableFrom(handler.getClass())) {
+						QuickStartWebApp app = (QuickStartWebApp) handler;
+						if (StringUtils.equals("/" + cls.getSimpleName(), app.getContextPath())) {
+							app.stop();
+							this.modified(bytes, war, dir);
+							app.start();
+						}
+					}
+				}
+			}
+		} else {
+			File dir = new File(Config.dir_servers_applicationServer_work(), cls.getSimpleName());
+			war = new File(Config.dir_store(), cls.getSimpleName() + ".war");
+			FileUtils.writeByteArrayToFile(war, bytes, false);
+			if (Servers.applicationServerIsRunning()) {
+				GzipHandler gzipHandler = (GzipHandler) Servers.applicationServer.getHandler();
+				HandlerList hanlderList = (HandlerList) gzipHandler.getHandler();
+				for (Handler handler : hanlderList.getHandlers()) {
+					if (QuickStartWebApp.class.isAssignableFrom(handler.getClass())) {
+						QuickStartWebApp app = (QuickStartWebApp) handler;
+						if (StringUtils.equals("/" + cls.getSimpleName(), app.getContextPath())) {
+							app.stop();
+							this.modified(bytes, war, dir);
+							app.start();
+						}
+					}
+				}
+			}
+		}
+	}
+
+	private void storeJar(String simpleName, byte[] bytes) throws Exception {
+		File jar = new File(Config.dir_store_jars(true), simpleName + ".jar");
+		FileUtils.writeByteArrayToFile(jar, bytes, false);
+		List<ClassInfo> classInfos = this.listModuleDependencyWith(simpleName);
 		List<String> contextPaths = new ArrayList<>();
 		for (ClassInfo info : classInfos) {
 			contextPaths.add("/" + info.getSimpleName());
@@ -139,11 +166,8 @@ public class NodeAgent extends Thread {
 				if (QuickStartWebApp.class.isAssignableFrom(handler.getClass())) {
 					QuickStartWebApp app = (QuickStartWebApp) handler;
 					if (contextPaths.contains(app.getContextPath())) {
-						logger.print("{} need restart because {} redeployed.", app.getDisplayName(),
-								cls.getSimpleName());
+						logger.print("{} need restart because {} redeployed.", app.getDisplayName(), simpleName);
 						app.stop();
-						Thread.sleep(2000);
-						app.start();
 					}
 				}
 			}
@@ -155,58 +179,84 @@ public class NodeAgent extends Thread {
 				if (QuickStartWebApp.class.isAssignableFrom(handler.getClass())) {
 					QuickStartWebApp app = (QuickStartWebApp) handler;
 					if (contextPaths.contains(app.getContextPath())) {
-						logger.print("{} need restart because {} redeployed.", app.getDisplayName(),
-								cls.getSimpleName());
+						logger.print("{} need restart because {} redeployed.", app.getDisplayName(), simpleName);
 						app.stop();
-						Thread.sleep(2000);
+					}
+				}
+			}
+		}
+		if (Servers.applicationServerIsRunning()) {
+			GzipHandler gzipHandler = (GzipHandler) Servers.applicationServer.getHandler();
+			HandlerList hanlderList = (HandlerList) gzipHandler.getHandler();
+			for (Handler handler : hanlderList.getHandlers()) {
+				if (QuickStartWebApp.class.isAssignableFrom(handler.getClass())) {
+					QuickStartWebApp app = (QuickStartWebApp) handler;
+					if (contextPaths.contains(app.getContextPath())) {
+						logger.print("{} need restart because {} redeployed.", app.getDisplayName(), simpleName);
+						app.start();
+					}
+				}
+			}
+		}
+		if (Servers.centerServerIsRunning()) {
+			GzipHandler gzipHandler = (GzipHandler) Servers.centerServer.getHandler();
+			HandlerList hanlderList = (HandlerList) gzipHandler.getHandler();
+			for (Handler handler : hanlderList.getHandlers()) {
+				if (QuickStartWebApp.class.isAssignableFrom(handler.getClass())) {
+					QuickStartWebApp app = (QuickStartWebApp) handler;
+					if (contextPaths.contains(app.getContextPath())) {
+						logger.print("{} need restart because {} redeployed.", app.getDisplayName(), simpleName);
 						app.start();
 					}
 				}
 			}
 		}
-		return true;
 	}
 
-	private boolean redeployAssembleAServiceA(Class<?> cls, File war, File dir) throws Exception {
+	private void customWar(String simpleName, byte[] bytes) throws Exception {
+		File war = new File(Config.dir_custom(true), simpleName + ".war");
+		File dir = new File(Config.dir_servers_applicationServer_work(), simpleName);
+		FileUtils.writeByteArrayToFile(war, bytes, false);
 		if (Servers.applicationServerIsRunning()) {
 			GzipHandler gzipHandler = (GzipHandler) Servers.applicationServer.getHandler();
 			HandlerList hanlderList = (HandlerList) gzipHandler.getHandler();
 			for (Handler handler : hanlderList.getHandlers()) {
 				if (QuickStartWebApp.class.isAssignableFrom(handler.getClass())) {
 					QuickStartWebApp app = (QuickStartWebApp) handler;
-					if (StringUtils.equals("/" + cls.getSimpleName(), app.getContextPath())) {
+					if (StringUtils.equals("/" + simpleName, app.getContextPath())) {
 						app.stop();
-						Thread.sleep(2000);
-						this.modified(war, dir);
+						this.modified(bytes, war, dir);
 						app.start();
-						return true;
 					}
 				}
 			}
 		}
-		return false;
 	}
 
-	private boolean redeployAssembleC(Class<?> cls, File war, File dir) throws Exception {
-		if (Servers.centerServerIsRunning()) {
-			GzipHandler gzipHandler = (GzipHandler) Servers.centerServer.getHandler();
+	private void customJar(String simpleName, byte[] bytes) throws Exception {
+		File jar = new File(Config.dir_custom_jars(true), simpleName + ".jar");
+		FileUtils.writeByteArrayToFile(jar, bytes, false);
+		List<String> contexts = new ArrayList<>();
+		for (String s : Config.dir_custom().list(new WildcardFileFilter("*.war"))) {
+			contexts.add("/" + FilenameUtils.getBaseName(s));
+		}
+		if (Servers.applicationServerIsRunning()) {
+			GzipHandler gzipHandler = (GzipHandler) Servers.applicationServer.getHandler();
 			HandlerList hanlderList = (HandlerList) gzipHandler.getHandler();
 			for (Handler handler : hanlderList.getHandlers()) {
 				if (QuickStartWebApp.class.isAssignableFrom(handler.getClass())) {
 					QuickStartWebApp app = (QuickStartWebApp) handler;
-					if (StringUtils.equals("/" + cls.getSimpleName(), app.getContextPath())) {
+					if (contexts.contains(app.getContextPath())) {
 						app.stop();
-						this.modified(war, dir);
+						Thread.sleep(2000);
 						app.start();
-						return true;
 					}
 				}
 			}
 		}
-		return false;
 	}
 
-	public List<ClassInfo> listModuleDependencyWith(String name) throws Exception {
+	private List<ClassInfo> listModuleDependencyWith(String name) throws Exception {
 		List<ClassInfo> list = new ArrayList<>();
 		try (ScanResult scanResult = new ClassGraph().enableAnnotationInfo().scan()) {
 			List<ClassInfo> classInfos = scanResult.getClassesWithAnnotation(Module.class.getName());
@@ -226,7 +276,7 @@ public class NodeAgent extends Thread {
 		return list;
 	}
 
-	public ClassInfo scanModuleClassInfo(String name) throws Exception {
+	private ClassInfo scanModuleClassInfo(String name) throws Exception {
 		try (ScanResult scanResult = new ClassGraph().enableAnnotationInfo().scan()) {
 			List<ClassInfo> classInfos = scanResult.getClassesWithAnnotation(Module.class.getName());
 			for (ClassInfo info : classInfos) {
@@ -239,14 +289,14 @@ public class NodeAgent extends Thread {
 		}
 	}
 
-	private void modified(File war, File dir) throws Exception {
+	private void modified(byte[] bytes, File war, File dir) throws Exception {
 		File lastModified = new File(dir, "WEB-INF/lastModified");
 		if ((!lastModified.exists()) || lastModified.isDirectory() || (war.lastModified() != NumberUtils
 				.toLong(FileUtils.readFileToString(lastModified, DefaultCharset.charset_utf_8), 0))) {
 			if (dir.exists()) {
 				FileUtils.forceDelete(dir);
 			}
-			JarTools.unjar(war, "", dir, true);
+			JarTools.unjar(bytes, "", dir, true);
 			FileUtils.writeStringToFile(lastModified, war.lastModified() + "", DefaultCharset.charset_utf_8, false);
 		}
 	}
@@ -285,4 +335,20 @@ public class NodeAgent extends Thread {
 
 	}
 
+	private String type(String simpleName) throws Exception {
+		if ((new File(Config.dir_store(), simpleName + ".war")).exists()) {
+			return "storeWar";
+		}
+		if ((new File(Config.dir_store_jars(), simpleName + ".jar")).exists()) {
+			return "storeJar";
+		}
+		if ((new File(Config.dir_custom(), simpleName + ".war")).exists()) {
+			return "customWar";
+		}
+		if ((new File(Config.dir_custom_jars(), simpleName + ".jar")).exists()) {
+			return "customJar";
+		}
+		return null;
+	}
+
 }

+ 1 - 0
o2server/x_console/src/main/java/com/x/server/console/action/ActionConfig.java

@@ -33,6 +33,7 @@ public class ActionConfig extends ActionBase {
 		}
 	}
 
+	@SuppressWarnings("deprecation")
 	private byte[] getZip() throws Exception {
 		String center = Config.nodes().primaryCenterNode();
 		String address = "http://" + center + ":" + Config.centerServer().getPort() + "/x_program_center/jaxrs/config";

+ 16 - 14
o2server/x_console/src/main/java/com/x/server/console/action/ActionRestoreData.java

@@ -79,13 +79,13 @@ public class ActionRestoreData {
 		return this.execute();
 	}
 
+	@SuppressWarnings("unchecked")
 	public boolean execute() throws Exception {
 		List<String> containerEntityNames = new ArrayList<>();
 		containerEntityNames.addAll((List<String>) Config.resource(Config.RESOUCE_CONTAINERENTITYNAMES));
 		List<String> classNames = new ArrayList<>();
 		classNames.addAll(this.catalog.keySet());
-		classNames = ListTools.includesExcludesWildcard(classNames, Config.dumpRestoreData().getIncludes(),
-				Config.dumpRestoreData().getExcludes());
+		classNames = ListTools.includesExcludesWildcard(classNames, Config.dumpRestoreData().getIncludes(), Config.dumpRestoreData().getExcludes());
 		classNames = ListTools.includesExcludesWildcard(containerEntityNames, classNames, null);
 
 		logger.print("find: {} data to restore, path: {}.", classNames.size(), this.dir.getAbsolutePath());
@@ -96,19 +96,21 @@ public class ActionRestoreData {
 			Class<JpaObject> cls = (Class<JpaObject>) Class.forName(classNames.get(i));
 			EntityManagerFactory emf = OpenJPAPersistence.createEntityManagerFactory(cls.getName(),
 					persistence.getName(), PersistenceXmlHelper.properties(cls.getName(), Config.slice().getEnable()));
-			EntityManager em = emf.createEntityManager();
-			em.setFlushMode(FlushModeType.COMMIT);
-			try {
-				logger.print("restore data({}/{}): {}, count: {}.", (i + 1), classNames.size(), cls.getName(),
-						catalog.get(cls.getName()));
-				count = count + this.store(cls, em);
-			} finally {
-				em.close();
-				emf.close();
-			}
+			if( emf != null ) {
+				EntityManager em = emf.createEntityManager();
+				em.setFlushMode( FlushModeType.COMMIT );
+				try {
+					logger.print("restore data({}/{}): {}, count: {}.", (i + 1), classNames.size(), cls.getName(), catalog.get(cls.getName()));
+					count = count + this.store(cls, em);
+				} finally {
+					em.close();
+					emf.close();
+				}
+			}else {
+				logger.warn("can not create 'EntityManagerFactory' for Entity:[" + cls.getName() + "]" );
+			}		
 		}
-		logger.print("restore data completed, total count: {}, elapsed: {} minutes.", count,
-				(new Date().getTime() - start.getTime()) / 1000 / 60);
+		logger.print("restore data completed, total count: {}, elapsed: {} minutes.", count, (new Date().getTime() - start.getTime()) / 1000 / 60);
 		return true;
 	}
 

+ 22 - 25
o2server/x_console/src/main/java/com/x/server/console/server/JettySeverTools.java

@@ -20,9 +20,6 @@ import org.eclipse.jetty.util.ssl.SslContextFactory;
 import com.x.base.core.project.x_base_core_project;
 import com.x.base.core.project.annotation.Module;
 import com.x.base.core.project.config.Config;
-import com.x.base.core.project.tools.DefaultCharset;
-
-import io.github.classgraph.ClassInfo;
 
 public abstract class JettySeverTools {
 
@@ -64,28 +61,28 @@ public abstract class JettySeverTools {
 		FileUtils.cleanDirectory(dir);
 	}
 
-	protected static void createOfficialDeployDescriptor(ClassInfo info) throws Exception {
-		StringBuffer buffer = new StringBuffer();
-		Class<?> cls = Class.forName(info.getName());
-		buffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
-		if (Config.currentNode().getQuickStartWebApp()) {
-			buffer.append("<Configure class=\"org.eclipse.jetty.quickstart.QuickStartWebApp\">");
-			buffer.append("<Set name=\"autoPreconfigure\">true</Set>");
-		} else {
-			buffer.append("<Configure class=\"org.eclipse.jetty.webapp.WebAppContext\">");
-		}
-		buffer.append("<Set name=\"contextPath\">/" + info.getSimpleName() + "</Set>");
-		File war = new File(Config.dir_store(), info.getSimpleName() + ".war");
-		buffer.append("<Set name=\"war\">" + war.getAbsolutePath() + "</Set>");
-		String extraClasspath = calculateExtraClassPath(cls);
-		buffer.append("<Set name=\"extraClasspath\">" + extraClasspath + "</Set>");
-		String tempDirectory = new File(Config.dir_servers_applicationServer_work(), info.getSimpleName())
-				.getAbsolutePath();
-		buffer.append("<Set name=\"tempDirectory\">" + tempDirectory + "</Set>");
-		buffer.append("</Configure>");
-		File file = new File(Config.dir_servers_applicationServer_webapps(), info.getSimpleName() + ".xml");
-		FileUtils.write(file, buffer.toString(), DefaultCharset.charset);
-	}
+//	protected static void createOfficialDeployDescriptor(ClassInfo info) throws Exception {
+//		StringBuffer buffer = new StringBuffer();
+//		Class<?> cls = Class.forName(info.getName());
+//		buffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
+//		if (Config.currentNode().getQuickStartWebApp()) {
+//			buffer.append("<Configure class=\"org.eclipse.jetty.quickstart.QuickStartWebApp\">");
+//			buffer.append("<Set name=\"autoPreconfigure\">true</Set>");
+//		} else {
+//			buffer.append("<Configure class=\"org.eclipse.jetty.webapp.WebAppContext\">");
+//		}
+//		buffer.append("<Set name=\"contextPath\">/" + info.getSimpleName() + "</Set>");
+//		File war = new File(Config.dir_store(), info.getSimpleName() + ".war");
+//		buffer.append("<Set name=\"war\">" + war.getAbsolutePath() + "</Set>");
+//		String extraClasspath = calculateExtraClassPath(cls);
+//		buffer.append("<Set name=\"extraClasspath\">" + extraClasspath + "</Set>");
+//		String tempDirectory = new File(Config.dir_servers_applicationServer_work(), info.getSimpleName())
+//				.getAbsolutePath();
+//		buffer.append("<Set name=\"tempDirectory\">" + tempDirectory + "</Set>");
+//		buffer.append("</Configure>");
+//		File file = new File(Config.dir_servers_applicationServer_webapps(), info.getSimpleName() + ".xml");
+//		FileUtils.write(file, buffer.toString(), DefaultCharset.charset);
+//	}
 
 	protected static String calculateExtraClassPath(Class<?> cls) throws Exception {
 		List<String> jars = new ArrayList<>();

+ 4 - 6
o2server/x_console/src/main/java/com/x/server/console/server/application/ApplicationServerTools.java

@@ -19,7 +19,6 @@ import javax.xml.xpath.XPathFactory;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.FilenameUtils;
-import org.apache.commons.io.filefilter.FileFilterUtils;
 import org.apache.commons.io.filefilter.WildcardFileFilter;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.math.NumberUtils;
@@ -102,8 +101,8 @@ public class ApplicationServerTools extends JettySeverTools {
 		logger.print("start to deploy custom module, size:{}.", customNames.size());
 
 		for (String name : customNames) {
-			File war = new File(Config.dir_custom(), name);
-			File dir = new File(Config.dir_servers_applicationServer_work(), FilenameUtils.getBaseName(name));
+			File war = new File(Config.dir_custom(), name + ".war");
+			File dir = new File(Config.dir_servers_applicationServer_work(), name);
 			if (war.exists()) {
 				modified(war, dir);
 				String className = contextParamProject(dir);
@@ -201,9 +200,8 @@ public class ApplicationServerTools extends JettySeverTools {
 
 	private static List<String> listCustom() throws Exception {
 		List<String> list = new ArrayList<>();
-		for (String str : Config.dir_custom(true)
-				.list(FileFilterUtils.or(new WildcardFileFilter("*.WAR"), new WildcardFileFilter("*.war")))) {
-			list.add(str);
+		for (String str : Config.dir_custom(true).list(new WildcardFileFilter("*.war"))) {
+			list.add(FilenameUtils.getBaseName(str));
 		}
 		list = ListTools.includesExcludesWildcard(list, Config.currentNode().getApplication().getIncludes(),
 				Config.currentNode().getApplication().getExcludes());

+ 0 - 126
o2server/x_console/src/main/java/com/x/server/console/server/center/CenterServerTools3.java

@@ -1,126 +0,0 @@
-package com.x.server.console.server.center;
-
-import java.io.File;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang3.BooleanUtils;
-import org.eclipse.jetty.annotations.AnnotationConfiguration;
-import org.eclipse.jetty.deploy.DeploymentManager;
-import org.eclipse.jetty.deploy.PropertiesConfigurationManager;
-import org.eclipse.jetty.deploy.providers.WebAppProvider;
-import org.eclipse.jetty.plus.webapp.EnvConfiguration;
-import org.eclipse.jetty.plus.webapp.PlusConfiguration;
-import org.eclipse.jetty.server.Handler;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.handler.ContextHandlerCollection;
-import org.eclipse.jetty.server.handler.DefaultHandler;
-import org.eclipse.jetty.server.handler.HandlerList;
-import org.eclipse.jetty.server.handler.gzip.GzipHandler;
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
-import org.eclipse.jetty.webapp.Configuration.ClassList;
-import org.eclipse.jetty.webapp.FragmentConfiguration;
-import org.eclipse.jetty.webapp.JettyWebXmlConfiguration;
-
-import com.x.base.core.project.x_program_center;
-import com.x.base.core.project.config.CenterServer;
-import com.x.base.core.project.config.Config;
-import com.x.base.core.project.logger.Logger;
-import com.x.base.core.project.logger.LoggerFactory;
-import com.x.base.core.project.tools.DefaultCharset;
-import com.x.server.console.server.JettySeverTools;
-
-public class CenterServerTools3 extends JettySeverTools {
-
-	private static Logger logger = LoggerFactory.getLogger(CenterServerTools3.class);
-
-	private static int CENTERSERVER_THREAD_POOL_SIZE_MIN = 5;
-	private static int CENTERSERVER_THREAD_POOL_SIZE_MAX = 100;
-
-	protected static final String PATH_WEBAPPS = "servers/centerServer/webapps";
-	protected static final String PATH_WORK = "servers/centerServer/work";
-
-	public static Server start(CenterServer centerServer) throws Exception {
-
-		if (BooleanUtils.isTrue(centerServer.getRedeploy())) {
-			cleanDirectory(Config.dir_servers_centerServer_webapps());
-			cleanDirectory(Config.dir_servers_centerServer_work());
-			createDeployDescriptor();
-		}
-		QueuedThreadPool threadPool = new QueuedThreadPool();
-		threadPool.setMinThreads(CENTERSERVER_THREAD_POOL_SIZE_MIN);
-		threadPool.setMaxThreads(CENTERSERVER_THREAD_POOL_SIZE_MAX);
-		Server server = new Server(threadPool);
-		server.setAttribute("maxFormContentSize", 1024 * 1024 * 1024 * 10);
-
-		ClassList classlist = ClassList.setServerDefault(server);
-		classlist.addAfter(FragmentConfiguration.class.getName(), EnvConfiguration.class.getName(),
-				PlusConfiguration.class.getName());
-		classlist.addBefore(JettyWebXmlConfiguration.class.getName(), AnnotationConfiguration.class.getName());
-
-		if (centerServer.getSslEnable()) {
-			addHttpsConnector(server, centerServer.getPort());
-		} else {
-			addHttpConnector(server, centerServer.getPort());
-		}
-
-		ContextHandlerCollection contexts = new ContextHandlerCollection();
-		DeploymentManager deployer = new DeploymentManager();
-		deployer.setContextAttribute("org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern", "nothing.jar");
-		deployer.setContexts(contexts);
-
-		WebAppProvider webAppProvider = new WebAppProvider();
-		webAppProvider.setMonitoredDirName(Config.dir_servers_centerServer_webapps().getAbsolutePath());
-		webAppProvider.setDefaultsDescriptor(new File(Config.dir_commons(), "webdefault_c.xml").getAbsolutePath());
-		webAppProvider.setScanInterval(centerServer.getScanInterval());
-		webAppProvider.setExtractWars(true);
-		webAppProvider.setConfigurationManager(new PropertiesConfigurationManager());
-		deployer.addAppProvider(webAppProvider);
-		server.addBean(deployer);
-
-		GzipHandler gzipHandler = new GzipHandler();
-		DefaultHandler defaultHandler = new DefaultHandler();
-		/** 禁止显示Contexts */
-		defaultHandler.setShowContexts(false);
-		/** 禁止显示icon */
-		defaultHandler.setServeIcon(false);
-		HandlerList handlers = new HandlerList();
-		handlers.setHandlers(new Handler[] { contexts, defaultHandler });
-		gzipHandler.setHandler(handlers);
-		server.setHandler(gzipHandler);
-
-		server.setDumpAfterStart(false);
-		server.setDumpBeforeStop(false);
-		server.setStopAtShutdown(true);
-
-		server.start();
-		System.out.println("****************************************");
-		System.out.println("* center server start completed.");
-		System.out.println("* port: " + centerServer.getPort() + ".");
-		System.out.println("****************************************");
-		return server;
-	}
-
-	protected static void createDeployDescriptor() throws Exception {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
-		if (Config.currentNode().getQuickStartWebApp()) {
-			buffer.append("<Configure class=\"org.eclipse.jetty.quickstart.QuickStartWebApp\">");
-			buffer.append("<Set name=\"autoPreconfigure\">true</Set>");
-		} else {
-			buffer.append("<Configure class=\"org.eclipse.jetty.webapp.WebAppContext\">");
-		}
-		buffer.append("<Set name=\"contextPath\">/" + x_program_center.class.getSimpleName() + "</Set>");
-		File war = new File(Config.dir_store(), x_program_center.class.getSimpleName() + ".war");
-		buffer.append("<Set name=\"war\">" + war.getAbsolutePath() + "</Set>");
-		String extraClasspath = calculateExtraClassPath(x_program_center.class);
-		buffer.append("<Set name=\"extraClasspath\">" + extraClasspath + "</Set>");
-		String tempDirectory = new File(Config.dir_servers_centerServer_work(), x_program_center.class.getSimpleName())
-				.getAbsolutePath();
-		buffer.append("<Set name=\"tempDirectory\">" + tempDirectory + "</Set>");
-		buffer.append("</Configure>");
-		File file = new File(Config.dir_servers_centerServer_webapps(),
-				x_program_center.class.getSimpleName() + ".xml");
-		FileUtils.write(file, buffer.toString(), DefaultCharset.charset);
-	}
-
-}

+ 0 - 1
o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/attachment/ActionCreateFormProcessPlatform.java

@@ -6,7 +6,6 @@ import java.util.Date;
 import java.util.List;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.StringUtils;
 
 import com.google.gson.JsonElement;
 import com.x.base.core.container.EntityManagerContainer;

+ 0 - 1
o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/building/ActionCreate.java

@@ -10,7 +10,6 @@ import com.x.base.core.project.bean.WrapCopierFactory;
 import com.x.base.core.project.exception.ExceptionAccessDenied;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
-import com.x.base.core.project.http.WrapOutId;
 import com.x.meeting.assemble.control.Business;
 import com.x.meeting.assemble.control.wrapout.WrapOutBuilding;
 import com.x.meeting.core.entity.Building;

+ 0 - 1
o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/building/ActionGet.java

@@ -12,7 +12,6 @@ import com.x.meeting.assemble.control.Business;
 import com.x.meeting.assemble.control.WrapTools;
 import com.x.meeting.assemble.control.wrapout.WrapOutBuilding;
 import com.x.meeting.core.entity.Building;
-import com.x.meeting.core.entity.Meeting;
 
 class ActionGet extends BaseAction {
 

+ 0 - 2
o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/meeting/ActionAccept.java

@@ -7,7 +7,6 @@ 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.tools.ListTools;
-import com.x.meeting.assemble.control.Business;
 import com.x.meeting.assemble.control.MessageFactory;
 import com.x.meeting.core.entity.Meeting;
 
@@ -15,7 +14,6 @@ class ActionAccept extends BaseAction {
 
 	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id) throws Exception {
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			Business business = new Business(emc);
 			Meeting meeting = emc.find(id, Meeting.class);
 			ActionResult<Wo> result = new ActionResult<>();
 			/* 在被邀请参加的人员之内 */

+ 54 - 0
o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/meeting/ActionCheckIn.java

@@ -0,0 +1,54 @@
+package com.x.meeting.assemble.control.jaxrs.meeting;
+
+import java.util.List;
+
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.annotation.CheckPersistType;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.exception.ExceptionWhen;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.meeting.assemble.control.jaxrs.meeting.BaseAction;
+import com.x.meeting.core.entity.Meeting;
+
+/**
+ * 会议签到
+ *
+ */
+class ActionCheckIn extends BaseAction {
+
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<Wo> result = new ActionResult<>();
+			Meeting meeting = emc.find(id, Meeting.class, ExceptionWhen.not_found);
+			
+			if( meeting != null ) {
+				emc.beginTransaction( Meeting.class );
+				meeting.addCheckinPerson( effectivePerson.getDistinguishedName() );
+				emc.check( meeting, CheckPersistType.all );
+				emc.commit();
+			}			
+			
+			Wo wo = new Wo();
+			wo.setCheckinPersonList( meeting.getCheckinPersonList());
+			result.setData(wo);
+			return result;
+		}
+	}
+
+	public static class Wo {
+		
+		@FieldDescribe("已签到的人员列表")
+		private List<String> checkinPersonList;
+
+		public List<String> getCheckinPersonList() {
+			return checkinPersonList;
+		}
+
+		public void setCheckinPersonList(List<String> checkinPersonList) {
+			this.checkinPersonList = checkinPersonList;
+		}
+	}
+
+}

+ 109 - 0
o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/meeting/ActionCheckinCode.java

@@ -0,0 +1,109 @@
+package com.x.meeting.assemble.control.jaxrs.meeting;
+
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.Hashtable;
+
+import javax.imageio.ImageIO;
+import javax.ws.rs.core.UriBuilder;
+
+import org.apache.commons.codec.binary.Base64;
+
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.MultiFormatWriter;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.config.ApplicationServer;
+import com.x.base.core.project.config.Config;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Audit;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.StringTools;
+import com.x.organization.core.entity.Bind;
+
+class ActionCheckinCode extends BaseAction {
+
+	private static Logger logger = LoggerFactory.getLogger(ActionCheckinCode.class);
+
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String meetingId) throws Exception {
+		Audit audit = logger.audit(effectivePerson);
+		ActionResult<Wo> result = new ActionResult<>();
+		Wo wo = new Wo();
+		String meta = StringTools.uniqueToken();
+
+		ApplicationServer applicationServer = Config.currentNode().getApplication();
+		Boolean sslEnable = applicationServer.getSslEnable();
+		String host = applicationServer.getProxyHost();
+		int port = applicationServer.getProxyPort();
+
+		String applicationUrl = getApplicationUrl(sslEnable, host, port) + "/x_meeting_assemble_control/jaxrs/meeting/" + meetingId + "/checkin";
+		/** 二维码内容 */
+		String url = UriBuilder.fromUri(applicationUrl).build().toASCIIString();
+		int width = 200; // 二维码图片宽度
+		int height = 200; // 二维码图片高度
+		String format = "png";// 二维码的图片格式
+
+		Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
+		// 内容所使用字符集编码
+		hints.put(EncodeHintType.MARGIN, "1");
+		hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.Q.toString());
+
+		BitMatrix bitMatrix = new MultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, width, height, hints);
+		BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+		for (int x = 0; x < width; x++) {
+			for (int y = 0; y < height; y++) {
+				image.setRGB(x, y, bitMatrix.get(x, y) ? BLACK : WHITE);
+			}
+		}
+		Graphics2D graphics = image.createGraphics();
+
+		Image logo = ImageIO.read(new ByteArrayInputStream(Config.bindLogo()));
+		graphics.drawImage(logo, 68, 68, null);
+		graphics.dispose();
+		logo.flush();
+		try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
+			ImageIO.write(image, format, out);
+			wo.setImage(Base64.encodeBase64String(out.toByteArray()));
+		}
+		wo.setMeta(meta);
+		result.setData(wo);
+		audit.log();
+		return result;
+	}
+
+	private String getApplicationUrl(Boolean sslEnable, String host, int port) {
+		if( sslEnable ) {
+			return "https://" + host + ":" + port;
+		}else {
+			return "http://" + host + ":" + port;
+		}
+	}
+
+	private static final int BLACK = 0xFF000000;
+	private static final int WHITE = 0xFFFFFFFF;
+
+	public class Wo extends Bind {
+
+		private static final long serialVersionUID = -3574645735233129236L;
+
+		@FieldDescribe("Base64编码图像.")
+		private String image;
+
+		public String getImage() {
+			return image;
+		}
+
+		public void setImage(String image) {
+			this.image = image;
+		}
+
+	}
+
+}

+ 0 - 3
o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/meeting/ActionConfirmDeny.java

@@ -2,10 +2,7 @@ package com.x.meeting.assemble.control.jaxrs.meeting;
 
 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.exception.ExceptionAccessDenied;
 import com.x.base.core.project.exception.ExceptionEntityNotExist;
 import com.x.base.core.project.http.ActionResult;

+ 0 - 2
o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/meeting/ActionCreate.java

@@ -10,11 +10,9 @@ 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.config.Config;
-import com.x.base.core.project.config.Token.InitialManager;
 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.message.MessageConnector;
 import com.x.meeting.assemble.control.Business;
 import com.x.meeting.assemble.control.MessageFactory;
 import com.x.meeting.core.entity.ConfirmStatus;

+ 0 - 1
o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/meeting/ActionGet.java

@@ -5,7 +5,6 @@ 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.exception.ExceptionAccessDenied;
 import com.x.base.core.project.exception.ExceptionWhen;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;

+ 0 - 3
o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/meeting/ActionListForwardMonthAll.java

@@ -15,19 +15,16 @@ import javax.persistence.criteria.Root;
 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.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
-import com.x.base.core.project.tools.ListTools;
 import com.x.meeting.assemble.control.Business;
 import com.x.meeting.assemble.control.WrapTools;
 import com.x.meeting.assemble.control.wrapout.WrapOutMeeting;
 import com.x.meeting.core.entity.Meeting;
 import com.x.meeting.core.entity.Meeting_;
 import com.x.meeting.core.entity.Room;
-import com.x.meeting.core.entity.Room_;
 
 class ActionListForwardMonthAll extends BaseAction {
 

+ 0 - 7
o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/meeting/ActionManualCompleted.java

@@ -2,21 +2,14 @@ package com.x.meeting.assemble.control.jaxrs.meeting;
 
 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.exception.ExceptionAccessDenied;
 import com.x.base.core.project.exception.ExceptionEntityNotExist;
-import com.x.base.core.project.exception.ExceptionWhen;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
-import com.x.base.core.project.http.WrapOutId;
 import com.x.base.core.project.jaxrs.WoId;
 import com.x.meeting.assemble.control.Business;
-import com.x.meeting.core.entity.ConfirmStatus;
 import com.x.meeting.core.entity.Meeting;
-import com.x.meeting.core.entity.Room;
 
 class ActionManualCompleted extends BaseAction {
 

+ 0 - 3
o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/meeting/ActionReject.java

@@ -6,10 +6,8 @@ import com.x.base.core.entity.annotation.CheckPersistType;
 import com.x.base.core.project.exception.ExceptionWhen;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
-import com.x.base.core.project.http.WrapOutId;
 import com.x.base.core.project.jaxrs.WoId;
 import com.x.base.core.project.tools.ListTools;
-import com.x.meeting.assemble.control.Business;
 import com.x.meeting.assemble.control.MessageFactory;
 import com.x.meeting.core.entity.Meeting;
 
@@ -18,7 +16,6 @@ class ActionReject extends BaseAction {
 	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id) throws Exception {
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 			ActionResult<Wo> result = new ActionResult<>();
-			Business business = new Business(emc);
 			Meeting meeting = emc.find(id, Meeting.class, ExceptionWhen.not_found);
 			/* 在被邀请参加的人员之内 */
 			if (meeting.getInvitePersonList().contains(effectivePerson.getDistinguishedName())) {

+ 4 - 0
o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/meeting/BaseAction.java

@@ -19,6 +19,7 @@ abstract class BaseAction extends StandardJaxrsAction {
 
 	private static Logger logger = LoggerFactory.getLogger(BaseAction.class);
 
+	@SuppressWarnings("unused")
 	protected void notifyMeetingInviteMessage(Business business, Meeting meeting) throws Exception {
 		if (ListTools.isNotEmpty(meeting.getInvitePersonList())) {
 			Room room = business.entityManagerContainer().find(meeting.getRoom(), Room.class, ExceptionWhen.not_found);
@@ -33,6 +34,7 @@ abstract class BaseAction extends StandardJaxrsAction {
 		}
 	}
 
+	@SuppressWarnings("unused")
 	protected void notifyMeetingCancelMessage(Business business, Meeting meeting) throws Exception {
 		if (ListTools.isNotEmpty(meeting.getInvitePersonList())) {
 			Room room = business.entityManagerContainer().find(meeting.getRoom(), Room.class, ExceptionWhen.not_found);
@@ -51,6 +53,7 @@ abstract class BaseAction extends StandardJaxrsAction {
 		}
 	}
 
+	@SuppressWarnings("unused")
 	protected void notifyMeetingAcceptMessage(Business business, Meeting meeting, String person) throws Exception {
 		Room room = business.entityManagerContainer().find(meeting.getRoom(), Room.class, ExceptionWhen.not_found);
 		Building building = business.entityManagerContainer().find(room.getBuilding(), Building.class,
@@ -68,6 +71,7 @@ abstract class BaseAction extends StandardJaxrsAction {
 
 	}
 
+	@SuppressWarnings("unused")
 	protected void notifyMeetingRejectMessage(Business business, Meeting meeting, String person) throws Exception {
 		Room room = business.entityManagerContainer().find(meeting.getRoom(), Room.class, ExceptionWhen.not_found);
 		Building building = business.entityManagerContainer().find(room.getBuilding(), Building.class,

+ 36 - 0
o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/meeting/MeetingAction.java

@@ -156,6 +156,42 @@ public class MeetingAction extends BaseAction {
 		}
 		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
 	}
+	
+	@JaxrsMethodDescribe(value = "会议签到", action = ActionCheckIn.class)
+	@GET
+	@Path("{id}/checkin")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void checkin(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			@PathParam("id") String id) {
+		ActionResult<ActionCheckIn.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionCheckIn().execute(effectivePerson, id);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
+	}
+	
+	@JaxrsMethodDescribe(value = "会议签到二维码", action = ActionCheckinCode.class)
+	@GET
+	@Path("{id}/checkin/code")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void checkInBindCode(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			@PathParam("id") String id) {
+		ActionResult<ActionCheckinCode.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionCheckinCode().execute(effectivePerson, id);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
+	}
 
 	@JaxrsMethodDescribe(value = "拒绝会议邀请", action = ActionAccept.class)
 	@GET

+ 0 - 2
o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/room/ActionDelete.java

@@ -8,13 +8,11 @@ import com.x.base.core.project.bean.WrapCopierFactory;
 import com.x.base.core.project.config.StorageMapping;
 import com.x.base.core.project.exception.ExceptionAccessDenied;
 import com.x.base.core.project.exception.ExceptionEntityNotExist;
-import com.x.base.core.project.exception.ExceptionWhen;
 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.meeting.assemble.control.Business;
 import com.x.meeting.assemble.control.ThisApplication;
-import com.x.meeting.assemble.control.WrapTools;
 import com.x.meeting.assemble.control.wrapout.WrapOutRoom;
 import com.x.meeting.core.entity.Attachment;
 import com.x.meeting.core.entity.Meeting;

+ 0 - 4
o2server/x_meeting_assemble_control/src/main/java/com/x/meeting/assemble/control/jaxrs/room/ActionEdit.java

@@ -9,15 +9,11 @@ import com.x.base.core.project.bean.WrapCopier;
 import com.x.base.core.project.bean.WrapCopierFactory;
 import com.x.base.core.project.exception.ExceptionAccessDenied;
 import com.x.base.core.project.exception.ExceptionEntityNotExist;
-import com.x.base.core.project.exception.ExceptionWhen;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
-import com.x.base.core.project.http.WrapOutId;
 import com.x.base.core.project.jaxrs.WoId;
 import com.x.base.core.project.tools.ListTools;
 import com.x.meeting.assemble.control.Business;
-import com.x.meeting.assemble.control.WrapTools;
-import com.x.meeting.assemble.control.jaxrs.room.ActionCreate.Wi;
 import com.x.meeting.core.entity.Room;
 
 class ActionEdit extends BaseAction {

+ 0 - 2
o2server/x_meeting_core_entity/src/main/java/com/x/meeting/core/entity/Building.java

@@ -1,7 +1,5 @@
 package com.x.meeting.core.entity;
 
-import java.util.Date;
-
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;

+ 37 - 1
o2server/x_meeting_core_entity/src/main/java/com/x/meeting/core/entity/Meeting.java

@@ -28,13 +28,13 @@ 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.CitationExist;
 import com.x.base.core.entity.annotation.ContainerEntity;
 import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.tools.ListTools;
 
 @Entity
 @ContainerEntity
@@ -181,6 +181,18 @@ public class Meeting extends SliceJpaObject {
 	@ElementIndex(name = TABLE + IndexNameMiddle + rejectPersonList_FIELDNAME + ElementIndexNameSuffix)
 	@CheckPersist(allowEmpty = true)
 	private List<String> rejectPersonList;
+	
+	public static final String checkinPersonList_FIELDNAME = "checkinPersonList";
+	@FieldDescribe("签到人员.")
+	@PersistentCollection(fetch = FetchType.EAGER)
+	@ContainerTable(name = TABLE + ContainerTableNameMiddle
+			+ checkinPersonList_FIELDNAME, joinIndex = @Index(name = TABLE + IndexNameMiddle + checkinPersonList_FIELDNAME
+					+ JoinIndexNameSuffix))
+	@OrderColumn(name =  ORDERCOLUMNCOLUMN)
+	@ElementColumn(length = length_255B, name = ColumnNamePrefix + checkinPersonList_FIELDNAME)
+	@ElementIndex(name = TABLE + IndexNameMiddle + checkinPersonList_FIELDNAME + ElementIndexNameSuffix)
+	@CheckPersist(allowEmpty = true)
+	private List<String> checkinPersonList;
 
 	public static final String confirmStatus_FIELDNAME = "confirmStatus";
 	@FieldDescribe("会议预定状态")
@@ -379,4 +391,28 @@ public class Meeting extends SliceJpaObject {
 		this.summary = summary;
 	}
 
+	public List<String> getCheckinPersonList() {
+		return checkinPersonList;
+	}
+
+	public void setCheckinPersonList(List<String> checkinPersonList) {
+		this.checkinPersonList = checkinPersonList;
+	}
+	
+	/**
+	 * 添加一个签到人员
+	 * @param distinguishedName
+	 */
+	public void addCheckinPerson( String distinguishedName ) {
+		this.checkinPersonList = ListTools.addStringToList( distinguishedName, this.checkinPersonList );
+	}
+	
+	/**
+	 * 删除一个签到人员
+	 * @param distinguishedName
+	 */
+	public void removeCheckinPerson( String distinguishedName ) {
+		this.checkinPersonList = ListTools.removeStringFromList( distinguishedName, this.checkinPersonList );
+	}
+
 }

+ 0 - 2
o2server/x_meeting_core_entity/src/main/java/com/x/meeting/core/entity/Room.java

@@ -1,7 +1,5 @@
 package com.x.meeting.core.entity;
 
-import java.util.Date;
-
 import javax.persistence.Basic;
 import javax.persistence.Column;
 import javax.persistence.Entity;

+ 4 - 4
o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/CacheFactory.java

@@ -9,7 +9,7 @@ import com.x.organization.core.entity.Role;
 import com.x.organization.core.entity.Unit;
 import com.x.organization.core.entity.UnitAttribute;
 import com.x.organization.core.entity.UnitDuty;
-import com.x.organization.core.entity.accredit.Trust;
+import com.x.organization.core.entity.accredit.Empower;
 
 import net.sf.ehcache.Ehcache;
 
@@ -17,7 +17,7 @@ public class CacheFactory {
 
 	public static Ehcache getOrganizationCache() {
 		return ApplicationCache.instance().getCache(Identity.class, Unit.class, UnitAttribute.class, UnitDuty.class,
-				Role.class, Person.class, PersonAttribute.class, Group.class, Trust.class);
+				Role.class, Person.class, PersonAttribute.class, Group.class, Empower.class);
 	}
 
 	public static Ehcache getIdentityCache() {
@@ -29,7 +29,7 @@ public class CacheFactory {
 	}
 
 	public static Ehcache getTrustCache() {
-		return ApplicationCache.instance().getCache(Trust.class);
+		return ApplicationCache.instance().getCache(Empower.class);
 	}
 
 	public static Ehcache getUnitAttributeCache() {
@@ -65,6 +65,6 @@ public class CacheFactory {
 		ApplicationCache.notify(UnitDuty.class);
 		ApplicationCache.notify(Group.class);
 		ApplicationCache.notify(Role.class);
-		ApplicationCache.notify(Trust.class);
+		ApplicationCache.notify(Empower.class);
 	}
 }

+ 4 - 4
o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/ActionApplication.java

@@ -5,13 +5,13 @@ import java.util.Set;
 import javax.ws.rs.ApplicationPath;
 
 import com.x.base.core.project.jaxrs.AbstractActionApplication;
+import com.x.organization.assemble.express.jaxrs.empower.EmpowerAction;
+import com.x.organization.assemble.express.jaxrs.empowerlog.EmpowerLogAction;
 import com.x.organization.assemble.express.jaxrs.group.GroupAction;
 import com.x.organization.assemble.express.jaxrs.identity.IdentityAction;
 import com.x.organization.assemble.express.jaxrs.person.PersonAction;
 import com.x.organization.assemble.express.jaxrs.personattribute.PersonAttributeAction;
 import com.x.organization.assemble.express.jaxrs.role.RoleAction;
-import com.x.organization.assemble.express.jaxrs.trust.TrustAction;
-import com.x.organization.assemble.express.jaxrs.trustlog.TrustLogAction;
 import com.x.organization.assemble.express.jaxrs.unit.UnitAction;
 import com.x.organization.assemble.express.jaxrs.unitattribute.UnitAttributeAction;
 import com.x.organization.assemble.express.jaxrs.unitduty.UnitDutyAction;
@@ -27,8 +27,8 @@ public class ActionApplication extends AbstractActionApplication {
 		classes.add(UnitAction.class);
 		classes.add(UnitAttributeAction.class);
 		classes.add(UnitDutyAction.class);
-		classes.add(TrustAction.class);
-		classes.add(TrustLogAction.class);
+		classes.add(EmpowerAction.class);
+		classes.add(EmpowerLogAction.class);
 		return classes;
 	}
 

+ 2 - 2
o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/TrustJaxrsFilter.java → o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/EmpowerJaxrsFilter.java

@@ -4,7 +4,7 @@ import javax.servlet.annotation.WebFilter;
 
 import com.x.base.core.project.jaxrs.CipherManagerUserJaxrsFilter;
 
-@WebFilter(urlPatterns = "/jaxrs/trust/*", asyncSupported = true)
-public class TrustJaxrsFilter extends CipherManagerUserJaxrsFilter {
+@WebFilter(urlPatterns = "/jaxrs/empower/*", asyncSupported = true)
+public class EmpowerJaxrsFilter extends CipherManagerUserJaxrsFilter {
 
 }

+ 2 - 2
o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/TrustLogJaxrsFilter.java → o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/EmpowerLogJaxrsFilter.java

@@ -4,7 +4,7 @@ import javax.servlet.annotation.WebFilter;
 
 import com.x.base.core.project.jaxrs.CipherManagerUserJaxrsFilter;
 
-@WebFilter(urlPatterns = "/jaxrs/trustlog/*", asyncSupported = true)
-public class TrustLogJaxrsFilter extends CipherManagerUserJaxrsFilter {
+@WebFilter(urlPatterns = "/jaxrs/empowerlog/*", asyncSupported = true)
+public class EmpowerLogJaxrsFilter extends CipherManagerUserJaxrsFilter {
 
 }

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff