Преглед изворни кода

Merge branch 'fix/dumpSize' into 'develop'

dumpSize=200

See merge request o2oa/o2oa!1651

(cherry picked from commit 71f230c2bb9d64dd3b58d115fdbb2fb241fe254f)

d6048736 dumpSize=200
o2null пре 5 година
родитељ
комит
47054a4e1a
76 измењених фајлова са 1097 додато и 323 уклоњено
  1. 2 1
      o2server/configSample/dumpRestoreData.json
  2. 87 87
      o2server/x_base_core_project/src/main/java/com/x/base/core/entity/StorageObject.java
  3. 18 18
      o2server/x_base_core_project/src/main/java/com/x/base/core/entity/annotation/ContainerEntity.java
  4. 1 2
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/build/CreateConfigSample.java
  5. 17 17
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Config.java
  6. 1 1
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/CreateSample.java
  7. 14 0
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/DumpRestoreData.java
  8. 0 106
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/DumpRestoreStorage.java
  9. 4 3
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/jaxrs/ResponseFactory.java
  10. 1 1
      o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSConfigSetting.java
  11. 1 1
      o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSForumInfo.java
  12. 1 1
      o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSOperationRecord.java
  13. 1 1
      o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSPermissionInfo.java
  14. 1 1
      o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSPermissionRole.java
  15. 1 1
      o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSReplyInfo.java
  16. 1 1
      o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSRoleInfo.java
  17. 1 1
      o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSSectionInfo.java
  18. 1 1
      o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSSubjectAttachment.java
  19. 1 1
      o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSSubjectInfo.java
  20. 1 1
      o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSSubjectVoteResult.java
  21. 2 2
      o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSUserInfo.java
  22. 1 1
      o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSUserRole.java
  23. 1 1
      o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSVoteOption.java
  24. 1 1
      o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSVoteOptionGroup.java
  25. 7 3
      o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSVoteRecord.java
  26. 1 1
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/AppInfo.java
  27. 1 1
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/AppInfoConfig.java
  28. 1 1
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/CategoryExt.java
  29. 1 1
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/CategoryInfo.java
  30. 1 1
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/CmsBatchOperation.java
  31. 1 1
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/Document.java
  32. 1 1
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/DocumentCommend.java
  33. 1 1
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/DocumentCommentCommend.java
  34. 1 1
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/DocumentCommentContent.java
  35. 1 1
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/DocumentCommentInfo.java
  36. 1 1
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/DocumentViewRecord.java
  37. 1 1
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/Log.java
  38. 1 1
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/ReadRemind.java
  39. 4 4
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/Review.java
  40. 1 1
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/element/AppDict.java
  41. 1 1
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/element/AppDictItem.java
  42. 1 1
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/element/File.java
  43. 1 1
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/element/Form.java
  44. 1 1
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/element/FormField.java
  45. 1 1
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/element/QueryView.java
  46. 1 1
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/element/Script.java
  47. 1 1
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/element/TemplateForm.java
  48. 1 1
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/element/View.java
  49. 1 1
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/element/ViewCategory.java
  50. 1 1
      o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/element/ViewFieldConfig.java
  51. 1 1
      o2server/x_component_core_entity/src/main/java/com/x/component/core/entity/Component.java
  52. 3 3
      o2server/x_console/src/main/java/com/x/server/console/action/DumpData.java
  53. 15 2
      o2server/x_console/src/main/java/com/x/server/console/action/RestoreData.java
  54. 2 2
      o2server/x_console/src/main/java/com/x/server/console/server/JettySeverTools.java
  55. 5 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/Business.java
  56. 3 1
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ActionListWithPerson.java
  57. 1 1
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/control/ActionGetWorkOrWorkCompleted.java
  58. 1 1
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/control/BaseAction.java
  59. 148 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/form/V2FindWithWorkOrWorkCompleted2.java
  60. 674 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/V2GetWorkOrWorkCompleted.java
  61. 2 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/V2ManageRetract.java
  62. 31 4
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/WorkAction.java
  63. 1 1
      o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/DocumentVersion.java
  64. 1 1
      o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/Draft.java
  65. 1 1
      o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/KeyLock.java
  66. 1 1
      o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/Read.java
  67. 2 4
      o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/ReadCompleted.java
  68. 1 1
      o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/Review.java
  69. 1 3
      o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/SerialNumber.java
  70. 1 1
      o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/Task.java
  71. 1 1
      o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/TaskCompleted.java
  72. 1 1
      o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/Work.java
  73. 2 4
      o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/WorkCompleted.java
  74. 1 1
      o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/WorkLog.java
  75. 1 1
      o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/temporary/ServiceValue.java
  76. 1 1
      o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/temporary/TriggerWorkRecord.java

+ 2 - 1
o2server/configSample/dumpRestoreData.json

@@ -12,5 +12,6 @@
   "###mode": "导出数据模式,lite|full,默认使用lite###",
   "###parallel": "使用并行导出,默认true###",
   "###redistribute": "是否进行重新分布.###",
-  "###exceptionInvalidStorage": "无法获取storage是否升起错误.###"
+  "###exceptionInvalidStorage": "无法获取storage是否升起错误.###",
+  "###restoreOverride": "数据导入方式,clean:清空重新导入,skipExisted:如果有相同id的数据跳过.默认方式为clean.###"
 }

+ 87 - 87
o2server/x_base_core_project/src/main/java/com/x/base/core/entity/StorageObject.java

@@ -113,7 +113,7 @@ public abstract class StorageObject extends SliceJpaObject {
 	public Long saveContent(StorageMapping mapping, InputStream input, String name) throws Exception {
 		this.setName(name);
 		this.setDeepPath(mapping.getDeepPath());
-		this.setExtension(StringUtils.lowerCase(FilenameUtils.getExtension(name)));
+		this.setExtension(StringUtils.lowerCase(StringUtils.substringAfterLast(name, ".")));
 		return this.updateContent(mapping, input);
 	}
 
@@ -325,38 +325,38 @@ public abstract class StorageObject extends SliceJpaObject {
 			throw new Exception("storage protocol is null.");
 		}
 		switch (mapping.getProtocol()) {
-			// bzip2,file, ftp, ftps, gzip, hdfs, http, https, jar, ram, res, sftp,
-			// tar, temp, webdav, zip, cifs, mime;
-			case ftp:
-				// ftp://[ username[: password]@] hostname[: port][ relative-path]
-				prefix = "ftp://" + URLEncoder.encode(mapping.getUsername(), DefaultCharset.name) + ":"
-						+ URLEncoder.encode(mapping.getPassword(), DefaultCharset.name) + "@" + mapping.getHost() + ":"
-						+ mapping.getPort();
-				break;
-			case ftps:
-				// ftps://[ username[: password]@] hostname[: port][ relative-path]
-				prefix = "ftps://" + URLEncoder.encode(mapping.getUsername(), DefaultCharset.name) + ":"
-						+ URLEncoder.encode(mapping.getPassword(), DefaultCharset.name) + "@" + mapping.getHost() + ":"
-						+ mapping.getPort();
-				break;
-			case cifs:
-				// smb://[ username[: password]@] hostname[: port][ absolute-path]
-				prefix = "smb://" + URLEncoder.encode(mapping.getUsername(), DefaultCharset.name) + ":"
-						+ URLEncoder.encode(mapping.getPassword(), DefaultCharset.name) + "@" + mapping.getHost() + ":"
-						+ mapping.getPort();
-				break;
-			case webdav:
-				// webdav://[ username[: password]@] hostname[: port][ absolute-path]
-				prefix = "webdav://" + URLEncoder.encode(mapping.getUsername(), DefaultCharset.name) + ":"
-						+ URLEncoder.encode(mapping.getPassword(), DefaultCharset.name) + "@" + mapping.getHost() + ":"
-						+ mapping.getPort();
-				break;
-			case file:
-				// [file://] absolute-path
-				prefix = "file://";
-				break;
-			default:
-				break;
+		// bzip2,file, ftp, ftps, gzip, hdfs, http, https, jar, ram, res, sftp,
+		// tar, temp, webdav, zip, cifs, mime;
+		case ftp:
+			// ftp://[ username[: password]@] hostname[: port][ relative-path]
+			prefix = "ftp://" + URLEncoder.encode(mapping.getUsername(), DefaultCharset.name) + ":"
+					+ URLEncoder.encode(mapping.getPassword(), DefaultCharset.name) + "@" + mapping.getHost() + ":"
+					+ mapping.getPort();
+			break;
+		case ftps:
+			// ftps://[ username[: password]@] hostname[: port][ relative-path]
+			prefix = "ftps://" + URLEncoder.encode(mapping.getUsername(), DefaultCharset.name) + ":"
+					+ URLEncoder.encode(mapping.getPassword(), DefaultCharset.name) + "@" + mapping.getHost() + ":"
+					+ mapping.getPort();
+			break;
+		case cifs:
+			// smb://[ username[: password]@] hostname[: port][ absolute-path]
+			prefix = "smb://" + URLEncoder.encode(mapping.getUsername(), DefaultCharset.name) + ":"
+					+ URLEncoder.encode(mapping.getPassword(), DefaultCharset.name) + "@" + mapping.getHost() + ":"
+					+ mapping.getPort();
+			break;
+		case webdav:
+			// webdav://[ username[: password]@] hostname[: port][ absolute-path]
+			prefix = "webdav://" + URLEncoder.encode(mapping.getUsername(), DefaultCharset.name) + ":"
+					+ URLEncoder.encode(mapping.getPassword(), DefaultCharset.name) + "@" + mapping.getHost() + ":"
+					+ mapping.getPort();
+			break;
+		case file:
+			// [file://] absolute-path
+			prefix = "file://";
+			break;
+		default:
+			break;
 		}
 		return prefix + (StringUtils.isEmpty(mapping.getPrefix()) ? "" : ("/" + mapping.getPrefix()));
 	}
@@ -367,60 +367,60 @@ public abstract class StorageObject extends SliceJpaObject {
 			throw new Exception("storage protocol is null.");
 		}
 		switch (mapping.getProtocol()) {
-			// bzip2,file, ftp, ftps, gzip, hdfs, http, https, jar, ram, res, sftp,
-			// tar, temp, webdav, zip, cifs, mime;
-			case ftp:
-				FtpFileSystemConfigBuilder ftpBuilder = FtpFileSystemConfigBuilder.getInstance();
-				/*
-				 * 如果使用被动模式在阿里云centos7下会经常性出现无法连接 Caused by: java.net.ConnectException:
-				 * Connection timed out (Connection timed out) at
-				 * java.net.PlainSocketImpl.socketConnect(Native Method) at
-				 * java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
-				 * at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.
-				 * java:206) at
-				 * java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at
-				 * java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at
-				 * java.net.Socket.connect(Socket.java:589)
-				 */
-				ftpBuilder.setPassiveMode(opts, Config.vfs().getFtp().getPassive());
-				// builder.setPassiveMode(opts, false);
-				// builder.setPassiveMode(opts, true);
-				/** 强制不校验IP */
-				ftpBuilder.setRemoteVerification(opts, false);
-				// FtpFileType.BINARY is the default
-				ftpBuilder.setFileType(opts, FtpFileType.BINARY);
-				ftpBuilder.setConnectTimeout(opts, 10000);
-				ftpBuilder.setSoTimeout(opts, 10000);
-				ftpBuilder.setControlEncoding(opts, DefaultCharset.name);
-				break;
-			case ftps:
-				FtpsFileSystemConfigBuilder ftpsBuilder = FtpsFileSystemConfigBuilder.getInstance();
-				ftpsBuilder.setPassiveMode(opts, Config.vfs().getFtp().getPassive());
-				/** 强制不校验IP */
-				ftpsBuilder.setRemoteVerification(opts, false);
-				// FtpFileType.BINARY is the default
-				ftpsBuilder.setFileType(opts, FtpFileType.BINARY);
-				ftpsBuilder.setConnectTimeout(opts, 10000);
-				ftpsBuilder.setSoTimeout(opts, 10000);
-				ftpsBuilder.setControlEncoding(opts, DefaultCharset.name);
-				break;
-			case cifs:
-				break;
-			case webdav:
-				WebdavFileSystemConfigBuilder webdavBuilder = (WebdavFileSystemConfigBuilder) WebdavFileSystemConfigBuilder
-						.getInstance();
-				webdavBuilder.setConnectionTimeout(opts, 10000);
-				webdavBuilder.setSoTimeout(opts, 10000);
-				webdavBuilder.setUrlCharset(opts, DefaultCharset.name);
-				webdavBuilder.setMaxConnectionsPerHost(opts, 200);
-				webdavBuilder.setMaxTotalConnections(opts, 200);
-				webdavBuilder.setFollowRedirect(opts, true);
-				// webdavBuilder.setVersioning(opts, true);
-				break;
-			case file:
-				break;
-			default:
-				break;
+		// bzip2,file, ftp, ftps, gzip, hdfs, http, https, jar, ram, res, sftp,
+		// tar, temp, webdav, zip, cifs, mime;
+		case ftp:
+			FtpFileSystemConfigBuilder ftpBuilder = FtpFileSystemConfigBuilder.getInstance();
+			/*
+			 * 如果使用被动模式在阿里云centos7下会经常性出现无法连接 Caused by: java.net.ConnectException:
+			 * Connection timed out (Connection timed out) at
+			 * java.net.PlainSocketImpl.socketConnect(Native Method) at
+			 * java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
+			 * at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.
+			 * java:206) at
+			 * java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at
+			 * java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at
+			 * java.net.Socket.connect(Socket.java:589)
+			 */
+			ftpBuilder.setPassiveMode(opts, Config.vfs().getFtp().getPassive());
+			// builder.setPassiveMode(opts, false);
+			// builder.setPassiveMode(opts, true);
+			/** 强制不校验IP */
+			ftpBuilder.setRemoteVerification(opts, false);
+			// FtpFileType.BINARY is the default
+			ftpBuilder.setFileType(opts, FtpFileType.BINARY);
+			ftpBuilder.setConnectTimeout(opts, 10000);
+			ftpBuilder.setSoTimeout(opts, 10000);
+			ftpBuilder.setControlEncoding(opts, DefaultCharset.name);
+			break;
+		case ftps:
+			FtpsFileSystemConfigBuilder ftpsBuilder = FtpsFileSystemConfigBuilder.getInstance();
+			ftpsBuilder.setPassiveMode(opts, Config.vfs().getFtp().getPassive());
+			/** 强制不校验IP */
+			ftpsBuilder.setRemoteVerification(opts, false);
+			// FtpFileType.BINARY is the default
+			ftpsBuilder.setFileType(opts, FtpFileType.BINARY);
+			ftpsBuilder.setConnectTimeout(opts, 10000);
+			ftpsBuilder.setSoTimeout(opts, 10000);
+			ftpsBuilder.setControlEncoding(opts, DefaultCharset.name);
+			break;
+		case cifs:
+			break;
+		case webdav:
+			WebdavFileSystemConfigBuilder webdavBuilder = (WebdavFileSystemConfigBuilder) WebdavFileSystemConfigBuilder
+					.getInstance();
+			webdavBuilder.setConnectionTimeout(opts, 10000);
+			webdavBuilder.setSoTimeout(opts, 10000);
+			webdavBuilder.setUrlCharset(opts, DefaultCharset.name);
+			webdavBuilder.setMaxConnectionsPerHost(opts, 200);
+			webdavBuilder.setMaxTotalConnections(opts, 200);
+			webdavBuilder.setFollowRedirect(opts, true);
+			// webdavBuilder.setVersioning(opts, true);
+			break;
+		case file:
+			break;
+		default:
+			break;
 		}
 		return opts;
 	}

+ 18 - 18
o2server/x_base_core_project/src/main/java/com/x/base/core/entity/annotation/ContainerEntity.java

@@ -19,27 +19,27 @@ import java.lang.annotation.Target;
 
 public @interface ContainerEntity {
 
-    /**
-     * 执行dump时分组数量
-     */
-    public int dumpSize() default 1000;
+	/**
+	 * 执行dump时分组数量
+	 */
+	public int dumpSize() default 200;
 
-    /**
-     * 类型
-     */
-    public Type type() default Type.content;
+	/**
+	 * 类型
+	 */
+	public Type type() default Type.content;
 
-    /**
-     * 引用,强数据,软数据(软数据不会影响系统运行)
-     */
+	/**
+	 * 引用,强数据,软数据(软数据不会影响系统运行)
+	 */
 
-    public Reference reference() default Reference.strong;
+	public Reference reference() default Reference.strong;
 
-    public enum Type {
-        element, content, log, custom;
-    }
+	public enum Type {
+		element, content, log, custom;
+	}
 
-    public enum Reference {
-        strong, soft;
-    }
+	public enum Reference {
+		strong, soft;
+	}
 }

+ 1 - 2
o2server/x_base_core_project/src/main/java/com/x/base/core/project/build/CreateConfigSample.java

@@ -27,7 +27,6 @@ import com.x.base.core.project.config.Components;
 import com.x.base.core.project.config.ConfigObject;
 import com.x.base.core.project.config.Dingding;
 import com.x.base.core.project.config.DumpRestoreData;
-import com.x.base.core.project.config.DumpRestoreStorage;
 import com.x.base.core.project.config.Exmail;
 import com.x.base.core.project.config.LogLevel;
 import com.x.base.core.project.config.Meeting;
@@ -64,7 +63,7 @@ public class CreateConfigSample {
 		classes.add(Components.class);
 		classes.add(Dingding.class);
 		classes.add(DumpRestoreData.class);
-		classes.add(DumpRestoreStorage.class);
+		// classes.add(DumpRestoreStorage.class);
 		classes.add(Exmail.class);
 		classes.add(LogLevel.class);
 		classes.add(Meeting.class);

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

@@ -740,23 +740,23 @@ public class Config {
 		return instance().dumpRestoreData;
 	}
 
-	public DumpRestoreStorage dumpRestoreStorage;
-
-	public static DumpRestoreStorage dumpRestoreStorage() throws Exception {
-		if (null == instance().dumpRestoreStorage) {
-			synchronized (Config.class) {
-				if (null == instance().dumpRestoreStorage) {
-					DumpRestoreStorage obj = BaseTools.readConfigObject(PATH_CONFIG_DUMPRESTORESTORAGE,
-							DumpRestoreStorage.class);
-					if (null == obj) {
-						obj = DumpRestoreStorage.defaultInstance();
-					}
-					instance().dumpRestoreStorage = obj;
-				}
-			}
-		}
-		return instance().dumpRestoreStorage;
-	}
+//	public DumpRestoreStorage dumpRestoreStorage;
+//
+//	public static DumpRestoreStorage dumpRestoreStorage() throws Exception {
+//		if (null == instance().dumpRestoreStorage) {
+//			synchronized (Config.class) {
+//				if (null == instance().dumpRestoreStorage) {
+//					DumpRestoreStorage obj = BaseTools.readConfigObject(PATH_CONFIG_DUMPRESTORESTORAGE,
+//							DumpRestoreStorage.class);
+//					if (null == obj) {
+//						obj = DumpRestoreStorage.defaultInstance();
+//					}
+//					instance().dumpRestoreStorage = obj;
+//				}
+//			}
+//		}
+//		return instance().dumpRestoreStorage;
+//	}
 
 	public String initialScriptText;
 

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

@@ -36,7 +36,7 @@ public class CreateSample {
 		classes.add(Collect.class);
 		classes.add(Dingding.class);
 		classes.add(DumpRestoreData.class);
-		classes.add(DumpRestoreStorage.class);
+		//classes.add(DumpRestoreStorage.class);
 		classes.add(LogLevel.class);
 		classes.add(Meeting.class);
 		classes.add(Messages.class);

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

@@ -19,6 +19,9 @@ public class DumpRestoreData extends ConfigObject {
 
 	public static final String TYPE_FULL = "full";
 	public static final String TYPE_LITE = "lite";
+	public static final String RESTOREOVERRIDE_CLEAN = "clean";
+	public static final String RESTOREOVERRIDE_SKIPEXISTED = "skipExisted";
+
 	public static final String DEFAULT_TYPE = TYPE_LITE;
 	public static final Boolean DEFAULT_PARALLEL = true;
 	public static final Boolean DEFAULT_REDISTRIBUTE = true;
@@ -55,6 +58,9 @@ public class DumpRestoreData extends ConfigObject {
 	@FieldDescribe("无法获取storage是否升起错误.")
 	private Boolean exceptionInvalidStorage;
 
+	@FieldDescribe("数据导入方式,clean:清空重新导入,skipExisted:如果有相同id的数据跳过.默认方式为clean.")
+	private String restoreOverride;
+
 	public Boolean getRedistribute() {
 		return BooleanUtils.isNotFalse(redistribute);
 	}
@@ -119,4 +125,12 @@ public class DumpRestoreData extends ConfigObject {
 		this.mode = mode;
 	}
 
+	public String getRestoreOverride() {
+		return restoreOverride;
+	}
+
+	public void setRestoreOverride(String restoreOverride) {
+		this.restoreOverride = restoreOverride;
+	}
+
 }

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

@@ -1,106 +0,0 @@
-package com.x.base.core.project.config;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.commons.lang3.BooleanUtils;
-
-import com.x.base.core.project.annotation.FieldDescribe;
-import com.x.base.core.project.gson.GsonPropertyObject;
-import com.x.base.core.project.tools.ListTools;
-
-public class DumpRestoreStorage extends GsonPropertyObject {
-
-	public static DumpRestoreStorage defaultInstance() {
-		return new DumpRestoreStorage();
-	}
-
-	public static final int default_batchSize = 100;
-
-	public DumpRestoreStorage() {
-		this.includes = new ArrayList<String>();
-		this.excludes = new ArrayList<String>();
-		this.batchSize = default_batchSize;
-		this.redistribute = true;
-		this.exceptionInvalidStorage = true;
-	}
-
-	@FieldDescribe("是否启用.")
-	private Boolean enable;
-
-	@FieldDescribe("导出导入包含对象,可以使用通配符*.")
-	private List<String> includes;
-
-	@FieldDescribe("导出导入排除对象,可以使用通配符*.")
-	private List<String> excludes;
-
-	@FieldDescribe("批量对象数量.")
-	private Integer batchSize;
-
-	@FieldDescribe("是否进行重新分布.")
-	private Boolean redistribute;
-
-	@FieldDescribe("无法获取storage是否升起错误.")
-	private Boolean exceptionInvalidStorage;
-
-	public Boolean getEnable() {
-		return BooleanUtils.isTrue(this.enable);
-	}
-
-	public List<String> getIncludes() {
-		List<String> list = new ArrayList<>();
-		for (String str : ListTools.trim(this.includes, true, true)) {
-			list.add(str);
-		}
-		return list;
-	}
-
-	public List<String> getExcludes() {
-		List<String> list = new ArrayList<>();
-		for (String str : ListTools.trim(this.excludes, true, true)) {
-			list.add(str);
-		}
-		return list;
-	}
-
-	public Boolean getRedistribute() {
-		return BooleanUtils.isNotFalse(this.redistribute);
-	}
-
-	/** 默认为true */
-	public Boolean getExceptionInvalidStorage() {
-		return BooleanUtils.isNotFalse(this.exceptionInvalidStorage);
-	}
-
-	public Integer getBatchSize() {
-		if ((null == this.batchSize) || (this.batchSize < 1)) {
-			return 500;
-		}
-		return this.batchSize;
-	}
-
-	public void setIncludes(List<String> includes) {
-		this.includes = includes;
-	}
-
-	public void setExcludes(List<String> excludes) {
-		this.excludes = excludes;
-	}
-
-	public void setBatchSize(Integer batchSize) {
-		this.batchSize = batchSize;
-	}
-
-	public void setRedistribute(Boolean redistribute) {
-		this.redistribute = redistribute;
-	}
-
-	public void setExceptionInvalidStorage(Boolean exceptionInvalidStorage) {
-		this.exceptionInvalidStorage = exceptionInvalidStorage;
-	}
-
-	public void setEnable(Boolean enable) {
-		this.enable = enable;
-	}
-
-}

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

@@ -1,6 +1,7 @@
 package com.x.base.core.project.jaxrs;
 
 import java.net.URI;
+import java.util.Date;
 import java.util.Objects;
 import java.util.zip.CRC32;
 
@@ -9,15 +10,15 @@ import javax.ws.rs.core.CacheControl;
 import javax.ws.rs.core.EntityTag;
 import javax.ws.rs.core.Response;
 
+import org.apache.commons.lang3.StringUtils;
+import org.eclipse.jetty.http.HttpHeader;
+
 import com.x.base.core.project.exception.CallbackPromptException;
 import com.x.base.core.project.gson.XGsonBuilder;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.HttpMediaType;
 import com.x.base.core.project.tools.DefaultCharset;
 
-import org.apache.commons.lang3.StringUtils;
-import org.eclipse.jetty.http.HttpHeader;
-
 public class ResponseFactory {
 
 	private static CacheControl defaultCacheControl = CacheControlFactory.getDefault();

+ 1 - 1
o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSConfigSetting.java

@@ -21,7 +21,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
  * 
  * @author LIYI
  */
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.BBSConfigSetting.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.BBSConfigSetting.table + JpaObject.IndexNameMiddle

+ 1 - 1
o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSForumInfo.java

@@ -21,7 +21,7 @@ import java.util.List;
  * 
  * @author LIYI
  */
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.BBSForumInfo.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.BBSForumInfo.table + JpaObject.IndexNameMiddle

+ 1 - 1
o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSOperationRecord.java

@@ -21,7 +21,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
  * 
  * @author LIYI
  */
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.BBSOperationRecord.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.BBSOperationRecord.table + JpaObject.IndexNameMiddle

+ 1 - 1
o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSPermissionInfo.java

@@ -21,7 +21,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
  * 
  * @author LIYI
  */
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.BBSPermissionInfo.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.BBSPermissionInfo.table + JpaObject.IndexNameMiddle

+ 1 - 1
o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSPermissionRole.java

@@ -21,7 +21,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
  * 
  * @author LIYI
  */
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.BBSPermissionRole.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.BBSPermissionRole.table + JpaObject.IndexNameMiddle

+ 1 - 1
o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSReplyInfo.java

@@ -24,7 +24,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
  * 
  * @author LIYI
  */
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.BBSReplyInfo.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.BBSReplyInfo.table + JpaObject.IndexNameMiddle

+ 1 - 1
o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSRoleInfo.java

@@ -21,7 +21,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
  * 
  * @author LIYI
  */
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.BBSRoleInfo.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.BBSRoleInfo.table + JpaObject.IndexNameMiddle

+ 1 - 1
o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSSectionInfo.java

@@ -20,7 +20,7 @@ import java.util.List;
  * 
  * @author LIYI
  */
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.BBSSectionInfo.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.BBSSectionInfo.table + JpaObject.IndexNameMiddle

+ 1 - 1
o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSSubjectAttachment.java

@@ -29,7 +29,7 @@ import com.x.base.core.project.tools.DateTools;
 /**
  * 附件信息管理表
  */
-@ContainerEntity(dumpSize = 10, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 5, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.BBSSubjectAttachment.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.BBSSubjectAttachment.table + JpaObject.IndexNameMiddle

+ 1 - 1
o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSSubjectInfo.java

@@ -33,7 +33,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
  * 
  * @author LIYI
  */
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.BBSSubjectInfo.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.BBSSubjectInfo.table + JpaObject.IndexNameMiddle

+ 1 - 1
o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSSubjectVoteResult.java

@@ -24,7 +24,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
  * 
  * @author LIYI
  */
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.BBSSubjectVoteResult.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.BBSSubjectVoteResult.table + JpaObject.IndexNameMiddle

+ 2 - 2
o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSUserInfo.java

@@ -28,7 +28,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
  * 
  * @author LIYI
  */
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.BBSUserInfo.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.BBSUserInfo.table + JpaObject.IndexNameMiddle
@@ -180,7 +180,7 @@ public class BBSUserInfo extends SliceJpaObject {
 	@FieldDescribe("上次访问时间")
 	@Temporal(TemporalType.TIMESTAMP)
 	@Column(name = ColumnNamePrefix + lastVisitTime_FIELDNAME)
-	@CheckPersist(allowEmpty = false)
+	@CheckPersist(allowEmpty = true)
 	private Date lastVisitTime = null;
 
 	public static final String lastOperationTime_FIELDNAME = "lastOperationTime";

+ 1 - 1
o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSUserRole.java

@@ -21,7 +21,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
  * 
  * @author LIYI
  */
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.BBSUserRole.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.BBSUserRole.table + JpaObject.IndexNameMiddle

+ 1 - 1
o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSVoteOption.java

@@ -21,7 +21,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
  * 
  * @author LIYI
  */
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.BBSVoteOption.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.BBSVoteOption.table + JpaObject.IndexNameMiddle

+ 1 - 1
o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSVoteOptionGroup.java

@@ -21,7 +21,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
  * 
  * @author LIYI
  */
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.BBSVoteOptionGroup.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.BBSVoteOptionGroup.table + JpaObject.IndexNameMiddle

+ 7 - 3
o2server/x_bbs_core_entity/src/main/java/com/x/bbs/entity/BBSVoteRecord.java

@@ -21,7 +21,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
  * 
  * @author LIYI
  */
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.BBSVoteRecord.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.BBSVoteRecord.table + JpaObject.IndexNameMiddle
@@ -169,7 +169,11 @@ public class BBSVoteRecord extends SliceJpaObject {
 		this.optionId = optionId;
 	}
 
-	public String getOptionGroupId() { return this.optionGroupId; }
+	public String getOptionGroupId() {
+		return this.optionGroupId;
+	}
 
-	public void setOptionGroupId(final String optionGroupId) { this.optionGroupId = optionGroupId; }
+	public void setOptionGroupId(final String optionGroupId) {
+		this.optionGroupId = optionGroupId;
+	}
 }

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

@@ -24,7 +24,7 @@ import java.util.List;
  * @author O2LEE
  *
  */
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.AppInfo.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.AppInfo.table + JpaObject.IndexNameMiddle

+ 1 - 1
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/AppInfoConfig.java

@@ -14,7 +14,7 @@ import javax.persistence.*;
  * @author O2LEE
  *
  */
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.AppInfoConfig.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.AppInfoConfig.table + JpaObject.IndexNameMiddle

+ 1 - 1
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/CategoryExt.java

@@ -20,7 +20,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
  * 内容管理应用目录分类扩展信息
  *
  */
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.CategoryExt.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.CategoryExt.table + JpaObject.IndexNameMiddle

+ 1 - 1
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/CategoryInfo.java

@@ -36,7 +36,7 @@ import com.x.base.core.project.tools.ListTools;
  * @author O2LEE
  *
  */
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.CategoryInfo.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.CategoryInfo.table + JpaObject.IndexNameMiddle

+ 1 - 1
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/CmsBatchOperation.java

@@ -18,7 +18,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
  * 数据指处理,比如修改栏目名称引起的所有分类 和文档别名需要修改
  */
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.CmsBatchOperation.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.CmsBatchOperation.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,

+ 1 - 1
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/Document.java

@@ -37,7 +37,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
  *
  */
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.Document.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Document.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,

+ 1 - 1
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/DocumentCommend.java

@@ -22,7 +22,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
  * @author O2LEE
  *
  */
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.DocumentCommend.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.DocumentCommend.table + JpaObject.IndexNameMiddle

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

@@ -22,7 +22,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
  * @author O2LEE
  *
  */
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.DocumentCommentCommend.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.DocumentCommentCommend.table + JpaObject.IndexNameMiddle

+ 1 - 1
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/DocumentCommentContent.java

@@ -20,7 +20,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
 /**
  * 信息评论内容表
  */
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.DocumentCommentContent.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.DocumentCommentContent.table + JpaObject.IndexNameMiddle

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

@@ -19,7 +19,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
 /**
  * 信息评论表
  */
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.DocumentCommentInfo.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.DocumentCommentInfo.table + JpaObject.IndexNameMiddle

+ 1 - 1
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/DocumentViewRecord.java

@@ -24,7 +24,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
  * 内容管理日志信息表
  *
  */
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.DocumentViewRecord.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.DocumentViewRecord.table + JpaObject.IndexNameMiddle

+ 1 - 1
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/Log.java

@@ -20,7 +20,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
  * 内容管理日志信息表
  *
  */
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.Log.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Log.table + JpaObject.IndexNameMiddle

+ 1 - 1
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/ReadRemind.java

@@ -28,7 +28,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
  *
  */
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.ReadRemind.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.ReadRemind.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,

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

@@ -23,7 +23,7 @@ import com.x.base.core.entity.annotation.ContainerEntity;
 import com.x.base.core.project.annotation.FieldDescribe;
 
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.Review.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Review.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,
@@ -598,9 +598,9 @@ public class Review extends SliceJpaObject {
 		return sequence_FIELDNAME;
 	}
 
-	private String getSequenceString(String sequenceString ) {
-		if( StringUtils.length(sequenceString) > 60 ){
-			return StringUtils.substring(sequenceString, 0, 60 );
+	private String getSequenceString(String sequenceString) {
+		if (StringUtils.length(sequenceString) > 60) {
+			return StringUtils.substring(sequenceString, 0, 60);
 		}
 		return sequenceString;
 	}

+ 1 - 1
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/element/AppDict.java

@@ -22,7 +22,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
 import com.x.cms.core.entity.AppInfo;
 import com.x.cms.core.entity.PersistenceProperties;
 
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.Element.AppDict.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Element.AppDict.table + JpaObject.IndexNameMiddle

+ 1 - 1
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/element/AppDictItem.java

@@ -36,7 +36,7 @@ import com.x.cms.core.entity.AppInfo;
 import com.x.cms.core.entity.PersistenceProperties;
 
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.Element.AppDictItem.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Element.AppDictItem.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,

+ 1 - 1
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/element/File.java

@@ -39,7 +39,7 @@ import com.x.cms.core.entity.PersistenceProperties;
  *
  */
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 5, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.Element.File.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Element.File.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,

+ 1 - 1
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/element/Form.java

@@ -25,7 +25,7 @@ import com.x.cms.core.entity.AppInfo;
 import com.x.cms.core.entity.PersistenceProperties;
 
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 5, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.Element.Form.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Element.Form.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,

+ 1 - 1
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/element/FormField.java

@@ -21,7 +21,7 @@ import com.x.cms.core.entity.AppInfo;
 import com.x.cms.core.entity.PersistenceProperties;
 
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.Element.FormField.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Element.FormField.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,

+ 1 - 1
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/element/QueryView.java

@@ -33,7 +33,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
 import com.x.cms.core.entity.PersistenceProperties;
 
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.Element.QueryView.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Element.QueryView.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,

+ 1 - 1
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/element/Script.java

@@ -36,7 +36,7 @@ import com.x.cms.core.entity.AppInfo;
 import com.x.cms.core.entity.PersistenceProperties;
 
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 5, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.Element.Script.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Element.Script.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,

+ 1 - 1
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/element/TemplateForm.java

@@ -24,7 +24,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
 import com.x.cms.core.entity.PersistenceProperties;
 
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 5, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.Element.TemplateForm.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Element.TemplateForm.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,

+ 1 - 1
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/element/View.java

@@ -34,7 +34,7 @@ import com.x.cms.core.entity.AppInfo;
 import com.x.cms.core.entity.PersistenceProperties;
 
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.Element.View.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Element.View.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,

+ 1 - 1
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/element/ViewCategory.java

@@ -20,7 +20,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
 import com.x.cms.core.entity.PersistenceProperties;
 
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.Element.ViewCategory.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Element.ViewCategory.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,

+ 1 - 1
o2server/x_cms_core_entity/src/main/java/com/x/cms/core/entity/element/ViewFieldConfig.java

@@ -20,7 +20,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
 import com.x.cms.core.entity.PersistenceProperties;
 
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.Element.ViewFieldConfig.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Element.ViewFieldConfig.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,

+ 1 - 1
o2server/x_component_core_entity/src/main/java/com/x/component/core/entity/Component.java

@@ -27,7 +27,7 @@ import org.apache.openjpa.persistence.jdbc.ElementColumn;
 import org.apache.openjpa.persistence.jdbc.ElementIndex;
 import org.apache.openjpa.persistence.jdbc.Index;
 
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
 @Table(name = PersistenceProperties.Component.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Component.table + JpaObject.IndexNameMiddle

+ 3 - 3
o2server/x_console/src/main/java/com/x/server/console/action/DumpData.java

@@ -96,8 +96,8 @@ public class DumpData {
 					EntityManagerFactory emf = null;
 					EntityManager em = null;
 					try {
-						Thread.currentThread().setContextClassLoader(ClassLoaderTools.urlClassLoader(false,false,false,
-								false, false, Config.dir_local_temp_classes().toPath()));
+						Thread.currentThread().setContextClassLoader(ClassLoaderTools.urlClassLoader(false, false,
+								false, false, false, Config.dir_local_temp_classes().toPath()));
 						Thread.currentThread().setName(DumpData.class.getName() + ":" + className);
 						@SuppressWarnings("unchecked")
 						Class<JpaObject> cls = (Class<JpaObject>) Thread.currentThread().getContextClassLoader()
@@ -208,7 +208,7 @@ public class DumpData {
 				StorageObject s = (StorageObject) t;
 				String name = s.getStorage();
 				StorageMapping mapping = storageMappings.get(s.getClass(), name);
-				if (null == mapping && Config.dumpRestoreStorage().getExceptionInvalidStorage()) {
+				if (null == mapping && Config.dumpRestoreData().getExceptionInvalidStorage()) {
 					throw new ExceptionInvalidStorage(s);
 				}
 				if (null != mapping) {

+ 15 - 2
o2server/x_console/src/main/java/com/x/server/console/action/RestoreData.java

@@ -9,6 +9,7 @@ import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.stream.Stream;
@@ -33,6 +34,7 @@ import com.x.base.core.entity.JpaObject;
 import com.x.base.core.entity.StorageObject;
 import com.x.base.core.entity.annotation.ContainerEntity;
 import com.x.base.core.project.config.Config;
+import com.x.base.core.project.config.DumpRestoreData;
 import com.x.base.core.project.config.StorageMapping;
 import com.x.base.core.project.config.StorageMappings;
 import com.x.base.core.project.gson.XGsonBuilder;
@@ -41,6 +43,9 @@ import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.tools.ClassLoaderTools;
 import com.x.base.core.project.tools.DateTools;
 import com.x.base.core.project.tools.ListTools;
+import com.x.base.core.project.tools.StringTools;
+
+import net.sf.ehcache.hibernate.management.impl.BeanUtils;
 
 public class RestoreData {
 
@@ -150,8 +155,11 @@ public class RestoreData {
 					throw new ExceptionDirectoryNotExist(directory);
 				}
 				StorageMappings storageMappings = Config.storageMappings();
-				this.clean(cls, em, storageMappings, cls.getAnnotation(ContainerEntity.class));
-				em.clear();
+				if (!Objects.equals(Config.dumpRestoreData().getRestoreOverride(),
+						DumpRestoreData.RESTOREOVERRIDE_SKIPEXISTED)) {
+					this.clean(cls, em, storageMappings, cls.getAnnotation(ContainerEntity.class));
+					em.clear();
+				}
 				List<Path> paths = this.list(directory);
 				paths.stream().forEach(o -> {
 					logger.print("restore {}/{} part of data:{}.", batch.getAndAdd(1), paths.size(), cls.getName());
@@ -160,6 +168,11 @@ public class RestoreData {
 						JsonArray raws = this.convert(o);
 						for (JsonElement json : raws) {
 							Object t = gson.fromJson(json, cls);
+							if (Objects.equals(Config.dumpRestoreData().getRestoreOverride(),
+									DumpRestoreData.RESTOREOVERRIDE_SKIPEXISTED)
+									&& (null != em.find(cls, BeanUtils.getBeanProperty(t, JpaObject.id_FIELDNAME)))) {
+								continue;
+							}
 							if (StorageObject.class.isAssignableFrom(cls)) {
 								Path sub = o.resolveSibling(FilenameUtils.getBaseName(o.getFileName().toString()));
 								this.binary(t, cls, sub, storageMappings);

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

@@ -35,7 +35,7 @@ public abstract class JettySeverTools {
 		sslContextFactory.setTrustAll(true);
 		HttpConfiguration config = new HttpConfiguration();
 		config.setSecureScheme("https");
-		config.setOutputBufferSize(32768);
+		config.setOutputBufferSize(1024 * 2048);
 		config.setRequestHeaderSize(8192 * 2);
 		config.setResponseHeaderSize(8192 * 2);
 		config.setSendServerVersion(true);
@@ -52,7 +52,7 @@ public abstract class JettySeverTools {
 
 	protected static void addHttpConnector(Server server, Integer port) throws Exception {
 		HttpConfiguration config = new HttpConfiguration();
-		config.setOutputBufferSize(32768);
+		config.setOutputBufferSize(1024 * 2048);
 		config.setRequestHeaderSize(8192 * 2);
 		config.setResponseHeaderSize(8192 * 2);
 		config.setSendServerVersion(true);

+ 5 - 2
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/Business.java

@@ -16,6 +16,7 @@ import org.apache.commons.lang3.StringUtils;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.project.config.StorageMapping;
 import com.x.base.core.project.exception.PromptException;
+import com.x.base.core.project.gson.GsonPropertyObject;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.organization.OrganizationDefinition;
 import com.x.base.core.project.tools.ListTools;
@@ -1228,7 +1229,8 @@ public class Business {
 		}
 		try (ZipOutputStream zos = new ZipOutputStream(os)) {
 			for (Map.Entry<String, Attachment> entry : filePathMap.entrySet()) {
-				zos.putNextEntry(new ZipEntry(new ZipEntry(StringUtils.replaceEach(entry.getKey(), new String[]{"/","\\"}, new String[]{"-","-"}))));
+				zos.putNextEntry(new ZipEntry(new ZipEntry(StringUtils.replaceEach(entry.getKey(),
+						new String[] { "/", "\\" }, new String[] { "-", "-" }))));
 				StorageMapping mapping = ThisApplication.context().storageMappings().get(Attachment.class,
 						entry.getValue().getStorage());
 				try (ByteArrayOutputStream os1 = new ByteArrayOutputStream()) {
@@ -1241,7 +1243,8 @@ public class Business {
 
 			if (otherAttMap != null) {
 				for (Map.Entry<String, byte[]> entry : otherAttMap.entrySet()) {
-					zos.putNextEntry(new ZipEntry(StringUtils.replaceEach(entry.getKey(), new String[]{"/","\\"}, new String[]{"-","-"})));
+					zos.putNextEntry(new ZipEntry(StringUtils.replaceEach(entry.getKey(), new String[] { "/", "\\" },
+							new String[] { "-", "-" })));
 					zos.write(entry.getValue());
 				}
 			}

+ 3 - 1
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ActionListWithPerson.java

@@ -47,7 +47,9 @@ class ActionListWithPerson extends BaseAction {
 			List<String> ids = this.list(business, effectivePerson, roles, identities, units);
 			for (String id : ids) {
 				Application o = business.application().pick(id);
-				wos.add(Wo.copier.copy(o));
+				if (null != o) {
+					wos.add(Wo.copier.copy(o));
+				}
 			}
 			wos = business.application().sort(wos);
 			result.setData(wos);

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

@@ -211,7 +211,7 @@ class ActionGetWorkOrWorkCompleted extends BaseAction {
 		return this.canManageApplicationOrProcess;
 	}
 
-	public static class Wo extends Control {
+	public static class Wo extends AbstractControl {
 
 	}
 

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

@@ -5,7 +5,7 @@ import com.x.base.core.project.jaxrs.StandardJaxrsAction;
 
 abstract class BaseAction extends StandardJaxrsAction {
 
-	public static class Control extends GsonPropertyObject {
+	protected static class AbstractControl extends GsonPropertyObject {
 		/* 是否可以看到 */
 		private Boolean allowVisit = false;
 		/* 是否可以直接流转 */

+ 148 - 0
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/form/V2FindWithWorkOrWorkCompleted2.java

@@ -0,0 +1,148 @@
+package com.x.processplatform.assemble.surface.jaxrs.form;
+
+import java.util.Map.Entry;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.project.exception.ExceptionAccessDenied;
+import com.x.base.core.project.exception.ExceptionEntityNotExist;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Audit;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.PropertyTools;
+import com.x.processplatform.assemble.surface.Business;
+import com.x.processplatform.core.entity.content.Work;
+import com.x.processplatform.core.entity.content.WorkCompleted;
+import com.x.processplatform.core.entity.content.WorkCompletedProperties;
+import com.x.processplatform.core.entity.element.Activity;
+import com.x.processplatform.core.entity.element.Form;
+import com.x.processplatform.core.entity.element.Script;
+
+class V2FindWithWorkOrWorkCompleted2 extends BaseAction {
+
+	private static Logger logger = LoggerFactory.getLogger(V2FindWithWorkOrWorkCompleted2.class);
+
+	ActionResult<JsonElement> execute(EffectivePerson effectivePerson, String workOrWorkCompleted) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Audit audit = logger.audit(effectivePerson);
+			ActionResult<JsonElement> result = new ActionResult<>();
+
+			Business business = new Business(emc);
+
+			if (!business.readableWithWorkOrWorkCompleted(effectivePerson, workOrWorkCompleted,
+					new ExceptionEntityNotExist(workOrWorkCompleted))) {
+				throw new ExceptionAccessDenied(effectivePerson);
+			}
+
+			JsonElement wo = null;
+
+			Work work = emc.find(workOrWorkCompleted, Work.class);
+
+			if (null != work) {
+				wo = gson.toJsonTree(this.work(business, work));
+			} else {
+				wo = gson.toJsonTree(this.workCompleted(business, emc.flag(workOrWorkCompleted, WorkCompleted.class)));
+			}
+			audit.log(null, "查看");
+			result.setData(wo);
+			return result;
+		}
+	}
+
+	private Wo work(Business business, Work work) throws Exception {
+		Wo wo = new Wo();
+		String id = work.getForm();
+		if (StringUtils.isEmpty(id)) {
+			Activity activity = business.getActivity(work);
+			id = PropertyTools.getOrElse(activity, Activity.form_FIELDNAME, String.class, "");
+		}
+		if (StringUtils.isNotEmpty(id)) {
+			Form form = business.form().pick(id);
+			if (null != form) {
+				wo.setForm(toWoFormDataOrMobileData(form));
+				related(business, wo, form);
+			}
+		}
+		return wo;
+	}
+
+	private Wo workCompleted(Business business, WorkCompleted workCompleted) throws Exception {
+		Wo wo = new Wo();
+		// 先使用当前库的表单,如果不存在使用储存的表单.
+		if (StringUtils.isNotEmpty(workCompleted.getForm())) {
+			Form form = business.form().pick(workCompleted.getForm());
+			if (null != form) {
+				wo.setForm(toWoFormDataOrMobileData(form));
+				related(business, wo, form);
+			}
+		} else if (null != workCompleted.getProperties().getForm()) {
+			wo.setForm(toWoFormDataOrMobileData(workCompleted.getProperties().getForm()));
+			if (StringUtils.isNotBlank(workCompleted.getProperties().getForm().getData())) {
+				workCompleted.getProperties().getRelatedFormList()
+						.forEach(o -> wo.getRelatedFormMap().put(o.getId(), toWoFormDataOrMobileData(o)));
+			} else {
+				workCompleted.getProperties().getMobileRelatedFormList()
+						.forEach(o -> wo.getRelatedFormMap().put(o.getId(), toWoFormMobileDataOrData(o)));
+			}
+		}
+		workCompleted.getProperties().getRelatedScriptList().stream()
+				.forEach(o -> wo.getRelatedScriptMap().put(o.getId(), toWoScript(o)));
+		return wo;
+	}
+
+	private void related(Business business, Wo wo, Form form) throws Exception {
+		if (StringUtils.isNotBlank(form.getData())) {
+			for (String relatedFormId : form.getProperties().getRelatedFormList()) {
+				Form relatedForm = business.form().pick(relatedFormId);
+				if (null != relatedForm) {
+					wo.getRelatedFormMap().put(relatedFormId, toWoFormDataOrMobileData(relatedForm));
+				}
+			}
+		} else {
+			for (String mobileRelatedFormId : form.getProperties().getMobileRelatedFormList()) {
+				Form mobileRelatedForm = business.form().pick(mobileRelatedFormId);
+				if (null != mobileRelatedForm) {
+					wo.getRelatedFormMap().put(mobileRelatedFormId, toWoFormMobileDataOrData(mobileRelatedForm));
+				}
+			}
+		}
+		relatedScript(business, wo, form);
+	}
+
+	protected void relatedScript(Business business, AbstractWo wo, Form form) throws Exception {
+		for (Entry<String, String> entry : form.getProperties().getRelatedScriptMap().entrySet()) {
+			switch (entry.getValue()) {
+			case WorkCompletedProperties.Script.TYPE_PROCESSPLATFORM:
+				Script relatedScript = business.script().pick(entry.getKey());
+				if (null != relatedScript) {
+					wo.getRelatedScriptMap().put(entry.getKey(), toWoScript(relatedScript));
+				}
+				break;
+			case WorkCompletedProperties.Script.TYPE_CMS:
+				com.x.cms.core.entity.element.Script relatedCmsScript = business.cms().script().pick(entry.getKey());
+				if (null != relatedCmsScript) {
+					wo.getRelatedScriptMap().put(entry.getKey(), toWoScript(relatedCmsScript));
+				}
+				break;
+			case WorkCompletedProperties.Script.TYPE_PORTAL:
+				com.x.portal.core.entity.Script relatedPortalScript = business.portal().script().pick(entry.getKey());
+				if (null != relatedPortalScript) {
+					wo.getRelatedScriptMap().put(entry.getKey(), toWoScript(relatedPortalScript));
+				}
+				break;
+			default:
+				break;
+			}
+		}
+	}
+
+	public static class Wo extends AbstractWo {
+
+	}
+
+}

+ 674 - 0
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/V2GetWorkOrWorkCompleted.java

@@ -0,0 +1,674 @@
+package com.x.processplatform.assemble.surface.jaxrs.work;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.stream.Collectors;
+
+import org.apache.commons.collections4.ListUtils;
+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.entity.JpaObject;
+import com.x.base.core.entity.dataitem.DataItem;
+import com.x.base.core.entity.dataitem.ItemCategory;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.exception.ExceptionAccessDenied;
+import com.x.base.core.project.exception.ExceptionEntityNotExist;
+import com.x.base.core.project.gson.GsonPropertyObject;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.organization.Identity;
+import com.x.base.core.project.organization.Person;
+import com.x.base.core.project.organization.Unit;
+import com.x.base.core.project.tools.ListTools;
+import com.x.processplatform.assemble.surface.Business;
+import com.x.processplatform.core.entity.content.Attachment;
+import com.x.processplatform.core.entity.content.Data;
+import com.x.processplatform.core.entity.content.Read;
+import com.x.processplatform.core.entity.content.Task;
+import com.x.processplatform.core.entity.content.Work;
+import com.x.processplatform.core.entity.content.WorkCompleted;
+import com.x.processplatform.core.entity.element.Activity;
+import com.x.processplatform.core.entity.element.ActivityType;
+import com.x.processplatform.core.entity.element.Manual;
+import com.x.processplatform.core.entity.element.ManualMode;
+import com.x.processplatform.core.entity.element.Route;
+import com.x.query.core.entity.Item;
+
+class V2GetWorkOrWorkCompleted extends BaseAction {
+
+	private static Logger logger = LoggerFactory.getLogger(V2GetWorkOrWorkCompleted.class);
+
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String workOrWorkCompleted) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<Wo> result = new ActionResult<>();
+			Business business = new Business(emc);
+			if (!business.readableWithWorkOrWorkCompleted(effectivePerson, workOrWorkCompleted,
+					new ExceptionEntityNotExist(workOrWorkCompleted))) {
+				throw new ExceptionAccessDenied(effectivePerson);
+			}
+			Wo wo = null;
+			Work work = business.entityManagerContainer().find(workOrWorkCompleted, Work.class);
+			if (null != work) {
+				wo = this.work(effectivePerson, business, work);
+			} else {
+				WorkCompleted workCompleted = emc.flag(workOrWorkCompleted, WorkCompleted.class);
+				if (null != workCompleted) {
+					wo = this.workCompleted(business, effectivePerson, workCompleted);
+				}
+			}
+			result.setData(wo);
+			return result;
+		}
+	}
+
+	private Wo work(EffectivePerson effectivePerson, Business business, Work work)
+			throws InterruptedException, ExecutionException {
+		Wo wo = new Wo();
+		// Date s = new Date();
+		CompletableFuture.allOf(workJson(work, wo), activity(business, work, wo), data(business, work, wo),
+				task(effectivePerson, business, work, wo), read(effectivePerson, business, work.getJob(), wo),
+				creatorIdentity(business, work.getCreatorIdentity(), wo),
+				creatorPerson(business, work.getCreatorPerson(), wo), creatorUnit(business, work.getCreatorUnit(), wo),
+				attachment(effectivePerson, business, work.getJob(), wo)).get();
+		// System.out.println("!!!!!!!!!!!!!!!!work:" + ((new Date()).getTime() -
+		// s.getTime()));
+		return wo;
+	}
+
+	private CompletableFuture<Void> data(Business business, Work work, Wo wo) {
+		return CompletableFuture.runAsync(() -> {
+			try {
+				// Date s = new Date();
+				List<Item> list = business.entityManagerContainer().listEqualAndEqual(Item.class,
+						DataItem.bundle_FIELDNAME, work.getJob(), DataItem.itemCategory_FIELDNAME, ItemCategory.pp);
+				if (!list.isEmpty()) {
+					JsonElement jsonElement = itemConverter.assemble(list);
+					// 必须是Object对象
+					if (jsonElement.isJsonObject()) {
+						wo.setData(gson.fromJson(jsonElement, Data.class));
+					}
+				}
+				// System.out.println("!!!!!!!!!!!!!!!!data:" + ((new Date()).getTime() -
+				// s.getTime()));
+			} catch (Exception e) {
+				logger.error(e);
+			}
+		});
+	}
+
+	private CompletableFuture<Void> activity(Business business, Work work, Wo wo) {
+		return CompletableFuture.runAsync(() -> {
+			try {
+				// Date s = new Date();
+				Activity activity = business.getActivity(work);
+				if (null != activity) {
+					WoActivity woActivity = new WoActivity();
+					activity.copyTo(woActivity);
+					wo.setActivity(woActivity);
+					if (Objects.equals(ActivityType.manual, activity.getActivityType())) {
+						wo.setRouteList(business.entityManagerContainer().fetchIn(Route.class, WoRoute.copier,
+								JpaObject.id_FIELDNAME, ((Manual) activity).getRouteList()));
+					}
+				}
+				// System.out.println("!!!!!!!!!!!!!!!!activity:" + ((new Date()).getTime() -
+				// s.getTime()));
+			} catch (Exception e) {
+				logger.error(e);
+			}
+		});
+	}
+
+	private CompletableFuture<Void> task(EffectivePerson effectivePerson, Business business, Work work, Wo wo) {
+		return CompletableFuture.runAsync(() -> {
+			try {
+				// Date s = new Date();
+				wo.setTaskList(WoTask.copier.copy(
+						business.entityManagerContainer().listEqual(Task.class, Task.work_FIELDNAME, work.getId())));
+				wo.setCurrentTaskIndex(
+						ListUtils.indexOf(wo.getTaskList(), e -> effectivePerson.isPerson(e.getPerson())));
+				// System.out.println("!!!!!!!!!!!!!!!!task:" + ((new Date()).getTime() -
+				// s.getTime()));
+			} catch (Exception e) {
+				logger.error(e);
+			}
+		});
+	}
+
+	private CompletableFuture<Void> attachment(EffectivePerson effectivePerson, Business business, String job, Wo wo) {
+		return CompletableFuture.runAsync(() -> {
+			try {
+				// Date s = new Date();
+				List<String> identities = business.organization().identity().listWithPerson(effectivePerson);
+				List<String> units = business.organization().unit().listWithPerson(effectivePerson);
+				List<WoAttachment> wos = new ArrayList<>();
+				for (Attachment attachment : business.entityManagerContainer().listEqual(Attachment.class,
+						Attachment.job_FIELDNAME, job)) {
+					boolean canControl = attachmentControl(attachment, effectivePerson, identities, units);
+					boolean canEdit = attachmentEdit(attachment, effectivePerson, identities, units) || canControl;
+					boolean canRead = attachmentRead(attachment, effectivePerson, identities, units) || canEdit;
+					WoAttachment woAttachment = WoAttachment.copier.copy(attachment);
+					if (canRead) {
+						woAttachment.getControl().setAllowRead(true);
+						woAttachment.getControl().setAllowEdit(canEdit);
+						woAttachment.getControl().setAllowControl(canControl);
+						wos.add(woAttachment);
+					}
+				}
+				wos = wos.stream()
+						.sorted(Comparator
+								.comparing(WoAttachment::getOrderNumber, Comparator.nullsLast(Integer::compareTo))
+								.thenComparing(Comparator.comparing(WoAttachment::getCreateTime,
+										Comparator.nullsLast(Date::compareTo))))
+						.collect(Collectors.toList());
+				wo.setAttachmentList(wos);
+				// System.out.println("!!!!!!!!!!!!!!!!attachment:" + ((new Date()).getTime() -
+				// s.getTime()));
+			} catch (Exception e) {
+				logger.error(e);
+			}
+		});
+	}
+
+	private CompletableFuture<Void> read(EffectivePerson effectivePerson, Business business, String job, Wo wo) {
+		return CompletableFuture.runAsync(() -> {
+			try {
+				// Date s = new Date();
+				wo.setReadList(WoRead.copier
+						.copy(business.entityManagerContainer().listEqual(Read.class, Read.job_FIELDNAME, job)));
+				wo.setCurrentReadIndex(
+						ListUtils.indexOf(wo.getReadList(), e -> effectivePerson.isPerson(e.getPerson())));
+				// System.out.println("!!!!!!!!!!!!!!!!read:" + ((new Date()).getTime() -
+				// s.getTime()));
+			} catch (Exception e) {
+				logger.error(e);
+			}
+		});
+	}
+
+	private CompletableFuture<Void> workJson(Work work, Wo wo) {
+		return CompletableFuture.runAsync(() -> {
+			try {
+				// Date s = new Date();
+				wo.setWork(gson.toJsonTree(WoWork.copier.copy(work)));
+				// System.out.println("!!!!!!!!!!!!!!!!workJson:" + ((new Date()).getTime() -
+				// s.getTime()));
+			} catch (Exception e) {
+				logger.error(e);
+			}
+		});
+	}
+
+	private CompletableFuture<Void> creatorIdentity(Business business, String creatorIdentity, Wo wo) {
+		return CompletableFuture.runAsync(() -> {
+			try {
+				// Date s = new Date();
+				wo.setCreatorIdentity(business.organization().identity().getObject(creatorIdentity));
+				// System.out.println("!!!!!!!!!!!!!!!!creatorIdentity:" + ((new
+				// Date()).getTime() - s.getTime()));
+			} catch (Exception e) {
+				logger.error(e);
+			}
+		});
+	}
+
+	private CompletableFuture<Void> creatorPerson(Business business, String creatorPerson, Wo wo) {
+		return CompletableFuture.runAsync(() -> {
+			try {
+				// Date s = new Date();
+				wo.setCreatorPerson(business.organization().person().getObject(creatorPerson));
+				// System.out.println("!!!!!!!!!!!!!!!!creatorPerson:" + ((new Date()).getTime()
+				// - s.getTime()));
+			} catch (Exception e) {
+				logger.error(e);
+			}
+		});
+	}
+
+	private CompletableFuture<Void> creatorUnit(Business business, String creatorUnit, Wo wo) {
+		return CompletableFuture.runAsync(() -> {
+			try {
+				// Date s = new Date();
+				wo.setCreatorUnit(business.organization().unit().getObject(creatorUnit));
+				// System.out.println("!!!!!!!!!!!!!!!!creatorUnit:" + ((new Date()).getTime() -
+				// s.getTime()));
+			} catch (Exception e) {
+				logger.error(e);
+			}
+		});
+	}
+
+	private Wo workCompleted(Business business, EffectivePerson effectivePerson, WorkCompleted workCompleted)
+			throws InterruptedException, ExecutionException {
+		Wo wo = new Wo();
+		CompletableFuture.allOf(completedJson(workCompleted, wo), completedData(business, workCompleted, wo),
+				read(effectivePerson, business, workCompleted.getJob(), wo),
+				creatorIdentity(business, workCompleted.getCreatorIdentity(), wo),
+				creatorPerson(business, workCompleted.getCreatorPerson(), wo),
+				creatorUnit(business, workCompleted.getCreatorUnit(), wo),
+				attachment(effectivePerson, business, workCompleted.getJob(), wo)).get();
+		return wo;
+	}
+
+	private CompletableFuture<Void> completedJson(WorkCompleted workCompleted, Wo wo) {
+		return CompletableFuture.runAsync(() -> {
+			try {
+				wo.setWork(gson.toJsonTree(WoWorkCompleted.copier.copy(workCompleted)));
+			} catch (Exception e) {
+				logger.error(e);
+			}
+		});
+	}
+
+	private CompletableFuture<Void> completedData(Business business, WorkCompleted workCompleted, Wo wo) {
+		return CompletableFuture.runAsync(() -> {
+			if (BooleanUtils.isTrue(workCompleted.getMerged())) {
+				wo.setData(workCompleted.getProperties().getData());
+			} else {
+				try {
+					List<Item> list = business.entityManagerContainer().listEqualAndEqual(Item.class,
+							DataItem.bundle_FIELDNAME, workCompleted.getJob(), DataItem.itemCategory_FIELDNAME,
+							ItemCategory.pp);
+					if (!list.isEmpty()) {
+						JsonElement jsonElement = itemConverter.assemble(list);
+						// 必须是Object对象
+						if (jsonElement.isJsonObject()) {
+							wo.setData(gson.fromJson(jsonElement, Data.class));
+						}
+					}
+				} catch (Exception e) {
+					logger.error(e);
+				}
+			}
+		});
+	}
+
+	private boolean attachmentRead(Attachment attachment, EffectivePerson effectivePerson, List<String> identities,
+			List<String> units) throws Exception {
+		boolean value = false;
+		if (effectivePerson.isManager()) {
+			value = true;
+		} else if (effectivePerson.isPerson(attachment.getPerson())) {
+			value = true;
+		} else if (ListTools.isEmpty(attachment.getReadIdentityList())
+				&& ListTools.isEmpty(attachment.getReadUnitList())) {
+			value = true;
+		} else {
+			if (ListTools.containsAny(identities, attachment.getReadIdentityList())
+					|| ListTools.containsAny(units, attachment.getReadUnitList())) {
+				value = true;
+			}
+		}
+		return value;
+	}
+
+	private boolean attachmentEdit(Attachment attachment, EffectivePerson effectivePerson, List<String> identities,
+			List<String> units) throws Exception {
+		boolean value = false;
+		if (effectivePerson.isManager()) {
+			value = true;
+		} else if (effectivePerson.isPerson(attachment.getPerson())) {
+			value = true;
+		} else if (ListTools.isEmpty(attachment.getEditIdentityList())
+				&& ListTools.isEmpty(attachment.getEditUnitList())) {
+			value = true;
+		} else {
+			if (ListTools.containsAny(identities, attachment.getEditIdentityList())
+					|| ListTools.containsAny(units, attachment.getEditUnitList())) {
+				value = true;
+			}
+		}
+		return value;
+	}
+
+	private boolean attachmentControl(Attachment attachment, EffectivePerson effectivePerson, List<String> identities,
+			List<String> units) throws Exception {
+		boolean value = false;
+		if (effectivePerson.isManager()) {
+			value = true;
+		} else if (effectivePerson.isPerson(attachment.getPerson())) {
+			value = true;
+		} else if (ListTools.isEmpty(attachment.getControllerUnitList())
+				&& ListTools.isEmpty(attachment.getControllerIdentityList())) {
+			value = true;
+		} else {
+			if (ListTools.containsAny(identities, attachment.getControllerIdentityList())
+					|| ListTools.containsAny(units, attachment.getControllerUnitList())) {
+				value = true;
+			}
+		}
+		return value;
+	}
+
+	public static class Wo extends GsonPropertyObject {
+
+		// work和workCompleted都有
+		private JsonElement work;
+		// work和workCompleted都有
+		private Data data;
+		// work和workCompleted都有
+		private List<WoRead> readList;
+		// work和workCompleted都有
+		private Integer currentReadIndex = -1;
+
+		// work和workCompleted都有
+		private Identity creatorIdentity;
+
+		// work和workCompleted都有
+		private Person creatorPerson;
+
+		// work和workCompleted都有
+		private Unit creatorUnit;
+
+		// work和workCompleted都有
+		private List<WoAttachment> attachmentList;
+
+		// 只有work有
+		private WoActivity activity;
+		// 只有work有
+		private List<WoTask> taskList;
+		// 只有work有
+		private Integer currentTaskIndex = -1;
+		// 只有work有
+		private List<WoRoute> routeList;
+
+		public JsonElement getWork() {
+			return work;
+		}
+
+		public void setWork(JsonElement work) {
+			this.work = work;
+		}
+
+		public List<WoRead> getReadList() {
+			return readList;
+		}
+
+		public void setReadList(List<WoRead> readList) {
+			this.readList = readList;
+		}
+
+		public Integer getCurrentReadIndex() {
+			return currentReadIndex;
+		}
+
+		public void setCurrentReadIndex(Integer currentReadIndex) {
+			this.currentReadIndex = currentReadIndex;
+		}
+
+		public List<WoTask> getTaskList() {
+			return taskList;
+		}
+
+		public void setTaskList(List<WoTask> taskList) {
+			this.taskList = taskList;
+		}
+
+		public Integer getCurrentTaskIndex() {
+			return currentTaskIndex;
+		}
+
+		public void setCurrentTaskIndex(Integer currentTaskIndex) {
+			this.currentTaskIndex = currentTaskIndex;
+		}
+
+		public Data getData() {
+			return data;
+		}
+
+		public void setData(Data data) {
+			this.data = data;
+		}
+
+		public WoActivity getActivity() {
+			return activity;
+		}
+
+		public void setActivity(WoActivity activity) {
+			this.activity = activity;
+		}
+
+		public Person getCreatorPerson() {
+			return creatorPerson;
+		}
+
+		public void setCreatorPerson(Person creatorPerson) {
+			this.creatorPerson = creatorPerson;
+		}
+
+		public Identity getCreatorIdentity() {
+			return creatorIdentity;
+		}
+
+		public void setCreatorIdentity(Identity creatorIdentity) {
+			this.creatorIdentity = creatorIdentity;
+		}
+
+		public Unit getCreatorUnit() {
+			return creatorUnit;
+		}
+
+		public void setCreatorUnit(Unit creatorUnit) {
+			this.creatorUnit = creatorUnit;
+		}
+
+		public List<WoRoute> getRouteList() {
+			return routeList;
+		}
+
+		public void setRouteList(List<WoRoute> routeList) {
+			this.routeList = routeList;
+		}
+
+		public List<WoAttachment> getAttachmentList() {
+			return attachmentList;
+		}
+
+		public void setAttachmentList(List<WoAttachment> attachmentList) {
+			this.attachmentList = attachmentList;
+		}
+
+	}
+
+	public static class WoWork extends Work {
+
+		private static final long serialVersionUID = 5244996549744746585L;
+
+		static WrapCopier<Work, WoWork> copier = WrapCopierFactory.wo(Work.class, WoWork.class, null,
+				JpaObject.FieldsInvisibleIncludeProperites);
+
+	}
+
+	public static class WoWorkCompleted extends WorkCompleted {
+
+		private static final long serialVersionUID = -1772642962691214007L;
+
+		static WrapCopier<WorkCompleted, WoWorkCompleted> copier = WrapCopierFactory.wo(WorkCompleted.class,
+				WoWorkCompleted.class, null, ListTools.toList(JpaObject.FieldsInvisibleIncludeProperites,
+						WorkCompleted.formData_FIELDNAME, WorkCompleted.formMobileData_FIELDNAME));
+	}
+
+	public static class WoTask extends Task {
+
+		private static final long serialVersionUID = 5244996549744746585L;
+
+		static WrapCopier<Task, WoTask> copier = WrapCopierFactory.wo(Task.class, WoTask.class, null,
+				JpaObject.FieldsInvisibleIncludeProperites);
+
+	}
+
+	public static class WoRead extends Read {
+
+		private static final long serialVersionUID = 5244996549744746585L;
+
+		static WrapCopier<Read, WoRead> copier = WrapCopierFactory.wo(Read.class, WoRead.class, null,
+				JpaObject.FieldsInvisibleIncludeProperites);
+
+	}
+
+	public static class WoActivity extends GsonPropertyObject {
+
+		private static final long serialVersionUID = 1L;
+
+		static WrapCopier<Activity, WoActivity> copier = WrapCopierFactory.wo(Activity.class, WoActivity.class,
+				JpaObject.singularAttributeField(Activity.class, true, true),
+				JpaObject.FieldsInvisibleIncludeProperites);
+
+		private String id;
+
+		private String name;
+
+		private String description;
+
+		private String alias;
+
+		private String position;
+
+		private String resetRange;
+
+		private Integer resetCount;
+
+		private Boolean allowReset;
+
+		private ManualMode manualMode;
+
+		public String getName() {
+			return name;
+		}
+
+		public void setName(String name) {
+			this.name = name;
+		}
+
+		public String getDescription() {
+			return description;
+		}
+
+		public void setDescription(String description) {
+			this.description = description;
+		}
+
+		public String getAlias() {
+			return alias;
+		}
+
+		public void setAlias(String alias) {
+			this.alias = alias;
+		}
+
+		public String getPosition() {
+			return position;
+		}
+
+		public void setPosition(String position) {
+			this.position = position;
+		}
+
+		public String getId() {
+			return id;
+		}
+
+		public void setId(String id) {
+			this.id = id;
+		}
+
+		public String getResetRange() {
+			return resetRange;
+		}
+
+		public void setResetRange(String resetRange) {
+			this.resetRange = resetRange;
+		}
+
+		public Integer getResetCount() {
+			return resetCount;
+		}
+
+		public void setResetCount(Integer resetCount) {
+			this.resetCount = resetCount;
+		}
+
+		public Boolean getAllowReset() {
+			return allowReset;
+		}
+
+		public void setAllowReset(Boolean allowReset) {
+			this.allowReset = allowReset;
+		}
+
+		public ManualMode getManualMode() {
+			return manualMode;
+		}
+
+		public void setManualMode(ManualMode manualMode) {
+			this.manualMode = manualMode;
+		}
+
+	}
+
+	public static class WoRoute extends GsonPropertyObject {
+		static WrapCopier<Route, WoRoute> copier = WrapCopierFactory.wo(Route.class, WoRoute.class,
+				ListTools.toList(JpaObject.id_FIELDNAME, Route.name_FIELDNAME, Route.description_FIELDNAME,
+						Route.alias_FIELDNAME),
+				null);
+	}
+
+	public static class WoAttachment extends Attachment {
+		static WrapCopier<Attachment, WoAttachment> copier = WrapCopierFactory.wo(Attachment.class, WoAttachment.class,
+				null, JpaObject.FieldsInvisibleIncludeProperites);
+
+		private WoAttachmentControl control = new WoAttachmentControl();
+
+		public WoAttachmentControl getControl() {
+			return control;
+		}
+
+		public void setControl(WoAttachmentControl control) {
+			this.control = control;
+		}
+
+	}
+
+	public static class WoAttachmentControl extends GsonPropertyObject {
+
+		private Boolean allowRead = false;
+		private Boolean allowEdit = false;
+		private Boolean allowControl = false;
+
+		public Boolean getAllowRead() {
+			return allowRead;
+		}
+
+		public void setAllowRead(Boolean allowRead) {
+			this.allowRead = allowRead;
+		}
+
+		public Boolean getAllowEdit() {
+			return allowEdit;
+		}
+
+		public void setAllowEdit(Boolean allowEdit) {
+			this.allowEdit = allowEdit;
+		}
+
+		public Boolean getAllowControl() {
+			return allowControl;
+		}
+
+		public void setAllowControl(Boolean allowControl) {
+			this.allowControl = allowControl;
+		}
+
+	}
+
+}

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

@@ -42,10 +42,10 @@ import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Collectors;
 
-class ActionManageRetract extends BaseAction {
+class V2ManageRetract extends BaseAction {
 
 	@ActionLogger
-	private static Logger logger = LoggerFactory.getLogger(ActionManageRetract.class);
+	private static Logger logger = LoggerFactory.getLogger(V2ManageRetract.class);
 
 	private WorkLog workLog;
 	private TaskCompleted taskCompleted;

+ 31 - 4
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/WorkAction.java

@@ -1,5 +1,6 @@
 package com.x.processplatform.assemble.surface.jaxrs.work;
 
+import java.util.Date;
 import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
@@ -995,18 +996,18 @@ public class WorkAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
 
-	@JaxrsMethodDescribe(value = "管理员替代person操作工作召回。", action = ActionManageRetract.class)
+	@JaxrsMethodDescribe(value = "管理员替代person操作工作召回。", action = V2ManageRetract.class)
 	@PUT
 	@Path("v2/{id}/person/{person}/retract/manage")
 	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
 	@Consumes(MediaType.APPLICATION_JSON)
-	public void manageRetract(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+	public void V2ManageRetract(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
 			@JaxrsParameterDescribe("工作标识") @PathParam("id") String id,
 			@JaxrsParameterDescribe("召回工作已办人员(根据流转记录确认)") @PathParam("person") String person, JsonElement jsonElement) {
-		ActionResult<ActionManageRetract.Wo> result = new ActionResult<>();
+		ActionResult<V2ManageRetract.Wo> result = new ActionResult<>();
 		EffectivePerson effectivePerson = this.effectivePerson(request);
 		try {
-			result = new ActionManageRetract().execute(effectivePerson, id, person);
+			result = new V2ManageRetract().execute(effectivePerson, id, person);
 		} catch (Exception e) {
 			logger.error(e, effectivePerson, request, jsonElement);
 			result.error(e);
@@ -1014,4 +1015,30 @@ public class WorkAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
 
+	@JaxrsMethodDescribe(value = "V2_根据Work或workCompleted取得内容.", action = V2GetWorkOrWorkCompleted.class)
+	@GET
+	@Path("v2/workorworkcompleted/{workOrWorkCompleted}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void V2GetWorkOrWorkCompleted(@Suspended final AsyncResponse asyncResponse,
+			@Context HttpServletRequest request,
+			@JaxrsParameterDescribe("工作标识") @PathParam("workOrWorkCompleted") String workOrWorkCompleted) {
+		// Date s = new Date();
+		ActionResult<V2GetWorkOrWorkCompleted.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		// System.out.println("!!!!!!!!!!!!!!!!V2GetWorkOrWorkCompleted1:" + ((new
+		// Date()).getTime() - s.getTime()));
+		try {
+			result = new V2GetWorkOrWorkCompleted().execute(effectivePerson, workOrWorkCompleted);
+			// System.out.println("!!!!!!!!!!!!!!!!V2GetWorkOrWorkCompleted2:" + ((new
+			// Date()).getTime() - s.getTime()));
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+		// System.out.println("!!!!!!!!!!!!!!!!V2GetWorkOrWorkCompleted3:" + ((new
+		// Date()).getTime() - s.getTime()));
+	}
+
 }

+ 1 - 1
o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/DocumentVersion.java

@@ -24,7 +24,7 @@ import com.x.processplatform.core.entity.PersistenceProperties;
 import com.x.processplatform.core.entity.element.ActivityType;
 
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 5, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.Content.DocumentVersion.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Content.DocumentVersion.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,

+ 1 - 1
o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/Draft.java

@@ -23,7 +23,7 @@ import com.x.base.core.project.tools.StringTools;
 import com.x.processplatform.core.entity.PersistenceProperties;
 
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 5, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.Content.Draft.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Content.Draft.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,

+ 1 - 1
o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/KeyLock.java

@@ -18,7 +18,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
 import com.x.processplatform.core.entity.PersistenceProperties;
 
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.Content.KeyLock.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Content.KeyLock.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,

+ 1 - 1
o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/Read.java

@@ -34,7 +34,7 @@ import org.apache.openjpa.persistence.jdbc.Index;
 import org.apache.openjpa.persistence.jdbc.Strategy;
 
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.Content.Read.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Content.Read.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,

+ 2 - 4
o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/ReadCompleted.java

@@ -40,7 +40,7 @@ import org.apache.openjpa.persistence.jdbc.Strategy;
  *
  */
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.Content.ReadCompleted.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Content.ReadCompleted.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,
@@ -169,7 +169,7 @@ public class ReadCompleted extends SliceJpaObject implements ProjectionInterface
 		}
 		return this.properties;
 	}
-	
+
 	public void setProperties(ReadCompletedProperties properties) {
 		this.properties = properties;
 	}
@@ -1146,6 +1146,4 @@ public class ReadCompleted extends SliceJpaObject implements ProjectionInterface
 		this.currentActivityName = currentActivityName;
 	}
 
- 
-
 }

+ 1 - 1
o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/Review.java

@@ -29,7 +29,7 @@ import com.x.base.core.project.tools.StringTools;
 import com.x.processplatform.core.entity.PersistenceProperties;
 
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.Content.Review.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Content.Review.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,

+ 1 - 3
o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/SerialNumber.java

@@ -1,7 +1,5 @@
 package com.x.processplatform.core.entity.content;
 
-import java.util.Date;
-
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
@@ -22,7 +20,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
 import com.x.processplatform.core.entity.PersistenceProperties;
 
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.Content.SerialNumber.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Content.SerialNumber.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,

+ 1 - 1
o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/Task.java

@@ -43,7 +43,7 @@ import org.apache.openjpa.persistence.jdbc.Index;
 import org.apache.openjpa.persistence.jdbc.Strategy;
 
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.Content.Task.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Content.Task.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,

+ 1 - 1
o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/TaskCompleted.java

@@ -45,7 +45,7 @@ import com.x.processplatform.core.entity.element.Route;
  *
  */
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.Content.TaskCompleted.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Content.TaskCompleted.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,

+ 1 - 1
o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/Work.java

@@ -45,7 +45,7 @@ import com.x.processplatform.core.entity.PersistenceProperties;
 import com.x.processplatform.core.entity.element.ActivityType;
 
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.Content.Work.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Content.Work.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,

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

@@ -33,7 +33,7 @@ import org.apache.openjpa.persistence.jdbc.Index;
 import org.apache.openjpa.persistence.jdbc.Strategy;
 
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 100, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.Content.WorkCompleted.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Content.WorkCompleted.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,
@@ -137,7 +137,7 @@ public class WorkCompleted extends SliceJpaObject implements ProjectionInterface
 		}
 		return this.properties;
 	}
-	
+
 	public void setProperties(WorkCompletedProperties properties) {
 		this.properties = properties;
 	}
@@ -1053,8 +1053,6 @@ public class WorkCompleted extends SliceJpaObject implements ProjectionInterface
 		this.merged = merged;
 	}
 
- 
-
 	public String getActivity() {
 		return activity;
 	}

+ 1 - 1
o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/WorkLog.java

@@ -29,7 +29,7 @@ import com.x.processplatform.core.entity.element.Activity;
 import com.x.processplatform.core.entity.element.ActivityType;
 
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.Content.WorkLog.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Content.WorkLog.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,

+ 1 - 1
o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/temporary/ServiceValue.java

@@ -23,7 +23,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
 import com.x.processplatform.core.entity.PersistenceProperties;
 
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.Temporary.ServiceValue.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Temporary.ServiceValue.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,

+ 1 - 1
o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/temporary/TriggerWorkRecord.java

@@ -18,7 +18,7 @@ import com.x.base.core.project.annotation.FieldDescribe;
 import com.x.processplatform.core.entity.PersistenceProperties;
 
 @Entity
-@ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
+@ContainerEntity(dumpSize = 200, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Table(name = PersistenceProperties.Temporary.TriggerWorkRecord.table, uniqueConstraints = {
 		@UniqueConstraint(name = PersistenceProperties.Temporary.TriggerWorkRecord.table + JpaObject.IndexNameMiddle
 				+ JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,