فهرست منبع

"修改merge任务为combine,增加合并workLog"

Zhou Rui 5 سال پیش
والد
کامیت
cde761ff34
100فایلهای تغییر یافته به همراه918 افزوده شده و 695 حذف شده
  1. 2 0
      o2server/x_base_core_project/pom.xml
  2. 107 107
      o2server/x_base_core_project/src/main/java/com/x/base/core/container/EntityManagerContainer.java
  3. 4 4
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Node.java
  4. 13 36
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/ProcessPlatform.java
  5. 0 1
      o2server/x_cms_assemble_control/.gitignore
  6. 0 1
      o2server/x_cms_core_entity/.gitignore
  7. 0 1
      o2server/x_console/.gitignore
  8. 1 134
      o2server/x_console/src/main/java/com/x/server/console/Main.java
  9. 2 0
      o2server/x_console/src/main/java/com/x/server/console/server/application/ApplicationServerTools.java
  10. 0 1
      o2server/x_file_assemble_control/.gitignore
  11. 0 1
      o2server/x_meeting_assemble_control/.gitignore
  12. 0 1
      o2server/x_message_assemble_communicate/.gitignore
  13. 0 1
      o2server/x_portal_assemble_designer/.gitignore
  14. 0 1
      o2server/x_portal_core_entity/.gitignore
  15. 0 1
      o2server/x_processplatform_assemble_designer/.gitignore
  16. 2 2
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/MappingExecuteQueue.java
  17. 2 2
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/ProjectionExecuteQueue.java
  18. 20 8
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/workcompleted/ActionMergeWithApplication.java
  19. 20 6
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/workcompleted/ActionMergeWithProcess.java
  20. 6 6
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/workcompleted/WorkCompletedAction.java
  21. 2 2
      o2server/x_processplatform_assemble_designer/src/main/webapp/describe/describe.json
  22. 2 2
      o2server/x_processplatform_assemble_designer/src/main/webapp/describe/sources/com/x/processplatform/assemble/designer/MappingExecuteQueue.java
  23. 2 2
      o2server/x_processplatform_assemble_designer/src/main/webapp/describe/sources/com/x/processplatform/assemble/designer/ProjectionExecuteQueue.java
  24. 6 6
      o2server/x_processplatform_assemble_designer/src/main/webapp/describe/sources/com/x/processplatform/assemble/designer/jaxrs/workcompleted/WorkCompletedAction.java
  25. 0 1
      o2server/x_processplatform_assemble_surface/.gitignore
  26. 5 4
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionGetWithWorkCompleted.java
  27. 4 4
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionGetWithWorkCompletedFromData.java
  28. 2 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionGetWithWorkCompletedFromItem.java
  29. 2 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionGetWithWorkCompletedPath0.java
  30. 2 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionGetWithWorkCompletedPath1.java
  31. 2 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionGetWithWorkCompletedPath2.java
  32. 2 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionGetWithWorkCompletedPath3.java
  33. 2 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionGetWithWorkCompletedPath4.java
  34. 2 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionGetWithWorkCompletedPath5.java
  35. 2 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionGetWithWorkCompletedPath6.java
  36. 2 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionGetWithWorkCompletedPath7.java
  37. 1 1
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionUpdateWithWorkCompleted.java
  38. 1 1
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionUpdateWithWorkCompletedPath0.java
  39. 1 1
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionUpdateWithWorkCompletedPath1.java
  40. 1 1
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionUpdateWithWorkCompletedPath2.java
  41. 1 1
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionUpdateWithWorkCompletedPath3.java
  42. 1 1
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionUpdateWithWorkCompletedPath4.java
  43. 1 1
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionUpdateWithWorkCompletedPath5.java
  44. 1 1
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionUpdateWithWorkCompletedPath6.java
  45. 1 1
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionUpdateWithWorkCompletedPath7.java
  46. 3 3
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/BaseAction.java
  47. 2 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionGetWithWorkOrWorkCompleted.java
  48. 5 6
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/schedule/CleanKeyLock.java
  49. 0 1
      o2server/x_processplatform_core_entity/.gitignore
  50. 21 21
      o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/WorkCompleted.java
  51. 23 0
      o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/WorkCompletedProperties.java
  52. 0 1
      o2server/x_processplatform_service_processing/.gitignore
  53. 5 5
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/ThisApplication.java
  54. 0 4
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ActionUpdateWithWork.java
  55. 2 2
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ActionUpdateWithWorkCompleted.java
  56. 2 2
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ActionUpdateWithWorkCompletedPath0.java
  57. 2 2
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ActionUpdateWithWorkCompletedPath1.java
  58. 2 2
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ActionUpdateWithWorkCompletedPath2.java
  59. 2 2
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ActionUpdateWithWorkCompletedPath3.java
  60. 2 2
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ActionUpdateWithWorkCompletedPath4.java
  61. 2 2
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ActionUpdateWithWorkCompletedPath5.java
  62. 2 2
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ActionUpdateWithWorkCompletedPath6.java
  63. 2 2
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ActionUpdateWithWorkCompletedPath7.java
  64. 2 38
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ActionUpdateWithWorkCompletedPrimitivePath0.java
  65. 3 3
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ExceptionModifyMerged.java
  66. 3 3
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/test/ActionCombine.java
  67. 5 5
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/test/TestAction.java
  68. 2 3
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/work/ActionProjection.java
  69. 152 0
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/workcompleted/ActionCombine.java
  70. 0 94
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/workcompleted/ActionDataMerge.java
  71. 3 3
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/workcompleted/ExceptionCombine.java
  72. 5 5
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/workcompleted/WorkCompletedAction.java
  73. 22 21
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/schedule/Combine.java
  74. 13 0
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/schedule/ExceptionCombine.java
  75. 0 13
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/schedule/ExceptionDataMerge.java
  76. 0 1
      o2server/x_program_center/.gitignore
  77. 0 1
      o2server/x_program_center_core_entity/.gitignore
  78. 0 1
      o2server/x_query_assemble_designer/.gitignore
  79. 0 1
      o2server/x_query_core_entity/.gitignore
  80. 0 1
      o2server/x_query_service_processing/.gitignore
  81. 7 4
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/ThisApplication.java
  82. 0 1
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/factory/ReviewFactory.java
  83. 20 0
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/factory/TaskListFactory.java
  84. 118 22
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/jaxrs/task/ActionGet.java
  85. 10 1
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/jaxrs/task/ActionSave.java
  86. 3 11
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/jaxrs/task/BaseAction.java
  87. 40 1
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/jaxrs/task/TaskAction.java
  88. 3 0
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/BatchOperationProcessService.java
  89. 80 13
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/DynamicPersistService.java
  90. 44 11
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/DynamicService.java
  91. 1 1
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/ReviewService.java
  92. 0 1
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/TaskGroupPersistService.java
  93. 1 1
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/TaskGroupQueryService.java
  94. 1 1
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/TaskGroupService.java
  95. 29 1
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/TaskListQueryService.java
  96. 6 1
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/TaskListService.java
  97. 30 2
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/TaskPersistService.java
  98. 6 3
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/TaskQueryService.java
  99. 4 4
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/TaskService.java
  100. 1 0
      o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/timertask/Timertask_BatchOperationTask.java

+ 2 - 0
o2server/x_base_core_project/pom.xml

@@ -14,6 +14,8 @@
 	<dependencies>
 
 	</dependencies>
+
+	
 	<build>
 		<plugins>
 			<plugin>

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

@@ -83,70 +83,70 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 			// Object object = jpa.get(field.getName());
 			Object object = FieldUtils.readField(field, jpa, true);
 			switch (fieldType) {
-			case stringValue:
-				this.persistChecker.stringValue.check(field, null == object ? null : Objects.toString(object), jpa,
-						checkPersist, checkPersistType);
-				break;
-			case stringValueList:
-				this.persistChecker.stringValueList.check(field, null == object ? null : (List<String>) object, jpa,
-						checkPersist, checkPersistType);
-				break;
-			case dateValue:
-				this.persistChecker.dateValue.check(field, (null == object ? null : (Date) object), jpa, checkPersist,
-						checkPersistType);
-				break;
-			case dateValueList:
-				this.persistChecker.dateValueList.check(field, (null == object ? null : (List<Date>) object), jpa,
-						checkPersist, checkPersistType);
-				break;
-			case booleanValue:
-				this.persistChecker.booleanValue.check(field, (null == object ? null : (Boolean) object), jpa,
-						checkPersist, checkPersistType);
-				break;
-			case booleanValueList:
-				this.persistChecker.booleanValueList.check(field, (null == object ? null : (List<Boolean>) object), jpa,
-						checkPersist, checkPersistType);
-				break;
-			case integerValue:
-				this.persistChecker.integerValue.check(field, (null == object ? null : (Integer) object), jpa,
-						checkPersist, checkPersistType);
-				break;
-			case integerValueList:
-				this.persistChecker.integerValueList.check(field, (null == object ? null : (List<Integer>) object), jpa,
-						checkPersist, checkPersistType);
-				break;
-			case doubleValue:
-				this.persistChecker.doubleValue.check(field, (null == object ? null : (Double) object), jpa,
-						checkPersist, checkPersistType);
-				break;
-			case doubleValueList:
-				this.persistChecker.doubleValueList.check(field, (null == object ? null : (List<Double>) object), jpa,
-						checkPersist, checkPersistType);
-				break;
-			case longValue:
-				this.persistChecker.longValue.check(field, (null == object ? null : (Long) object), jpa, checkPersist,
-						checkPersistType);
-				break;
-			case longValueList:
-				this.persistChecker.longValueList.check(field, (null == object ? null : (List<Long>) object), jpa,
-						checkPersist, checkPersistType);
-				break;
-			case floatValue:
-				this.persistChecker.floatValue.check(field, (null == object ? null : (Float) object), jpa, checkPersist,
-						checkPersistType);
-				break;
-			case floatValueList:
-				this.persistChecker.floatValueList.check(field, (null == object ? null : (List<Float>) object), jpa,
-						checkPersist, checkPersistType);
-				break;
-			case byteValueArray:
-				this.persistChecker.byteValueArray.check(field, (null == object ? null : (byte[]) object), jpa,
-						checkPersist, checkPersistType);
-				break;
-			case enumValue:
-				break;
-			default:
-				break;
+				case stringValue:
+					this.persistChecker.stringValue.check(field, null == object ? null : Objects.toString(object), jpa,
+							checkPersist, checkPersistType);
+					break;
+				case stringValueList:
+					this.persistChecker.stringValueList.check(field, null == object ? null : (List<String>) object, jpa,
+							checkPersist, checkPersistType);
+					break;
+				case dateValue:
+					this.persistChecker.dateValue.check(field, (null == object ? null : (Date) object), jpa,
+							checkPersist, checkPersistType);
+					break;
+				case dateValueList:
+					this.persistChecker.dateValueList.check(field, (null == object ? null : (List<Date>) object), jpa,
+							checkPersist, checkPersistType);
+					break;
+				case booleanValue:
+					this.persistChecker.booleanValue.check(field, (null == object ? null : (Boolean) object), jpa,
+							checkPersist, checkPersistType);
+					break;
+				case booleanValueList:
+					this.persistChecker.booleanValueList.check(field, (null == object ? null : (List<Boolean>) object),
+							jpa, checkPersist, checkPersistType);
+					break;
+				case integerValue:
+					this.persistChecker.integerValue.check(field, (null == object ? null : (Integer) object), jpa,
+							checkPersist, checkPersistType);
+					break;
+				case integerValueList:
+					this.persistChecker.integerValueList.check(field, (null == object ? null : (List<Integer>) object),
+							jpa, checkPersist, checkPersistType);
+					break;
+				case doubleValue:
+					this.persistChecker.doubleValue.check(field, (null == object ? null : (Double) object), jpa,
+							checkPersist, checkPersistType);
+					break;
+				case doubleValueList:
+					this.persistChecker.doubleValueList.check(field, (null == object ? null : (List<Double>) object),
+							jpa, checkPersist, checkPersistType);
+					break;
+				case longValue:
+					this.persistChecker.longValue.check(field, (null == object ? null : (Long) object), jpa,
+							checkPersist, checkPersistType);
+					break;
+				case longValueList:
+					this.persistChecker.longValueList.check(field, (null == object ? null : (List<Long>) object), jpa,
+							checkPersist, checkPersistType);
+					break;
+				case floatValue:
+					this.persistChecker.floatValue.check(field, (null == object ? null : (Float) object), jpa,
+							checkPersist, checkPersistType);
+					break;
+				case floatValueList:
+					this.persistChecker.floatValueList.check(field, (null == object ? null : (List<Float>) object), jpa,
+							checkPersist, checkPersistType);
+					break;
+				case byteValueArray:
+					this.persistChecker.byteValueArray.check(field, (null == object ? null : (byte[]) object), jpa,
+							checkPersist, checkPersistType);
+					break;
+				case enumValue:
+					break;
+				default:
+					break;
 			}
 		}
 	}
@@ -161,16 +161,16 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 			// Object object = jpa.get(field.getName());
 			Object object = FieldUtils.readField(field, jpa, true);
 			switch (fieldType) {
-			case stringValue:
-				this.removeChecker.stringValue.check(field, null == object ? null : Objects.toString(object), jpa,
-						checkRemove, checkRemoveType);
-				break;
-			case stringValueList:
-				this.removeChecker.stringValueList.check(field, null == object ? null : (List<String>) object, jpa,
-						checkRemove, checkRemoveType);
-				break;
-			default:
-				break;
+				case stringValue:
+					this.removeChecker.stringValue.check(field, null == object ? null : Objects.toString(object), jpa,
+							checkRemove, checkRemoveType);
+					break;
+				case stringValueList:
+					this.removeChecker.stringValueList.check(field, null == object ? null : (List<String>) object, jpa,
+							checkRemove, checkRemoveType);
+					break;
+				default:
+					break;
 			}
 		}
 	}
@@ -208,18 +208,19 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 			t = em.find(cls, id);
 		}
 		switch (exceptionWhen) {
-		case not_found:
-			if (null == t) {
-				throw new Exception("can not find entity id: " + id + ", class: " + cls.getCanonicalName() + ".");
-			}
-			break;
-		case found:
-			if (null != t) {
-				throw new Exception("entity already existed, id: " + id + ", class: " + cls.getCanonicalName() + ".");
-			}
-			break;
-		default:
-			break;
+			case not_found:
+				if (null == t) {
+					throw new Exception("can not find entity id: " + id + ", class: " + cls.getCanonicalName() + ".");
+				}
+				break;
+			case found:
+				if (null != t) {
+					throw new Exception(
+							"entity already existed, id: " + id + ", class: " + cls.getCanonicalName() + ".");
+				}
+				break;
+			default:
+				break;
 		}
 		return t;
 	}
@@ -244,14 +245,14 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 			Predicate p = cb.equal(root.get(field.getName()), flag);
 			List<T> list = em.createQuery(cq.select(root).where(p).distinct(true)).setMaxResults(2).getResultList();
 			switch (list.size()) {
-			case 0:
-				break;
-			case 1:
-				t = list.get(0);
-				break out;
-			case 2:
-				throw new Exception("flag get multiple entity flag:" + flag + ", class:" + cls.getName()
-						+ ", attribute:" + field.getName() + ".");
+				case 0:
+					break;
+				case 1:
+					t = list.get(0);
+					break out;
+				case 2:
+					throw new Exception("flag get multiple entity flag:" + flag + ", class:" + cls.getName()
+							+ ", attribute:" + field.getName() + ".");
 			}
 		}
 		return t;
@@ -309,15 +310,15 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 			cq.select(root).where(p);
 			List<T> list = em.createQuery(cq).setMaxResults(2).getResultList();
 			switch (list.size()) {
-			case 0:
-				break;
-			case 1:
-				t = list.get(0);
-				break out;
-			case 2:
-				throw new Exception("flag get multiple entity flag:" + flag + ", class:" + cls.getName()
-						+ ", attribute:" + field.getName() + ", restrict attrubte:" + singularAttribute
-						+ ", restrict value:" + restrictValue + ".");
+				case 0:
+					break;
+				case 1:
+					t = list.get(0);
+					break out;
+				case 2:
+					throw new Exception("flag get multiple entity flag:" + flag + ", class:" + cls.getName()
+							+ ", attribute:" + field.getName() + ", restrict attrubte:" + singularAttribute
+							+ ", restrict value:" + restrictValue + ".");
 			}
 		}
 		return t;
@@ -1125,9 +1126,9 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 			selections.add(root.get(str));
 		}
 		cq.multiselect(selections).where(predicate);
-//		if (StringUtils.isNotEmpty(orderAttribute)) {
-//			cq.orderBy(cb.desc(root.get(orderAttribute)));
-//		}
+		// if (StringUtils.isNotEmpty(orderAttribute)) {
+		// cq.orderBy(cb.desc(root.get(orderAttribute)));
+		// }
 		T t = null;
 		for (Tuple o : em.createQuery(cq).getResultList()) {
 			t = clz.newInstance();
@@ -1823,5 +1824,4 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 		return list;
 	}
 
-
 }

+ 4 - 4
o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Node.java

@@ -192,7 +192,7 @@ public class Node extends ConfigObject {
 		}
 
 		public boolean available() {
-			return DateTools.cronAvailable(this.cron);
+			return DateTools.cronAvailable(this.cron());
 		}
 
 		@FieldDescribe("是否启用,默认每天凌晨2点进行备份.")
@@ -232,7 +232,7 @@ public class Node extends ConfigObject {
 		}
 
 		public boolean available() {
-			return DateTools.cronAvailable(this.cron);
+			return DateTools.cronAvailable(this.cron());
 		}
 
 		@FieldDescribe("是否启用,默认每天凌晨4点进行备份.")
@@ -275,7 +275,7 @@ public class Node extends ConfigObject {
 			return DateTools.cronAvailable(this.cron) && StringUtils.isNotEmpty(this.path);
 		}
 
-		@FieldDescribe("是否启用,默认每天凌晨2点进行备份.")
+		@FieldDescribe("是否启用.")
 		private Boolean enable = false;
 
 		@FieldDescribe("定时任务cron表达式")
@@ -308,7 +308,7 @@ public class Node extends ConfigObject {
 			return DateTools.cronAvailable(this.cron) && StringUtils.isNotEmpty(this.path);
 		}
 
-		@FieldDescribe("是否启用,默认每天凌晨2点进行备份.")
+		@FieldDescribe("是否启用.")
 		private Boolean enable = false;
 
 		@FieldDescribe("定时任务cron表达式")

+ 13 - 36
o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/ProcessPlatform.java

@@ -11,6 +11,9 @@ import com.x.base.core.project.annotation.FieldDescribe;
 import com.x.base.core.project.gson.XGsonBuilder;
 import com.x.base.core.project.tools.DefaultCharset;
 
+/**
+ * @author Zhou Rui
+ */
 public class ProcessPlatform extends ConfigObject {
 
 	public final static Integer DEFAULT_FORMVERSIONPERIOD = 45;
@@ -28,6 +31,7 @@ public class ProcessPlatform extends ConfigObject {
 	public final static String DEFAULT_DOCTOWORDTYPE = "local";
 
 	public final static String DOCTOWORDTYPE_LOCAL = "local";
+
 	public final static String DOCTOWORDTYPE_CLOUD = "cloud";
 
 	public final static String DEFAULT_DOCTOWORDDEFAULTFILENAME = "正文.docx";
@@ -46,9 +50,6 @@ public class ProcessPlatform extends ConfigObject {
 		this.formVersionCount = DEFAULT_FORMVERSIONCOUNT;
 		this.processVersionCount = DEFAULT_PROCESSVERSIONCOUNT;
 		this.scriptVersionCount = DEFAULT_SCRIPTVERSIONCOUNT;
-//		this.formVersionPeriod = DEFAULT_FORMVERSIONPERIOD;
-//		this.processVersionPeriod = DEFAULT_PROCESSVERSIONPERIOD;
-//		this.scriptVersionPeriod = DEFAULT_SCRIPTVERSIONPERIOD;
 		this.docToWordType = DEFAULT_DOCTOWORDTYPE;
 		this.docToWordDefaultFileName = DEFAULT_DOCTOWORDDEFAULTFILENAME;
 		this.docToWordDefaultSite = DEFAULT_DOCTOWORDDEFAULTSITE;
@@ -56,7 +57,7 @@ public class ProcessPlatform extends ConfigObject {
 		this.urge = new Urge();
 		this.expire = new Expire();
 		this.touchDelay = new TouchDelay();
-		this.dataMerge = new DataMerge();
+		this.combine = new Combine();
 		this.touchDetained = new TouchDetained();
 		this.deleteDraft = new DeleteDraft();
 		this.passExpired = new PassExpired();
@@ -75,15 +76,6 @@ public class ProcessPlatform extends ConfigObject {
 	@FieldDescribe("脚本历史版本保留数量,0为不保留.")
 	private Integer scriptVersionCount;
 
-//	@FieldDescribe("表单历史版本保留天数.")
-//	private Integer formVersionPeriod;
-//
-//	@FieldDescribe("流程历史版本保留天数.")
-//	private Integer processVersionPeriod;
-//
-//	@FieldDescribe("脚本历史版本保留天数.")
-//	private Integer scriptVersionPeriod;
-
 	@FieldDescribe("HTML版式公文转换成Word文件方式,local,cloud.")
 	private String docToWordType;
 
@@ -112,21 +104,6 @@ public class ProcessPlatform extends ConfigObject {
 		return scriptVersionCount == null ? DEFAULT_SCRIPTVERSIONCOUNT : this.scriptVersionCount;
 	}
 
-//	public Integer getFormVersionPeriod() {
-//		return (formVersionPeriod == null || formVersionPeriod < 1) ? DEFAULT_FORMVERSIONPERIOD
-//				: this.formVersionPeriod;
-//	}
-//
-//	public Integer getProcessVersionPeriod() {
-//		return (processVersionPeriod == null || processVersionPeriod < 1) ? DEFAULT_PROCESSVERSIONPERIOD
-//				: this.processVersionPeriod;
-//	}
-//
-//	public Integer getScriptVersionPeriod() {
-//		return (scriptVersionPeriod == null || scriptVersionPeriod < 1) ? DEFAULT_SCRIPTVERSIONPERIOD
-//				: this.scriptVersionPeriod;
-//	}
-
 	public String getDocToWordType() {
 		return StringUtils.isEmpty(docToWordType) ? DEFAULT_DOCTOWORDTYPE : docToWordType;
 	}
@@ -150,7 +127,7 @@ public class ProcessPlatform extends ConfigObject {
 	private TouchDelay touchDelay;
 
 	@FieldDescribe("合并任务设置,定时触发合并任务,将已完成工作的Data从Item表中提取合并到WorkCompleted的Data字段中,默认工作完成后2年开始进行合并.")
-	private DataMerge dataMerge;
+	private Combine combine;
 
 	@FieldDescribe("清除草稿状态的工作.")
 	private DeleteDraft deleteDraft;
@@ -195,8 +172,8 @@ public class ProcessPlatform extends ConfigObject {
 		return this.logLongDetained == null ? new LogLongDetained() : this.logLongDetained;
 	}
 
-	public DataMerge getDataMerge() {
-		return this.dataMerge == null ? new DataMerge() : this.dataMerge;
+	public Combine getCombine() {
+		return this.combine == null ? new Combine() : this.combine;
 	}
 
 	public Press getPress() {
@@ -312,10 +289,10 @@ public class ProcessPlatform extends ConfigObject {
 
 	}
 
-	public static class DataMerge extends ConfigObject {
+	public static class Combine extends ConfigObject {
 
-		public static DataMerge defaultInstance() {
-			DataMerge o = new DataMerge();
+		public static Combine defaultInstance() {
+			Combine o = new Combine();
 			return o;
 		}
 
@@ -331,7 +308,7 @@ public class ProcessPlatform extends ConfigObject {
 		@FieldDescribe("定时cron表达式")
 		private String cron = DEFAULT_CRON;
 
-		@FieldDescribe("期限,已完成工作结束间隔指定时间进行merge,默认两年后进行merge")
+		@FieldDescribe("期限,已完成工作结束间隔指定时间进行combine,默认两年后进行combine")
 		private Integer thresholdDays = DEFAULT_THRESHOLDDAYS;
 
 		public String getCron() {
@@ -347,7 +324,7 @@ public class ProcessPlatform extends ConfigObject {
 		}
 
 		public Integer getThresholdDays() {
-			return (null == thresholdDays || thresholdDays < 1) ? DEFAULT_THRESHOLDDAYS : thresholdDays;
+			return (null == thresholdDays || thresholdDays < 0) ? DEFAULT_THRESHOLDDAYS : thresholdDays;
 		}
 
 	}

+ 0 - 1
o2server/x_cms_assemble_control/.gitignore

@@ -1 +0,0 @@
-/target/

+ 0 - 1
o2server/x_cms_core_entity/.gitignore

@@ -1 +0,0 @@
-/target/

+ 0 - 1
o2server/x_console/.gitignore

@@ -1 +0,0 @@
-/target/

+ 1 - 134
o2server/x_console/src/main/java/com/x/server/console/Main.java

@@ -89,6 +89,7 @@ public class Main {
 							cmd = StringUtils.trim(new String(readBytes, DefaultCharset.charset));
 							System.out.println("read command:" + cmd);
 							commandQueue.put(cmd);
+							continue;
 						}
 						Thread.sleep(1000);
 					}
@@ -190,62 +191,6 @@ public class Main {
 				}
 				continue;
 			}
-			// matcher = CommandFactory.dump_path_pattern.matcher(cmd);
-			// if (matcher.find()) {
-			// 	switch (matcher.group(1)) {
-			// 		case "data":
-			// 			dumpData(matcher.group(2), matcher.group(3));
-			// 			break;
-			// 		case "storage":
-			// 			dumpStorage(matcher.group(2), matcher.group(3));
-			// 			break;
-			// 		default:
-			// 			break;
-			// 	}
-			// 	continue;
-			// }
-			// matcher = CommandFactory.dump_pattern.matcher(cmd);
-			// if (matcher.find()) {
-			// 	switch (matcher.group(1)) {
-			// 		case "data":
-			// 			dumpData("", matcher.group(2));
-			// 			break;
-			// 		case "storage":
-			// 			dumpStorage("", matcher.group(2));
-			// 			break;
-			// 		default:
-			// 			break;
-			// 	}
-			// 	continue;
-			// }
-			// matcher = CommandFactory.restore_path_pattern.matcher(cmd);
-			// if (matcher.find()) {
-			// 	switch (matcher.group(1)) {
-			// 		case "data":
-			// 			resotreDataPath(matcher.group(2), matcher.group(3));
-			// 			break;
-			// 		case "storage":
-			// 			resotreStoragePath(matcher.group(2), matcher.group(3));
-			// 			break;
-			// 		default:
-			// 			break;
-			// 	}
-			// 	continue;
-			// }
-			// matcher = CommandFactory.restore_pattern.matcher(cmd);
-			// if (matcher.find()) {
-			// 	switch (matcher.group(1)) {
-			// 		case "data":
-			// 			resotreData(matcher.group(2), matcher.group(3));
-			// 			break;
-			// 		case "storage":
-			// 			resotreStorage(matcher.group(2), matcher.group(3));
-			// 			break;
-			// 		default:
-			// 			break;
-			// 	}
-			// 	continue;
-			// }
 			matcher = CommandFactory.help_pattern.matcher(cmd);
 			if (matcher.find()) {
 				CommandFactory.printHelp();
@@ -317,8 +262,6 @@ public class Main {
 		}
 		return true;
 	}
- 
- 
 
 	private static boolean createEncryptKey(String password) {
 		try {
@@ -551,63 +494,6 @@ public class Main {
 		}
 	}
 
-//	private static boolean dumpData(String path, String password) {
-//		try {
-//			return (new ActionDumpData()).execute(path, password);
-//		} catch (Exception e) {
-//			e.printStackTrace();
-//		}
-//		return true;
-//	}
-//
-//	private static boolean dumpStorage(String path, String password) {
-//		try {
-//			return (new ActionDumpStorage()).execute(path, password);
-//		} catch (Exception e) {
-//			e.printStackTrace();
-//		}
-//		return true;
-//	}
-
-//	private static void resotreData(String dateString, String password) {
-//		try {
-//			SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
-//			Date date = format.parse(dateString);
-//			File file = new File(Config.base(), "local/dump/dumpData_" + format.format(date));
-//			if (file.exists() && file.isDirectory()) {
-//				(new ActionRestoreData()).execute(date, password);
-//			} else {
-//				System.out.println("directory " + file.getAbsolutePath() + " not existed.");
-//			}
-//		} catch (Exception e) {
-//			e.printStackTrace();
-//		}
-//	}
-//
-//	private static void resotreDataPath(String path, String password) {
-//		try {
-//			(new ActionRestoreData()).execute(path, password);
-//		} catch (Exception e) {
-//			e.printStackTrace();
-//		}
-//	}
-
-//	private static void resotreStorage(String dateString, String password) {
-//		try {
-//			SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
-//			Date date = format.parse(dateString);
-//			File file = new File(Config.base(), "local/dump/dumpStorage_" + format.format(date));
-//			if (file.exists() && file.isDirectory()) {
-//				ActionRestoreStorage restoreStorage = new ActionRestoreStorage();
-//				restoreStorage.execute(date, password);
-//			} else {
-//				System.out.println("directory " + file.getAbsolutePath() + " not existed.");
-//			}
-//		} catch (Exception e) {
-//			e.printStackTrace();
-//		}
-//	}
-
 	private static void debugDesignDetail(String cmd) {
 		try {
 			String[] args = StringTools.translateCommandline(cmd);
@@ -619,14 +505,6 @@ public class Main {
 		}
 	}
 
-//	private static void resotreStoragePath(String path, String password) {
-//		try {
-//			new ActionRestoreStorage().execute(path, password);
-//		} catch (Exception e) {
-//			e.printStackTrace();
-//		}
-//	}
-
 	private static void createTempClassesDirectory(String base) throws Exception {
 		File local_temp_classes_dir = new File(base, "local/temp/classes");
 		FileUtils.forceMkdir(local_temp_classes_dir);
@@ -782,15 +660,4 @@ public class Main {
 		return false;
 	}
 
-//	private static boolean compactData(String password) throws Exception {
-//		try {
-//			return new ActionCompactData().execute(password);
-//		} catch (Exception e) {
-//			e.printStackTrace();
-//		}
-//		return false;
-//	}
-
- 
-
 }

+ 2 - 0
o2server/x_console/src/main/java/com/x/server/console/server/application/ApplicationServerTools.java

@@ -126,6 +126,8 @@ public class ApplicationServerTools extends JettySeverTools {
 				webApp.setResourceBase(dir.getAbsolutePath());
 				webApp.setDescriptor(new File(dir, "WEB-INF/web.xml").getAbsolutePath());
 				webApp.setExtraClasspath(calculateExtraClassPath(clz));
+				webApp.getMimeTypes().addMimeMapping("vcf", "text/x-vcard");
+				//webApp.getMimeTypes().addMimeMapping("wcss", "application/json");
 				webApp.getInitParams().put("org.eclipse.jetty.servlet.Default.useFileMappedBuffer", "false");
 				webApp.getInitParams().put("org.eclipse.jetty.jsp.precompiled", "true");
 				webApp.getInitParams().put("org.eclipse.jetty.servlet.Default.dirAllowed", "false");

+ 0 - 1
o2server/x_file_assemble_control/.gitignore

@@ -1 +0,0 @@
-/target/

+ 0 - 1
o2server/x_meeting_assemble_control/.gitignore

@@ -1 +0,0 @@
-/target/

+ 0 - 1
o2server/x_message_assemble_communicate/.gitignore

@@ -1 +0,0 @@
-/target/

+ 0 - 1
o2server/x_portal_assemble_designer/.gitignore

@@ -1 +0,0 @@
-/target/

+ 0 - 1
o2server/x_portal_core_entity/.gitignore

@@ -1 +0,0 @@
-/target/

+ 0 - 1
o2server/x_processplatform_assemble_designer/.gitignore

@@ -1 +0,0 @@
-/target/

+ 2 - 2
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/MappingExecuteQueue.java

@@ -82,8 +82,8 @@ public class MappingExecuteQueue extends AbstractQueue<String> {
 	}
 
 	private Data data(Business business, WorkCompleted workCompleted) throws Exception {
-		if (StringUtils.isNotEmpty(workCompleted.getData())) {
-			return XGsonBuilder.instance().fromJson(workCompleted.getData(), Data.class);
+		if (BooleanUtils.isTrue(workCompleted.getMerged()) && (null!= workCompleted.getProperties().getData())) {
+			return workCompleted.getProperties().getData();
 		}
 		List<Item> items = business.entityManagerContainer().listEqualAndEqual(Item.class, Item.bundle_FIELDNAME,
 				workCompleted.getJob(), Item.itemCategory_FIELDNAME, ItemCategory.pp);

+ 2 - 2
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/ProjectionExecuteQueue.java

@@ -166,8 +166,8 @@ public class ProjectionExecuteQueue extends AbstractQueue<String> {
 	}
 
 	private Data data(Business business, WorkCompleted workCompleted) throws Exception {
-		if (StringUtils.isNotEmpty(workCompleted.getData())) {
-			return XGsonBuilder.instance().fromJson(workCompleted.getData(), Data.class);
+		if (BooleanUtils.isTrue(workCompleted.getMerged())) {
+			return workCompleted.getProperties().getData();
 		}
 		List<Item> items = business.entityManagerContainer().listEqualAndEqual(Item.class, Item.bundle_FIELDNAME,
 				workCompleted.getJob(), Item.itemCategory_FIELDNAME, ItemCategory.pp);

+ 20 - 8
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/workcompleted/ActionMergeDataWithApplication.java → o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/workcompleted/ActionMergeWithApplication.java

@@ -1,7 +1,9 @@
 package com.x.processplatform.assemble.designer.jaxrs.workcompleted;
 
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -18,20 +20,20 @@ import com.x.base.core.entity.dataitem.DataItemConverter;
 import com.x.base.core.entity.dataitem.ItemCategory;
 import com.x.base.core.project.exception.ExceptionAccessDenied;
 import com.x.base.core.project.exception.ExceptionEntityNotExist;
-import com.x.base.core.project.gson.XGsonBuilder;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.jaxrs.WrapInteger;
 import com.x.base.core.project.tools.ListTools;
 import com.x.processplatform.assemble.designer.Business;
+import com.x.processplatform.core.entity.content.Data;
+import com.x.processplatform.core.entity.content.Record;
 import com.x.processplatform.core.entity.content.WorkCompleted;
 import com.x.processplatform.core.entity.content.WorkCompleted_;
 import com.x.processplatform.core.entity.element.Application;
-import com.x.processplatform.core.entity.element.Process;
 import com.x.query.core.entity.Item;
 import com.x.query.core.entity.Item_;
 
-class ActionMergeDataWithApplication extends BaseAction {
+class ActionMergeWithApplication extends BaseAction {
 
 	ActionResult<Wo> execute(EffectivePerson effectivePerson, String applicationFlag) throws Exception {
 		ActionResult<Wo> result = new ActionResult<>();
@@ -53,16 +55,26 @@ class ActionMergeDataWithApplication extends BaseAction {
 				for (String id : ids) {
 					workCompleted = emc.find(id, WorkCompleted.class);
 					if (null != workCompleted) {
+						emc.beginTransaction(WorkCompleted.class);
 						List<Item> items = this.items(business, workCompleted);
+						List<Record> records = emc.listEqual(Record.class, Record.job_FIELDNAME,
+								workCompleted.getJob());
+						records = records.stream()
+								.sorted(Comparator.comparing(Record::getOrder, Comparator.nullsLast(Long::compareTo)))
+								.collect(Collectors.toList());
+						workCompleted.getProperties().setRecordList(records);
 						JsonElement jsonElement = converter.assemble(items);
-						emc.beginTransaction(WorkCompleted.class);
-						workCompleted.setData(XGsonBuilder.toJson(jsonElement));
-						workCompleted.setDataMerged(true);
+						workCompleted.getProperties().setData(gson.fromJson(jsonElement, Data.class));
+						workCompleted.setMerged(true);
 						emc.commit();
 						emc.beginTransaction(Item.class);
+						emc.beginTransaction(Record.class);
 						for (Item item : items) {
 							emc.remove(item, CheckRemoveType.all);
 						}
+						for (Record record : records) {
+							emc.remove(record, CheckRemoveType.all);
+						}
 						emc.commit();
 						count++;
 					}
@@ -93,8 +105,8 @@ class ActionMergeDataWithApplication extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<WorkCompleted> root = cq.from(WorkCompleted.class);
 		Predicate p = cb.equal(root.get(WorkCompleted_.application), application.getId());
-		p = cb.and(p, cb.or(cb.isNull(root.get(WorkCompleted_.dataMerged)),
-				cb.equal(root.get(WorkCompleted_.dataMerged), false)));
+		p = cb.and(p, cb.or(cb.isNull(root.get(WorkCompleted_.merged)),
+				cb.equal(root.get(WorkCompleted_.merged), false)));
 		cq.select(root.get(WorkCompleted_.id)).where(p);
 		return em.createQuery(cq).setMaxResults(100).getResultList();
 	}

+ 20 - 6
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/workcompleted/ActionMergeDataWithProcess.java → o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/workcompleted/ActionMergeWithProcess.java

@@ -1,7 +1,9 @@
 package com.x.processplatform.assemble.designer.jaxrs.workcompleted;
 
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -24,14 +26,16 @@ import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.jaxrs.WrapInteger;
 import com.x.base.core.project.tools.ListTools;
 import com.x.processplatform.assemble.designer.Business;
+import com.x.processplatform.core.entity.content.Record;
 import com.x.processplatform.core.entity.content.WorkCompleted;
+import com.x.processplatform.core.entity.content.Data;
 import com.x.processplatform.core.entity.content.WorkCompleted_;
 import com.x.processplatform.core.entity.element.Application;
 import com.x.processplatform.core.entity.element.Process;
 import com.x.query.core.entity.Item;
 import com.x.query.core.entity.Item_;
 
-class ActionMergeDataWithProcess extends BaseAction {
+class ActionMergeWithProcess extends BaseAction {
 
 	ActionResult<Wo> execute(EffectivePerson effectivePerson, String processFlag) throws Exception {
 		ActionResult<Wo> result = new ActionResult<>();
@@ -57,16 +61,26 @@ class ActionMergeDataWithProcess extends BaseAction {
 				for (String id : ids) {
 					workCompleted = emc.find(id, WorkCompleted.class);
 					if (null != workCompleted) {
+						emc.beginTransaction(WorkCompleted.class);
 						List<Item> items = this.items(business, workCompleted);
+						List<Record> records = emc.listEqual(Record.class, Record.job_FIELDNAME,
+								workCompleted.getJob());
+						records = records.stream()
+								.sorted(Comparator.comparing(Record::getOrder, Comparator.nullsLast(Long::compareTo)))
+								.collect(Collectors.toList());
+						workCompleted.getProperties().setRecordList(records);
 						JsonElement jsonElement = converter.assemble(items);
-						emc.beginTransaction(WorkCompleted.class);
-						workCompleted.setData(XGsonBuilder.toJson(jsonElement));
-						workCompleted.setDataMerged(true);
+						workCompleted.getProperties().setData(gson.fromJson(jsonElement, Data.class));
+						workCompleted.setMerged(true);
 						emc.commit();
 						emc.beginTransaction(Item.class);
+						emc.beginTransaction(Record.class);
 						for (Item item : items) {
 							emc.remove(item, CheckRemoveType.all);
 						}
+						for (Record record : records) {
+							emc.remove(record, CheckRemoveType.all);
+						}
 						emc.commit();
 						count++;
 					}
@@ -97,8 +111,8 @@ class ActionMergeDataWithProcess extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<WorkCompleted> root = cq.from(WorkCompleted.class);
 		Predicate p = cb.equal(root.get(WorkCompleted_.process), process.getId());
-		p = cb.and(p, cb.or(cb.isNull(root.get(WorkCompleted_.dataMerged)),
-				cb.equal(root.get(WorkCompleted_.dataMerged), false)));
+		p = cb.and(p, cb.or(cb.isNull(root.get(WorkCompleted_.merged)),
+				cb.equal(root.get(WorkCompleted_.merged), false)));
 		cq.select(root.get(WorkCompleted_.id)).where(p);
 		return em.createQuery(cq).setMaxResults(100).getResultList();
 	}

+ 6 - 6
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/workcompleted/WorkCompletedAction.java

@@ -28,17 +28,17 @@ public class WorkCompletedAction extends StandardJaxrsAction {
 
 	private static Logger logger = LoggerFactory.getLogger(WorkCompletedAction.class);
 
-	@JaxrsMethodDescribe(value = "指定process合并DataItem数据到WorkCompleted,并删除Item表中的数据.", action = ActionMergeDataWithProcess.class)
+	@JaxrsMethodDescribe(value = "指定process合并DataItem数据到WorkCompleted,并删除Item表中的数据.", action = ActionMergeWithProcess.class)
 	@GET
 	@Path("process/{processFlag}/merge/data")
 	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
 	@Consumes(MediaType.APPLICATION_JSON)
 	public void mergeDataWithProcess(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
 			@JaxrsParameterDescribe("流程标识") @PathParam("processFlag") String processFlag) {
-		ActionResult<ActionMergeDataWithProcess.Wo> result = new ActionResult<>();
+		ActionResult<ActionMergeWithProcess.Wo> result = new ActionResult<>();
 		EffectivePerson effectivePerson = this.effectivePerson(request);
 		try {
-			result = new ActionMergeDataWithProcess().execute(effectivePerson, processFlag);
+			result = new ActionMergeWithProcess().execute(effectivePerson, processFlag);
 		} catch (Exception e) {
 			logger.error(e, effectivePerson, request, null);
 			result.error(e);
@@ -46,7 +46,7 @@ public class WorkCompletedAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
 
-	@JaxrsMethodDescribe(value = "指定application合并DataItem数据到WorkCompleted,并删除Item表中的数据.", action = ActionMergeDataWithApplication.class)
+	@JaxrsMethodDescribe(value = "指定application合并DataItem数据到WorkCompleted,并删除Item表中的数据.", action = ActionMergeWithApplication.class)
 	@GET
 	@Path("application/{applicationFlag}/merge/data")
 	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
@@ -54,10 +54,10 @@ public class WorkCompletedAction extends StandardJaxrsAction {
 	public void mergeDataWithApplication(@Suspended final AsyncResponse asyncResponse,
 			@Context HttpServletRequest request,
 			@JaxrsParameterDescribe("应用标识") @PathParam("applicationFlag") String applicationFlag) {
-		ActionResult<ActionMergeDataWithApplication.Wo> result = new ActionResult<>();
+		ActionResult<ActionMergeWithApplication.Wo> result = new ActionResult<>();
 		EffectivePerson effectivePerson = this.effectivePerson(request);
 		try {
-			result = new ActionMergeDataWithApplication().execute(effectivePerson, applicationFlag);
+			result = new ActionMergeWithApplication().execute(effectivePerson, applicationFlag);
 		} catch (Exception e) {
 			logger.error(e, effectivePerson, request, null);
 			result.error(e);

+ 2 - 2
o2server/x_processplatform_assemble_designer/src/main/webapp/describe/describe.json

@@ -7719,7 +7719,7 @@
       "methods": [
         {
           "name": "mergeDataWithApplication",
-          "className": "com.x.processplatform.assemble.designer.jaxrs.workcompleted.ActionMergeDataWithApplication",
+          "className": "com.x.processplatform.assemble.designer.jaxrs.workcompleted.ActionMergeWithApplication",
           "description": "指定application合并DataItem数据到WorkCompleted,并删除Item表中的数据.",
           "type": "GET",
           "path": "jaxrs/workcompleted/application/{applicationFlag}/merge/data",
@@ -7748,7 +7748,7 @@
         },
         {
           "name": "mergeDataWithProcess",
-          "className": "com.x.processplatform.assemble.designer.jaxrs.workcompleted.ActionMergeDataWithProcess",
+          "className": "com.x.processplatform.assemble.designer.jaxrs.workcompleted.ActionMergeWithProcess",
           "description": "指定process合并DataItem数据到WorkCompleted,并删除Item表中的数据.",
           "type": "GET",
           "path": "jaxrs/workcompleted/process/{processFlag}/merge/data",

+ 2 - 2
o2server/x_processplatform_assemble_designer/src/main/webapp/describe/sources/com/x/processplatform/assemble/designer/MappingExecuteQueue.java

@@ -82,8 +82,8 @@ public class MappingExecuteQueue extends AbstractQueue<String> {
 	}
 
 	private Data data(Business business, WorkCompleted workCompleted) throws Exception {
-		if (StringUtils.isNotEmpty(workCompleted.getData())) {
-			return XGsonBuilder.instance().fromJson(workCompleted.getData(), Data.class);
+		if (BooleanUtils.isTrue(workCompleted.getMerged()) && (null!= workCompleted.getProperties().getData())) {
+			return workCompleted.getProperties().getData();
 		}
 		List<Item> items = business.entityManagerContainer().listEqualAndEqual(Item.class, Item.bundle_FIELDNAME,
 				workCompleted.getJob(), Item.itemCategory_FIELDNAME, ItemCategory.pp);

+ 2 - 2
o2server/x_processplatform_assemble_designer/src/main/webapp/describe/sources/com/x/processplatform/assemble/designer/ProjectionExecuteQueue.java

@@ -166,8 +166,8 @@ public class ProjectionExecuteQueue extends AbstractQueue<String> {
 	}
 
 	private Data data(Business business, WorkCompleted workCompleted) throws Exception {
-		if (StringUtils.isNotEmpty(workCompleted.getData())) {
-			return XGsonBuilder.instance().fromJson(workCompleted.getData(), Data.class);
+		if (BooleanUtils.isTrue(workCompleted.getMerged())) {
+			return workCompleted.getProperties().getData();
 		}
 		List<Item> items = business.entityManagerContainer().listEqualAndEqual(Item.class, Item.bundle_FIELDNAME,
 				workCompleted.getJob(), Item.itemCategory_FIELDNAME, ItemCategory.pp);

+ 6 - 6
o2server/x_processplatform_assemble_designer/src/main/webapp/describe/sources/com/x/processplatform/assemble/designer/jaxrs/workcompleted/WorkCompletedAction.java

@@ -28,17 +28,17 @@ public class WorkCompletedAction extends StandardJaxrsAction {
 
 	private static Logger logger = LoggerFactory.getLogger(WorkCompletedAction.class);
 
-	@JaxrsMethodDescribe(value = "指定process合并DataItem数据到WorkCompleted,并删除Item表中的数据.", action = ActionMergeDataWithProcess.class)
+	@JaxrsMethodDescribe(value = "指定process合并DataItem数据到WorkCompleted,并删除Item表中的数据.", action = ActionMergeWithProcess.class)
 	@GET
 	@Path("process/{processFlag}/merge/data")
 	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
 	@Consumes(MediaType.APPLICATION_JSON)
 	public void mergeDataWithProcess(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
 			@JaxrsParameterDescribe("流程标识") @PathParam("processFlag") String processFlag) {
-		ActionResult<ActionMergeDataWithProcess.Wo> result = new ActionResult<>();
+		ActionResult<ActionMergeWithProcess.Wo> result = new ActionResult<>();
 		EffectivePerson effectivePerson = this.effectivePerson(request);
 		try {
-			result = new ActionMergeDataWithProcess().execute(effectivePerson, processFlag);
+			result = new ActionMergeWithProcess().execute(effectivePerson, processFlag);
 		} catch (Exception e) {
 			logger.error(e, effectivePerson, request, null);
 			result.error(e);
@@ -46,7 +46,7 @@ public class WorkCompletedAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
 
-	@JaxrsMethodDescribe(value = "指定application合并DataItem数据到WorkCompleted,并删除Item表中的数据.", action = ActionMergeDataWithApplication.class)
+	@JaxrsMethodDescribe(value = "指定application合并DataItem数据到WorkCompleted,并删除Item表中的数据.", action = ActionMergeWithApplication.class)
 	@GET
 	@Path("application/{applicationFlag}/merge/data")
 	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
@@ -54,10 +54,10 @@ public class WorkCompletedAction extends StandardJaxrsAction {
 	public void mergeDataWithApplication(@Suspended final AsyncResponse asyncResponse,
 			@Context HttpServletRequest request,
 			@JaxrsParameterDescribe("应用标识") @PathParam("applicationFlag") String applicationFlag) {
-		ActionResult<ActionMergeDataWithApplication.Wo> result = new ActionResult<>();
+		ActionResult<ActionMergeWithApplication.Wo> result = new ActionResult<>();
 		EffectivePerson effectivePerson = this.effectivePerson(request);
 		try {
-			result = new ActionMergeDataWithApplication().execute(effectivePerson, applicationFlag);
+			result = new ActionMergeWithApplication().execute(effectivePerson, applicationFlag);
 		} catch (Exception e) {
 			logger.error(e, effectivePerson, request, null);
 			result.error(e);

+ 0 - 1
o2server/x_processplatform_assemble_surface/.gitignore

@@ -1 +0,0 @@
-/target/

+ 5 - 4
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionGetWithWorkCompleted.java

@@ -1,17 +1,18 @@
 package com.x.processplatform.assemble.surface.jaxrs.data;
 
-import org.apache.commons.lang3.BooleanUtils;
-
 import com.google.gson.JsonElement;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.project.exception.ExceptionEntityNotExist;
+import com.x.base.core.project.gson.XGsonBuilder;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.processplatform.assemble.surface.Business;
 import com.x.processplatform.assemble.surface.WorkCompletedControl;
 import com.x.processplatform.core.entity.content.WorkCompleted;
 
+import org.apache.commons.lang3.BooleanUtils;
+
 class ActionGetWithWorkCompleted extends BaseAction {
 
 	ActionResult<JsonElement> execute(EffectivePerson effectivePerson, String id) throws Exception {
@@ -27,8 +28,8 @@ class ActionGetWithWorkCompleted extends BaseAction {
 				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(),
 						workCompleted.getTitle(), workCompleted.getId());
 			}
-			if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
-				result.setData(gson.fromJson(workCompleted.getData(), JsonElement.class));
+			if (BooleanUtils.isTrue(workCompleted.getMerged())) {
+				result.setData(XGsonBuilder.convert(workCompleted.getProperties().getData(),JsonElement.class));
 			} else {
 				result.setData(this.getData(business, workCompleted.getJob()));
 			}

+ 4 - 4
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionGetWithWorkCompletedFromData.java

@@ -1,17 +1,18 @@
 package com.x.processplatform.assemble.surface.jaxrs.data;
 
-import org.apache.commons.lang3.BooleanUtils;
-
 import com.google.gson.JsonElement;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.project.exception.ExceptionEntityNotExist;
+import com.x.base.core.project.gson.XGsonBuilder;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.processplatform.assemble.surface.Business;
 import com.x.processplatform.assemble.surface.WorkCompletedControl;
 import com.x.processplatform.core.entity.content.WorkCompleted;
 
+import org.apache.commons.lang3.BooleanUtils;
+
 class ActionGetWithWorkCompletedFromData extends BaseAction {
 
 	ActionResult<JsonElement> execute(EffectivePerson effectivePerson, String id) throws Exception {
@@ -27,8 +28,7 @@ class ActionGetWithWorkCompletedFromData extends BaseAction {
 				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(),
 						workCompleted.getTitle(), workCompleted.getId());
 			}
-			
-			result.setData(gson.fromJson(workCompleted.getData(), JsonElement.class));
+			result.setData(XGsonBuilder.convert(workCompleted.getProperties().getData(), JsonElement.class));
 			return result;
 		}
 	}

+ 2 - 2
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionGetWithWorkCompletedFromItem.java

@@ -1,7 +1,5 @@
 package com.x.processplatform.assemble.surface.jaxrs.data;
 
-import org.apache.commons.lang3.BooleanUtils;
-
 import com.google.gson.JsonElement;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
@@ -12,6 +10,8 @@ import com.x.processplatform.assemble.surface.Business;
 import com.x.processplatform.assemble.surface.WorkCompletedControl;
 import com.x.processplatform.core.entity.content.WorkCompleted;
 
+import org.apache.commons.lang3.BooleanUtils;
+
 class ActionGetWithWorkCompletedFromItem extends BaseAction {
 
 	ActionResult<JsonElement> execute(EffectivePerson effectivePerson, String id) throws Exception {

+ 2 - 2
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionGetWithWorkCompletedPath0.java

@@ -28,8 +28,8 @@ class ActionGetWithWorkCompletedPath0 extends BaseAction {
 				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(),
 						workCompleted.getTitle(), workCompleted.getId());
 			}
-			if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
-				Data data = gson.fromJson(workCompleted.getData(), Data.class);
+			if (BooleanUtils.isTrue(workCompleted.getMerged())) {
+				Data data = workCompleted.getProperties().getData();
 				Object o = data.find(path0);
 				result.setData(gson.toJsonTree(o));
 			} else {

+ 2 - 2
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionGetWithWorkCompletedPath1.java

@@ -29,8 +29,8 @@ class ActionGetWithWorkCompletedPath1 extends BaseAction {
 				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(),
 						workCompleted.getTitle(), workCompleted.getId());
 			}
-			if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
-				Data data = gson.fromJson(workCompleted.getData(), Data.class);
+			if (BooleanUtils.isTrue(workCompleted.getMerged())) {
+				Data data = workCompleted.getProperties().getData();
 				Object o = data.find(new String[] { path0, path1 });
 				result.setData(gson.toJsonTree(o));
 			} else {

+ 2 - 2
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionGetWithWorkCompletedPath2.java

@@ -29,8 +29,8 @@ class ActionGetWithWorkCompletedPath2 extends BaseAction {
 				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(),
 						workCompleted.getTitle(), workCompleted.getId());
 			}
-			if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
-				Data data = gson.fromJson(workCompleted.getData(), Data.class);
+			if (BooleanUtils.isTrue(workCompleted.getMerged())) {
+				Data data = workCompleted.getProperties().getData();
 				Object o = data.find(new String[] { path0, path1, path2 });
 				result.setData(gson.toJsonTree(o));
 			} else {

+ 2 - 2
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionGetWithWorkCompletedPath3.java

@@ -29,8 +29,8 @@ class ActionGetWithWorkCompletedPath3 extends BaseAction {
 				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(),
 						workCompleted.getTitle(), workCompleted.getId());
 			}
-			if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
-				Data data = gson.fromJson(workCompleted.getData(), Data.class);
+			if (BooleanUtils.isTrue(workCompleted.getMerged())) {
+				Data data =  workCompleted.getProperties().getData();
 				Object o = data.find(new String[] { path0, path1, path2, path3 });
 				result.setData(gson.toJsonTree(o));
 			} else {

+ 2 - 2
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionGetWithWorkCompletedPath4.java

@@ -29,8 +29,8 @@ class ActionGetWithWorkCompletedPath4 extends BaseAction {
 				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(),
 						workCompleted.getTitle(), workCompleted.getId());
 			}
-			if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
-				Data data = gson.fromJson(workCompleted.getData(), Data.class);
+			if (BooleanUtils.isTrue(workCompleted.getMerged())) {
+				Data data = workCompleted.getProperties().getData();
 				Object o = data.find(new String[] { path0, path1, path2, path3, path4 });
 				result.setData(gson.toJsonTree(o));
 			} else {

+ 2 - 2
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionGetWithWorkCompletedPath5.java

@@ -29,8 +29,8 @@ class ActionGetWithWorkCompletedPath5 extends BaseAction {
 				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(),
 						workCompleted.getTitle(), workCompleted.getId());
 			}
-			if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
-				Data data = gson.fromJson(workCompleted.getData(), Data.class);
+			if (BooleanUtils.isTrue(workCompleted.getMerged())) {
+				Data data = workCompleted.getProperties().getData();
 				Object o = data.find(new String[] { path0, path1, path2, path3, path4, path5 });
 				result.setData(gson.toJsonTree(o));
 			} else {

+ 2 - 2
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionGetWithWorkCompletedPath6.java

@@ -29,8 +29,8 @@ class ActionGetWithWorkCompletedPath6 extends BaseAction {
 				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(),
 						workCompleted.getTitle(), workCompleted.getId());
 			}
-			if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
-				Data data = gson.fromJson(workCompleted.getData(), Data.class);
+			if (BooleanUtils.isTrue(workCompleted.getMerged())) {
+				Data data = workCompleted.getProperties().getData();
 				Object o = data.find(new String[] { path0, path1, path2, path3, path4, path5, path6 });
 				result.setData(gson.toJsonTree(o));
 			} else {

+ 2 - 2
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionGetWithWorkCompletedPath7.java

@@ -29,8 +29,8 @@ class ActionGetWithWorkCompletedPath7 extends BaseAction {
 				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(),
 						workCompleted.getTitle(), workCompleted.getId());
 			}
-			if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
-				Data data = gson.fromJson(workCompleted.getData(), Data.class);
+			if (BooleanUtils.isTrue(workCompleted.getMerged())) {
+				Data data = workCompleted.getProperties().getData();
 				Object o = data.find(new String[] { path0, path1, path2, path3, path4, path5, path6, path7 });
 				result.setData(gson.toJsonTree(o));
 			} else {

+ 1 - 1
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionUpdateWithWorkCompleted.java

@@ -44,7 +44,7 @@ class ActionUpdateWithWorkCompleted extends BaseAction {
 				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(),
 						workCompleted.getTitle(), workCompleted.getId());
 			}
-			if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
+			if (BooleanUtils.isTrue(workCompleted.getMerged())) {
 				throw new ExceptionModifyDataMerged(workCompleted.getId());
 			}
 		}

+ 1 - 1
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionUpdateWithWorkCompletedPath0.java

@@ -38,7 +38,7 @@ class ActionUpdateWithWorkCompletedPath0 extends BaseAction {
 				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(),
 						workCompleted.getTitle(), workCompleted.getId());
 			}
-			if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
+			if (BooleanUtils.isTrue(workCompleted.getMerged())) {
 				throw new ExceptionModifyDataMerged(workCompleted.getId());
 			}
 		}

+ 1 - 1
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionUpdateWithWorkCompletedPath1.java

@@ -38,7 +38,7 @@ class ActionUpdateWithWorkCompletedPath1 extends BaseAction {
 				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(),
 						workCompleted.getTitle(), workCompleted.getId());
 			}
-			if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
+			if (BooleanUtils.isTrue(workCompleted.getMerged())) {
 				throw new ExceptionModifyDataMerged(workCompleted.getId());
 			}
 		}

+ 1 - 1
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionUpdateWithWorkCompletedPath2.java

@@ -38,7 +38,7 @@ class ActionUpdateWithWorkCompletedPath2 extends BaseAction {
 				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(),
 						workCompleted.getTitle(), workCompleted.getId());
 			}
-			if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
+			if (BooleanUtils.isTrue(workCompleted.getMerged())) {
 				throw new ExceptionModifyDataMerged(workCompleted.getId());
 			}
 		}

+ 1 - 1
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionUpdateWithWorkCompletedPath3.java

@@ -39,7 +39,7 @@ class ActionUpdateWithWorkCompletedPath3 extends BaseAction {
 				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(),
 						workCompleted.getTitle(), workCompleted.getId());
 			}
-			if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
+			if (BooleanUtils.isTrue(workCompleted.getMerged())) {
 				throw new ExceptionModifyDataMerged(workCompleted.getId());
 			}
 		}

+ 1 - 1
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionUpdateWithWorkCompletedPath4.java

@@ -38,7 +38,7 @@ class ActionUpdateWithWorkCompletedPath4 extends BaseAction {
 				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(),
 						workCompleted.getTitle(), workCompleted.getId());
 			}
-			if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
+			if (BooleanUtils.isTrue(workCompleted.getMerged())) {
 				throw new ExceptionModifyDataMerged(workCompleted.getId());
 			}
 		}

+ 1 - 1
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionUpdateWithWorkCompletedPath5.java

@@ -38,7 +38,7 @@ class ActionUpdateWithWorkCompletedPath5 extends BaseAction {
 				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(),
 						workCompleted.getTitle(), workCompleted.getId());
 			}
-			if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
+			if (BooleanUtils.isTrue(workCompleted.getMerged())) {
 				throw new ExceptionModifyDataMerged(workCompleted.getId());
 			}
 		}

+ 1 - 1
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionUpdateWithWorkCompletedPath6.java

@@ -38,7 +38,7 @@ class ActionUpdateWithWorkCompletedPath6 extends BaseAction {
 				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(),
 						workCompleted.getTitle(), workCompleted.getId());
 			}
-			if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
+			if (BooleanUtils.isTrue(workCompleted.getMerged())) {
 				throw new ExceptionModifyDataMerged(workCompleted.getId());
 			}
 		}

+ 1 - 1
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/ActionUpdateWithWorkCompletedPath7.java

@@ -40,7 +40,7 @@ class ActionUpdateWithWorkCompletedPath7 extends BaseAction {
 				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(),
 						workCompleted.getTitle(), workCompleted.getId());
 			}
-			if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
+			if (BooleanUtils.isTrue(workCompleted.getMerged())) {
 				throw new ExceptionModifyDataMerged(workCompleted.getId());
 			}
 		}

+ 3 - 3
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/data/BaseAction.java

@@ -47,11 +47,11 @@ abstract class BaseAction extends StandardJaxrsAction {
 	protected Gson gson = XGsonBuilder.instance();
 
 	JsonElement getData(Business business, String job, String... paths) throws Exception {
-		JsonElement jsonElement = null;
+		//JsonElement jsonElement = null;
 		List<Item> list = business.item().listWithJobWithPath(job, paths);
 		DataItemConverter<Item> converter = new DataItemConverter<>(Item.class);
-		jsonElement = converter.assemble(list, paths.length);
-		return jsonElement;
+		return  converter.assemble(list, paths.length);
+		//return XGsonBuilder.convert(jsonElement, Data.class);
 	}
 
 	/** 将data中的Title 和 serial 字段同步到work中 */

+ 2 - 2
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionGetWithWorkOrWorkCompleted.java

@@ -87,9 +87,9 @@ class ActionGetWithWorkOrWorkCompleted extends BaseAction {
 		Wo wo = new Wo();
 		wo.setWork(gson.toJsonTree(WoWorkCompleted.copier.copy(workCompleted)));
 		CompletableFuture<Data> future_data = CompletableFuture.supplyAsync(() -> {
-			if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
+			if (BooleanUtils.isTrue(workCompleted.getMerged())) {
 				/* 如果data已经merged */
-				return gson.fromJson(workCompleted.getData(), Data.class);
+				return workCompleted.getProperties().getData();
 			} else {
 				return this.data(business, workCompleted.getJob());
 			}

+ 5 - 6
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/schedule/CleanKeyLock.java

@@ -4,21 +4,20 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
-import org.apache.commons.lang3.time.DateUtils;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
-import com.x.base.core.project.config.ProcessPlatform.DataMerge;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.schedule.AbstractJob;
 import com.x.processplatform.core.entity.content.KeyLock;
 
+import org.apache.commons.lang3.time.DateUtils;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
 public class CleanKeyLock extends AbstractJob {
 
-	private static Logger logger = LoggerFactory.getLogger(DataMerge.class);
+	private static Logger logger = LoggerFactory.getLogger(CleanKeyLock.class);
 
 	@Override
 	public void schedule(JobExecutionContext jobExecutionContext) throws Exception {

+ 0 - 1
o2server/x_processplatform_core_entity/.gitignore

@@ -1 +0,0 @@
-/target/

+ 21 - 21
o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/WorkCompleted.java

@@ -147,8 +147,8 @@ public class WorkCompleted extends SliceJpaObject implements ProjectionInterface
 		}
 	}
 
-	public Boolean getDataMerged() {
-		return BooleanUtils.isTrue(dataMerged);
+	public Boolean getMerged() {
+		return BooleanUtils.isTrue(merged);
 	}
 
 	public static final String job_FIELDNAME = "job";
@@ -339,13 +339,13 @@ public class WorkCompleted extends SliceJpaObject implements ProjectionInterface
 	@CheckPersist(allowEmpty = true)
 	private Boolean allowRollback;
 
-	public static final String data_FIELDNAME = "data";
-	@FieldDescribe("业务数据.")
-	@Lob
-	@Basic(fetch = FetchType.EAGER)
-	@Column(length = JpaObject.length_10M, name = ColumnNamePrefix + data_FIELDNAME)
-	@CheckPersist(allowEmpty = true)
-	private String data;
+	// public static final String data_FIELDNAME = "data";
+	// @FieldDescribe("业务数据.")
+	// @Lob
+	// @Basic(fetch = FetchType.EAGER)
+	// @Column(length = JpaObject.length_10M, name = ColumnNamePrefix + data_FIELDNAME)
+	// @CheckPersist(allowEmpty = true)
+	// private String data;
 
 	public static final String properties_FIELDNAME = "properties";
 	@FieldDescribe("属性对象存储字段.")
@@ -355,12 +355,12 @@ public class WorkCompleted extends SliceJpaObject implements ProjectionInterface
 	@CheckPersist(allowEmpty = true)
 	private WorkCompletedProperties properties;
 
-	public static final String dataMerged_FIELDNAME = "dataMerged";
+	public static final String merged_FIELDNAME = "merged";
 	@FieldDescribe("业务数据是否从item表中合并至data字段")
-	@Column(name = ColumnNamePrefix + dataMerged_FIELDNAME)
-	@Index(name = TABLE + IndexNameMiddle + dataMerged_FIELDNAME)
+	@Column(name = ColumnNamePrefix + merged_FIELDNAME)
+	@Index(name = TABLE + IndexNameMiddle + merged_FIELDNAME)
 	@CheckPersist(allowEmpty = true)
-	private Boolean dataMerged;
+	private Boolean merged;
 
 	public static final String stringValue01_FIELDNAME = "stringValue01";
 	@FieldDescribe("业务数据String值01.")
@@ -780,13 +780,13 @@ public class WorkCompleted extends SliceJpaObject implements ProjectionInterface
 		this.allowRollback = allowRollback;
 	}
 
-	public String getData() {
-		return data;
-	}
+	// public String getData() {
+	// 	return data;
+	// }
 
-	public void setData(String data) {
-		this.data = data;
-	}
+	// public void setData(String data) {
+	// 	this.data = data;
+	// }
 
 	public String getStringValue01() {
 		return stringValue01;
@@ -1044,8 +1044,8 @@ public class WorkCompleted extends SliceJpaObject implements ProjectionInterface
 		this.titleLob = titleLob;
 	}
 
-	public void setDataMerged(Boolean dataMerged) {
-		this.dataMerged = dataMerged;
+	public void setMerged(Boolean merged) {
+		this.merged = merged;
 	}
 
 	public void setProperties(WorkCompletedProperties properties) {

+ 23 - 0
o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/WorkCompletedProperties.java

@@ -9,12 +9,35 @@ public class WorkCompletedProperties extends JsonProperties {
 
 	private List<Record> recordList = new ArrayList<>();
 
+	private Data data;
+
+	public List<WorkLog> workLogList= new ArrayList<>();
+
 	public List<Record> getRecordList() {
 		return recordList;
 	}
 
+
 	public void setRecordList(List<Record> recordList) {
 		this.recordList = recordList;
 	}
 
+	public Data getData() {
+		return data;
+	}
+
+	public void setData(Data data) {
+		this.data = data;
+	}
+
+	public List<WorkLog> getWorkLogList() {
+		return workLogList;
+	}
+
+	public void setWorkLogList(List<WorkLog> workLogList) {
+		this.workLogList = workLogList;
+	}
+
+	
+
 }

+ 0 - 1
o2server/x_processplatform_service_processing/.gitignore

@@ -1 +0,0 @@
-/target/

+ 5 - 5
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/ThisApplication.java

@@ -1,7 +1,5 @@
 package com.x.processplatform.service.processing;
 
-import org.apache.commons.lang3.BooleanUtils;
-
 import com.x.base.core.project.Context;
 import com.x.base.core.project.config.Config;
 import com.x.base.core.project.logger.LoggerFactory;
@@ -9,7 +7,7 @@ import com.x.base.core.project.message.MessageConnector;
 import com.x.processplatform.service.processing.processor.embed.SyncEmbedQueue;
 import com.x.processplatform.service.processing.processor.invoke.SyncJaxrsInvokeQueue;
 import com.x.processplatform.service.processing.processor.invoke.SyncJaxwsInvokeQueue;
-import com.x.processplatform.service.processing.schedule.DataMerge;
+import com.x.processplatform.service.processing.schedule.Combine;
 import com.x.processplatform.service.processing.schedule.DeleteDraft;
 import com.x.processplatform.service.processing.schedule.Expire;
 import com.x.processplatform.service.processing.schedule.LogLongDetained;
@@ -18,6 +16,8 @@ import com.x.processplatform.service.processing.schedule.TouchDelay;
 import com.x.processplatform.service.processing.schedule.TouchDetained;
 import com.x.processplatform.service.processing.schedule.Urge;
 
+import org.apache.commons.lang3.BooleanUtils;
+
 public class ThisApplication {
 
 	protected static Context context;
@@ -39,8 +39,8 @@ public class ThisApplication {
 			context().startQueue(syncJaxrsInvokeQueue);
 			context().startQueue(syncJaxwsInvokeQueue);
 			context().startQueue(syncEmbedQueue);
-			if (BooleanUtils.isTrue(Config.processPlatform().getDataMerge().getEnable())) {
-				context.schedule(DataMerge.class, Config.processPlatform().getDataMerge().getCron());
+			if (BooleanUtils.isTrue(Config.processPlatform().getCombine().getEnable())) {
+				context.schedule(Combine.class, Config.processPlatform().getCombine().getCron());
 			}
 			if (BooleanUtils.isTrue(Config.processPlatform().getDeleteDraft().getEnable())) {
 				context.schedule(DeleteDraft.class, Config.processPlatform().getDeleteDraft().getCron());

+ 0 - 4
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ActionUpdateWithWork.java

@@ -34,10 +34,6 @@ class ActionUpdateWithWork extends BaseAction {
 			throw new ExceptionNotJsonObject();
 		}
 
-//		if (jsonElement.getAsJsonObject().entrySet().isEmpty()) {
-//			throw new ExceptionEmptyData();
-//		}
-
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 			Work work = emc.fetch(id, Work.class, ListTools.toList(Work.job_FIELDNAME));
 			if (null == work) {

+ 2 - 2
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ActionUpdateWithWorkCompleted.java

@@ -54,8 +54,8 @@ class ActionUpdateWithWorkCompleted extends BaseAction {
 					if (null == workCompleted) {
 						throw new ExceptionEntityNotExist(id, WorkCompleted.class);
 					}
-					if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
-						throw new ExceptionModifyDataMerged(workCompleted.getId());
+					if (BooleanUtils.isTrue(workCompleted.getMerged())) {
+						throw new ExceptionModifyMerged(workCompleted.getId());
 					}
 					wo.setId(workCompleted.getId());
 					updateData(business, workCompleted, jsonElement);

+ 2 - 2
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ActionUpdateWithWorkCompletedPath0.java

@@ -48,8 +48,8 @@ class ActionUpdateWithWorkCompletedPath0 extends BaseAction {
 					if (null == workCompleted) {
 						throw new ExceptionEntityNotExist(id, WorkCompleted.class);
 					}
-					if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
-						throw new ExceptionModifyDataMerged(workCompleted.getId());
+					if (BooleanUtils.isTrue(workCompleted.getMerged())) {
+						throw new ExceptionModifyMerged(workCompleted.getId());
 					}
 
 					Wo wo = new Wo();

+ 2 - 2
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ActionUpdateWithWorkCompletedPath1.java

@@ -47,8 +47,8 @@ class ActionUpdateWithWorkCompletedPath1 extends BaseAction {
 					if (null == workCompleted) {
 						throw new ExceptionEntityNotExist(id, WorkCompleted.class);
 					}
-					if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
-						throw new ExceptionModifyDataMerged(workCompleted.getId());
+					if (BooleanUtils.isTrue(workCompleted.getMerged())) {
+						throw new ExceptionModifyMerged(workCompleted.getId());
 					}
 
 					Wo wo = new Wo();

+ 2 - 2
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ActionUpdateWithWorkCompletedPath2.java

@@ -47,8 +47,8 @@ class ActionUpdateWithWorkCompletedPath2 extends BaseAction {
 					if (null == workCompleted) {
 						throw new ExceptionEntityNotExist(id, WorkCompleted.class);
 					}
-					if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
-						throw new ExceptionModifyDataMerged(workCompleted.getId());
+					if (BooleanUtils.isTrue(workCompleted.getMerged())) {
+						throw new ExceptionModifyMerged(workCompleted.getId());
 					}
 
 					Wo wo = new Wo();

+ 2 - 2
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ActionUpdateWithWorkCompletedPath3.java

@@ -47,8 +47,8 @@ class ActionUpdateWithWorkCompletedPath3 extends BaseAction {
 					if (null == workCompleted) {
 						throw new ExceptionEntityNotExist(id, WorkCompleted.class);
 					}
-					if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
-						throw new ExceptionModifyDataMerged(workCompleted.getId());
+					if (BooleanUtils.isTrue(workCompleted.getMerged())) {
+						throw new ExceptionModifyMerged(workCompleted.getId());
 					}
 
 					Wo wo = new Wo();

+ 2 - 2
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ActionUpdateWithWorkCompletedPath4.java

@@ -47,8 +47,8 @@ class ActionUpdateWithWorkCompletedPath4 extends BaseAction {
 					if (null == workCompleted) {
 						throw new ExceptionEntityNotExist(id, WorkCompleted.class);
 					}
-					if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
-						throw new ExceptionModifyDataMerged(workCompleted.getId());
+					if (BooleanUtils.isTrue(workCompleted.getMerged())) {
+						throw new ExceptionModifyMerged(workCompleted.getId());
 					}
 
 					Wo wo = new Wo();

+ 2 - 2
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ActionUpdateWithWorkCompletedPath5.java

@@ -47,8 +47,8 @@ class ActionUpdateWithWorkCompletedPath5 extends BaseAction {
 					if (null == workCompleted) {
 						throw new ExceptionEntityNotExist(id, WorkCompleted.class);
 					}
-					if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
-						throw new ExceptionModifyDataMerged(workCompleted.getId());
+					if (BooleanUtils.isTrue(workCompleted.getMerged())) {
+						throw new ExceptionModifyMerged(workCompleted.getId());
 					}
 
 					Wo wo = new Wo();

+ 2 - 2
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ActionUpdateWithWorkCompletedPath6.java

@@ -47,8 +47,8 @@ class ActionUpdateWithWorkCompletedPath6 extends BaseAction {
 					if (null == workCompleted) {
 						throw new ExceptionEntityNotExist(id, WorkCompleted.class);
 					}
-					if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
-						throw new ExceptionModifyDataMerged(workCompleted.getId());
+					if (BooleanUtils.isTrue(workCompleted.getMerged())) {
+						throw new ExceptionModifyMerged(workCompleted.getId());
 					}
 
 					Wo wo = new Wo();

+ 2 - 2
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ActionUpdateWithWorkCompletedPath7.java

@@ -48,8 +48,8 @@ class ActionUpdateWithWorkCompletedPath7 extends BaseAction {
 					if (null == workCompleted) {
 						throw new ExceptionEntityNotExist(id, WorkCompleted.class);
 					}
-					if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
-						throw new ExceptionModifyDataMerged(workCompleted.getId());
+					if (BooleanUtils.isTrue(workCompleted.getMerged())) {
+						throw new ExceptionModifyMerged(workCompleted.getId());
 					}
 
 					Wo wo = new Wo();

+ 2 - 38
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ActionUpdateWithWorkCompletedPrimitivePath0.java

@@ -45,41 +45,6 @@ class ActionUpdateWithWorkCompletedPrimitivePath0 extends BaseAction {
 			executorSeed = workCompleted.getJob();
 		}
 
-		/*
-		void updateData(Business business, WorkCompleted workCompleted, JsonElement jsonElement, String... paths)
-				throws Exception {
-			JsonObject jsonObject = jsonElement.getAsJsonObject();
-			if (paths.length == 0) {
-				DataWork dataWork = DataWork.workCompletedCopier.copy(workCompleted);
-				dataWork.setWorkCompletedId(workCompleted.getId());
-				dataWork.setWorkId(workCompleted.getWork());
-				dataWork.setCompleted(true);
-				jsonObject.add(Data.WORK_PROPERTY, gson.toJsonTree(dataWork));
-				jsonObject.add(Data.ATTACHMENTLIST_PROPERTY,
-						gson.toJsonTree(this.listDataAttachment(business, workCompleted.getJob())));
-			}
-			DataItemConverter<Item> converter = new DataItemConverter<>(Item.class);
-			List<Item> exists = business.item().listWithJobWithPath(workCompleted.getJob(), paths);
-			List<Item> currents = converter.disassemble(jsonObject, paths);
-			List<Item> removes = converter.subtract(exists, currents);
-			List<Item> adds = converter.subtract(currents, exists);
-			if ((!removes.isEmpty()) || (!adds.isEmpty())) {
-				business.entityManagerContainer().beginTransaction(Item.class);
-				for (Item _o : removes) {
-					business.entityManagerContainer().remove(_o);
-				}
-				for (Item _o : adds) {
-					this.fill(_o, workCompleted);
-					business.entityManagerContainer().persist(_o);
-				}
-				//基于前面的原因,这里进行单独提交 
-				business.entityManagerContainer().commit();
-		
-			}
-		
-		}
-		*/
-
 		Callable<String> callable = new Callable<String>() {
 			public String call() throws Exception {
 				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
@@ -88,13 +53,12 @@ class ActionUpdateWithWorkCompletedPrimitivePath0 extends BaseAction {
 					if (null == workCompleted) {
 						throw new ExceptionEntityNotExist(id, WorkCompleted.class);
 					}
-					if (BooleanUtils.isTrue(workCompleted.getDataMerged())) {
-						throw new ExceptionModifyDataMerged(workCompleted.getId());
+					if (BooleanUtils.isTrue(workCompleted.getMerged())) {
+						throw new ExceptionModifyMerged(workCompleted.getId());
 					}
 
 					Wo wo = new Wo();
 					wo.setId(workCompleted.getId());
-					//					updateData(business, workCompleted, jsonElement, path0);
 					List<Item> exists = business.item().listWithJobWithPath(workCompleted.getJob(), path0);
 
 					if (1 == exists.size()) {

+ 3 - 3
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ExceptionModifyDataMerged.java → o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ExceptionModifyMerged.java

@@ -2,11 +2,11 @@ package com.x.processplatform.service.processing.jaxrs.data;
 
 import com.x.base.core.project.exception.PromptException;
 
-class ExceptionModifyDataMerged extends PromptException {
+class ExceptionModifyMerged extends PromptException {
 
 	private static final long serialVersionUID = -665095222445791960L;
 
-	ExceptionModifyDataMerged(String workCompletedId) {
-		super("数据已归并,workCompleted:{}.", workCompletedId);
+	ExceptionModifyMerged(String workCompletedId) {
+		super("已完成工作已归并,workCompleted:{}.", workCompletedId);
 	}
 }

+ 3 - 3
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/test/ActionDataMerge.java → o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/test/ActionCombine.java

@@ -6,14 +6,14 @@ import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.jaxrs.WrapBoolean;
 import com.x.processplatform.service.processing.ThisApplication;
-import com.x.processplatform.service.processing.schedule.DataMerge;
+import com.x.processplatform.service.processing.schedule.Combine;
 
-class ActionDataMerge extends BaseAction {
+class ActionCombine extends BaseAction {
 
 	ActionResult<Wo> execute(EffectivePerson effectivePerson) throws Exception {
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 			ActionResult<Wo> result = new ActionResult<>();
-			ThisApplication.context().scheduleLocal(DataMerge.class, 1);
+			ThisApplication.context().scheduleLocal(Combine.class, 1);
 			Wo wo = new Wo();
 			wo.setValue(true);
 			result.setData(wo);

+ 5 - 5
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/test/TestAction.java

@@ -26,16 +26,16 @@ public class TestAction extends StandardJaxrsAction {
 
 	private static Logger logger = LoggerFactory.getLogger(TestAction.class);
 
-	@JaxrsMethodDescribe(value = "立即执行已完成工作数据合并任务.", action = ActionDataMerge.class)
+	@JaxrsMethodDescribe(value = "立即执行已完成工作合并任务.", action = ActionCombine.class)
 	@GET
-	@Path("datamerge")
+	@Path("combine")
 	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
 	@Consumes(MediaType.APPLICATION_JSON)
-	public void dataMerge(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request) {
-		ActionResult<ActionDataMerge.Wo> result = new ActionResult<>();
+	public void combine(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request) {
+		ActionResult<ActionCombine.Wo> result = new ActionResult<>();
 		EffectivePerson effectivePerson = this.effectivePerson(request);
 		try {
-			result = new ActionDataMerge().execute(effectivePerson);
+			result = new ActionCombine().execute(effectivePerson);
 		} catch (Exception e) {
 			logger.error(e, effectivePerson, request, null);
 			result.error(e);

+ 2 - 3
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/work/ActionProjection.java

@@ -1,10 +1,9 @@
 package com.x.processplatform.service.processing.jaxrs.work;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.Callable;
 
-import org.apache.commons.lang3.StringUtils;
-
 import com.google.gson.reflect.TypeToken;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
@@ -109,7 +108,7 @@ class ActionProjection extends BaseAction {
 			return XGsonBuilder.instance().fromJson(text, new TypeToken<List<Projection>>() {
 			}.getType());
 		}
-		return null;
+		return new ArrayList<Projection>();
 	}
 
 	public static class Wo extends WrapBoolean {

+ 152 - 0
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/workcompleted/ActionCombine.java

@@ -0,0 +1,152 @@
+package com.x.processplatform.service.processing.jaxrs.workcompleted;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.Callable;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.annotation.CheckRemoveType;
+import com.x.base.core.entity.dataitem.DataItemConverter;
+import com.x.base.core.entity.dataitem.ItemCategory;
+import com.x.base.core.project.exception.ExceptionEntityNotExist;
+import com.x.base.core.project.executor.ProcessPlatformExecutorFactory;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WoId;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ListTools;
+import com.x.processplatform.core.entity.content.Data;
+import com.x.processplatform.core.entity.content.DocumentVersion;
+import com.x.processplatform.core.entity.content.Record;
+import com.x.processplatform.core.entity.content.WorkCompleted;
+import com.x.processplatform.core.entity.content.WorkLog;
+import com.x.processplatform.service.processing.Business;
+import com.x.query.core.entity.Item;
+
+class ActionCombine extends BaseAction {
+
+	private static Logger logger = LoggerFactory.getLogger(ActionCombine.class);
+
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id) throws Exception {
+
+		String executorSeed = null;
+
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			WorkCompleted workCompleted = emc.fetch(id, WorkCompleted.class,
+					ListTools.toList(WorkCompleted.job_FIELDNAME));
+			if (null == workCompleted) {
+				throw new ExceptionEntityNotExist(id, WorkCompleted.class);
+			}
+			executorSeed = workCompleted.getJob();
+		}
+
+		return ProcessPlatformExecutorFactory.get(executorSeed).submit(new CallableAction(id)).get();
+	}
+
+	public static class Wo extends WoId {
+	}
+
+	public class CallableAction implements Callable<ActionResult<Wo>> {
+
+		private String id;
+
+		CallableAction(String id) {
+			this.id = id;
+		}
+
+		@Override
+		public ActionResult<Wo> call() throws Exception {
+			WorkCompleted workCompleted = null;
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				workCompleted = emc.find(id, WorkCompleted.class);
+				Business business = new Business(emc);
+				if (null != workCompleted) {
+					emc.beginTransaction(WorkCompleted.class);
+					List<Item> items = mergeItem(business, workCompleted);
+					List<WorkLog> workLogs = mergeWorkLog(business, workCompleted);
+					List<Record> records = mergeRecord(business, workCompleted);
+					List<DocumentVersion> documentVersions = listDocumentVersion(business, workCompleted);
+					workCompleted.setMerged(true);
+					emc.commit();
+					this.remove(business, items, workLogs, records,documentVersions);
+					logger.print("已完成工作合并, id: {}, title:{}, sequence:{}.", workCompleted.getId(),
+							workCompleted.getTitle(), workCompleted.getSequence());
+				}
+			} catch (Exception e) {
+				throw new ExceptionCombine(e, id);
+			}
+			Wo wo = new Wo();
+			wo.setId(id);
+			ActionResult<Wo> result = new ActionResult<>();
+			result.setData(wo);
+			return result;
+		}
+
+		private void remove(Business business, List<Item> items, List<WorkLog> workLogs, List<Record> records,List<DocumentVersion> documentVersions)
+				throws Exception {
+			EntityManagerContainer emc = business.entityManagerContainer();
+			if (!items.isEmpty()) {
+				emc.beginTransaction(Item.class);
+				for (Item o : items) {
+					emc.remove(o, CheckRemoveType.all);
+				}
+			}
+			if (!workLogs.isEmpty()) {
+				emc.beginTransaction(WorkLog.class);
+				for (WorkLog o : workLogs) {
+					emc.remove(o, CheckRemoveType.all);
+				}
+			}
+			if (!records.isEmpty()) {
+				emc.beginTransaction(Record.class);
+				for (Record o : records) {
+					emc.remove(o, CheckRemoveType.all);
+				}
+			}
+	
+			if (!documentVersions.isEmpty()) {
+				emc.beginTransaction(DocumentVersion.class);
+				for (DocumentVersion o : documentVersions) {
+					emc.remove(o, CheckRemoveType.all);
+				}
+			}
+			emc.commit();
+		}
+
+		private List<DocumentVersion> listDocumentVersion(Business business, WorkCompleted workCompleted) throws Exception {
+			return  business.entityManagerContainer().listEqual(DocumentVersion.class, DocumentVersion.job_FIELDNAME,
+					workCompleted.getJob());
+		}
+
+		private List<Item> mergeItem(Business business, WorkCompleted workCompleted) throws Exception {
+			List<Item> list = business.entityManagerContainer().listEqualAndEqual(Item.class, Item.bundle_FIELDNAME,
+					workCompleted.getJob(), Item.itemCategory_FIELDNAME, ItemCategory.pp);
+			DataItemConverter<Item> converter = new DataItemConverter<Item>(Item.class);
+			JsonElement jsonElement = converter.assemble(list);
+			workCompleted.getProperties().setData(gson.fromJson(jsonElement, Data.class));
+			return list;
+		}
+
+		private List<Record> mergeRecord(Business business, WorkCompleted workCompleted) throws Exception {
+			List<Record> list = business.entityManagerContainer().listEqual(Record.class, Record.job_FIELDNAME,
+					workCompleted.getJob());
+			Collections.sort(list, Comparator.comparing(Record::getOrder, Comparator.nullsLast(Long::compareTo)));
+			workCompleted.getProperties().setRecordList(list);
+			return list;
+		}
+
+		private List<WorkLog> mergeWorkLog(Business business, WorkCompleted workCompleted) throws Exception {
+			List<WorkLog> list = business.entityManagerContainer().listEqual(WorkLog.class, WorkCompleted.job_FIELDNAME,
+					workCompleted.getJob());
+			Collections.sort(list, Comparator.comparing(WorkLog::getCreateTime, Comparator.nullsLast(Date::compareTo)));
+			workCompleted.getProperties().setWorkLogList(list);
+			return list;
+		}
+	}
+
+}

+ 0 - 94
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/workcompleted/ActionDataMerge.java

@@ -1,94 +0,0 @@
-package com.x.processplatform.service.processing.jaxrs.workcompleted;
-
-import java.util.List;
-import java.util.concurrent.Callable;
-
-import com.google.gson.JsonElement;
-import com.x.base.core.container.EntityManagerContainer;
-import com.x.base.core.container.factory.EntityManagerContainerFactory;
-import com.x.base.core.entity.annotation.CheckRemoveType;
-import com.x.base.core.entity.dataitem.DataItemConverter;
-import com.x.base.core.entity.dataitem.ItemCategory;
-import com.x.base.core.project.exception.ExceptionEntityNotExist;
-import com.x.base.core.project.executor.ProcessPlatformExecutorFactory;
-import com.x.base.core.project.gson.XGsonBuilder;
-import com.x.base.core.project.http.ActionResult;
-import com.x.base.core.project.http.EffectivePerson;
-import com.x.base.core.project.jaxrs.WoId;
-import com.x.base.core.project.logger.Logger;
-import com.x.base.core.project.logger.LoggerFactory;
-import com.x.base.core.project.tools.ListTools;
-import com.x.processplatform.core.entity.content.WorkCompleted;
-import com.x.query.core.entity.Item;
-
-class ActionDataMerge extends BaseAction {
-
-	private static Logger logger = LoggerFactory.getLogger(ActionDataMerge.class);
-
-	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id) throws Exception {
-
-		DataItemConverter<Item> converter = new DataItemConverter<Item>(Item.class);
-
-		String executorSeed = null;
-
-		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			WorkCompleted workCompleted = emc.fetch(id, WorkCompleted.class,
-					ListTools.toList(WorkCompleted.job_FIELDNAME));
-			if (null == workCompleted) {
-				throw new ExceptionEntityNotExist(id, WorkCompleted.class);
-			}
-			executorSeed = workCompleted.getJob();
-		}
-
-		Callable<ActionResult<Wo>> callable = new Callable<ActionResult<Wo>>() {
-			public ActionResult<Wo> call() throws Exception {
-				String workCompletedId = null;
-				String workCompletedTitle = null;
-				String workCompletedSequence = null;
-				try {
-					try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-						WorkCompleted workCompleted = emc.find(id, WorkCompleted.class);
-						if (null != workCompleted) {
-							workCompletedId = workCompleted.getId();
-							workCompletedTitle = workCompleted.getTitle();
-							workCompletedSequence = workCompleted.getSequence();
-							List<Item> items = items(emc, workCompleted);
-							JsonElement jsonElement = converter.assemble(items);
-							emc.beginTransaction(WorkCompleted.class);
-							workCompleted.setData(XGsonBuilder.toJson(jsonElement));
-							workCompleted.setDataMerged(true);
-							emc.commit();
-							emc.beginTransaction(Item.class);
-							for (Item item : items) {
-								emc.remove(item, CheckRemoveType.all);
-							}
-							emc.commit();
-							logger.print("已完成工作数据合并, id: {}, title:{}, sequence:{}.", workCompletedId,
-									workCompletedTitle, workCompletedSequence);
-						}
-					} catch (Exception e) {
-						throw new ExceptionDataMerge(e, workCompletedId, workCompletedTitle, workCompletedSequence);
-					}
-				} catch (Exception e) {
-					logger.error(e);
-				}
-				Wo wo = new Wo();
-				wo.setId(workCompletedId);
-				ActionResult<Wo> result = new ActionResult<>();
-				result.setData(wo);
-				return result;
-			}
-		};
-		ActionResult<Wo> result = ProcessPlatformExecutorFactory.get(executorSeed).submit(callable).get();
-		return result;
-	}
-
-	private List<Item> items(EntityManagerContainer emc, WorkCompleted workCompleted) throws Exception {
-		return emc.listEqualAndEqual(Item.class, Item.bundle_FIELDNAME, workCompleted.getJob(),
-				Item.itemCategory_FIELDNAME, ItemCategory.pp);
-	}
-
-	public static class Wo extends WoId {
-	}
-
-}

+ 3 - 3
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/workcompleted/ExceptionDataMerge.java → o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/workcompleted/ExceptionCombine.java

@@ -2,12 +2,12 @@ package com.x.processplatform.service.processing.jaxrs.workcompleted;
 
 import com.x.base.core.project.exception.PromptException;
 
-class ExceptionDataMerge extends PromptException {
+class ExceptionCombine extends PromptException {
 
 	private static final long serialVersionUID = -7038279889683420366L;
 
-	ExceptionDataMerge(Exception e, String id, String title, String sequence) {
-		super(e, "已成工作数据合并失败, id:{}, title:{}, sequence:{}.");
+	ExceptionCombine(Exception e, String id) {
+		super(e, "已完成工作合并失败, id:{}.",id);
 	}
 
 }

+ 5 - 5
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/workcompleted/WorkCompletedAction.java

@@ -49,17 +49,17 @@ public class WorkCompletedAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
 
-	@JaxrsMethodDescribe(value = "指定的已完成工作进行数据合并.", action = ActionDataMerge.class)
+	@JaxrsMethodDescribe(value = "指定的已完成工作进行合并.", action = ActionCombine.class)
 	@GET
-	@Path("{flag}/data/merge")
+	@Path("{flag}/combine")
 	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
 	@Consumes(MediaType.APPLICATION_JSON)
-	public void dataMerge(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+	public void combine(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
 			@JaxrsParameterDescribe("完成工作") @PathParam("flag") String flag) {
-		ActionResult<ActionDataMerge.Wo> result = new ActionResult<>();
+		ActionResult<ActionCombine.Wo> result = new ActionResult<>();
 		EffectivePerson effectivePerson = this.effectivePerson(request);
 		try {
-			result = new ActionDataMerge().execute(effectivePerson, flag);
+			result = new ActionCombine().execute(effectivePerson, flag);
 		} catch (Exception e) {
 			logger.error(e, effectivePerson, request, null);
 			result.error(e);

+ 22 - 21
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/schedule/DataMerge.java → o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/schedule/Combine.java

@@ -13,12 +13,9 @@ import javax.persistence.criteria.Path;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 
-import org.apache.commons.lang3.time.DateUtils;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-
 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.Applications;
 import com.x.base.core.project.x_processplatform_service_processing;
 import com.x.base.core.project.config.Config;
@@ -31,11 +28,15 @@ import com.x.processplatform.core.entity.content.WorkCompleted;
 import com.x.processplatform.core.entity.content.WorkCompleted_;
 import com.x.processplatform.service.processing.ThisApplication;
 
+import org.apache.commons.lang3.time.DateUtils;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
 import fr.opensagres.poi.xwpf.converter.core.utils.StringUtils;
 
-public class DataMerge extends AbstractJob {
+public class Combine extends AbstractJob {
 
-	private static Logger logger = LoggerFactory.getLogger(DataMerge.class);
+	private static Logger logger = LoggerFactory.getLogger(Combine.class);
 
 	@Override
 	public void schedule(JobExecutionContext jobExecutionContext) throws Exception {
@@ -55,12 +56,12 @@ public class DataMerge extends AbstractJob {
 							try {
 								ThisApplication.context().applications()
 										.getQuery(x_processplatform_service_processing.class, Applications
-												.joinQueryUri("workcompleted", workCompleted.getId(), "data", "merge"),
+												.joinQueryUri("workcompleted", workCompleted.getId(), "combine"),
 												workCompleted.getJob())
 										.getData(WoId.class);
 								count.incrementAndGet();
 							} catch (Exception e) {
-								throw new ExceptionDataMerge(e, workCompleted.getId(), workCompleted.getTitle(),
+								throw new ExceptionCombine(e, workCompleted.getId(), workCompleted.getTitle(),
 										workCompleted.getSequence());
 							}
 						} catch (Exception e) {
@@ -69,7 +70,7 @@ public class DataMerge extends AbstractJob {
 					}
 				}
 			} while (!targets.isEmpty());
-			logger.print("完成{}个已完成工作数据合并, 耗时:{}.", count.intValue(), stamp.consumingMilliseconds());
+			logger.print("完成{}个已完成工作合并, 耗时:{}.", count.intValue(), stamp.consumingMilliseconds());
 		} catch (Exception e) {
 			throw new JobExecutionException(e);
 		}
@@ -77,28 +78,28 @@ public class DataMerge extends AbstractJob {
 
 	private List<WorkCompleted> list(EntityManagerContainer emc, String sequence) throws Exception {
 		Date date = new Date();
-		date = DateUtils.addDays(date, 0 - Config.processPlatform().getDataMerge().getThresholdDays());
+		date = DateUtils.addDays(date, 0 - Config.processPlatform().getCombine().getThresholdDays());
 		EntityManager em = emc.get(WorkCompleted.class);
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<Tuple> cq = cb.createQuery(Tuple.class);
 		Root<WorkCompleted> root = cq.from(WorkCompleted.class);
-		Path<String> id_path = root.get(WorkCompleted_.id);
-		Path<String> job_path = root.get(WorkCompleted_.job);
-		Path<String> sequence_path = root.get(WorkCompleted_.sequence);
-		Predicate p = cb.or(cb.isNull(root.get(WorkCompleted_.dataMerged)),
-				cb.equal(root.get(WorkCompleted_.dataMerged), false));
+		Path<String> idPath = root.get(WorkCompleted_.id);
+		Path<String> jobPath = root.get(WorkCompleted_.job);
+		Path<String> sequencePath = root.get(JpaObject_.sequence);
+		Predicate p = cb.or(cb.isNull(root.get(WorkCompleted_.merged)),
+				cb.equal(root.get(WorkCompleted_.merged), false));
 		p = cb.and(p, cb.lessThan(root.get(WorkCompleted_.completedTime), date));
 		if (StringUtils.isNotEmpty(sequence)) {
-			p = cb.and(p, cb.greaterThan(sequence_path, sequence));
+			p = cb.and(p, cb.greaterThan(sequencePath, sequence));
 		}
-		cq.multiselect(id_path, job_path, sequence_path).where(p).orderBy(cb.asc(sequence_path));
-		List<Tuple> os = em.createQuery(cq).setMaxResults(200).getResultList();
+		cq.multiselect(idPath, jobPath, sequencePath).where(p).orderBy(cb.asc(sequencePath));
+		List<Tuple> os = em.createQuery(cq).setMaxResults(100).getResultList();
 		List<WorkCompleted> list = new ArrayList<>();
 		for (Tuple o : os) {
 			WorkCompleted workCompleted = new WorkCompleted();
-			workCompleted.setId(o.get(id_path));
-			workCompleted.setJob(o.get(job_path));
-			workCompleted.setSequence(o.get(sequence_path));
+			workCompleted.setId(o.get(idPath));
+			workCompleted.setJob(o.get(jobPath));
+			workCompleted.setSequence(o.get(sequencePath));
 			list.add(workCompleted);
 		}
 		return list;

+ 13 - 0
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/schedule/ExceptionCombine.java

@@ -0,0 +1,13 @@
+package com.x.processplatform.service.processing.schedule;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionCombine extends PromptException {
+
+	private static final long serialVersionUID = -7038279889683420366L;
+
+	ExceptionCombine(Exception e, String id, String title, String sequence) {
+		super(e, "已完成工作合并失败, id:{}, title:{}, sequence:{}.");
+	}
+
+}

+ 0 - 13
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/schedule/ExceptionDataMerge.java

@@ -1,13 +0,0 @@
-package com.x.processplatform.service.processing.schedule;
-
-import com.x.base.core.project.exception.PromptException;
-
-class ExceptionDataMerge extends PromptException {
-
-	private static final long serialVersionUID = -7038279889683420366L;
-
-	ExceptionDataMerge(Exception e, String id, String title, String sequence) {
-		super(e, "已完成工作数据合并失败, id:{}, title:{}, sequence:{}.");
-	}
-
-}

+ 0 - 1
o2server/x_program_center/.gitignore

@@ -1 +0,0 @@
-/target/

+ 0 - 1
o2server/x_program_center_core_entity/.gitignore

@@ -1 +0,0 @@
-/target/

+ 0 - 1
o2server/x_query_assemble_designer/.gitignore

@@ -1 +0,0 @@
-/target/

+ 0 - 1
o2server/x_query_core_entity/.gitignore

@@ -1 +0,0 @@
-/target/

+ 0 - 1
o2server/x_query_service_processing/.gitignore

@@ -1 +0,0 @@
-/target/

+ 7 - 4
o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/ThisApplication.java

@@ -19,14 +19,17 @@ public class ThisApplication {
 
 	public static void init() {
 		try {
-			//执行数据库中的批处理操作
-			MessageConnector.start(context());
+			//执行消息操作
 			queueBatchOperation = new QueueBatchOperation();
+
+			MessageConnector.start(context());
+
 			context().startQueue( queueBatchOperation );
+
 			new SystemConfigPersistService().initSystemConfig();
-			MessageConnector.start(context());
+
 			//每隔5分钟检查是否有未完成的批处理工作需要完成以及是否有未review的task需要核对权限信息
-			context.schedule( Timertask_BatchOperationTask.class, "0 */5 * * * ?" );
+			context.schedule( Timertask_BatchOperationTask.class, "0 */2 * * * ?" );
 			
 			//每天凌晨把所有项目的所有工作任务的权限和review信息核对一次
 			context.schedule( Timertask_RefreshAllTaskReview.class, "0 0 2 * * ?" );

+ 0 - 1
o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/factory/ReviewFactory.java

@@ -201,7 +201,6 @@ public class ReviewFactory extends AbstractFactory {
 		Root<Review> root = cq.from( Review.class );
 		Predicate p = cb.equal( root.get( Review_.permissionObj ), person );
 		p = cb.and( p, cb.equal( root.get( Review_.parent ), taskId ));
-		System.out.println(">>>SQL:" + em.createQuery( cq.where(p) ) );
 		return em.createQuery( cq.where(p) ).getResultList();
 	}
 }

+ 20 - 0
o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/factory/TaskListFactory.java

@@ -341,6 +341,9 @@ public class TaskListFactory extends AbstractFactory {
 		if( StringUtils.isEmpty( taskId ) ){
 			return null;
 		}
+		if( StringUtils.isEmpty( taskGroupId ) ){
+			return null;
+		}
 		EntityManager em = this.entityManagerContainer().get(TaskListRele.class);
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<TaskListRele> cq = cb.createQuery(TaskListRele.class);
@@ -350,6 +353,23 @@ public class TaskListFactory extends AbstractFactory {
 		return em.createQuery(cq.where(p)).getResultList();
 	}
 
+	public List<String> listTaskListIdWithTask(String taskId, String taskGroupId ) throws Exception {
+		if( StringUtils.isEmpty( taskId ) ){
+			return null;
+		}
+		if( StringUtils.isEmpty( taskGroupId ) ){
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get(TaskListRele.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<TaskListRele> root = cq.from(TaskListRele.class);
+		Predicate p = cb.equal( root.get(TaskListRele_.taskId ), taskId );
+		p = cb.and( p, cb.equal( root.get(TaskListRele_.taskGroupId ), taskGroupId ) );
+		cq.select( root.get(TaskListRele_.taskListId) );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+
 	public List<String> listTaskListIdsWithGroup(String taskGroupId, String person) throws Exception {
 		if( StringUtils.isEmpty( taskGroupId ) ){
 			return null;

+ 118 - 22
o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/jaxrs/task/ActionGet.java

@@ -5,6 +5,7 @@ import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 
+import com.x.teamwork.core.entity.*;
 import org.apache.commons.lang3.StringUtils;
 
 import com.x.base.core.entity.JpaObject;
@@ -17,11 +18,6 @@ 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.teamwork.core.entity.ProjectExtFieldRele;
-import com.x.teamwork.core.entity.Task;
-import com.x.teamwork.core.entity.TaskDetail;
-import com.x.teamwork.core.entity.TaskExtField;
-import com.x.teamwork.core.entity.TaskTag;
 
 import net.sf.ehcache.Element;
 
@@ -108,11 +104,11 @@ public class ActionGet extends BaseAction {
 						wo.setDetail( taskDetail.getDetail() );
 						wo.setDescription( taskDetail.getDescription() );
 					}
-					
-//					if( taskExtField != null ) {
-//						wo.setExtField( WoTaskExtField.copier.copy( taskExtField ));
-//					}
-					
+
+					if( taskExtField != null ) {
+						wo.setExtField( WoTaskExtField.copier.copy( taskExtField ));
+					}
+
 					if( ListTools.isNotEmpty( extFieldReleList )) {
 						List<WoExtFieldRele> reles = WoExtFieldRele.copier.copy( extFieldReleList ) ;
 						for( WoExtFieldRele woExtFieldRele :  reles ) {
@@ -125,15 +121,93 @@ public class ActionGet extends BaseAction {
 					if( ListTools.isNotEmpty( tags )) {
 						wo.setTags( WoTaskTag.copier.copy( tags ));
 					}
-					taskCache.put(new Element( cacheKey, wo ));
-					result.setData(wo);
+
 				} catch (Exception e) {
 					Exception exception = new TaskQueryException(e, "将查询出来的工作任务信息对象转换为可输出的数据信息时发生异常。");
 					result.error(exception);
 					logger.error(e, effectivePerson, request, null);
 				}
 			}
+
+			//查询任务所在的Group信息
+			if (check) {
+				List<String> groupIds = null;
+				try {
+					groupIds = taskGroupQueryService.listGroupIdsByTask( task.getId() );
+					if( ListTools.isNotEmpty( groupIds )){
+						wo.setTaskGroupId( groupIds.get(0) );
+					}
+				} catch (Exception e) {
+					check = false;
+					Exception exception = new TaskQueryException(e, "根据指定projectId查询项目扩展列配置信息对象时发生异常。projectId:" + task.getProject());
+					result.error(exception);
+					logger.error(e, effectivePerson, request, null);
+				}
+			}
+
+			//查询任务所在的List信息
+			if (check) {
+				if( StringUtils.isNotEmpty(wo.getTaskGroupId() )){
+					List<String> listIds = null;
+					try {
+						listIds = taskListQueryService.listTaskListIdWithTaskId( task.getId(), wo.getTaskGroupId() );
+						if( ListTools.isNotEmpty( listIds )){
+							wo.setTaskListId( listIds.get(0) );
+						}
+					} catch (Exception e) {
+						Exception exception = new TaskQueryException(e, "根据指定projectId查询项目扩展列配置信息对象时发生异常。projectId:" + task.getProject());
+						result.error(exception);
+						logger.error(e, effectivePerson, request, null);
+					}
+				}
+			}
+
+//			//查询任务所在的Group信息
+//			if (check) {
+//				List<String> groupIds = null;
+//				List<TaskGroup> groupList = null;
+//				List<WoTaskGroup> woGroupList = new ArrayList<>();
+//				try {
+//					groupIds = taskGroupQueryService.listGroupIdsByTask( task.getId() );
+//					groupList = taskGroupQueryService.list( groupIds );
+//					if( ListTools.isNotEmpty( groupList )){
+//						woGroupList = WoTaskGroup.copier.copy( groupList );
+//					}
+//					wo.setTaskgroups( woGroupList );
+//				} catch (Exception e) {
+//					check = false;
+//					Exception exception = new TaskQueryException(e, "根据指定projectId查询项目扩展列配置信息对象时发生异常。projectId:" + task.getProject());
+//					result.error(exception);
+//					logger.error(e, effectivePerson, request, null);
+//				}
+//			}
+//
+//			//查询任务所在的List信息
+//			if (check) {
+//				if( ListTools.isNotEmpty(wo.getTaskgroups() )){
+//					List<String> listIds = null;
+//					List<TaskList> taskLists = null;
+//					List<WoTaskList> woTaskLists = new ArrayList<>();
+//					for( WoTaskGroup woGroup : wo.getTaskgroups() ){
+//						try {
+//							listIds = taskListQueryService.listTaskListIdWithTaskId( task.getId(), woGroup.getId() );
+//							taskLists = taskListQueryService.list( listIds );
+//							if( ListTools.isNotEmpty( taskLists )){
+//								woTaskLists = WoTaskList.copier.copy( taskLists );
+//							}
+//							woGroup.setTaskLists( woTaskLists );
+//						} catch (Exception e) {
+//							check = false;
+//							Exception exception = new TaskQueryException(e, "根据指定projectId查询项目扩展列配置信息对象时发生异常。projectId:" + task.getProject());
+//							result.error(exception);
+//							logger.error(e, effectivePerson, request, null);
+//						}
+//					}
+//				}
+//			}
 		}
+		taskCache.put(new Element( cacheKey, wo ));
+		result.setData(wo);
 		return result;
 	}
 
@@ -145,24 +219,46 @@ public class ActionGet extends BaseAction {
 		@FieldDescribe("说明详细信息(10M)")
 		private String description;
 		
-//		@FieldDescribe("扩展属性信息(对象)")
-//		private WoTaskExtField extField;
+		@FieldDescribe("扩展属性信息(对象)")
+		private WoTaskExtField extField;
 		
 		@FieldDescribe("任务标签(列表)")
 		private List<WoTaskTag> tags = null;
 		
 		@FieldDescribe("所属项目的扩展列设定(配置列表)")
 		private List<WoExtFieldRele> extFieldConfigs;
-		
+
+		@FieldDescribe("工作任务所属的工作任务组信息ID")
+		String taskGroupId = null;
+
+		@FieldDescribe("工作任务所属的工作任务列表(泳道)信息ID")
+		String taskListId = null;
+
 		private Long rank;
 
-//		public WoTaskExtField getExtField() {
-//			return extField;
-//		}
-//
-//		public void setExtField(WoTaskExtField extField) {
-//			this.extField = extField;
-//		}
+		public String getTaskGroupId() {
+			return taskGroupId;
+		}
+
+		public void setTaskGroupId(String taskGroupId) {
+			this.taskGroupId = taskGroupId;
+		}
+
+		public String getTaskListId() {
+			return taskListId;
+		}
+
+		public void setTaskListId(String taskListId) {
+			this.taskListId = taskListId;
+		}
+
+		public WoTaskExtField getExtField() {
+			return extField;
+		}
+
+		public void setExtField(WoTaskExtField extField) {
+			this.extField = extField;
+		}
 
 		public List<WoExtFieldRele> getExtFieldConfigs() {
 			return extFieldConfigs;

+ 10 - 1
o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/jaxrs/task/ActionSave.java

@@ -226,6 +226,15 @@ public class ActionSave extends BaseAction {
 			}
 		}
 
+		//查询该任务和任务组的绑定情况
+		if (check) {
+			if( !taskGroupQueryService.existsWithTaskAndGroup( wi.getTaskGroupId(), task.getId() )){
+				//添加任务和任务组的关联
+				taskGroupPersistService.addTaskToGroup( task.getId(), wi.getTaskGroupId() );
+				taskGroupPersistService.refreshTaskCountInTaskGroupWithTaskId( effectivePerson.getDistinguishedName(), task.getId() );
+			}
+		}
+
 		//检查标签是否有变动
 		if (check) {
 			//检查任务和标签的所有关联
@@ -713,7 +722,7 @@ public class ActionSave extends BaseAction {
 
 	}
 
-public static class Wo extends WoId {
+	public static class Wo extends WoId {
 		
 		@FieldDescribe("操作引起的动态内容")
 		List<WoDynamic> dynamics = new ArrayList<>();

+ 3 - 11
o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/jaxrs/task/BaseAction.java

@@ -3,17 +3,7 @@ package com.x.teamwork.assemble.control.jaxrs.task;
 import com.x.base.core.project.annotation.FieldDescribe;
 import com.x.base.core.project.cache.ApplicationCache;
 import com.x.base.core.project.jaxrs.StandardJaxrsAction;
-import com.x.teamwork.assemble.control.service.DynamicPersistService;
-import com.x.teamwork.assemble.control.service.ProjectExtFieldReleQueryService;
-import com.x.teamwork.assemble.control.service.ProjectQueryService;
-import com.x.teamwork.assemble.control.service.TaskGroupPersistService;
-import com.x.teamwork.assemble.control.service.TaskGroupQueryService;
-import com.x.teamwork.assemble.control.service.TaskListPersistService;
-import com.x.teamwork.assemble.control.service.TaskPersistService;
-import com.x.teamwork.assemble.control.service.TaskQueryService;
-import com.x.teamwork.assemble.control.service.TaskTagPersistService;
-import com.x.teamwork.assemble.control.service.TaskTagQueryService;
-import com.x.teamwork.assemble.control.service.TaskViewQueryService;
+import com.x.teamwork.assemble.control.service.*;
 import com.x.teamwork.core.entity.Task;
 import com.x.teamwork.core.entity.TaskView;
 
@@ -38,6 +28,8 @@ public class BaseAction extends StandardJaxrsAction {
 	protected 	TaskPersistService taskPersistService = new TaskPersistService();
 	
 	protected TaskListPersistService taskListPersistService = new TaskListPersistService();
+
+	protected TaskListQueryService taskListQueryService = new TaskListQueryService();
 	
 	protected TaskGroupQueryService taskGroupQueryService = new TaskGroupQueryService();
 	

+ 40 - 1
o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/jaxrs/task/TaskAction.java

@@ -90,7 +90,46 @@ public class TaskAction extends StandardJaxrsAction {
 		}
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
-	
+
+	@JaxrsMethodDescribe(value = "将指定的工作转换为子工作.", action = ActionTransformAsSubTask.class)
+	@GET
+	@Path("transform/{tid}/parent/{pid}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void transformAsSubTask(@Suspended final AsyncResponse asyncResponse,
+								  @Context HttpServletRequest request,
+								  @JaxrsParameterDescribe("指定任务ID") @PathParam("tid") String tid,
+								  @JaxrsParameterDescribe("上级任务ID") @PathParam("pid") String pid) {
+		ActionResult<ActionTransformAsSubTask.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionTransformAsSubTask().execute( request, effectivePerson, tid, pid );
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+	@JaxrsMethodDescribe(value = "复制指定的工作为新的工作.", action = ActionCopyTask.class)
+	@GET
+	@Path("copy/{tid}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void copyTask(@Suspended final AsyncResponse asyncResponse,
+								   @Context HttpServletRequest request,
+								   @JaxrsParameterDescribe("指定任务ID") @PathParam("tid") String tid) {
+		ActionResult<ActionCopyTask.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionCopyTask().execute( request, effectivePerson, tid );
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
 	@JaxrsMethodDescribe(value = "查询我的项目首页中工作任务视图信息.", action = ActionStatisticMyTaskViews.class)
 	@GET
 	@Path("statitic/group/{projectId}")

+ 3 - 0
o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/BatchOperationProcessService.java

@@ -99,6 +99,9 @@ public class BatchOperationProcessService {
 				if( StringUtils.isEmpty( task.getParent() )) {
 					task.setParent( "0" );
 				}
+				if( StringUtils.equals( task.getId(), task.getParent() )) {
+					task.setParent( "0" );
+				}
 				emc.check( task, CheckPersistType.all );
 				emc.commit();
 			}

+ 80 - 13
o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/DynamicPersistService.java

@@ -82,7 +82,6 @@ public class DynamicPersistService {
 	
 	/**
 	 * 保存项目创建或者更新动态信息
-	 * @param old_object
 	 * @param object
 	 * @param effectivePerson
 	 * @param content
@@ -132,9 +131,7 @@ public class DynamicPersistService {
 	 * 保存项目扩展信息保存操作动态信息
 	 * @param object_old
 	 * @param object
-	 * @param optType
 	 * @param effectivePerson
-	 * @param content
 	 * @return
 	 * @throws Exception
 	 */
@@ -179,8 +176,8 @@ public class DynamicPersistService {
 	
 	/**
 	 * 保存动态信息
+	 * @param object_old
 	 * @param object
-	 * @param optType
 	 * @param effectivePerson
 	 * @param content
 	 * @return
@@ -230,7 +227,6 @@ public class DynamicPersistService {
 	 * @param object_old
 	 * @param object_new
 	 * @param effectivePerson
-	 * @param content
 	 * @return
 	 * @throws Exception
 	 */
@@ -257,11 +253,87 @@ public class DynamicPersistService {
 		}
 		return result;
 	}
-	
+
 	/**
-	 * 保存动态信息
-	 * @param dynamic
+	 * 工作复制动态信息
+	 * @param sourceTask
+	 * @param newTask
+	 * @param effectivePerson
+	 * @return
+	 * @throws Exception
+	 */
+	public List<Dynamic> taskCopyDynamic( Task sourceTask, Task newTask, EffectivePerson effectivePerson ) throws Exception {
+		if ( sourceTask == null) {
+			throw new Exception("sourceTask is null.");
+		}
+		if ( newTask == null) {
+			throw new Exception("newTask is null.");
+		}
+		if ( effectivePerson == null ) {
+			throw new Exception("effectivePerson is null.");
+		}
+		List<Dynamic> result = new ArrayList<>();
+		List<Dynamic> dynamics = null;
+		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			dynamics = dynamicService.getTaskCopyDynamic( sourceTask, newTask, effectivePerson );
+			if( ListTools.isNotEmpty( dynamics )) {
+				for( Dynamic dynamic : dynamics ) {
+					dynamic = dynamicService.save( emc, dynamic, "" );
+					result.add( dynamic );
+				}
+			}
+		} catch (Exception e) {
+			throw e;
+		}
+		return result;
+	}
+
+	/**
+	 * 保存转换子工作的动态信息
+	 * @param subTask
+	 * @param parentTask
+	 * @param effectivePerson
+	 * @return
+	 * @throws Exception
+	 */
+	public List<Dynamic> subTaskTransformDynamic( Task subTask, Task parentTask, EffectivePerson effectivePerson ) throws Exception {
+		if ( subTask == null) {
+			throw new Exception("sourceTask is null.");
+		}
+		if ( parentTask == null) {
+			throw new Exception("parentTask is null.");
+		}
+		if ( effectivePerson == null ) {
+			throw new Exception("effectivePerson is null.");
+		}
+		List<Dynamic> result = new ArrayList<>();
+		List<Dynamic> dynamics = null;
+
+		//记录一个添加子任务转换的动态信息
+		result.add(dynamicService.getTaskTransformDynamic( parentTask, subTask, effectivePerson));
+
+		//记录一个为上级任务添加子任务的动态信息
+		result.add(dynamicService.getTaskSplitDynamic( parentTask, subTask, effectivePerson));
+
+		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			if( ListTools.isNotEmpty( result )) {
+				for( Dynamic dynamic : result ) {
+					//持久化工作操作动态
+					dynamicService.save( emc, dynamic, "" );
+				}
+			}
+		} catch (Exception e) {
+			throw e;
+		}
+		return result;
+	}
+
+	/**
+	 * 保存项目工作组信息动态
+	 * @param object_old
+	 * @param object
 	 * @param effectivePerson
+	 * @param content
 	 * @return
 	 * @throws Exception
 	 */
@@ -287,7 +359,6 @@ public class DynamicPersistService {
 	 * 保存项目组删除动态信息
 	 * @param object
 	 * @param effectivePerson
-	 * @param content
 	 * @return
 	 * @throws Exception
 	 */
@@ -311,7 +382,6 @@ public class DynamicPersistService {
 	 * 保存工作任务删除动态信息
 	 * @param object
 	 * @param effectivePerson
-	 * @param content
 	 * @return
 	 * @throws Exception
 	 */
@@ -338,7 +408,6 @@ public class DynamicPersistService {
 	 * @param addManagers
 	 * @param removeManagers
 	 * @param effectivePerson
-	 * @param content
 	 * @throws Exception
 	 */
 	public List<Dynamic> taskManagerUpdateDynamic(Task task, List<String> addManagers, List<String> removeManagers, EffectivePerson effectivePerson ) throws Exception {
@@ -421,7 +490,6 @@ public class DynamicPersistService {
 	 * @param addParticipants
 	 * @param removeParticipants
 	 * @param effectivePerson
-	 * @param content
 	 * @throws Exception
 	 */
 	public List<Dynamic> taskParticipantsUpdateDynamic(Task task, List<String> addParticipants, List<String> removeParticipants, EffectivePerson effectivePerson ) throws Exception {
@@ -570,7 +638,6 @@ public class DynamicPersistService {
 	 * 保存工作任务评论删除动态信息
 	 * @param object
 	 * @param effectivePerson
-	 * @param content
 	 * @return
 	 * @throws Exception
 	 */

+ 44 - 11
o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/DynamicService.java

@@ -103,8 +103,6 @@ class DynamicService {
 	 * @param maxCount
 	 * @param orderField
 	 * @param orderType
-	 * @param projectIds
-	 * @param taskIds
 	 * @return
 	 * @throws Exception
 	 */
@@ -116,7 +114,7 @@ class DynamicService {
 	/**
 	 * 向数据库持久化动态信息
 	 * @param emc
-	 * @param dynamic
+	 * @param object
 	 * @return
 	 * @throws Exception 
 	 */
@@ -480,7 +478,6 @@ class DynamicService {
 	 * 保存和根据项目组信息操作动态
 	 * @param object_old
 	 * @param object
-	 * @param optType
 	 * @param effectivePerson
 	 * @return
 	 */
@@ -731,10 +728,35 @@ class DynamicService {
 		
 		return dynamics;
 	}
-	
+
+	/**
+	 * 复制任务信息操作动态
+	 * @param sourceTask
+	 * @param newTask
+	 * @param effectivePerson
+	 * @return
+	 * @throws Exception
+	 */
+	protected List<Dynamic> getTaskCopyDynamic( Task sourceTask, Task newTask, EffectivePerson effectivePerson ) throws Exception {
+		String objectType =  "TASK";
+		String optType =  "TASK_INFO";
+		String title =  "复制工作任务信息";
+		List<Dynamic> dynamics = new ArrayList<>();
+		String viewUrl = null;
+		String description = null;
+
+		if( sourceTask != null ) {
+			optType =  "COPY";
+			title =  "工作任务信息复制";
+			description = effectivePerson.getName() + "复制了任务:" + sourceTask.getName() + "。";
+			dynamics.add( composeNewDynamic( objectType, title, description, viewUrl, optType, newTask, effectivePerson, false ) );
+		}
+		return dynamics;
+	}
+
 	/**
 	 * 更新工作任务管理者信息操作动态
-	 * @param task
+	 * @param object
 	 * @param addManagers
 	 * @param removeManagers
 	 * @param effectivePerson
@@ -768,7 +790,7 @@ class DynamicService {
 	
 	/**
 	 * 更新工作任务参与者操作动态
-	 * @param task
+	 * @param object
 	 * @param addParticipants
 	 * @param removeParticipants
 	 * @param effectivePerson
@@ -805,11 +827,22 @@ class DynamicService {
 		String title =  "工作任务分解";
 		String viewUrl = task.getId();
 		String optType =  "SPLIT";
-		String description = effectivePerson.getName() +"为工作添加了一个子任务:" + task.getName();
+		String description = effectivePerson.getName() +"为工作添加了一个子任务:[" + task.getName() + "]";
 		Dynamic dynamic =  composeNewDynamic( objectType, title, description, viewUrl, optType, parentTask, effectivePerson, false );
 		dynamic.setTarget( parentTask.getExecutor() );		
 		return dynamic;
 	}
+
+	public Dynamic getTaskTransformDynamic(Task parentTask, Task task, EffectivePerson effectivePerson) {
+		String objectType =  "TASK";
+		String title =  "转换为子工作";
+		String viewUrl = task.getId();
+		String optType =  "TRANSFORM";
+		String description = effectivePerson.getName() +"将工作转换为工作[" +parentTask.getName() + "]的一个子任务。";
+		Dynamic dynamic =  composeNewDynamic( objectType, title, description, viewUrl, optType, task, effectivePerson, false );
+		dynamic.setTarget( task.getExecutor() );
+		return dynamic;
+	}
 	
 	public Dynamic subTaskDeleteDynamic(Task parentTask, Task task, EffectivePerson effectivePerson) {
 		String objectType =  "TASK";
@@ -888,7 +921,7 @@ class DynamicService {
 	
 	/**
 	 * 工作任务附件上传操作动态信息
-	 * @param attachment
+	 * @param object
 	 * @param effectivePerson
 	 * @return
 	 */
@@ -903,7 +936,7 @@ class DynamicService {
 	
 	/**
 	 * 工作任务附件下载操作动态信息
-	 * @param attachment
+	 * @param object
 	 * @param effectivePerson
 	 * @return
 	 */
@@ -918,7 +951,7 @@ class DynamicService {
 
 	/**
 	 * 工作任务附件删除操作动态信息
-	 * @param attachment
+	 * @param object
 	 * @param effectivePerson
 	 * @return
 	 */

+ 1 - 1
o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/ReviewService.java

@@ -263,7 +263,7 @@ public class ReviewService {
 			}
 			
 			//查查该工作是否有上级工作,如果有上级工作,那上级工作的可见人员也应该加入到该工作的可见人员中
-			if( StringUtils.isNotEmpty( task.getParent() )) {
+			if( StringUtils.isNotEmpty( task.getParent() ) && !StringUtils.equals( task.getParent(), task.getId() ) ) {
 				permissionObjs = addTaskAllPermission( emc, permissionObjs, task.getParent() );
 			}
 		}

+ 0 - 1
o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/TaskGroupPersistService.java

@@ -77,7 +77,6 @@ public class TaskGroupPersistService {
 	
 	/**
 	 *  将工作任务从工作任务组中除去
-	 * @param emc
 	 * @param taskId
 	 * @param groupId
 	 * @throws Exception

+ 1 - 1
o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/TaskGroupQueryService.java

@@ -142,7 +142,7 @@ public class TaskGroupQueryService {
 	/**
 	 * 判断是否存在分组和工作任务的关联
 	 * @param taskId
-	 * @param projectId
+	 * @param groupId
 	 * @return
 	 * @throws Exception 
 	 */

+ 1 - 1
o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/TaskGroupService.java

@@ -109,7 +109,7 @@ class TaskGroupService {
 		if( taskGroup != null ){
 			reles = business.taskGroupReleFactory().listWithGroupAndTask( groupId, taskId );
 			if( ListTools.isEmpty( reles )) { 
-				emc.beginTransaction( TaskGroup.class );		
+				emc.beginTransaction( TaskGroupRele.class );
 				taskGroupRele = new TaskGroupRele();
 				taskGroupRele.setId( TaskGroupRele.createId() );
 				taskGroupRele.setProject( taskGroup.getProject() );

+ 29 - 1
o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/TaskListQueryService.java

@@ -37,7 +37,32 @@ public class TaskListQueryService {
 			throw e;
 		}
 	}
-	
+
+	public List<TaskList> list(List<String> listIds) throws Exception {
+		if ( ListTools.isEmpty( listIds )) {
+			return null;
+		}
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			return emc.list( TaskList.class, listIds);
+		} catch (Exception e) {
+			throw e;
+		}
+	}
+
+	public List<String> listTaskListIdWithTaskId( String taskId, String taskGroupId) throws Exception {
+		if ( StringUtils.isEmpty( taskId )) {
+			throw new Exception("taskId is empty.");
+		}
+		if ( StringUtils.isEmpty( taskGroupId )) {
+			throw new Exception("taskGroupId is empty.");
+		}
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			return taskListService.listTaskListIdWithTask( emc, taskId, taskGroupId );
+		} catch (Exception e) {
+			throw e;
+		}
+	}
+
 	/**
 	 *  根据用户和项目ID查询工作任务列表
 	 * @param person
@@ -151,4 +176,7 @@ public class TaskListQueryService {
 		taskList.setOwner( person );
 		return taskList;
 	}
+
+
+
 }

+ 6 - 1
o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/TaskListService.java

@@ -66,6 +66,11 @@ class TaskListService {
 		Business business = new Business( emc );	
 		return business.taskListFactory().listTaskListWithTask( taskId, taskGroupId );
 	}
+
+	public List<String> listTaskListIdWithTask(EntityManagerContainer emc, String taskId, String taskGroupId ) throws Exception {
+		Business business = new Business( emc );
+		return business.taskListFactory().listTaskListIdWithTask( taskId, taskGroupId );
+	}
 	
 	public List<String> listTaskListIdsWithGroup(EntityManagerContainer emc, String taskGroupId, String person) throws Exception {
 		Business business = new Business( emc );	
@@ -117,7 +122,7 @@ class TaskListService {
 	/**
 	 * 向数据库持久化工作任务列表列表信息
 	 * @param emc
-	 * @param taskList
+	 * @param object
 	 * @return
 	 * @throws Exception 
 	 */

+ 30 - 2
o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/TaskPersistService.java

@@ -79,6 +79,7 @@ public class TaskPersistService {
 		if ( task == null) {
 			throw new Exception( "task is null." );
 		}
+
 		if( StringUtils.isEmpty( task.getName() )) {
 			task.setName("无标题工作任务("+ DateOperation.getNowDateTime() +")");
 		}		
@@ -190,7 +191,34 @@ public class TaskPersistService {
 			throw e;
 		}
 	}
-	
+
+
+	/**
+	 * 更新任务的上级任务ID信息
+	 * @param taskId
+	 * @param parentId
+	 * @param effectivePerson
+	 * @throws Exception
+	 */
+	public void updateParentId( String taskId, String parentId, EffectivePerson effectivePerson) throws Exception {
+
+		if( StringUtils.isEmpty( taskId )) {
+			throw new Exception("taskId can not empty in update parentId.");
+		}
+		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Task task = emc.find( taskId, Task.class );
+			if( task != null ){
+				task.setParent( parentId );
+			}
+			emc.beginTransaction( Task.class );
+			emc.check( task, CheckPersistType.all );
+			emc.commit();
+		} catch (Exception e) {
+			throw e;
+		}
+
+	}
+
 	/**
 	 * 查询用户是否拥有创建工作任务的权限
 	 * @param effectivePerson
@@ -588,5 +616,5 @@ public class TaskPersistService {
 		}
 	}
 
-	
+
 }

+ 6 - 3
o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/TaskQueryService.java

@@ -217,7 +217,9 @@ public class TaskQueryService {
 					for( TaskListRele rele : taskListReles ) {
 						task = emc.find( rele.getTaskId(), Task.class );
 						//只查询自己负责的任务
-						if( personName.equalsIgnoreCase( task.getExecutor() )) {
+						if( personName.equalsIgnoreCase( task.getExecutor() ) ||
+								( task.getParticipantList() !=null && task.getParticipantList().contains( personName ))
+						) {
 							task.setOrder( rele.getOrder() );
 							resultList.add( task );
 						}
@@ -252,7 +254,9 @@ public class TaskQueryService {
 				if( ListTools.isNotEmpty( taskListTmp )) {
 					for( Task _task : taskListTmp ) {
 						//只查询自己负责的任务
-						if( personName.equalsIgnoreCase( _task.getExecutor() )) {
+						if( personName.equalsIgnoreCase( _task.getExecutor() )||
+								( _task.getParticipantList() !=null && _task.getParticipantList().contains( personName )))
+						{
 							resultList.add( _task );
 						}
 					}
@@ -266,7 +270,6 @@ public class TaskQueryService {
 	
 	/**
 	 * 在人员的可见范围之类,根据指定的工作任务ID,查询子任务列表
-	 * @param project
 	 * @param taskId
 	 * @param effectivePerson
 	 * @return

+ 4 - 4
o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/service/TaskService.java

@@ -138,11 +138,11 @@ class TaskService {
 	/**
 	 * 向数据库持久化工作任务信息
 	 * @param emc
-	 * @param taskExtField 
-	 * @param taskDetail 
-	 * @param task
+	 * @param object
+	 * @param detail
+	 * @param extField
 	 * @return
-	 * @throws Exception 
+	 * @throws Exception
 	 */
 	protected Task save( EntityManagerContainer emc, Task object, TaskDetail detail, TaskExtField extField ) throws Exception {
 		Task task = null;

+ 1 - 0
o2server/x_teamwork_assemble_control/src/main/webapp/describe/sources/com/x/teamwork/assemble/control/timertask/Timertask_BatchOperationTask.java

@@ -42,6 +42,7 @@ public class Timertask_BatchOperationTask extends AbstractJob {
 					try {
 						logger.info("Timertask_BatchOperationTask -> send operation to queue[queueBatchOperation]......");
 						ThisApplication.queueBatchOperation.send( operation );
+						Thread.sleep(500 );
 					} catch (Exception e) {
 						logger.warn("Timertask_BatchOperationTask -> send operation to queue got an exception.");
 						logger.error(e);

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است