Parcourir la source

Merge remote-tracking branch 'origin/develop' into develop

o2lee il y a 5 ans
Parent
commit
4ed1650972
100 fichiers modifiés avec 1895 ajouts et 754 suppressions
  1. 2 1
      gulpfile.js
  2. 2 1
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/O2AppUpdateManager.kt
  3. 5 4
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/cms/application/CMSCategoryPresenter.kt
  4. 4 4
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/o2/main/IndexPresenter.kt
  5. 16 2
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/core/component/adapter/SwipeRefreshCommonRecyclerViewAdapter.java
  6. 2 1
      o2android/o2_auth_sdk/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/O2.kt
  7. 12 0
      o2android/o2_auth_sdk/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/model/bo/api/cms/CMSDocumentFilter.kt
  8. 3 1
      o2server/configSample/processPlatform.json
  9. 1 1
      o2server/console_aix.sh
  10. 1 1
      o2server/console_arm.sh
  11. 1 1
      o2server/console_linux.sh
  12. 1 1
      o2server/console_macos.sh
  13. 1 1
      o2server/console_raspberrypi.sh
  14. 1 1
      o2server/console_risc.sh
  15. 1 1
      o2server/console_windows.bat
  16. 1 1
      o2server/start_arm.sh
  17. 1 1
      o2server/start_arm_debug.sh
  18. 1 1
      o2server/start_linux.sh
  19. 1 1
      o2server/start_linux_debug.sh
  20. 1 1
      o2server/start_macos.sh
  21. 1 1
      o2server/start_macos_debug.sh
  22. 1 1
      o2server/start_raspberrypi.sh
  23. 1 1
      o2server/start_raspberrypi_debug.sh
  24. 1 1
      o2server/start_risc.sh
  25. 1 1
      o2server/start_risc_debug.sh
  26. 1 1
      o2server/start_windows.bat
  27. 1 1
      o2server/start_windows_debug.bat
  28. 258 26
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceDetailFactory.java
  29. 5 4
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/DingdingAttendanceFactory.java
  30. 66 2
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionListNextWithFilter.java
  31. 10 15
      o2server/x_base_core_project/src/main/java/com/x/base/core/container/EntityManagerContainer.java
  32. 1 1
      o2server/x_base_core_project/src/main/java/com/x/base/core/container/factory/SlicePropertiesBuilder.java
  33. 198 6
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/Applications.java
  34. 1 1
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Config.java
  35. 43 36
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/ProcessPlatform.java
  36. 33 35
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/http/HttpToken.java
  37. 5 79
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/jaxrs/StandardJaxrsAction.java
  38. 1 1
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_processplatform_service_processing.java
  39. 52 60
      o2server/x_console/src/main/java/com/x/server/console/NodeAgent.java
  40. 15 4
      o2server/x_console/src/main/java/com/x/server/console/action/ActionControl.java
  41. 2 0
      o2server/x_console/src/main/java/com/x/server/console/action/EraseContentLog.java
  42. 2 0
      o2server/x_console/src/main/java/com/x/server/console/action/EraseContentProcessPlatform.java
  43. 5 4
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/factory/AttachmentFactory.java
  44. 3 2
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/factory/FileFactory.java
  45. 5 2
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/file/ActionListReferenceType.java
  46. 1 1
      o2server/x_message_assemble_communicate/src/main/java/com/x/message/assemble/communicate/DingdingConsumeQueue.java
  47. 1 1
      o2server/x_message_assemble_communicate/src/main/java/com/x/message/assemble/communicate/PmsConsumeQueue.java
  48. 1 1
      o2server/x_message_assemble_communicate/src/main/java/com/x/message/assemble/communicate/PmsInnerConsumeQueue.java
  49. 1 1
      o2server/x_message_assemble_communicate/src/main/java/com/x/message/assemble/communicate/QiyeweixinConsumeQueue.java
  50. 1 1
      o2server/x_message_assemble_communicate/src/main/java/com/x/message/assemble/communicate/WeLinkConsumeQueue.java
  51. 5 2
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/content/factory/WorkCompletedFactory.java
  52. 5 2
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/content/factory/WorkFactory.java
  53. 3 21
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/element/factory/ApplicationFactory.java
  54. 8 12
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/element/factory/ProcessFactory.java
  55. 5 4
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/elementtool/ActionApplicationDictOrphan.java
  56. 5 4
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/elementtool/ActionFormOrphan.java
  57. 5 4
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/elementtool/ActionProcessOrphan.java
  58. 3 2
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/elementtool/ActionScriptOrphan.java
  59. 10 6
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/form/ActionEdit.java
  60. 4 4
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/input/BaseAction.java
  61. 1 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/BaseAction.java
  62. 2 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/Business.java
  63. 2 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/factory/element/ApplicationFactory.java
  64. 0 20
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/factory/element/FileFactory.java
  65. 5 45
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/factory/element/ProcessFactory.java
  66. 5 4
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ActionListWithPerson.java
  67. 5 5
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ActionListWithPersonComplex.java
  68. 5 5
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ActionListWithPersonLike.java
  69. 12 15
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ActionManageListWithPersonComplex.java
  70. 183 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/ActionCopyToWorkCompleted.java
  71. 18 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/AttachmentAction.java
  72. 3 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/process/ActionListWithPersonWithApplicationFilter.java
  73. 11 10
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/read/ActionFilterAttribute.java
  74. 10 10
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/read/ActionFilterAttributeFilter.java
  75. 3 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/read/ActionListCountWithApplication.java
  76. 3 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/read/ActionListCountWithProcess.java
  77. 15 12
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/readcompleted/ActionFilterAttribute.java
  78. 13 12
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/readcompleted/ActionFilterAttributeFilter.java
  79. 3 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/readcompleted/ActionListCountWithApplication.java
  80. 3 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/readcompleted/ActionListCountWithProcess.java
  81. 0 31
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/readcompleted/BaseAction.java
  82. 11 10
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/task/ActionFilterAttribute.java
  83. 10 10
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/task/ActionFilterAttributeFilter.java
  84. 3 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/task/ActionListCountWithApplication.java
  85. 3 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/task/ActionListCountWithProcess.java
  86. 157 84
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/task/ActionProcessing.java
  87. 480 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/task/ActionProcessing2.java
  88. 2 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/task/ActionProcessingNeural.java
  89. 15 14
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/taskcompleted/ActionFilterAttribute.java
  90. 14 14
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/taskcompleted/ActionFilterAttributeFilter.java
  91. 3 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/taskcompleted/ActionListCountWithApplication.java
  92. 3 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/taskcompleted/ActionListCountWithProcess.java
  93. 16 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionCountWithPerson.java
  94. 12 11
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionFilterAttribute.java
  95. 13 21
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionManageFilterAttribute.java
  96. 7 6
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/workcompleted/ActionFilterAttribute.java
  97. 3 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/workcompleted/ActionListCountWithApplication.java
  98. 3 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/workcompleted/ActionListCountWithProcess.java
  99. 7 6
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/workcompleted/ActionManageFilterAttribute.java
  100. 3 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/workcompleted/ActionManageListCountWithProcess.java

+ 2 - 1
gulpfile.js

@@ -527,12 +527,13 @@ function build_concat_basework() {
         'o2web/source/o2_core/o2/xAction/services/x_processplatform_assemble_surface.js',
         'o2web/source/o2_core/o2/xAction/services/x_cms_assemble_control.js',
         'o2web/source/o2_core/o2/xAction/services/x_organization_assemble_control.js',
+        'o2web/source/o2_core/o2/xAction/services/x_query_assemble_surface.js',
         'o2web/source/x_desktop/js/base_work_end.js',
         'o2web/source/x_desktop/js/base.js'
     ];
     var dest = 'target/o2server/servers/webServer/x_desktop/js/';
     return gulp.src(src)
-        .pipe(concat('bask_work.js'))
+        .pipe(concat('base_work.js'))
         .pipe(gulp.dest(dest))
         .pipe(uglify())
         .pipe(rename({ extname: '.min.js' }))

+ 2 - 1
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/O2AppUpdateManager.kt

@@ -30,7 +30,8 @@ class O2AppUpdateManager private constructor() {
     }
 
     //更新的json地址
-    private val o2AppVersionJsonUrl = "https://sample.o2oa.net/app/app.json"
+//    private val o2AppVersionJsonUrl = "https://sample.o2oa.net/app/app.json"
+    private val o2AppVersionJsonUrl = "https://app.o2oa.net/download/app.json"
     private val client = OkHttpClient()
 
 

+ 5 - 4
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/cms/application/CMSCategoryPresenter.kt

@@ -7,6 +7,7 @@ import net.zoneland.x.bpm.mobile.v1.zoneXBPM.O2App
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.O2SDKManager
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.base.BasePresenterImpl
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.core.component.api.ResponseHandler
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.cms.CMSDocumentFilter
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.cms.CMSDocumentInfoJson
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.XLog
 import okhttp3.MediaType
@@ -21,14 +22,14 @@ class CMSCategoryPresenter : BasePresenterImpl<CMSCategoryContract.View>(), CMSC
             mView?.loadFail()
             return
         }
-        val wrapIn = HashMap<String, ArrayList<String>>()
         val category = ArrayList<String>()
         category.add(id)
-        wrapIn["categoryIdList"] = category
         val status = ArrayList<String>()
         status.add("published")
-        wrapIn["statusList"] = status
-        val json = O2SDKManager.instance().gson.toJson(wrapIn)
+        val filter = CMSDocumentFilter()
+        filter.categoryIdList = category
+        filter.statusList = status
+        val json = O2SDKManager.instance().gson.toJson(filter)
         val body = RequestBody.create(MediaType.parse("text/json"), json)
         getCMSAssembleControlService(mView?.getContext())?.let { service ->
             service.filterDocumentList(body, lastId, O2.DEFAULT_PAGE_NUMBER)

+ 4 - 4
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/o2/main/IndexPresenter.kt

@@ -8,6 +8,7 @@ import net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.base.BasePresenterImpl
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.core.component.api.ResponseHandler
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.core.component.enums.ApplicationEnum
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.core.component.realm.RealmDataService
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.cms.CMSDocumentFilter
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.o2.HotPictureOutData
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.persistence.MyAppListObject
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.XLog
@@ -35,12 +36,11 @@ class IndexPresenter : BasePresenterImpl<IndexContract.View>(), IndexContract.Pr
     }
 
     override fun loadNewsList(lastId: String) {
-        val wrapIn = HashMap<String, List<String>>()
         val status = ArrayList<String>()
         status.add("published")
-        wrapIn["statusList"] = status
-        val json = O2SDKManager.instance().gson.toJson(wrapIn)
-
+        val filter = CMSDocumentFilter()
+        filter.statusList = status
+        val json = O2SDKManager.instance().gson.toJson(filter)
         val body = RequestBody.create(MediaType.parse("text/json"), json)
         getCMSAssembleControlService(mView?.getContext())?.let { service ->
             service.filterDocumentList(body, lastId, O2.DEFAULT_PAGE_NUMBER)

+ 16 - 2
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/core/component/adapter/SwipeRefreshCommonRecyclerViewAdapter.java

@@ -2,6 +2,8 @@ package net.zoneland.x.bpm.mobile.v1.zoneXBPM.core.component.adapter;
 
 import android.content.Context;
 import androidx.recyclerview.widget.RecyclerView;
+
+import android.os.Handler;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -116,7 +118,13 @@ public abstract class SwipeRefreshCommonRecyclerViewAdapter<T> extends RecyclerV
      */
     public void addFooter(View view) {
         footer = view;
-        this.notifyDataSetChanged();
+        new Handler().post(new Runnable() {
+            @Override
+            public void run() {
+                // 刷新操作
+                notifyDataSetChanged();
+            }
+        });
     }
 
     /**
@@ -125,7 +133,13 @@ public abstract class SwipeRefreshCommonRecyclerViewAdapter<T> extends RecyclerV
      */
     public void removeFooter(View view) {
         footer = null;
-        this.notifyDataSetChanged();
+        new Handler().post(new Runnable() {
+            @Override
+            public void run() {
+                // 刷新操作
+                notifyDataSetChanged();
+            }
+        });
     }
 
 

+ 2 - 1
o2android/o2_auth_sdk/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/O2.kt

@@ -11,7 +11,8 @@ object O2 {
 
 
     val O2_COLLECT_URL = "http://collect.o2oa.net:20080/o2_collect_assemble/"
-    val O2_DOWNLOAD_URL = "https://sample.o2oa.net/app/download.html"
+//    val O2_DOWNLOAD_URL = "https://sample.o2oa.net/app/download.html"
+    val O2_DOWNLOAD_URL = "https://app.o2oa.net/download/download.html"
 
     const val O2_Process_start_mode_draft = "draft"
 

+ 12 - 0
o2android/o2_auth_sdk/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/model/bo/api/cms/CMSDocumentFilter.kt

@@ -0,0 +1,12 @@
+package net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.bo.api.cms
+
+/**
+ * Created by fancyLou on 2020-09-07.
+ * Copyright © 2020 O2. All rights reserved.
+ */
+
+data class CMSDocumentFilter(
+        var statusList: ArrayList<String> = ArrayList(),
+        var categoryIdList: ArrayList<String> = ArrayList(),
+        var orderField: String = ""
+)

+ 3 - 1
o2server/configSample/processPlatform.json

@@ -56,6 +56,7 @@
     "###cron": "定时cron表达式###",
     "###thresholdMinutes": "当工作滞留设定时间后,将尝试触发工作流转,可以自动处理由于人员变动的引起的工作滞留,默认24*60分钟.###"
   },
+  "processingSignalPersistEnable": false,
   "###maintenanceIdentity": "维护身份,当工作发生意外错误,无法找到对应的处理人情况下,先尝试将工作分配给创建身份,如果创建身份也不可获取,那么分配给指定人员,默认情况下这个值为空.###",
   "###formVersionCount": "表单历史版本保留数量,0为不保留.###",
   "###processVersionCount": "流程历史版本保留数量,0为不保留.###",
@@ -92,5 +93,6 @@
     "###intervalMinutes": "提醒间隔(分钟)###",
     "###count": "提醒数量限制.###"
   },
-  "###extensionEvents": "事件扩充.###"
+  "###extensionEvents": "事件扩充.###",
+  "###processingSignalPersistEnable": "是否保存工作处理信号内容,默认false.###"
 }

+ 1 - 1
o2server/console_aix.sh

@@ -1 +1 @@
-$(cd "$(dirname "$0")"; pwd)/jvm/aix/bin/java -cp $(cd "$(dirname "$0")"; pwd)/console.jar com.x.server.console.Shadow
+$(cd "$(dirname "$0")"; pwd)/jvm/aix/bin/java -javaagent:$(cd "$(dirname "$0")"; pwd)/console.jar -cp $(cd "$(dirname "$0")"; pwd)/console.jar com.x.server.console.Shadow

+ 1 - 1
o2server/console_arm.sh

@@ -1 +1 @@
-$(cd "$(dirname "$0")"; pwd)/jvm/arm/bin/java -cp $(cd "$(dirname "$0")"; pwd)/console.jar com.x.server.console.Shadow
+$(cd "$(dirname "$0")"; pwd)/jvm/arm/bin/java -javaagent:$(cd "$(dirname "$0")"; pwd)/console.jar -cp $(cd "$(dirname "$0")"; pwd)/console.jar com.x.server.console.Shadow

+ 1 - 1
o2server/console_linux.sh

@@ -1 +1 @@
-$(cd "$(dirname "$0")"; pwd)/jvm/linux/bin/java -cp $(cd "$(dirname "$0")"; pwd)/console.jar com.x.server.console.Shadow
+$(cd "$(dirname "$0")"; pwd)/jvm/linux/bin/java -javaagent:$(cd "$(dirname "$0")"; pwd)/console.jar -cp $(cd "$(dirname "$0")"; pwd)/console.jar com.x.server.console.Shadow

+ 1 - 1
o2server/console_macos.sh

@@ -1 +1 @@
-sudo $(cd "$(dirname "$0")"; pwd)/jvm/macos/bin/java -cp $(cd "$(dirname "$0")"; pwd)/console.jar com.x.server.console.swapcommand.Exit
+sudo $(cd "$(dirname "$0")"; pwd)/jvm/macos/bin/java -javaagent:$(cd "$(dirname "$0")"; pwd)/console.jar -cp $(cd "$(dirname "$0")"; pwd)/console.jar com.x.server.console.swapcommand.Exit

+ 1 - 1
o2server/console_raspberrypi.sh

@@ -1 +1 @@
-sudo $(cd "$(dirname "$0")"; pwd)/jvm/raspberrypi/bin/java -cp $(cd "$(dirname "$0")"; pwd)/console.jar com.x.server.console.Shadow
+sudo $(cd "$(dirname "$0")"; pwd)/jvm/raspberrypi/bin/java -javaagent:$(cd "$(dirname "$0")"; pwd)/console.jar -cp $(cd "$(dirname "$0")"; pwd)/console.jar com.x.server.console.Shadow

+ 1 - 1
o2server/console_risc.sh

@@ -1 +1 @@
-$(cd "$(dirname "$0")"; pwd)/jvm/risc/bin/java -cp $(cd "$(dirname "$0")"; pwd)/console.jar com.x.server.console.Shadow
+$(cd "$(dirname "$0")"; pwd)/jvm/risc/bin/java -javaagent:$(cd "$(dirname "$0")"; pwd)/console.jar -cp $(cd "$(dirname "$0")"; pwd)/console.jar com.x.server.console.Shadow

+ 1 - 1
o2server/console_windows.bat

@@ -1 +1 @@
-"%~dp0jvm\windows\bin\java" -cp "%~dp0console.jar" com.x.server.console.Shadow
+"%~dp0jvm\windows\bin\java" -javaagent:"%~dp0console.jar" -cp "%~dp0console.jar" com.x.server.console.Shadow

+ 1 - 1
o2server/start_arm.sh

@@ -148,4 +148,4 @@ if [ -d ${current_dir}/local/update ]; then
 		rm -Rf ${current_dir}/local/update
 	fi
 fi
-setsid ${current_dir}/jvm/arm/bin/java -server -Djava.awt.headless=true -Xms2g -Xmx8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar
+setsid ${current_dir}/jvm/arm/bin/java -javaagent:${current_dir}/console.jar -server -Djava.awt.headless=true -Xms2g -Xmx4g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar

+ 1 - 1
o2server/start_arm_debug.sh

@@ -148,4 +148,4 @@ if [ -d ${current_dir}/local/update ]; then
 		rm -Rf ${current_dir}/local/update
 	fi
 fi
-setsid ${current_dir}/jvm/arm/bin/java -javaagent:${current_dir}/console.jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20000 -Djava.awt.headless=true -Xms2g -Xmx8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar
+setsid ${current_dir}/jvm/arm/bin/java -javaagent:${current_dir}/console.jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20000 -Djava.awt.headless=true -Xms2g -Xmx4g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar

+ 1 - 1
o2server/start_linux.sh

@@ -148,4 +148,4 @@ if [ -d ${current_dir}/local/update ]; then
 		rm -Rf ${current_dir}/local/update
 	fi
 fi
-setsid ${current_dir}/jvm/linux/bin/java -javaagent:${current_dir}/console.jar -server -Djava.awt.headless=true -Xms2g -Xmx5g -Duser.timezone=GMT+08 -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar
+setsid ${current_dir}/jvm/linux/bin/java -javaagent:${current_dir}/console.jar -server -Djava.awt.headless=true -Xms2g -Xmx4g -Duser.timezone=GMT+08 -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar

+ 1 - 1
o2server/start_linux_debug.sh

@@ -148,4 +148,4 @@ if [ -d ${current_dir}/local/update ]; then
 		rm -Rf ${current_dir}/local/update
 	fi
 fi
-setsid ${current_dir}/jvm/linux/bin/java -javaagent:${current_dir}/console.jar -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20000 -Djava.awt.headless=true -Xms2g -Xmx8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar
+setsid ${current_dir}/jvm/linux/bin/java -javaagent:${current_dir}/console.jar -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20000 -Djava.awt.headless=true -Xms2g -Xmx4g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar

+ 1 - 1
o2server/start_macos.sh

@@ -149,4 +149,4 @@ if [ -d ${current_dir}/local/update ]; then
 		rm -Rf ${current_dir}/local/update
 	fi
 fi
-sudo ${current_dir}/jvm/macos/bin/java -javaagent:${current_dir}/console.jar -server -Djava.awt.headless=true -Xms2g -Xmx8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar
+sudo ${current_dir}/jvm/macos/bin/java -javaagent:${current_dir}/console.jar -server -Djava.awt.headless=true -Xms2g -Xmx4g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar

+ 1 - 1
o2server/start_macos_debug.sh

@@ -149,4 +149,4 @@ if [ -d ${current_dir}/local/update ]; then
 		rm -Rf ${current_dir}/local/update
 	fi
 fi
-sudo ${current_dir}/jvm/macos/bin/java -javaagent:${current_dir}/console.jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20000 -Djava.awt.headless=true -Xms2g -Xmx8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar
+sudo ${current_dir}/jvm/macos/bin/java -javaagent:${current_dir}/console.jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20000 -Djava.awt.headless=true -Xms2g -Xmx4g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar

+ 1 - 1
o2server/start_raspberrypi.sh

@@ -148,4 +148,4 @@ if [ -d ${current_dir}/local/update ]; then
 		sudo rm -Rf ${current_dir}/local/update
 	fi
 fi
-sudo setsid ${current_dir}/jvm/raspberrypi/bin/java -javaagent:${current_dir}/console.jar -server -Xms1g -Xmx1g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar
+sudo setsid ${current_dir}/jvm/raspberrypi/bin/java -javaagent:${current_dir}/console.jar -server -Xms1g -Xmx2g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar

+ 1 - 1
o2server/start_raspberrypi_debug.sh

@@ -148,4 +148,4 @@ if [ -d ${current_dir}/local/update ]; then
 		sudo rm -Rf ${current_dir}/local/update
 	fi
 fi
-sudo setsid ${current_dir}/jvm/raspberrypi/bin/java -javaagent:${current_dir}/console.jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20000 -Djava.awt.headless=true -Xms1g -Xmx1g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar
+sudo setsid ${current_dir}/jvm/raspberrypi/bin/java -javaagent:${current_dir}/console.jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20000 -Djava.awt.headless=true -Xms1g -Xmx2g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar

+ 1 - 1
o2server/start_risc.sh

@@ -148,4 +148,4 @@ if [ -d ${current_dir}/local/update ]; then
 		rm -Rf ${current_dir}/local/update
 	fi
 fi
-setsid ${current_dir}/jvm/risc/bin/java -javaagent:${current_dir}/console.jar -server -Djava.awt.headless=true -Xms2g -Xmx8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar
+setsid ${current_dir}/jvm/risc/bin/java -javaagent:${current_dir}/console.jar -server -Djava.awt.headless=true -Xms2g -Xmx4g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar

+ 1 - 1
o2server/start_risc_debug.sh

@@ -148,4 +148,4 @@ if [ -d ${current_dir}/local/update ]; then
 		rm -Rf ${current_dir}/local/update
 	fi
 fi
-setsid ${current_dir}/jvm/risc/bin/java -javaagent:${current_dir}/console.jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20000 -Djava.awt.headless=true -Xms2g -Xmx8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar
+setsid ${current_dir}/jvm/risc/bin/java -javaagent:${current_dir}/console.jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20000 -Djava.awt.headless=true -Xms2g -Xmx4g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar ${current_dir}/console.jar

+ 1 - 1
o2server/start_windows.bat

@@ -144,5 +144,5 @@ if exist "%~dp0local\update" (
 	)
 )
 @echo on
-"%~dp0jvm\windows\bin\java" -javaagent:"%~dp0console.jar" -server -Xms2g -Xmx5g -Duser.timezone=GMT+08 -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar "%~dp0console.jar"
+"%~dp0jvm\windows\bin\java" -javaagent:"%~dp0console.jar" -server -Xms2g -Xmx4g -Duser.timezone=GMT+08 -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar "%~dp0console.jar"
 pause

+ 1 - 1
o2server/start_windows_debug.bat

@@ -144,5 +144,5 @@ if exist "%~dp0local\update" (
 	)
 )
 @echo on
-"%~dp0jvm\windows\bin\java" -javaagent:"%~dp0console.jar" -server -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20000 -Xms2g -Xmx8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar "%~dp0console.jar"
+"%~dp0jvm\windows\bin\java" -javaagent:"%~dp0console.jar" -server -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20000 -Xms2g -Xmx4g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -jar "%~dp0console.jar"
 pause

+ 258 - 26
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceDetailFactory.java

@@ -3,6 +3,7 @@ package com.x.attendance.assemble.control.factory;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.Query;
@@ -284,8 +285,10 @@ public class AttendanceDetailFactory extends AbstractFactory {
 			}
 		}
 		
-		cq.distinct(true).select( root.get( AttendanceDetail_.empName ) );
-		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+		/*cq.distinct(true).select( root.get( AttendanceDetail_.empName ) );
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();*/
+		cq.select( root.get( AttendanceDetail_.empName ) ).where(p);
+		return em.createQuery(cq).setMaxResults(20000).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 	
 	/**
@@ -344,8 +347,8 @@ public class AttendanceDetailFactory extends AbstractFactory {
 			}
 		}
 		
-		cq.distinct(true).select( root.get( AttendanceDetail_.empName ) );
-		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+		cq.select( root.get( AttendanceDetail_.empName ) ).where(p);
+		return em.createQuery(cq).setMaxResults(20000).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 	
 	//@MethodDescribe("按指定的开始时间,结束时间列示未被分析的AttendanceDetail信息列表")
@@ -433,11 +436,11 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
-		cq.distinct(true).select( root.get(AttendanceDetail_.unitName ));
+		cq.select( root.get(AttendanceDetail_.unitName ));
 		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.yearString), year ));
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.monthString), month ));
-		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 	
 	/**
@@ -482,11 +485,11 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
-		cq.distinct(true).select( root.get(AttendanceDetail_.unitName ));
+		cq.select( root.get(AttendanceDetail_.unitName ));
 		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleYear), cycleYear ));
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleMonth), cycleMonth ));
-		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 	
 	//@MethodDescribe("按指定的统计周期年份,月份列示AttendanceDetail信息中涉及的顶层组织名称列表")
@@ -498,11 +501,11 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
-		cq.distinct(true).select( root.get(AttendanceDetail_.topUnitName ));
+		cq.select( root.get(AttendanceDetail_.topUnitName ));
 		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.yearString), year ));
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.monthString), month ));
-		return em.createQuery(cq.where(p)).setMaxResults(1000).getResultList();
+		return em.createQuery(cq.where(p)).setMaxResults(1000).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 	
 	//@MethodDescribe("按指定的统计周期年份,月份列示AttendanceDetail信息中涉及的员工姓名列表")
@@ -514,11 +517,11 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
-		cq.distinct(true).select( root.get(AttendanceDetail_.empName ));
+		cq.select( root.get(AttendanceDetail_.empName ));
 		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleYear), cycleYear ));
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleMonth), cycleMonth ));
-		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 	
 	//@MethodDescribe("按指定的统计周期年份,月份列示AttendanceDetail信息中涉及的顶层组织名称列表")
@@ -530,11 +533,11 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
-		cq.distinct(true).select( root.get(AttendanceDetail_.topUnitName ));
+		cq.select( root.get(AttendanceDetail_.topUnitName ));
 		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleYear), cycleYear ));
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleMonth), cycleMonth ));
-		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 	
 	//@MethodDescribe("按指定的统计周期年份,月份列示AttendanceDetail信息中涉及的组织名称列表")
@@ -546,11 +549,11 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
-		cq.distinct(true).select( root.get(AttendanceDetail_.unitName ));
+		cq.select( root.get(AttendanceDetail_.unitName ));
 		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleYear), cycleYear ));
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleMonth), cycleMonth ));
-		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 	
 	//@MethodDescribe("按指定的统计周期年份,月份列示AttendanceDetail信息中涉及的组织名称列表")
@@ -562,12 +565,12 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
-		cq.distinct(true).select( root.get(AttendanceDetail_.unitName ));
+		cq.select( root.get(AttendanceDetail_.unitName ));
 		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleYear), cycleYear ));
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleMonth), cycleMonth ));
 		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.empName), employeeName ));
-		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 
 
@@ -580,10 +583,10 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
-		cq.distinct(true).select( root.get(AttendanceDetail_.id ));
+		cq.select( root.get(AttendanceDetail_.id ));
 		//一般始终为true, id is not null
 		Predicate p = cb.equal( root.get(AttendanceDetail_.batchName), file_id );
-		return em.createQuery(cq.where(p)).getResultList();
+		return em.createQuery(cq.where(p)).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 
 	//@MethodDescribe("按年份月份查询某用户的打卡数据记录列表")
@@ -840,6 +843,131 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		return query.setMaxResults(count).getResultList();
 	}	
 	
+	/**
+	 * 查询下一页的信息数据(排除不参加考勤的人员)
+	 * @param id
+	 * @param count
+	 * @param sequence
+	 * @param wrapIn
+	 * @return
+	 * @throws Exception
+	 */
+	@SuppressWarnings("unchecked")
+	public List<AttendanceDetail> listIdsNextWithFilterUn( String id, Integer count, Object sequence, WrapInFilter wrapIn ,List<String> unUnitNameList,List<String> personNameList) throws Exception {
+		//先获取上一页最后一条的sequence值,如果有值的话,以此sequence值作为依据取后续的count条数据
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		String order = wrapIn.getOrder();//排序方式
+		List<Object> vs = new ArrayList<>();
+		StringBuffer sql_stringBuffer = new StringBuffer();
+		
+		if( order == null || order.isEmpty() ){
+			order = "DESC";
+		}
+		
+		Integer index = 1;
+		sql_stringBuffer.append( "SELECT o FROM "+AttendanceDetail.class.getCanonicalName()+" o where 1=1" );
+
+		if ((null != sequence) ) {
+			sql_stringBuffer.append(" and o.sequence " + (StringUtils.equalsIgnoreCase(order, "DESC") ? "<" : ">") + (" ?" + (index)));
+			vs.add(sequence);
+			index++;
+		}
+		if ((null != wrapIn.getQ_empName()) && (!wrapIn.getQ_empName().isEmpty())) {
+			sql_stringBuffer.append(" and o.empName = ?" + (index));
+			vs.add( wrapIn.getQ_empName() );
+			index++;
+		}
+		if (null != wrapIn.getUnitNames() && wrapIn.getUnitNames().size()>0) {
+			sql_stringBuffer.append(" and o.unitName in ( ?" + (index) + ")");
+			vs.add( wrapIn.getUnitNames() );
+			index++;
+		}
+		if (null != wrapIn.getTopUnitNames() && wrapIn.getTopUnitNames().size() > 0 ) {
+			sql_stringBuffer.append(" and o.topUnitName in ( ?" + (index) + ")");
+			vs.add( wrapIn.getTopUnitNames() );
+			index++;
+		}
+		if ((null != wrapIn.getCycleYear() ) && (!wrapIn.getCycleYear().isEmpty())) {
+			sql_stringBuffer.append(" and o.cycleYear = ?" + (index));
+			vs.add( wrapIn.getCycleYear() );
+			index++;
+		}
+		if ((null != wrapIn.getCycleMonth()) && (!wrapIn.getCycleMonth().isEmpty())) {
+			sql_stringBuffer.append(" and o.cycleMonth = ?" + (index));
+			vs.add( wrapIn.getCycleMonth() );
+			index++;
+		}
+		if ((null != wrapIn.getQ_year() ) && (!wrapIn.getQ_year().isEmpty())) {
+			sql_stringBuffer.append(" and o.yearString = ?" + (index));
+			vs.add( wrapIn.getQ_year() );
+			index++;
+		}
+		if ((null != wrapIn.getQ_month()) && (!wrapIn.getQ_month().isEmpty())) {
+			sql_stringBuffer.append(" and o.monthString = ?" + (index));
+			vs.add( wrapIn.getQ_month() );
+			index++;
+		}
+		if ((null != wrapIn.getQ_date()) && (!wrapIn.getQ_date().isEmpty())) {
+			sql_stringBuffer.append(" and o.recordDateString = ?" + (index));
+			vs.add( wrapIn.getQ_date() );
+			index++;
+		}
+		
+		if ( wrapIn.getRecordStatus() != 999 ) {
+			sql_stringBuffer.append(" and o.recordStatus = ?" + (index));
+			vs.add( wrapIn.getRecordStatus() );
+			index++;
+		}
+		
+		if (wrapIn.getIsAbsent() != null ) {
+			sql_stringBuffer.append(" and o.isAbsent = ?" + (index));
+			vs.add( wrapIn.getIsAbsent() );
+			index++;
+		}
+		
+		if (wrapIn.getIsLate() != null ) {
+			sql_stringBuffer.append(" and o.isLate = ?" + (index));
+			vs.add( wrapIn.getIsLate() );
+			index++;
+		}
+		
+		if (wrapIn.getIsLackOfTime() != null ) {
+			sql_stringBuffer.append(" and o.isLackOfTime = ?" + (index));
+			vs.add( wrapIn.getIsLackOfTime() );
+			index++;
+		}
+		
+		if (wrapIn.getIsLeaveEarlier() != null ) {
+			sql_stringBuffer.append(" and o.isLeaveEarlier = ?" + (index));
+			vs.add( wrapIn.getIsLeaveEarlier() );
+			index++;
+		}
+		
+		if (ListTools.isNotEmpty(unUnitNameList)) {
+			sql_stringBuffer.append(" and o.unitName not in ( ?" + (index) + ")");
+			vs.add( unUnitNameList );
+			index++;
+		}
+		if (ListTools.isNotEmpty(personNameList)) {
+			sql_stringBuffer.append(" and o.empName not in ( ?" + (index) + ")");
+			vs.add( personNameList );
+			index++;
+		}
+		
+		if( StringUtils.isNotEmpty( wrapIn.getKey() )){
+			sql_stringBuffer.append(" order by o."+wrapIn.getKey()+" " + order );
+		}else{
+			sql_stringBuffer.append(" order by o.sequence " + order );
+		}
+		
+		Query query = em.createQuery( sql_stringBuffer.toString(), AttendanceDetail.class );
+		//为查询设置所有的参数值
+		for (int i = 0; i < vs.size(); i++) {
+			query.setParameter(i + 1, vs.get(i));
+		}
+		return query.setMaxResults(count).getResultList();
+	}
+	
 	/**
 	 * 查询上一页的文档信息数据
 	 * @param id
@@ -1046,6 +1174,110 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		}		
 		return (Long) query.getSingleResult();
 	}
+	
+	/**
+	 * 查询符合的文档信息总数(排除不参加考勤的人员)
+	 * @param wrapIn
+	 * @return
+	 * @throws Exception
+	 */
+	public long getCountWithFilterUn( WrapInFilter wrapIn ,List<String> unUnitNameList,List<String> personNameList) throws Exception {
+		//先获取上一页最后一条的sequence值,如果有值的话,以此sequence值作为依据取后续的count条数据
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		List<Object> vs = new ArrayList<>();
+		StringBuffer sql_stringBuffer = new StringBuffer();
+		Integer index = 1;
+		
+		sql_stringBuffer.append( "SELECT count(o.id) FROM "+AttendanceDetail.class.getCanonicalName()+" o where 1=1" );
+		
+		if ((null != wrapIn.getQ_empName()) && (!wrapIn.getQ_empName().isEmpty())) {
+			sql_stringBuffer.append(" and o.empName = ?" + (index));
+			vs.add( wrapIn.getQ_empName() );
+			index++;
+		}
+		if (null != wrapIn.getUnitNames() && wrapIn.getUnitNames().size()>0) {
+			sql_stringBuffer.append(" and o.unitName in ( ?" + (index) + ")");
+			vs.add( wrapIn.getUnitNames() );
+			index++;
+		}
+		if (null != wrapIn.getTopUnitNames() && wrapIn.getTopUnitNames().size() > 0 ) {
+			sql_stringBuffer.append(" and o.topUnitName in ( ?" + (index) + ")");
+			vs.add( wrapIn.getTopUnitNames() );
+			index++;
+		}
+		if ((null != wrapIn.getCycleYear() ) && (!wrapIn.getCycleYear().isEmpty())) {
+			sql_stringBuffer.append(" and o.cycleYear = ?" + (index));
+			vs.add( wrapIn.getCycleYear() );
+			index++;
+		}
+		if ((null != wrapIn.getCycleMonth()) && (!wrapIn.getCycleMonth().isEmpty())) {
+			sql_stringBuffer.append(" and o.cycleMonth = ?" + (index));
+			vs.add( wrapIn.getCycleMonth() );
+			index++;
+		}
+		if ((null != wrapIn.getQ_year() ) && (!wrapIn.getQ_year().isEmpty())) {
+			sql_stringBuffer.append(" and o.yearString = ?" + (index));
+			vs.add( wrapIn.getQ_year() );
+			index++;
+		}
+		if ((null != wrapIn.getQ_month()) && (!wrapIn.getQ_month().isEmpty())) {
+			sql_stringBuffer.append(" and o.monthString = ?" + (index));
+			vs.add( wrapIn.getQ_month() );
+			index++;
+		}
+		if ((null != wrapIn.getQ_date()) && (!wrapIn.getQ_date().isEmpty())) {
+			sql_stringBuffer.append(" and o.recordDateString = ?" + (index));
+			vs.add( wrapIn.getQ_date() );
+			index++;
+		}
+		if ( wrapIn.getRecordStatus() != 999 ) {
+			sql_stringBuffer.append(" and o.recordStatus = ?" + (index));
+			vs.add( wrapIn.getIsAbsent() );
+			index++;
+		}
+		
+		if (wrapIn.getIsAbsent() != null ) {
+			sql_stringBuffer.append(" and o.isAbsent = ?" + (index));
+			vs.add( wrapIn.getIsAbsent() );
+			index++;
+		}
+		
+		if (wrapIn.getIsLate() != null ) {
+			sql_stringBuffer.append(" and o.isLate = ?" + (index));
+			vs.add( wrapIn.getIsLate() );
+			index++;
+		}
+		
+		if (wrapIn.getIsLackOfTime() != null ) {
+			sql_stringBuffer.append(" and o.isLackOfTime = ?" + (index));
+			vs.add( wrapIn.getIsLackOfTime() );
+			index++;
+		}
+		
+		if (wrapIn.getIsLeaveEarlier() != null ) {
+			sql_stringBuffer.append(" and o.isLeaveEarlier = ?" + (index));
+			vs.add( wrapIn.getIsLeaveEarlier() );
+			index++;
+		}
+		
+		if (ListTools.isNotEmpty(unUnitNameList)) {
+			sql_stringBuffer.append(" and o.unitName not in ( ?" + (index) + ")");
+			vs.add( unUnitNameList );
+			index++;
+		}
+		if (ListTools.isNotEmpty(personNameList)) {
+			sql_stringBuffer.append(" and o.empName not in ( ?" + (index) + ")");
+			vs.add( personNameList );
+			index++;
+		}
+		
+		Query query = em.createQuery( sql_stringBuffer.toString(), AttendanceDetail.class );
+		//为查询设置所有的参数值
+		for (int i = 0; i < vs.size(); i++) {
+			query.setParameter(i + 1, vs.get(i));
+		}		
+		return (Long) query.getSingleResult();
+	}
 
 	public List<String> getByUserAndRecordDate(String employeeName, String recordDateStringFormated)  throws Exception{		
 		if( employeeName == null || employeeName.isEmpty() || recordDateStringFormated == null || recordDateStringFormated.isEmpty() ){
@@ -1075,9 +1307,9 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		List<Selection<?>> selectionList = new ArrayList<Selection<?>>();
 		selectionList.add(root.get(AttendanceDetail_.cycleYear ));
 		selectionList.add(root.get(AttendanceDetail_.cycleMonth ));
-		cq.distinct(true).multiselect(selectionList);
+		cq.multiselect(selectionList);
 		
-		return em.createQuery(cq.where(p)).getResultList();
+		return em.createQuery(cq.where(p)).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 	
 	public List<AttendanceCycles> getCyclesFromDetailWithDateSplit( String empName, Date startDate, Date endDate )  throws Exception{
@@ -1093,9 +1325,9 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		List<Selection<?>> selectionList = new ArrayList<Selection<?>>();
 		selectionList.add(root.get(AttendanceDetail_.cycleYear ));
 		selectionList.add(root.get(AttendanceDetail_.cycleMonth ));
-		cq.distinct(true).multiselect(selectionList);
+		cq.multiselect(selectionList);
 		
-		return em.createQuery(cq.where(p)).getResultList();
+		return em.createQuery(cq.where(p)).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 	
 	//@MethodDescribe("查询未归档的条卡记录列表,最大2000条")
@@ -1180,7 +1412,7 @@ public class AttendanceDetailFactory extends AbstractFactory {
 			);
 			p = cb.and( p, p_or );
 		}
-		cq.distinct(true).select(root.get(AttendanceDetail_.empName));
-		return em.createQuery(cq.where(p)).setMaxResults(100000).getResultList();
+		cq.select(root.get(AttendanceDetail_.empName));
+		return em.createQuery(cq.where(p)).setMaxResults(100000).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 }

+ 5 - 4
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/DingdingAttendanceFactory.java

@@ -15,6 +15,7 @@ import javax.persistence.metamodel.SingularAttribute;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 public class DingdingAttendanceFactory extends AbstractFactory {
 
@@ -315,8 +316,8 @@ public class DingdingAttendanceFactory extends AbstractFactory {
         CriteriaQuery<String> query = cb.createQuery(String.class);
         Root<AttendanceDingtalkDetail> root = query.from(AttendanceDingtalkDetail.class);
         Predicate p = cb.between(root.get(AttendanceDingtalkDetail_.userCheckTime), startTime.getTime(), endTime.getTime());
-        query.select(root.get(AttendanceDingtalkDetail_.o2Unit)).where(p).distinct(true);
-        return em.createQuery(query).getResultList();
+        query.select(root.get(AttendanceDingtalkDetail_.o2Unit)).where(p);
+        return em.createQuery(query).getResultList().stream().distinct().collect(Collectors.toList());
     }
 
 
@@ -608,8 +609,8 @@ public class DingdingAttendanceFactory extends AbstractFactory {
         CriteriaQuery<String> query = cb.createQuery(String.class);
         Root<AttendanceQywxDetail> root = query.from(AttendanceQywxDetail.class);
         Predicate p = cb.between(root.get(AttendanceQywxDetail_.checkin_time_date), startTime, endTime);
-        query.select(root.get(AttendanceQywxDetail_.o2Unit)).where(p).distinct(true);
-        return em.createQuery(query).getResultList();
+        query.select(root.get(AttendanceQywxDetail_.o2Unit)).where(p);
+        return em.createQuery(query).getResultList().stream().distinct().collect(Collectors.toList());
     }
 
     /**

+ 66 - 2
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionListNextWithFilter.java

@@ -16,7 +16,10 @@ import org.apache.commons.lang3.StringUtils;
 import com.google.gson.JsonElement;
 import com.x.attendance.assemble.control.Business;
 import com.x.attendance.assemble.control.ExceptionWrapInConvert;
+import com.x.attendance.assemble.control.service.AttendanceEmployeeConfigServiceAdv;
+import com.x.attendance.assemble.control.service.UserManagerService;
 import com.x.attendance.entity.AttendanceDetail;
+import com.x.attendance.entity.AttendanceEmployeeConfig;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.entity.JpaObject;
@@ -31,6 +34,8 @@ import com.x.base.core.project.logger.LoggerFactory;
 public class ActionListNextWithFilter extends BaseAction {
 
 	private static  Logger logger = LoggerFactory.getLogger(ActionListNextWithFilter.class);
+	private UserManagerService userManagerService = new UserManagerService();
+	protected AttendanceEmployeeConfigServiceAdv attendanceEmployeeConfigServiceAdv = new AttendanceEmployeeConfigServiceAdv();
 
 	protected ActionResult<List<Wo>> execute(HttpServletRequest request, EffectivePerson effectivePerson, String id,
 			Integer count, JsonElement jsonElement) throws Exception {
@@ -47,6 +52,9 @@ public class ActionListNextWithFilter extends BaseAction {
 		AttendanceScheduleSetting scheduleSetting_top = null;
 		AttendanceScheduleSetting scheduleSetting = null;
 		Boolean check = true;
+		
+		List<String> unUnitNameList = new ArrayList<String>();
+		List<String> personNameList = new ArrayList<String>();
 
 		try {
 			wrapIn = this.convertToWrapIn(jsonElement, Wi.class);
@@ -111,10 +119,14 @@ public class ActionListNextWithFilter extends BaseAction {
 				}
 
 				if (check ) {
+					unUnitNameList = getUnUnitNameList();
+					personNameList = getUnPersonNameList();
 					// 从数据库中查询符合条件的一页数据对象
-					detailList = business.getAttendanceDetailFactory().listIdsNextWithFilter(id, count, sequence, wrapIn);
+					//detailList = business.getAttendanceDetailFactory().listIdsNextWithFilter(id, count, sequence, wrapIn);
+					detailList = business.getAttendanceDetailFactory().listIdsNextWithFilterUn(id, count, sequence, wrapIn,unUnitNameList,personNameList);
 					// 从数据库中查询符合条件的对象总数
-					total = business.getAttendanceDetailFactory().getCountWithFilter(wrapIn);
+					//total = business.getAttendanceDetailFactory().getCountWithFilter(wrapIn);
+					total = business.getAttendanceDetailFactory().getCountWithFilterUn(wrapIn,unUnitNameList,personNameList);
 					// 将所有查询出来的有状态的对象转换为可以输出的过滤过属性的对象
 					wraps = Wo.copier.copy(detailList);
 				}
@@ -192,5 +204,57 @@ public class ActionListNextWithFilter extends BaseAction {
 		public static WrapCopier<AttendanceDetail, Wo> copier = WrapCopierFactory.wo(AttendanceDetail.class, Wo.class,
 				null, JpaObject.FieldsInvisible);
 	}
+	
+	/**
+	 * 获取不需要考勤的组织
+	 * @return
+	 * @throws Exception 
+	 */
+	protected  List<String> getUnUnitNameList() throws Exception {
+		List<String> unUnitNameList = new ArrayList<String>();
+
+		List<AttendanceEmployeeConfig> attendanceEmployeeConfigs = attendanceEmployeeConfigServiceAdv.listByConfigType("NOTREQUIRED");
+
+		if(ListTools.isNotEmpty(attendanceEmployeeConfigs)){
+			for (AttendanceEmployeeConfig attendanceEmployeeConfig : attendanceEmployeeConfigs) {
+				String unitName = attendanceEmployeeConfig.getUnitName();
+				String employeeName = attendanceEmployeeConfig.getEmployeeName();
+
+				if(StringUtils.isEmpty(employeeName) && StringUtils.isNotEmpty(unitName)){
+					unUnitNameList.add(unitName);
+					List<String> tempUnitNameList = userManagerService.listSubUnitNameWithParent(unitName);
+					if(ListTools.isNotEmpty(tempUnitNameList)){
+						for(String tempUnit:tempUnitNameList){
+							if(!ListTools.contains(unUnitNameList, tempUnit)){
+								unUnitNameList.add(tempUnit);
+							}
+						}
+					}
+				}
+			} 
+		}
+		return unUnitNameList;
+	}
+	
+	/**
+	 * 获取不需要考勤的人员
+	 * @return
+	 * @throws Exception 
+	 */
+	protected  List<String> getUnPersonNameList() throws Exception {
+		List<String> personNameList = new ArrayList<String>();
+		List<AttendanceEmployeeConfig> attendanceEmployeeConfigs = attendanceEmployeeConfigServiceAdv.listByConfigType("NOTREQUIRED");
+
+		if(ListTools.isNotEmpty(attendanceEmployeeConfigs)){
+			for (AttendanceEmployeeConfig attendanceEmployeeConfig : attendanceEmployeeConfigs) {
+				String employeeName = attendanceEmployeeConfig.getEmployeeName();
+
+				if(StringUtils.isNotEmpty(employeeName) && !ListTools.contains(personNameList, employeeName)){
+					personNameList.add(employeeName);
+				}
+			}
+		}
+		return personNameList;
+	}
 
 }

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

@@ -10,6 +10,7 @@ import java.util.Date;
 import java.util.List;
 import java.util.Map.Entry;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.Query;
@@ -244,7 +245,8 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 			CriteriaQuery<T> cq = cb.createQuery(cls);
 			Root<T> root = cq.from(cls);
 			Predicate p = cb.equal(root.get(field.getName()), flag);
-			List<T> list = em.createQuery(cq.select(root).where(p).distinct(true)).setMaxResults(2).getResultList();
+			List<T> list = em.createQuery(cq.select(root).where(p)).setMaxResults(2).getResultList().stream().distinct()
+					.collect(Collectors.toList());
 			switch (list.size()) {
 			case 0:
 				break;
@@ -252,7 +254,7 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 				t = list.get(0);
 				break out;
 			case 2:
-				throw new Exception("flag get multiple entity flag:" + flag + ", class:" + cls.getName()
+				throw new IllegalStateException("flag get multiple entity flag:" + flag + ", class:" + cls.getName()
 						+ ", attribute:" + field.getName() + ".");
 			}
 		}
@@ -265,7 +267,7 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 
 	private <T extends JpaObject> List<T> flag(List<String> FLAGS, Class<T> cls, List<Field> fields) throws Exception {
 		if (ListTools.isEmpty(fields)) {
-			throw new Exception("attributes can not be empty.");
+			throw new IllegalStateException("attributes can not be empty.");
 		}
 		List<T> list = new ArrayList<>();
 		if (ListTools.isEmpty(FLAGS)) {
@@ -582,9 +584,7 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 		CriteriaQuery<T> cq = cb.createQuery(cls);
 		Root<T> root = cq.from(cls);
 		cq.select(root).where(cb.isMember(root.get(attribute), cb.literal(values)));
-		List<T> os = em.createQuery(cq.distinct(true)).getResultList();
-		List<T> list = new ArrayList<>(os);
-		return list;
+		return new ArrayList<>(em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList()));
 	}
 
 	public <T extends JpaObject> List<T> listIsMember(Class<T> cls, String attribute, Object value) throws Exception {
@@ -888,9 +888,8 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<T> root = cq.from(cls);
 		cq.select(root.get(JpaObject.id_FIELDNAME)).where(cb.isMember(root.get(attribute), cb.literal(values)));
-		List<String> os = em.createQuery(cq.distinct(true)).getResultList();
-		List<String> list = new ArrayList<>(os);
-		return list;
+		return new ArrayList<>(
+				em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList()));
 	}
 
 	public <T extends JpaObject, W extends Object> List<String> idsNotIn(Class<T> cls, String attribute,
@@ -900,9 +899,7 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<T> root = cq.from(cls);
 		cq.select(root.get(JpaObject.id_FIELDNAME)).where(cb.not(root.get(attribute).in(values)));
-		List<String> os = em.createQuery(cq.distinct(true)).getResultList();
-		List<String> list = new ArrayList<>(os);
-		return list;
+		return new ArrayList<>(em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList()));
 	}
 
 	public <T extends JpaObject, W extends Object> List<String> idsEqualAndNotIn(Class<T> cls, String attribute,
@@ -914,9 +911,7 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 		Predicate p = cb.not(root.get(attribute).in(values));
 		p = cb.and(p, cb.equal(root.get(otherAttribute), otherValue));
 		cq.select(root.get(JpaObject.id_FIELDNAME)).where(p);
-		List<String> os = em.createQuery(cq.distinct(true)).getResultList();
-		List<String> list = new ArrayList<>(os);
-		return list;
+		return new ArrayList<>(em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList()));
 	}
 
 	public <T extends JpaObject> List<String> idsIsMember(Class<T> cls, String attribute, Object value)

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

@@ -10,7 +10,7 @@ public class SlicePropertiesBuilder {
 
 	public static String driver_db2 = "com.ibm.db2.jcc.DB2Driver";
 	public static String driver_oracle = "oracle.jdbc.OracleDriver";
-	public static String driver_mysql = "com.mysql.jdbc.Driver";
+	public static String driver_mysql = "com.mysql.cj.jdbc.Driver";
 	public static String driver_postgresql = "org.postgresql.Driver";
 	public static String driver_informix = "com.informix.jdbc.IfxDriver";
 	public static String driver_h2 = "org.h2.Driver";

+ 198 - 6
o2server/x_base_core_project/src/main/java/com/x/base/core/project/Applications.java

@@ -15,6 +15,7 @@ import java.util.stream.Stream;
 import java.util.zip.CRC32;
 
 import com.x.base.core.project.config.Config;
+import com.x.base.core.project.config.Nodes;
 import com.x.base.core.project.connection.ActionResponse;
 import com.x.base.core.project.connection.CipherConnectionAction;
 import com.x.base.core.project.connection.FilePart;
@@ -26,6 +27,7 @@ import com.x.base.core.project.tools.DefaultCharset;
 import com.x.base.core.project.tools.ListTools;
 import com.x.base.core.project.tools.StringTools;
 
+import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.StringUtils;
 
 public class Applications extends ConcurrentHashMap<String, CopyOnWriteArrayList<Application>> {
@@ -109,6 +111,25 @@ public class Applications extends ConcurrentHashMap<String, CopyOnWriteArrayList
 
 	public ActionResponse getQuery(Boolean xdebugger, String applicationName, String uri, String seed)
 			throws Exception {
+		if(applicationName.equalsIgnoreCase("x_program_center")|| applicationName.equalsIgnoreCase(x_program_center.class.getName())) {
+			Nodes nodes = Config.nodes();
+			for (String node : nodes.keySet()) {
+				if (nodes.get(node).getCenter().getEnable()) {
+					Integer port = nodes.get(node).getCenter().getPort();
+					StringBuffer buffer = new StringBuffer();
+					if (BooleanUtils.isTrue(nodes.get(node).getCenter().getSslEnable())) {
+						buffer.append("https://").append(StringUtils.isNotEmpty(node) ? node : "127.0.0.1")
+								.append(":" + port);
+					} else {
+						buffer.append("http://").append(StringUtils.isNotEmpty(node) ? node : "127.0.0.1")
+								.append(":" + port);
+					}
+					buffer.append("/x_program_center/jaxrs/");
+					return CipherConnectionAction.get(xdebugger, buffer.toString()+ CipherConnectionAction.trim(uri));
+
+				}
+			}
+		}
 		String name = this.findApplicationName(applicationName);
 		if (StringUtils.isEmpty(name)) {
 			throw new ExceptionFindApplicationName(applicationName);
@@ -162,6 +183,27 @@ public class Applications extends ConcurrentHashMap<String, CopyOnWriteArrayList
 
 	public byte[] getQueryBinary(Boolean xdebugger, String applicationName, String uri, String seed) throws Exception {
 		String name = this.findApplicationName(applicationName);
+
+		if(applicationName.equalsIgnoreCase("x_program_center")|| applicationName.equalsIgnoreCase(x_program_center.class.getName())) {
+			Nodes nodes = Config.nodes();
+			for (String node : nodes.keySet()) {
+				if (nodes.get(node).getCenter().getEnable()) {
+					Integer port = nodes.get(node).getCenter().getPort();
+					StringBuffer buffer = new StringBuffer();
+					if (BooleanUtils.isTrue(nodes.get(node).getCenter().getSslEnable())) {
+						buffer.append("https://").append(StringUtils.isNotEmpty(node) ? node : "127.0.0.1")
+								.append(":" + port);
+					} else {
+						buffer.append("http://").append(StringUtils.isNotEmpty(node) ? node : "127.0.0.1")
+								.append(":" + port);
+					}
+					buffer.append("/x_program_center/jaxrs/");
+					return CipherConnectionAction.getBinary(xdebugger,
+							buffer.toString() + CipherConnectionAction.trim(uri));
+				}
+			}
+		}
+
 		if (StringUtils.isEmpty(name)) {
 			throw new ExceptionFindApplicationName(applicationName);
 		}
@@ -215,6 +257,26 @@ public class Applications extends ConcurrentHashMap<String, CopyOnWriteArrayList
 
 	public ActionResponse deleteQuery(Boolean xdebugger, String applicationName, String uri, String seed)
 			throws Exception {
+		if(applicationName.equalsIgnoreCase("x_program_center")|| applicationName.equalsIgnoreCase(x_program_center.class.getName())) {
+			Nodes nodes = Config.nodes();
+			for (String node : nodes.keySet()) {
+				if (nodes.get(node).getCenter().getEnable()) {
+					Integer port = nodes.get(node).getCenter().getPort();
+					StringBuffer buffer = new StringBuffer();
+					if (BooleanUtils.isTrue(nodes.get(node).getCenter().getSslEnable())) {
+						buffer.append("https://").append(StringUtils.isNotEmpty(node) ? node : "127.0.0.1")
+								.append(":" + port);
+					} else {
+						buffer.append("http://").append(StringUtils.isNotEmpty(node) ? node : "127.0.0.1")
+								.append(":" + port);
+					}
+					buffer.append("/x_program_center/jaxrs/");
+
+					return CipherConnectionAction.delete(xdebugger,
+							buffer.toString() + CipherConnectionAction.trim(uri));
+				}
+			}
+		}
 		String name = this.findApplicationName(applicationName);
 		if (StringUtils.isEmpty(name)) {
 			throw new ExceptionFindApplicationName(applicationName);
@@ -269,6 +331,26 @@ public class Applications extends ConcurrentHashMap<String, CopyOnWriteArrayList
 
 	public byte[] deleteQueryBinary(Boolean xdebugger, String applicationName, String uri, String seed)
 			throws Exception {
+		if(applicationName.equalsIgnoreCase("x_program_center")|| applicationName.equalsIgnoreCase(x_program_center.class.getName())) {
+			Nodes nodes = Config.nodes();
+			for (String node : nodes.keySet()) {
+				if (nodes.get(node).getCenter().getEnable()) {
+					Integer port = nodes.get(node).getCenter().getPort();
+					StringBuffer buffer = new StringBuffer();
+					if (BooleanUtils.isTrue(nodes.get(node).getCenter().getSslEnable())) {
+						buffer.append("https://").append(StringUtils.isNotEmpty(node) ? node : "127.0.0.1")
+								.append(":" + port);
+					} else {
+						buffer.append("http://").append(StringUtils.isNotEmpty(node) ? node : "127.0.0.1")
+								.append(":" + port);
+					}
+					buffer.append("/x_program_center/jaxrs/");
+
+					return CipherConnectionAction.deleteBinary(xdebugger,
+							buffer.toString()  + CipherConnectionAction.trim(uri));
+				}
+			}
+		}
 		String name = this.findApplicationName(applicationName);
 		if (StringUtils.isEmpty(name)) {
 			throw new ExceptionFindApplicationName(applicationName);
@@ -325,6 +407,26 @@ public class Applications extends ConcurrentHashMap<String, CopyOnWriteArrayList
 
 	public ActionResponse postQuery(Boolean xdebugger, String applicationName, String uri, Object body, String seed)
 			throws Exception {
+		if(applicationName.equalsIgnoreCase("x_program_center")|| applicationName.equalsIgnoreCase(x_program_center.class.getName())) {
+			Nodes nodes = Config.nodes();
+			for (String node : nodes.keySet()) {
+				if (nodes.get(node).getCenter().getEnable()) {
+					Integer port = nodes.get(node).getCenter().getPort();
+					StringBuffer buffer = new StringBuffer();
+					if (BooleanUtils.isTrue(nodes.get(node).getCenter().getSslEnable())) {
+						buffer.append("https://").append(StringUtils.isNotEmpty(node) ? node : "127.0.0.1")
+								.append(":" + port);
+					} else {
+						buffer.append("http://").append(StringUtils.isNotEmpty(node) ? node : "127.0.0.1")
+								.append(":" + port);
+					}
+					buffer.append("/x_program_center/jaxrs/");
+
+					return CipherConnectionAction.post(xdebugger, buffer.toString()  + CipherConnectionAction.trim(uri),
+							body);
+				}
+			}
+		}
 		String name = this.findApplicationName(applicationName);
 		if (StringUtils.isEmpty(name)) {
 			throw new ExceptionFindApplicationName(applicationName);
@@ -381,6 +483,27 @@ public class Applications extends ConcurrentHashMap<String, CopyOnWriteArrayList
 
 	public byte[] postQueryBinary(Boolean xdebugger, String applicationName, String uri, Object body, String seed)
 			throws Exception {
+		if(applicationName.equalsIgnoreCase("x_program_center")|| applicationName.equalsIgnoreCase(x_program_center.class.getName())) {
+			Nodes nodes = Config.nodes();
+			for (String node : nodes.keySet()) {
+				if (nodes.get(node).getCenter().getEnable()) {
+					Integer port = nodes.get(node).getCenter().getPort();
+					StringBuffer buffer = new StringBuffer();
+					if (BooleanUtils.isTrue(nodes.get(node).getCenter().getSslEnable())) {
+						buffer.append("https://").append(StringUtils.isNotEmpty(node) ? node : "127.0.0.1")
+								.append(":" + port);
+					} else {
+						buffer.append("http://").append(StringUtils.isNotEmpty(node) ? node : "127.0.0.1")
+								.append(":" + port);
+					}
+					buffer.append("/x_program_center/jaxrs/");
+
+					return CipherConnectionAction.postBinary(xdebugger,
+							buffer.toString()  + CipherConnectionAction.trim(uri), body);
+				}
+			}
+		}
+
 		String name = this.findApplicationName(applicationName);
 		if (StringUtils.isEmpty(name)) {
 			throw new ExceptionFindApplicationName(applicationName);
@@ -442,6 +565,27 @@ public class Applications extends ConcurrentHashMap<String, CopyOnWriteArrayList
 
 	public byte[] postQueryMultiPartBinary(Boolean xdebugger, String applicationName, String uri,
 			Collection<FormField> formFields, Collection<FilePart> fileParts, String seed) throws Exception {
+		if(applicationName.equalsIgnoreCase("x_program_center")|| applicationName.equalsIgnoreCase(x_program_center.class.getName())) {
+			Nodes nodes = Config.nodes();
+			for (String node : nodes.keySet()) {
+				if (nodes.get(node).getCenter().getEnable()) {
+					Integer port = nodes.get(node).getCenter().getPort();
+					StringBuffer buffer = new StringBuffer();
+					if (BooleanUtils.isTrue(nodes.get(node).getCenter().getSslEnable())) {
+						buffer.append("https://").append(StringUtils.isNotEmpty(node) ? node : "127.0.0.1")
+								.append(":" + port);
+					} else {
+						buffer.append("http://").append(StringUtils.isNotEmpty(node) ? node : "127.0.0.1")
+								.append(":" + port);
+					}
+					buffer.append("/x_program_center/jaxrs/");
+
+					return CipherConnectionAction.postMultiPartBinary(xdebugger,
+							buffer.toString() + CipherConnectionAction.trim(uri), formFields, fileParts);
+				}
+			}
+		}
+
 		String name = this.findApplicationName(applicationName);
 		if (StringUtils.isEmpty(name)) {
 			throw new ExceptionFindApplicationName(applicationName);
@@ -498,6 +642,28 @@ public class Applications extends ConcurrentHashMap<String, CopyOnWriteArrayList
 
 	public ActionResponse putQuery(Boolean xdebugger, String applicationName, String uri, Object body, String seed)
 			throws Exception {
+
+		if(applicationName.equalsIgnoreCase("x_program_center")|| applicationName.equalsIgnoreCase(x_program_center.class.getName())) {
+			Nodes nodes = Config.nodes();
+			for (String node : nodes.keySet()) {
+				if (nodes.get(node).getCenter().getEnable()) {
+					Integer port = nodes.get(node).getCenter().getPort();
+					StringBuffer buffer = new StringBuffer();
+					if (BooleanUtils.isTrue(nodes.get(node).getCenter().getSslEnable())) {
+						buffer.append("https://").append(StringUtils.isNotEmpty(node) ? node : "127.0.0.1")
+								.append(":" + port);
+					} else {
+						buffer.append("http://").append(StringUtils.isNotEmpty(node) ? node : "127.0.0.1")
+								.append(":" + port);
+					}
+					buffer.append("/x_program_center/jaxrs/");
+
+					return CipherConnectionAction.put(xdebugger, buffer.toString() + CipherConnectionAction.trim(uri),
+							body);
+				}
+			}
+		}
+
 		String name = this.findApplicationName(applicationName);
 		if (StringUtils.isEmpty(name)) {
 			throw new ExceptionFindApplicationName(applicationName);
@@ -522,7 +688,10 @@ public class Applications extends ConcurrentHashMap<String, CopyOnWriteArrayList
 				return str;
 			}
 		}
-		return null;
+		if(name.equalsIgnoreCase("x_program_center")|| name.equalsIgnoreCase(x_program_center.class.getName())) {
+			return "x_program_center";
+		}
+			return null;
 	}
 
 	public Application findApplicationWithNode(String className, String node) throws Exception {
@@ -602,12 +771,35 @@ public class Applications extends ConcurrentHashMap<String, CopyOnWriteArrayList
 	}
 
 	public String describeApi(String name) throws Exception {
-		String applicationName = this.findApplicationName(name);
-		if (StringUtils.isEmpty(applicationName)) {
-			throw new Exception("getDescribe can not find application with name:" + name + ".");
+		String urlDescribeApiJson = "";
+		if(name.equalsIgnoreCase("x_program_center")|| name.equalsIgnoreCase(x_program_center.class.getName())) {
+			 Nodes nodes = Config.nodes();
+			for (String node : nodes.keySet()) {
+				if (nodes.get(node).getCenter().getEnable()) {
+					Integer port = nodes.get(node).getCenter().getPort();
+					StringBuffer buffer = new StringBuffer();
+					if (BooleanUtils.isTrue(nodes.get(node).getCenter().getSslEnable())) {
+						buffer.append("https://").append(StringUtils.isNotEmpty(node) ? node : "127.0.0.1")
+								.append(":" + port);
+					} else {
+						buffer.append("http://").append(StringUtils.isNotEmpty(node) ? node : "127.0.0.1")
+								.append(":" + port);
+					}
+					buffer.append("/x_program_center/describe/api.json");
+					urlDescribeApiJson = buffer.toString();
+					break;
+				}
+			}
+		}else {
+			String applicationName = this.findApplicationName(name);
+			if (StringUtils.isEmpty(applicationName)) {
+				throw new Exception("getDescribe can not find application with name:" + name + ".");
+			}
+			Application application = this.randomWithWeight(applicationName);
+			//return HttpConnection.getAsString(application.getUrlDescribeApiJson(), null);
+			urlDescribeApiJson = application.getUrlDescribeApiJson();
 		}
-		Application application = this.randomWithWeight(applicationName);
-		return HttpConnection.getAsString(application.getUrlDescribeApiJson(), null);
+		return HttpConnection.getAsString(urlDescribeApiJson, null);
 	}
 
 }

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

@@ -1113,7 +1113,7 @@ public class Config {
 		}
 		return instance().mq;
 	}
-	
+
 	private Vfs vfs;
 
 	public static Vfs vfs() throws Exception {

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

@@ -5,16 +5,16 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
 
-import com.x.base.core.project.annotation.FieldDescribe;
-import com.x.base.core.project.gson.XGsonBuilder;
-import com.x.base.core.project.tools.DefaultCharset;
-import com.x.base.core.project.tools.ListTools;
-
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.quartz.CronExpression;
 
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.gson.XGsonBuilder;
+import com.x.base.core.project.tools.DefaultCharset;
+import com.x.base.core.project.tools.ListTools;
+
 /**
  * @author Zhou Rui
  */
@@ -48,14 +48,15 @@ public class ProcessPlatform extends ConfigObject {
 
 	public static final Boolean DEFAULT_DELETEAPPLICATIONINUSE = false;
 
-	public final static Boolean DEFAULT_UPDATEDATAPROJECTIONENABLE = false;
+	public static final Boolean DEFAULT_UPDATEDATAPROJECTIONENABLE = false;
+
+	public static final Boolean DEFAULT_PROCESSINGSIGNALPERSISTENABLE = false;
 
 	public static ProcessPlatform defaultInstance() {
 		return new ProcessPlatform();
 	}
 
 	public ProcessPlatform() {
-
 		this.maintenanceIdentity = "";
 		this.formVersionCount = DEFAULT_FORMVERSIONCOUNT;
 		this.processVersionCount = DEFAULT_PROCESSVERSIONCOUNT;
@@ -72,7 +73,7 @@ public class ProcessPlatform extends ConfigObject {
 		this.touchDetained = new TouchDetained();
 		this.deleteDraft = new DeleteDraft();
 		this.passExpired = new PassExpired();
-
+		this.processingSignalPersistEnable = DEFAULT_PROCESSINGSIGNALPERSISTENABLE;
 	}
 
 	public Integer getExecutorCount() {
@@ -165,6 +166,16 @@ public class ProcessPlatform extends ConfigObject {
 	@FieldDescribe("事件扩充.")
 	private ExtensionEvents extensionEvents;
 
+	@FieldDescribe("是否保存工作处理信号内容,默认false.")
+	private Boolean processingSignalPersistEnable;
+
+	public Boolean getProcessingSignalPersistEnable() {
+		if (processingSignalPersistEnable == null) {
+			this.processingSignalPersistEnable = DEFAULT_PROCESSINGSIGNALPERSISTENABLE;
+		}
+		return processingSignalPersistEnable;
+	}
+
 	public ExtensionEvents getExtensionEvents() {
 		if (null == extensionEvents) {
 			this.extensionEvents = new ExtensionEvents();
@@ -224,9 +235,9 @@ public class ProcessPlatform extends ConfigObject {
 			return o;
 		}
 
-		public final static Boolean DEFAULT_ENABLE = false;
+		public static final Boolean DEFAULT_ENABLE = false;
 
-		public final static String DEFAULT_CRON = "30 0/10 8-18 * * ?";
+		public static final String DEFAULT_CRON = "30 0/10 8-18 * * ?";
 
 		@FieldDescribe("是否启用")
 		private Boolean enable = DEFAULT_ENABLE;
@@ -262,9 +273,9 @@ public class ProcessPlatform extends ConfigObject {
 			return o;
 		}
 
-		public final static Boolean DEFAULT_ENABLE = true;
+		public static final Boolean DEFAULT_ENABLE = true;
 
-		public final static String DEFAULT_CRON = "45 0/15 8-18 * * ?";
+		public static final String DEFAULT_CRON = "45 0/15 8-18 * * ?";
 
 		@FieldDescribe("是否启用")
 		private Boolean enable = DEFAULT_ENABLE;
@@ -293,9 +304,9 @@ public class ProcessPlatform extends ConfigObject {
 			return o;
 		}
 
-		public final static Boolean DEFAULT_ENABLE = true;
+		public static final Boolean DEFAULT_ENABLE = true;
 
-		public final static String DEFAULT_CRON = "5 0/5 * * * ?";
+		public static final String DEFAULT_CRON = "5 0/5 * * * ?";
 
 		@FieldDescribe("是否启用")
 		private Boolean enable = DEFAULT_ENABLE;
@@ -324,11 +335,11 @@ public class ProcessPlatform extends ConfigObject {
 			return o;
 		}
 
-		public final static Boolean DEFAULT_ENABLE = false;
+		public static final Boolean DEFAULT_ENABLE = false;
 
-		public final static String DEFAULT_CRON = "30 30 6 * * ?";
+		public static final String DEFAULT_CRON = "30 30 6 * * ?";
 
-		public final static Integer DEFAULT_THRESHOLDDAYS = 365 * 2;
+		public static final Integer DEFAULT_THRESHOLDDAYS = 365 * 2;
 
 		@FieldDescribe("是否启用")
 		private Boolean enable = DEFAULT_ENABLE;
@@ -364,11 +375,11 @@ public class ProcessPlatform extends ConfigObject {
 			return o;
 		}
 
-		public final static String DEFAULT_CRON = "30 30 12 * * ?";
+		public static final String DEFAULT_CRON = "30 30 12 * * ?";
 
-		public final static Boolean DEFAULT_ENABLE = true;
+		public static final Boolean DEFAULT_ENABLE = true;
 
-		public final static Integer DEFAULT_THRESHOLDMINUTES = 60 * 24;
+		public static final Integer DEFAULT_THRESHOLDMINUTES = 60 * 24;
 
 		@FieldDescribe("是否启用")
 		private Boolean enable = DEFAULT_ENABLE;
@@ -404,11 +415,11 @@ public class ProcessPlatform extends ConfigObject {
 			return o;
 		}
 
-		public final static String DEFAULT_CRON = "0 0 20 * * ?";
+		public static final String DEFAULT_CRON = "0 0 20 * * ?";
 
-		public final static Boolean DEFAULT_ENABLE = false;
+		public static final Boolean DEFAULT_ENABLE = false;
 
-		public final static Integer DEFAULT_THRESHOLDMINUTES = 60 * 24 * 60;
+		public static final Integer DEFAULT_THRESHOLDMINUTES = 60 * 24 * 60;
 
 		@FieldDescribe("是否启用")
 		private Boolean enable = DEFAULT_ENABLE;
@@ -444,9 +455,9 @@ public class ProcessPlatform extends ConfigObject {
 			return o;
 		}
 
-		public final static String DEFAULT_CRON = "5 5 8-18 * * ?";
+		public static final String DEFAULT_CRON = "5 5 8-18 * * ?";
 
-		public final static Boolean DEFAULT_ENABLE = true;
+		public static final Boolean DEFAULT_ENABLE = true;
 
 		@FieldDescribe("是否启用")
 		private Boolean enable = DEFAULT_ENABLE;
@@ -474,15 +485,15 @@ public class ProcessPlatform extends ConfigObject {
 			return o;
 		}
 
-		public final static String DEFAULT_CRON = "0 0 4 * * ?";
+		public static final String DEFAULT_CRON = "0 0 4 * * ?";
 
-		public final static Boolean DEFAULT_ENABLE = true;
+		public static final Boolean DEFAULT_ENABLE = true;
 
-		public final static Integer DEFAULT_TASKTHRESHOLDMINUTES = 60 * 24 * 10;
+		public static final Integer DEFAULT_TASKTHRESHOLDMINUTES = 60 * 24 * 10;
 
-		public final static Integer DEFAULT_READTHRESHOLDMINUTES = 60 * 24 * 10;
+		public static final Integer DEFAULT_READTHRESHOLDMINUTES = 60 * 24 * 10;
 
-		public final static Integer DEFAULT_WORKTHRESHOLDMINUTES = 60 * 24 * 10;
+		public static final Integer DEFAULT_WORKTHRESHOLDMINUTES = 60 * 24 * 10;
 
 		@FieldDescribe("是否启用")
 		private Boolean enable = DEFAULT_ENABLE;
@@ -535,9 +546,9 @@ public class ProcessPlatform extends ConfigObject {
 			return o;
 		}
 
-		public final static Integer DEFAULT_INTERVALMINUTES = 10;
+		public static final Integer DEFAULT_INTERVALMINUTES = 10;
 
-		public final static Integer DEFAULT_COUNT = 3;
+		public static final Integer DEFAULT_COUNT = 3;
 
 		@FieldDescribe("提醒间隔(分钟)")
 		private Integer intervalMinutes = DEFAULT_INTERVALMINUTES;
@@ -565,10 +576,6 @@ public class ProcessPlatform extends ConfigObject {
 
 	public static class ExtensionEvents {
 
-		// public static ExtensionEvents defaultInstance() {
-		// return new ExtensionEvents();
-		// }
-
 		@FieldDescribe("工作附件上传.")
 		private WorkExtensionEvents workAttachmentUploadEvents = new WorkExtensionEvents();
 		@FieldDescribe("工作附件下载.")

+ 33 - 35
o2server/x_base_core_project/src/main/java/com/x/base/core/project/http/HttpToken.java

@@ -1,8 +1,8 @@
 package com.x.base.core.project.http;
 
 import java.net.URLDecoder;
+import java.nio.charset.StandardCharsets;
 import java.util.Date;
-import java.util.Enumeration;
 import java.util.Objects;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -41,13 +41,14 @@ public class HttpToken {
 		effectivePerson.setRemoteAddress(this.remoteAddress(request));
 		effectivePerson.setUserAgent(this.userAgent(request));
 		effectivePerson.setUri(request.getRequestURI());
-		/* 加入调试标记 */
+		// 加入调试标记
 		Object debugger = request.getHeader(HttpToken.X_Debugger);
-		if (null != debugger && BooleanUtils.toBoolean(Objects.toString(debugger))) {
-			effectivePerson.setDebugger(true);
-		} else {
-			effectivePerson.setDebugger(false);
-		}
+		effectivePerson.setDebugger((null != debugger) && BooleanUtils.toBoolean(Objects.toString(debugger)));
+//		if (null != debugger && BooleanUtils.toBoolean(Objects.toString(debugger))) {
+//			effectivePerson.setDebugger(true);
+//		} else {
+//			effectivePerson.setDebugger(false);
+//		}
 		setAttribute(request, effectivePerson);
 		setToken(request, response, effectivePerson);
 		return effectivePerson;
@@ -69,7 +70,7 @@ public class HttpToken {
 			Pattern pattern = Pattern.compile(RegularExpression_Token, Pattern.CASE_INSENSITIVE);
 			Matcher matcher = pattern.matcher(plain);
 			if (!matcher.find()) {
-				/* 不报错,跳过错误,将用户设置为anonymous */
+				// 不报错,跳过错误,将用户设置为anonymous
 				logger.warn("token format error:{}.", plain);
 				return EffectivePerson.anonymous();
 			}
@@ -79,21 +80,18 @@ public class HttpToken {
 			diff = Math.abs(diff);
 			if (TokenType.user.equals(tokenType) || TokenType.manager.equals(tokenType)) {
 				if (diff > (60000L * Config.person().getTokenExpiredMinutes())) {
-					// throw new Exception("token expired." + token);
-					/* 不报错,跳过错误,将用户设置为anonymous */
-					logger.warn("token expired:{}.", plain);
+					// 不报错,跳过错误,将用户设置为anonymous
+					logger.warn("token expired, user:{}, token:{}.",
+							URLDecoder.decode(matcher.group(3), StandardCharsets.UTF_8.name()), plain);
 					return EffectivePerson.anonymous();
 				}
 			}
-			if (TokenType.cipher.equals(tokenType)) {
-				if (diff > (60000 * 20)) {
-					/* 不报错,跳过错误,将用户设置为anonymous */
-					return EffectivePerson.anonymous();
-				}
+			if (TokenType.cipher.equals(tokenType) && (diff > (60000 * 20))) {
+				// 不报错,跳过错误,将用户设置为anonymous
+				return EffectivePerson.anonymous();
 			}
-			EffectivePerson effectivePerson = new EffectivePerson(URLDecoder.decode(matcher.group(3), "utf-8"),
-					tokenType, key);
-			return effectivePerson;
+			return new EffectivePerson(URLDecoder.decode(matcher.group(3), StandardCharsets.UTF_8.name()), tokenType,
+					key);
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
@@ -112,20 +110,20 @@ public class HttpToken {
 	public void setToken(HttpServletRequest request, HttpServletResponse response, EffectivePerson effectivePerson)
 			throws Exception {
 		switch (effectivePerson.getTokenType()) {
-			case anonymous:
-				// this.deleteToken(request, response);
-				break;
-			case user:
-				this.setResponseToken(request, response, effectivePerson);
-				break;
-			case manager:
-				this.setResponseToken(request, response, effectivePerson);
-				break;
-			case cipher:
-				this.deleteToken(request, response);
-				break;
-			default:
-				break;
+		case anonymous:
+			// this.deleteToken(request, response);
+			break;
+		case user:
+			this.setResponseToken(request, response, effectivePerson);
+			break;
+		case manager:
+			this.setResponseToken(request, response, effectivePerson);
+			break;
+		case cipher:
+			this.deleteToken(request, response);
+			break;
+		default:
+			break;
 		}
 	}
 
@@ -138,8 +136,8 @@ public class HttpToken {
 		}
 	}
 
-	public void setResponseToken(HttpServletRequest request, HttpServletResponse response,
-								  String tokenName, String token) throws Exception {
+	public void setResponseToken(HttpServletRequest request, HttpServletResponse response, String tokenName,
+			String token) throws Exception {
 		if (!StringUtils.isEmpty(token)) {
 			String cookie = tokenName + "=" + token + "; path=/; domain=" + this.domain(request);
 			response.setHeader("Set-Cookie", cookie);

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

@@ -624,7 +624,7 @@ public abstract class StandardJaxrsAction extends AbstractJaxrsAction {
 			ListOrderedMap<String, Collection<?>> notIns, ListOrderedMap<String, Object> members,
 			ListOrderedMap<String, Object> notMembers, boolean andJoin, String order) throws Exception {
 		EntityManager em = emc.get(cls);
-		String str = "SELECT count(distinct o) FROM " + cls.getCanonicalName() + " o";
+		String str = "SELECT count(o) FROM " + cls.getCanonicalName() + " o";
 		/* 预编译的SQL语句的参数序号,必须由1开始 */
 		Integer index = 1;
 		List<String> ps = new ArrayList<>();
@@ -696,80 +696,6 @@ public abstract class StandardJaxrsAction extends AbstractJaxrsAction {
 		return (Long) query.getSingleResult() + 1;
 	}
 
-	// private <T extends JpaObject> Long count(EntityManagerContainer emc, Class<T>
-	// cls, EqualsTerms equals,
-	// NotEqualsTerms notEquals, LikeTerms likes, InTerms ins, NotInTerms notIns,
-	// MemberTerms members,
-	// NotMemberTerms notMembers, boolean andJoin) throws Exception {
-	// EntityManager em = emc.get(cls);
-	// String str = "SELECT count(distinct o) FROM " + cls.getCanonicalName() + "
-	// o";
-	// /* 预编译的SQL语句的参数序号,必须由1开始 */
-	// Integer index = 1;
-	// List<String> ps = new ArrayList<>();
-	// List<Object> vs = new ArrayList<>();
-	// if (null != equals && (!equals.isEmpty())) {
-	// for (Entry<String, Object> en : equals.entrySet()) {
-	// ps.add("o." + en.getKey() + (" = ?" + index));
-	// vs.add(en.getValue());
-	// index++;
-	// }
-	// }
-	// if (null != notEquals && (!notEquals.isEmpty())) {
-	// for (Entry<String, Object> en : notEquals.entrySet()) {
-	// ps.add("(o." + en.getKey() + (" <> ?" + index) + " or o." + en.getKey() + "
-	// is null)");
-	// vs.add(en.getValue());
-	// index++;
-	// }
-	// }
-	// if (null != likes && (!likes.isEmpty())) {
-	// List<String> ors = new ArrayList<>();
-	// for (Entry<String, Object> en : likes.entrySet()) {
-	// ors.add("o." + en.getKey() + (" Like ?" + index));
-	// vs.add("%" + en.getValue() + "%");
-	// index++;
-	// }
-	// ps.add("(" + StringUtils.join(ors, " or ") + ")");
-	// }
-	// if (null != ins && (!ins.isEmpty())) {
-	// for (Entry<String, Collection<?>> en : ins.entrySet()) {
-	// ps.add("o." + en.getKey() + (" in ?" + index));
-	// vs.add(en.getValue());
-	// index++;
-	// }
-	// }
-	// if (null != notIns && (!notIns.isEmpty())) {
-	// for (Entry<String, Collection<?>> en : notIns.entrySet()) {
-	// ps.add("o." + en.getKey() + (" not in ?" + index));
-	// vs.add(en.getValue());
-	// index++;
-	// }
-	// }
-	// if (null != members && (!members.isEmpty())) {
-	// for (Entry<String, Object> en : members.entrySet()) {
-	// ps.add(("?" + index) + (" member of o." + en.getKey()));
-	// vs.add(en.getValue());
-	// index++;
-	// }
-	// }
-	// if (null != notMembers && (!notMembers.isEmpty())) {
-	// for (Entry<String, Object> en : notMembers.entrySet()) {
-	// ps.add(("?" + index) + (" not member of o." + en.getKey()));
-	// vs.add(en.getValue());
-	// index++;
-	// }
-	// }
-	// if (!ps.isEmpty()) {
-	// str += " where " + StringUtils.join(ps, (andJoin ? " and " : " or "));
-	// }
-	// Query query = em.createQuery(str, cls);
-	// for (int i = 0; i < vs.size(); i++) {
-	// query.setParameter(i + 1, vs.get(i));
-	// }
-	// return (Long) query.getSingleResult();
-	// }
-
 	private <T extends JpaObject> Long count(EntityManagerContainer emc, Class<T> cls, EqualsTerms equals,
 			NotEqualsTerms notEquals, LikeTerms likes, InTerms ins, NotInTerms notIns, MemberTerms members,
 			NotMemberTerms notMembers, boolean andJoin) throws Exception {
@@ -1121,7 +1047,7 @@ public abstract class StandardJaxrsAction extends AbstractJaxrsAction {
 				selections.add(root.get(field));
 			}
 
-			List<Tuple> os = em.createQuery(cq.multiselect(selections).distinct(true))
+			List<Tuple> os = em.createQuery(cq.multiselect(selections))
 					.setMaxResults(Math.max(Math.min(count, list_max), list_min)).getResultList();
 
 			List<W> ws = new ArrayList<W>();
@@ -1181,7 +1107,7 @@ public abstract class StandardJaxrsAction extends AbstractJaxrsAction {
 				selections.add(root.get(field));
 			}
 
-			List<Tuple> os = em.createQuery(cq.multiselect(selections).distinct(true))
+			List<Tuple> os = em.createQuery(cq.multiselect(selections))
 					.setMaxResults(Math.max(Math.min(count, list_max), list_min)).getResultList();
 
 			List<W> ws = new ArrayList<W>();
@@ -1236,8 +1162,8 @@ public abstract class StandardJaxrsAction extends AbstractJaxrsAction {
 				cq.orderBy(cb.asc(root.get(sequenceField)));
 			}
 
-			List<T> os = em.createQuery(cq.select(root).distinct(true))
-					.setMaxResults(Math.max(Math.min(count, list_max), list_min)).getResultList();
+			List<T> os = em.createQuery(cq.select(root)).setMaxResults(Math.max(Math.min(count, list_max), list_min))
+					.getResultList();
 
 			ActionResult<List<T>> result = new ActionResult<>();
 			result.setData(new ArrayList<T>(os));

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

@@ -27,7 +27,7 @@ import com.x.base.core.project.annotation.ModuleType;
 		"com.x.processplatform.core.entity.element.Delay", "com.x.processplatform.core.entity.element.File",
 		"com.x.processplatform.core.entity.element.Form", "com.x.processplatform.core.entity.element.FormField",
 		"com.x.processplatform.core.entity.element.Embed", "com.x.processplatform.core.entity.element.Mapping",
-		"com.x.processplatform.core.entity.log.ProcessingError", "com.x.query.core.entity.Item",
+		"com.x.processplatform.core.entity.log.SignalStackLog", "com.x.query.core.entity.Item",
 		"com.x.query.dynamic.entity.*" }, storageTypes = { StorageType.processPlatform }, storeJars = {
 				"x_organization_core_entity", "x_organization_core_express", "x_processplatform_core_entity",
 				"x_processplatform_core_express", "x_query_core_entity" }, dynamicJars = { "x_query_dynamic_entity" })

+ 52 - 60
o2server/x_console/src/main/java/com/x/server/console/NodeAgent.java

@@ -152,7 +152,7 @@ public class NodeAgent extends Thread {
 							logger.info("文件名path:" + tempFile.getAbsolutePath() + File.separator + filename);
 							File file = new File(tempFile.getAbsolutePath() + File.separator + filename);
 
-							filename = filename.substring(0, filename.lastIndexOf("."));
+							filename = filename.substring(0, filename.indexOf("."));
 							// uninstall
 							boolean result = this.customWarUninstall(filename);
 
@@ -162,41 +162,25 @@ public class NodeAgent extends Thread {
 
 						matcher = redeploy_pattern.matcher(commandObject.getCommand());
 						if (matcher.find()) {
-							String strCommand = commandObject.getCommand();
-							strCommand = strCommand.trim();
-							strCommand = strCommand.substring(strCommand.indexOf(":") + 1, strCommand.length());
+							String strCommand = commandObject.getCommand().trim();
+							strCommand = StringUtils.substringAfter(strCommand, ":");
 							logger.info("收接到命令:" + strCommand);
 							String filename = dis.readUTF();
-							File tempFile = null;
-							switch (strCommand) {
-							case "storeWar":
-								tempFile = Config.dir_store();
-								break;
-							case "storeJar":
-								tempFile = Config.dir_store_jars();
-								break;
-							case "customWar":
-								tempFile = Config.dir_custom();
-								break;
-							case "customJar":
-								tempFile = Config.dir_custom_jars();
-								break;
-							}
-							FileTools.forceMkdir(tempFile);
-							logger.info("文件名path:" + tempFile.getAbsolutePath() + File.separator + filename);
-							File file = new File(tempFile.getAbsolutePath() + File.separator + filename);
-							fos = new FileOutputStream(file);
-							byte[] bytes = new byte[1024];
-							int length = 0;
-							while ((length = dis.read(bytes, 0, bytes.length)) != -1) {
-								fos.write(bytes, 0, length);
-								fos.flush();
+
+							byte[] bytes;
+							try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
+								byte[] onceBytes = new byte[1024];
+								int length = 0;
+								while ((length = dis.read(onceBytes, 0, onceBytes.length)) != -1) {
+									bos.write(onceBytes, 0, length);
+									bos.flush();
+								}
+								bytes = bos.toByteArray();
 							}
-							fos.close();
-							bytes = FileUtils.readFileToByteArray(file);
-							filename = filename.substring(0, filename.lastIndexOf("."));
+
+							filename = filename.substring(0, filename.indexOf("."));
 							// 部署
-							String result = this.redeploy(filename, bytes, true);
+							String result = this.redeploy(strCommand, filename, bytes, true);
 							logger.info("部署:" + result);
 							continue;
 
@@ -405,11 +389,11 @@ public class NodeAgent extends Thread {
 		return result;
 	}
 
-	private String redeploy(String name, byte[] bytes, boolean rebootApp) {
+	private String redeploy(String type, String name, byte[] bytes, boolean rebootApp) {
 		String result = "success";
 		try {
 			logger.print("redeploy:{}.", name);
-			switch (this.type(name)) {
+			switch (type) {
 			case "storeWar":
 				storeWar(name, bytes);
 				break;
@@ -422,6 +406,9 @@ public class NodeAgent extends Thread {
 			case "customJar":
 				customJar(name, bytes, rebootApp);
 				break;
+			case "customZip":
+				customZip(name, bytes, rebootApp);
+				break;
 			}
 		} catch (Exception e) {
 			e.printStackTrace();
@@ -634,35 +621,40 @@ public class NodeAgent extends Thread {
 	private void customJar(String simpleName, byte[] bytes, boolean rebootApp) throws Exception {
 		File jar = new File(Config.dir_custom_jars(true), simpleName + ".jar");
 		FileUtils.writeByteArrayToFile(jar, bytes, false);
-		List<String> contexts = new ArrayList<>();
-		boolean isStartApplication = false;
-		for (String s : Config.dir_custom().list(new WildcardFileFilter("*.war"))) {
-			contexts.add("/" + FilenameUtils.getBaseName(s));
-		}
-		if (Servers.applicationServerIsRunning()) {
-			GzipHandler gzipHandler = (GzipHandler) Servers.applicationServer.getHandler();
-			HandlerList hanlderList = (HandlerList) gzipHandler.getHandler();
-			for (Handler handler : hanlderList.getHandlers()) {
-				if (QuickStartWebApp.class.isAssignableFrom(handler.getClass())) {
-					QuickStartWebApp app = (QuickStartWebApp) handler;
-					if (contexts.contains(app.getContextPath())) {
-						app.stop();
-						logger.print("{} need restart because {} redeployed.", app.getDisplayName(), simpleName);
-						Thread.sleep(3000);
-						app.start();
-						isStartApplication = true;
-					}
-				}
-			}
+		/*if (rebootApp) {
+			Servers.stopApplicationServer();
+			Thread.sleep(3000);
+			Servers.startApplicationServer();
+		}*/
+	}
 
-			if (rebootApp) {
-				if (!isStartApplication) {
-					Servers.stopApplicationServer();
-					Thread.sleep(1000);
-					Servers.startApplicationServer();
+	private void customZip(String simpleName, byte[] bytes, boolean rebootApp) throws Exception {
+		logger.print("start deploy customZip app {} ", simpleName);
+		File tempFile = new File(Config.base(), "local/temp/redeploy");
+		FileTools.forceMkdir(tempFile);
+		FileUtils.cleanDirectory(tempFile);
+
+		File zipFile = new File(tempFile.getAbsolutePath(), simpleName+".zip");
+		FileUtils.writeByteArrayToFile(zipFile, bytes);
+		File dist = Config.dir_custom(true);
+		List<String> subs = new ArrayList<>();
+		JarTools.unjar(zipFile, subs, dist, false);
+
+		FileUtils.cleanDirectory(tempFile);
+
+		/*if (rebootApp) {
+			Servers.stopApplicationServer();
+			int i = 0;
+			while (i++<6){
+				try {
+					if(Servers.applicationServerIsRunning()){
+						Thread.sleep(2000);
+					}
+				} catch (Exception e) {
 				}
 			}
-		}
+			Servers.startApplicationServer();
+		}*/
 	}
 
 	private List<ClassInfo> listModuleDependencyWith(String name) throws Exception {

+ 15 - 4
o2server/x_console/src/main/java/com/x/server/console/action/ActionControl.java

@@ -1,6 +1,9 @@
 package com.x.server.console.action;
 
+import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.CommandLineParser;
@@ -15,6 +18,7 @@ import org.apache.commons.lang3.math.NumberUtils;
 import com.x.base.core.project.config.Config;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ListTools;
 
 /*
 @author zhourui
@@ -203,11 +207,18 @@ public class ActionControl extends ActionBase {
 			new EraseContentOrg().execute();
 			break;
 		default:
-			EraseContentEntity eraseContentEntity = new EraseContentEntity();
-			for (String str : StringUtils.split(type, ",")) {
-				eraseContentEntity.addClass(str);
+			List<String> names = Stream.of(StringUtils.split(type, ","))
+					.filter(((List<String>) Config.resource(Config.RESOURCE_CONTAINERENTITYNAMES))::contains)
+					.collect(Collectors.toList());
+			if (names.isEmpty()) {
+				logger.print("unkown parameter:{}.", type);
+			} else {
+				EraseContentEntity eraseContentEntity = new EraseContentEntity();
+				for (String str : names) {
+					eraseContentEntity.addClass(str);
+				}
+				eraseContentEntity.execute();
 			}
-			eraseContentEntity.execute();
 			break;
 		}
 	}

+ 2 - 0
o2server/x_console/src/main/java/com/x/server/console/action/EraseContentLog.java

@@ -3,6 +3,7 @@ package com.x.server.console.action;
 import com.x.processplatform.core.entity.element.FormVersion;
 import com.x.processplatform.core.entity.element.ProcessVersion;
 import com.x.processplatform.core.entity.element.ScriptVersion;
+import com.x.processplatform.core.entity.log.SignalStackLog;
 import com.x.program.center.core.entity.PromptErrorLog;
 import com.x.program.center.core.entity.ScheduleLog;
 import com.x.program.center.core.entity.UnexpectedErrorLog;
@@ -20,6 +21,7 @@ public class EraseContentLog extends EraseContent {
 		addClass(ProcessVersion.class);
 		addClass(FormVersion.class);
 		addClass(ScriptVersion.class);
+		addClass(SignalStackLog.class);
 		this.run();
 		return true;
 	}

+ 2 - 0
o2server/x_console/src/main/java/com/x/server/console/action/EraseContentProcessPlatform.java

@@ -14,6 +14,7 @@ import com.x.processplatform.core.entity.content.TaskCompleted;
 import com.x.processplatform.core.entity.content.Work;
 import com.x.processplatform.core.entity.content.WorkCompleted;
 import com.x.processplatform.core.entity.content.WorkLog;
+import com.x.processplatform.core.entity.log.SignalStackLog;
 import com.x.query.core.entity.Item;
 
 public class EraseContentProcessPlatform extends EraseContent {
@@ -34,6 +35,7 @@ public class EraseContentProcessPlatform extends EraseContent {
 		addClass(WorkCompleted.class);
 		addClass(WorkLog.class);
 		addClass(Item.class);
+		addClass(SignalStackLog.class);
 		this.run();
 		return true;
 	}

+ 5 - 4
o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/factory/AttachmentFactory.java

@@ -1,6 +1,7 @@
 package com.x.file.assemble.control.factory;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -46,8 +47,8 @@ public class AttachmentFactory extends AbstractFactory {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Attachment> root = cq.from(Attachment.class);
 		Predicate p = cb.isMember(person, root.get(Attachment_.shareList));
-		cq.distinct(true).select(root.get(Attachment_.person)).where(p);
-		return em.createQuery(cq).getResultList();
+		cq.select(root.get(Attachment_.person)).where(p);
+		return em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 
 	public List<String> listPersonWithEditor(String person) throws Exception {
@@ -56,8 +57,8 @@ public class AttachmentFactory extends AbstractFactory {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Attachment> root = cq.from(Attachment.class);
 		Predicate p = cb.isMember(person, root.get(Attachment_.editorList));
-		cq.distinct(true).select(root.get(Attachment_.person)).where(p);
-		return em.createQuery(cq).getResultList();
+		cq.select(root.get(Attachment_.person)).where(p);
+		return em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 
 	public Long countWithPersonWithShare(String owner, String person) throws Exception {

+ 3 - 2
o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/factory/FileFactory.java

@@ -1,6 +1,7 @@
 package com.x.file.assemble.control.factory;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -28,7 +29,7 @@ public class FileFactory extends AbstractFactory {
 		Root<File> root = cq.from(File.class);
 		Predicate p = cb.equal(root.get(File_.reference), reference);
 		p = cb.and(p, cb.equal(root.get(File_.referenceType), referenceType));
-		cq.select(root.get(File_.id)).where(p).distinct(true);
-		return em.createQuery(cq).getResultList();
+		cq.select(root.get(File_.id)).where(p);
+		return em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 }

+ 5 - 2
o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/file/ActionListReferenceType.java

@@ -2,6 +2,7 @@ package com.x.file.assemble.control.jaxrs.file;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -9,10 +10,12 @@ import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 
+import com.google.gson.GsonBuilder;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.project.annotation.FieldDescribe;
 import com.x.base.core.project.gson.GsonPropertyObject;
+import com.x.base.core.project.gson.XGsonBuilder;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.file.assemble.control.Business;
@@ -45,8 +48,8 @@ class ActionListReferenceType extends BaseAction {
 		CriteriaQuery<ReferenceType> cq = cb.createQuery(ReferenceType.class);
 		Root<File> root = cq.from(File.class);
 		Predicate p = cb.equal(root.get(File_.person), effectivePerson.getDistinguishedName());
-		cq.select(root.get(File_.referenceType)).where(p).distinct(true);
-		return em.createQuery(cq).getResultList();
+		cq.select(root.get(File_.referenceType)).where(p);
+		return em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 
 	private Long countWithPersonWithReferenceType(Business business, EffectivePerson effectivePerson,

+ 1 - 1
o2server/x_message_assemble_communicate/src/main/java/com/x/message/assemble/communicate/DingdingConsumeQueue.java

@@ -57,7 +57,7 @@ public class DingdingConsumeQueue extends AbstractQueue<Message> {
 					Message messageEntityObject = emc.find(message.getId(), Message.class);
 					if (null != messageEntityObject) {
 						emc.beginTransaction(Message.class);
-						message.setConsumed(true);
+						messageEntityObject.setConsumed(true);
 						emc.commit();
 					}
 				}

+ 1 - 1
o2server/x_message_assemble_communicate/src/main/java/com/x/message/assemble/communicate/PmsConsumeQueue.java

@@ -55,7 +55,7 @@ public class PmsConsumeQueue extends AbstractQueue<Message> {
 				Message messageEntityObject = emc.find(message.getId(), Message.class);
 				if (null != messageEntityObject) {
 					emc.beginTransaction(Message.class);
-					message.setConsumed(true);
+					messageEntityObject.setConsumed(true);
 					emc.commit();
 				}
 			}

+ 1 - 1
o2server/x_message_assemble_communicate/src/main/java/com/x/message/assemble/communicate/PmsInnerConsumeQueue.java

@@ -31,7 +31,7 @@ public class PmsInnerConsumeQueue extends AbstractQueue<Message> {
 					Message messageEntityObject = emc.find(message.getId(), Message.class);
 					if (null != messageEntityObject) {
 						emc.beginTransaction(Message.class);
-						message.setConsumed(true);
+						messageEntityObject.setConsumed(true);
 						emc.commit();
 					}
 				}

+ 1 - 1
o2server/x_message_assemble_communicate/src/main/java/com/x/message/assemble/communicate/QiyeweixinConsumeQueue.java

@@ -49,7 +49,7 @@ public class QiyeweixinConsumeQueue extends AbstractQueue<Message> {
 					Message messageEntityObject = emc.find(message.getId(), Message.class);
 					if (null != messageEntityObject) {
 						emc.beginTransaction(Message.class);
-						message.setConsumed(true);
+						messageEntityObject.setConsumed(true);
 						emc.commit();
 					}
 				}

+ 1 - 1
o2server/x_message_assemble_communicate/src/main/java/com/x/message/assemble/communicate/WeLinkConsumeQueue.java

@@ -77,7 +77,7 @@ public class WeLinkConsumeQueue extends AbstractQueue<Message> {
 					Message messageEntityObject = emc.find(message.getId(), Message.class);
 					if (null != messageEntityObject) {
 						emc.beginTransaction(Message.class);
-						message.setConsumed(true);
+						messageEntityObject.setConsumed(true);
 						emc.commit();
 					}
 				}

+ 5 - 2
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/content/factory/WorkCompletedFactory.java

@@ -1,6 +1,7 @@
 package com.x.processplatform.assemble.designer.content.factory;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -45,7 +46,8 @@ public class WorkCompletedFactory extends AbstractFactory {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<WorkCompleted> root = cq.from(WorkCompleted.class);
 		Predicate p = cb.equal(root.get(WorkCompleted_.application), applicationId);
-		return em.createQuery(cq.select(root.get(WorkCompleted_.job)).where(p).distinct(true)).getResultList();
+		return em.createQuery(cq.select(root.get(WorkCompleted_.job)).where(p)).getResultList().stream().distinct()
+				.collect(Collectors.toList());
 	}
 
 	public List<String> listJobWithProcess(String processId) throws Exception {
@@ -54,6 +56,7 @@ public class WorkCompletedFactory extends AbstractFactory {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<WorkCompleted> root = cq.from(WorkCompleted.class);
 		Predicate p = cb.equal(root.get(WorkCompleted_.process), processId);
-		return em.createQuery(cq.select(root.get(WorkCompleted_.job)).where(p).distinct(true)).getResultList();
+		return em.createQuery(cq.select(root.get(WorkCompleted_.job)).where(p)).getResultList().stream().distinct()
+				.collect(Collectors.toList());
 	}
 }

+ 5 - 2
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/content/factory/WorkFactory.java

@@ -1,6 +1,7 @@
 package com.x.processplatform.assemble.designer.content.factory;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -45,7 +46,8 @@ public class WorkFactory extends AbstractFactory {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Work> root = cq.from(Work.class);
 		Predicate p = cb.equal(root.get(Work_.application), applicationId);
-		return em.createQuery(cq.select(root.get(Work_.job)).where(p).distinct(true)).getResultList();
+		return em.createQuery(cq.select(root.get(Work_.job)).where(p)).getResultList().stream().distinct()
+				.collect(Collectors.toList());
 	}
 
 	public List<String> listJobWithProcess(String processId) throws Exception {
@@ -54,6 +56,7 @@ public class WorkFactory extends AbstractFactory {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Work> root = cq.from(Work.class);
 		Predicate p = cb.equal(root.get(Work_.process), processId);
-		return em.createQuery(cq.select(root.get(Work_.job)).where(p).distinct(true)).getResultList();
+		return em.createQuery(cq.select(root.get(Work_.job)).where(p)).getResultList().stream().distinct()
+				.collect(Collectors.toList());
 	}
 }

+ 3 - 21
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/element/factory/ApplicationFactory.java

@@ -57,25 +57,7 @@ public class ApplicationFactory extends AbstractFactory {
 		return em.createQuery(cq).getResultList();
 	}
 
-	// /* 如果是isManager列示所有应用,如果不是则判断权限 */
-	// public List<String> listApplicationCategoryWithPerson(EffectivePerson
-	// effectivePerson) throws Exception {
-	// EntityManager em = this.entityManagerContainer().get(Application.class);
-	// CriteriaBuilder cb = em.getCriteriaBuilder();
-	// CriteriaQuery<String> cq = cb.createQuery(String.class);
-	// Root<Application> root = cq.from(Application.class);
-	// cq.select(root.get(Application_.applicationCategory)).distinct(true);
-	// if (!effectivePerson.isManager()) {
-	// Predicate p = cb.isMember(effectivePerson.getDistinguishedName(),
-	// root.get(Application_.controllerList));
-	// p = cb.or(p, cb.equal(root.get(Application_.creatorPerson),
-	// effectivePerson.getDistinguishedName()));
-	// cq.where(p);
-	// }
-	// return em.createQuery(cq).getResultList();
-	// }
-
-	/* 如果是isManager列示所有应用,如果不是则判断权限 */
+	// 如果是isManager列示所有应用,如果不是则判断权限
 	public Long countWithPersonWithApplicationCategory(EffectivePerson effectivePerson, String applicationCategory)
 			throws Exception {
 		EntityManager em = this.entityManagerContainer().get(Application.class);
@@ -88,8 +70,8 @@ public class ApplicationFactory extends AbstractFactory {
 					cb.or(cb.isMember(effectivePerson.getDistinguishedName(), root.get(Application_.controllerList)),
 							cb.equal(root.get(Application_.creatorPerson), effectivePerson.getDistinguishedName())));
 		}
-		cq.select(root.get(Application_.id)).where(p).distinct(true);
-		List<String> list = em.createQuery(cq).getResultList();
+		cq.select(root.get(Application_.id)).where(p);
+		List<String> list = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		return new Long(list.size());
 	}
 

+ 8 - 12
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/element/factory/ProcessFactory.java

@@ -26,8 +26,7 @@ public class ProcessFactory extends AbstractFactory {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Process> root = cq.from(Process.class);
 		Predicate p = cb.equal(root.get(Process_.application), application);
-		p = cb.and(p, cb.or(cb.isTrue(root.get(Process_.editionEnable)),
-				cb.isNull(root.get(Process_.editionEnable))));
+		p = cb.and(p, cb.or(cb.isTrue(root.get(Process_.editionEnable)), cb.isNull(root.get(Process_.editionEnable))));
 		cq.select(root.get(Process_.id)).where(p);
 		return em.createQuery(cq).getResultList();
 	}
@@ -38,8 +37,7 @@ public class ProcessFactory extends AbstractFactory {
 		CriteriaQuery<Process> cq = cb.createQuery(Process.class);
 		Root<Process> root = cq.from(Process.class);
 		Predicate p = cb.equal(root.get(Process_.application), application);
-		p = cb.and(p, cb.or(cb.isTrue(root.get(Process_.editionEnable)),
-				cb.isNull(root.get(Process_.editionEnable))));
+		p = cb.and(p, cb.or(cb.isTrue(root.get(Process_.editionEnable)), cb.isNull(root.get(Process_.editionEnable))));
 		cq.select(root).where(p);
 		return em.createQuery(cq).getResultList();
 	}
@@ -74,7 +72,6 @@ public class ProcessFactory extends AbstractFactory {
 		Predicate p = cb.equal(root.get(Process_.application), application);
 		p = cb.and(p, cb.isNotNull(root.get(Process_.edition)));
 		p = cb.and(p, cb.notEqual(root.get(Process_.edition), ""));
-
 		Subquery<Process> subquery = cq.subquery(Process.class);
 		Root<Process> subRoot = subquery.from(Process.class);
 		Predicate subP = cb.conjunction();
@@ -82,9 +79,8 @@ public class ProcessFactory extends AbstractFactory {
 		subP = cb.and(subP, cb.isTrue(subRoot.get(Process_.editionEnable)));
 		subquery.select(subRoot).where(subP);
 		p = cb.and(p, cb.not(cb.exists(subquery)));
-
-		cq.distinct(true).select(root.get(Process_.edition)).where(p);
-		return em.createQuery(cq).getResultList();
+		cq.select(root.get(Process_.edition)).where(p);
+		return em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 
 	public Process getEnabledProcess(String application, String edition) throws Exception {
@@ -97,7 +93,7 @@ public class ProcessFactory extends AbstractFactory {
 		p = cb.and(p, cb.isTrue(root.get(Process_.editionEnable)));
 		cq.select(root).where(p).orderBy(cb.desc(root.get(Process_.editionNumber)));
 		List<Process> list = em.createQuery(cq).getResultList();
-		if(list!=null && !list.isEmpty()){
+		if (list != null && !list.isEmpty()) {
 			return list.get(0);
 		}
 		return null;
@@ -110,16 +106,16 @@ public class ProcessFactory extends AbstractFactory {
 	}
 
 	public Double getMaxEditionNumber(String application, String edition) throws Exception {
-		if (StringUtils.isNotEmpty(edition)){
+		if (StringUtils.isNotEmpty(edition)) {
 			EntityManager em = this.entityManagerContainer().get(Process.class);
 			CriteriaBuilder cb = em.getCriteriaBuilder();
 			CriteriaQuery<Double> cq = cb.createQuery(Double.class);
 			Root<Process> root = cq.from(Process.class);
 			Predicate p = cb.equal(root.get(Process_.application), application);
-			p = cb.and(p,cb.equal(root.get(Process_.edition), edition));
+			p = cb.and(p, cb.equal(root.get(Process_.edition), edition));
 			cq.select(cb.max(root.get(Process_.editionNumber))).where(p);
 			Double max = em.createQuery(cq).getSingleResult();
-			if(max == null || max < 1.0){
+			if (max == null || max < 1.0) {
 				max = 1.0;
 			}
 			return max;

+ 5 - 4
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/elementtool/ActionApplicationDictOrphan.java

@@ -2,6 +2,7 @@ package com.x.processplatform.assemble.designer.jaxrs.elementtool;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -49,8 +50,8 @@ class ActionApplicationDictOrphan extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<ApplicationDict> root = cq.from(ApplicationDict.class);
 		Predicate p = cb.not(root.get(ApplicationDict_.application).in(applicationIds));
-		cq.select(root.get(ApplicationDict_.id)).where(p).distinct(true);
-		return em.createQuery(cq).getResultList();
+		cq.select(root.get(ApplicationDict_.id)).where(p);
+		return em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 
 	private List<String> listOrphanApplicationDictItem(Business business, List<String> applicationDictIds)
@@ -60,8 +61,8 @@ class ActionApplicationDictOrphan extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<ApplicationDictItem> root = cq.from(ApplicationDictItem.class);
 		Predicate p = cb.not(root.get(ApplicationDictItem_.bundle).in(applicationDictIds));
-		cq.select(root.get(ApplicationDictItem_.id)).where(p).distinct(true);
-		return em.createQuery(cq).getResultList();
+		cq.select(root.get(ApplicationDictItem_.id)).where(p);
+		return em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 
 	public static class WoApplicationDict extends ApplicationDict {

+ 5 - 4
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/elementtool/ActionFormOrphan.java

@@ -2,6 +2,7 @@ package com.x.processplatform.assemble.designer.jaxrs.elementtool;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -47,8 +48,8 @@ class ActionFormOrphan extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Form> root = cq.from(Form.class);
 		Predicate p = cb.not(root.get(Form_.application).in(applicationIds));
-		cq.select(root.get(Form_.id)).where(p).distinct(true);
-		return em.createQuery(cq).getResultList();
+		cq.select(root.get(Form_.id)).where(p);
+		return em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 
 	private List<String> listOrphanFormField(Business business, List<String> formIds) throws Exception {
@@ -57,8 +58,8 @@ class ActionFormOrphan extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<FormField> root = cq.from(FormField.class);
 		Predicate p = cb.not(root.get(FormField_.form).in(formIds));
-		cq.select(root.get(FormField_.id)).where(p).distinct(true);
-		return em.createQuery(cq).getResultList();
+		cq.select(root.get(FormField_.id)).where(p);
+		return em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 
 	public static class WoForm extends Form {

+ 5 - 4
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/elementtool/ActionProcessOrphan.java

@@ -2,6 +2,7 @@ package com.x.processplatform.assemble.designer.jaxrs.elementtool;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -88,8 +89,8 @@ class ActionProcessOrphan extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Process> root = cq.from(Process.class);
 		Predicate p = cb.not(root.get(Process_.application).in(applicationIds));
-		cq.select(root.get(Process_.id)).where(p).distinct(true);
-		return em.createQuery(cq).getResultList();
+		cq.select(root.get(Process_.id)).where(p);
+		return em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 
 	private <T extends JpaObject, W> List<String> listOrphanProcessElement(Business business, List<String> processIds,
@@ -99,8 +100,8 @@ class ActionProcessOrphan extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<T> root = cq.from(copier.getOrigClass());
 		Predicate p = cb.not(root.get(Agent.process_FIELDNAME).in(processIds));
-		cq.select(root.get(JpaObject.id_FIELDNAME)).where(p).distinct(true);
-		return em.createQuery(cq).getResultList();
+		cq.select(root.get(JpaObject.id_FIELDNAME)).where(p);
+		return em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 
 	public static class WoProcess extends Process {

+ 3 - 2
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/elementtool/ActionScriptOrphan.java

@@ -2,6 +2,7 @@ package com.x.processplatform.assemble.designer.jaxrs.elementtool;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -43,8 +44,8 @@ class ActionScriptOrphan extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Script> root = cq.from(Script.class);
 		Predicate p = cb.not(root.get(Script_.application).in(applicationIds));
-		cq.select(root.get(Script_.id)).where(p).distinct(true);
-		return em.createQuery(cq).getResultList();
+		cq.select(root.get(Script_.id)).where(p);
+		return em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 
 	public static class WoScript extends Script {

+ 10 - 6
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/form/ActionEdit.java

@@ -63,12 +63,16 @@ class ActionEdit extends BaseAction {
 			Wi.copier.copy(wi, form);
 			form.setId(id);
 			form.setApplication(application.getId());
-			FormProperties properties = new FormProperties();
-			properties.setRelatedFormList(wi.getRelatedFormList());
-			properties.setMobileRelatedFormList(wi.getMobileRelatedFormList());
-			properties.setRelatedScriptMap(wi.getRelatedScriptMap());
-			properties.setMobileRelatedScriptMap(wi.getMobileRelatedScriptMap());
-			form.setProperties(properties);
+			// FormProperties properties = new FormProperties();
+//			properties.setRelatedFormList(wi.getRelatedFormList());
+//			properties.setMobileRelatedFormList(wi.getMobileRelatedFormList());
+//			properties.setRelatedScriptMap(wi.getRelatedScriptMap());
+//			properties.setMobileRelatedScriptMap(wi.getMobileRelatedScriptMap());
+			// form.setP!!!roperties(properties);
+			form.getProperties().setRelatedFormList(wi.getRelatedFormList());
+			form.getProperties().setMobileRelatedFormList(wi.getMobileRelatedFormList());
+			form.getProperties().setRelatedScriptMap(wi.getRelatedScriptMap());
+			form.getProperties().setMobileRelatedScriptMap(wi.getMobileRelatedScriptMap());
 			emc.check(form, CheckPersistType.all);
 			emc.commit();
 			ApplicationCache.notify(Form.class);

+ 4 - 4
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/input/BaseAction.java

@@ -24,8 +24,8 @@ abstract class BaseAction extends StandardJaxrsAction {
 
 //	protected Ehcache inputCache = ApplicationCache.instance().getCache(BaseAction.class.getName(), 100,
 //			ApplicationCache.MINUTES_20, ApplicationCache.MINUTES_20);
-	
-	protected CacheCategory cacheCategory= new CacheCategory(BaseAction.class);
+
+	protected CacheCategory cacheCategory = new CacheCategory(BaseAction.class);
 
 	public enum Method {
 		cover, create, ignore;
@@ -51,7 +51,7 @@ abstract class BaseAction extends StandardJaxrsAction {
 		CriteriaQuery<Application> cq = cb.createQuery(Application.class);
 		Root<Application> root = cq.from(Application.class);
 		Predicate p = cb.equal(root.get(Application_.alias), alias);
-		List<Application> os = em.createQuery(cq.select(root).where(p).distinct(true)).getResultList();
+		List<Application> os = em.createQuery(cq.select(root).where(p)).getResultList();
 		if (os.size() == 1) {
 			return os.get(0);
 		} else {
@@ -68,7 +68,7 @@ abstract class BaseAction extends StandardJaxrsAction {
 		CriteriaQuery<Application> cq = cb.createQuery(Application.class);
 		Root<Application> root = cq.from(Application.class);
 		Predicate p = cb.equal(root.get(Application_.name), name);
-		List<Application> os = em.createQuery(cq.select(root).where(p).distinct(true)).getResultList();
+		List<Application> os = em.createQuery(cq.select(root).where(p)).getResultList();
 		if (os.size() == 1) {
 			return os.get(0);
 		} else {

+ 1 - 0
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/BaseAction.java

@@ -726,6 +726,7 @@ abstract class BaseAction extends StandardJaxrsAction {
 					business.entityManagerContainer().persist(o, CheckPersistType.all);
 				} else {
 					WrapRoute.inCopier.copy(w, o);
+
 					business.entityManagerContainer().check(o, CheckPersistType.all);
 				}
 			}

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

@@ -1228,7 +1228,7 @@ public class Business {
 		}
 		try (ZipOutputStream zos = new ZipOutputStream(os)) {
 			for (Map.Entry<String, Attachment> entry : filePathMap.entrySet()) {
-				zos.putNextEntry(new ZipEntry(entry.getKey()));
+				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 +1241,7 @@ public class Business {
 
 			if (otherAttMap != null) {
 				for (Map.Entry<String, byte[]> entry : otherAttMap.entrySet()) {
-					zos.putNextEntry(new ZipEntry(entry.getKey()));
+					zos.putNextEntry(new ZipEntry(StringUtils.replaceEach(entry.getKey(), new String[]{"/","\\"}, new String[]{"-","-"})));
 					zos.write(entry.getValue());
 				}
 			}

+ 2 - 2
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/factory/element/ApplicationFactory.java

@@ -87,7 +87,7 @@ public class ApplicationFactory extends ElementFactory {
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Application> root = cq.from(Application.class);
-		cq.select(root.get(Application_.id)).distinct(true);
+		cq.select(root.get(Application_.id));
 		if (effectivePerson.isNotManager() && (!this.business().organization().person().hasRole(effectivePerson,
 				OrganizationDefinition.Manager, OrganizationDefinition.ProcessPlatformManager))) {
 			Predicate p = cb.and(cb.isEmpty(root.get(Application_.availableIdentityList)),
@@ -102,7 +102,7 @@ public class ApplicationFactory extends ElementFactory {
 			}
 			cq.where(p);
 		}
-		return em.createQuery(cq.distinct(true)).getResultList();
+		return em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 
 	public <T extends Application> List<T> sort(List<T> list) {

+ 0 - 20
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/factory/element/FileFactory.java

@@ -21,26 +21,6 @@ public class FileFactory extends ElementFactory {
 		return this.pick(flag, File.class);
 	}
 
-//	private File pickObject(String flag) throws Exception {
-//		File o = this.business().entityManagerContainer().flag(flag, File.class);
-//		if (o != null) {
-//			this.entityManagerContainer().get(File.class).detach(o);
-//		}
-//		if (null == o) {
-//			EntityManager em = this.entityManagerContainer().get(File.class);
-//			CriteriaBuilder cb = em.getCriteriaBuilder();
-//			CriteriaQuery<File> cq = cb.createQuery(File.class);
-//			Root<File> root = cq.from(File.class);
-//			Predicate p = cb.equal(root.get(File_.name), flag);
-//			List<File> os = em.createQuery(cq.select(root).where(p).distinct(true)).getResultList();
-//			if (os.size() == 1) {
-//				o = os.get(0);
-//				em.detach(o);
-//			}
-//		}
-//		return o;
-//	}
-
 	public <T extends File> List<T> sort(List<T> list) {
 		list = list.stream()
 				.sorted(Comparator.comparing(File::getAlias, Comparator.nullsLast(String::compareTo))

+ 5 - 45
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/factory/element/ProcessFactory.java

@@ -65,47 +65,7 @@ public class ProcessFactory extends ElementFactory {
 		return o;
 	}
 
-//	private Process pickObject(String flag) throws Exception {
-//		Process o = this.business().entityManagerContainer().flag(flag, Process.class);
-//		if (o != null) {
-//			this.entityManagerContainer().get(Process.class).detach(o);
-//		}
-//		if (null == o) {
-//			EntityManager em = this.entityManagerContainer().get(Process.class);
-//			CriteriaBuilder cb = em.getCriteriaBuilder();
-//			CriteriaQuery<Process> cq = cb.createQuery(Process.class);
-//			Root<Process> root = cq.from(Process.class);
-//			Predicate p = cb.equal(root.get(Process_.name), flag);
-//			List<Process> os = em.createQuery(cq.select(root).where(p).distinct(true)).getResultList();
-//			if (os.size() == 1) {
-//				o = os.get(0);
-//				em.detach(o);
-//			}
-//		}
-//		return o;
-//	}
-
-//	public Process pickObject(Application application, String flag) throws Exception {
-//		if (null == application || StringUtils.isEmpty(flag)) {
-//			return null;
-//		}
-//		Process o = null;
-//		String cacheKey = ApplicationCache.concreteCacheKey(Process.class, application.getId(), flag);
-//		Element element = cache.get(cacheKey);
-//		if (null != element) {
-//			if (null != element.getObjectValue()) {
-//				o = (Process) element.getObjectValue();
-//			}
-//		} else {
-//			o = this.restrictProcess(application.getId(), flag);
-//			if (null != o) {
-//				cache.put(new Element(cacheKey, o));
-//			}
-//		}
-//		return o;
-//	}
-
-	/* 获取Application下的所有流程 */
+	// 获取Application下的所有流程
 	public List<String> listWithApplication(Application application) throws Exception {
 		EntityManager em = this.entityManagerContainer().get(Process.class);
 		CriteriaBuilder cb = em.getCriteriaBuilder();
@@ -113,8 +73,8 @@ public class ProcessFactory extends ElementFactory {
 		Root<Process> root = cq.from(Process.class);
 		Predicate p = cb.equal(root.get(Process_.application), application.getId());
 		p = cb.and(p, cb.or(cb.isTrue(root.get(Process_.editionEnable)), cb.isNull(root.get(Process_.editionEnable))));
-		cq.select(root.get(Process_.id)).where(p).distinct(true);
-		return em.createQuery(cq).getResultList();
+		cq.select(root.get(Process_.id)).where(p);
+		return em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 
 	/* 获取用户可启动的流程,如果applicationId 为空则取到所有可启动流程 */
@@ -139,8 +99,8 @@ public class ProcessFactory extends ElementFactory {
 		}
 		p = cb.and(p, cb.equal(root.get(Process_.application), application.getId()));
 		p = cb.and(p, cb.or(cb.isTrue(root.get(Process_.editionEnable)), cb.isNull(root.get(Process_.editionEnable))));
-		cq.select(root.get(Process_.id)).where(p).distinct(true);
-		return em.createQuery(cq).getResultList();
+		cq.select(root.get(Process_.id)).where(p);
+		return em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 
 	/* 获取用户可启动的流程,如果applicationId 为空则取到所有可启动流程 */

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

@@ -2,6 +2,7 @@ package com.x.processplatform.assemble.surface.jaxrs.application;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -98,8 +99,8 @@ class ActionListWithPerson extends BaseAction {
 			}
 			cq.where(p);
 		}
-		list = em.createQuery(cq.select(root.get(Application_.id)).distinct(true)).getResultList();
-		return list;
+		return em.createQuery(cq.select(root.get(Application_.id))).getResultList().stream().distinct()
+				.collect(Collectors.toList());
 	}
 
 	/**
@@ -126,7 +127,7 @@ class ActionListWithPerson extends BaseAction {
 				p = cb.or(p, root.get(Process_.startableUnitList).in(units));
 			}
 		}
-		cq.select(root.get(Process_.application)).distinct(true).where(p);
-		return em.createQuery(cq).getResultList();
+		cq.select(root.get(Process_.application)).where(p);
+		return em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 }

+ 5 - 5
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ActionListWithPersonComplex.java

@@ -2,6 +2,7 @@ package com.x.processplatform.assemble.surface.jaxrs.application;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -108,7 +109,6 @@ class ActionListWithPersonComplex extends BaseAction {
 
 	private List<String> listFromApplication(Business business, EffectivePerson effectivePerson, List<String> roles,
 			List<String> identities, List<String> units) throws Exception {
-		List<String> list = new ArrayList<>();
 		EntityManager em = business.entityManagerContainer().get(Application.class);
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
@@ -127,8 +127,8 @@ class ActionListWithPersonComplex extends BaseAction {
 			}
 			cq.where(p);
 		}
-		list = em.createQuery(cq.select(root.get(Application_.id)).distinct(true)).getResultList();
-		return list;
+		return em.createQuery(cq.select(root.get(Application_.id))).getResultList().stream().distinct()
+				.collect(Collectors.toList());
 	}
 
 	/**
@@ -155,8 +155,8 @@ class ActionListWithPersonComplex extends BaseAction {
 				p = cb.or(p, root.get(Process_.startableUnitList).in(units));
 			}
 		}
-		cq.select(root.get(Process_.application)).distinct(true).where(p);
-		return em.createQuery(cq).getResultList();
+		cq.select(root.get(Process_.application)).where(p);
+		return em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 
 	private List<WoProcess> referenceProcess(Business business, EffectivePerson effectivePerson,

+ 5 - 5
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ActionListWithPersonLike.java

@@ -2,6 +2,7 @@ package com.x.processplatform.assemble.surface.jaxrs.application;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -66,7 +67,6 @@ class ActionListWithPersonLike extends BaseAction {
 
 	private List<String> listFromApplication(Business business, EffectivePerson effectivePerson, List<String> roles,
 			List<String> identities, List<String> units) throws Exception {
-		List<String> list = new ArrayList<>();
 		EntityManager em = business.entityManagerContainer().get(Application.class);
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
@@ -85,8 +85,8 @@ class ActionListWithPersonLike extends BaseAction {
 			}
 			cq.where(p);
 		}
-		list = em.createQuery(cq.select(root.get(Application_.id)).distinct(true)).getResultList();
-		return list;
+		return em.createQuery(cq.select(root.get(Application_.id))).getResultList().stream().distinct()
+				.collect(Collectors.toList());
 	}
 
 	/**
@@ -116,7 +116,7 @@ class ActionListWithPersonLike extends BaseAction {
 				p = cb.or(p, root.get(Process_.startableUnitList).in(units));
 			}
 		}
-		cq.select(root.get(Process_.application)).distinct(true).where(p);
-		return em.createQuery(cq).getResultList();
+		cq.select(root.get(Process_.application)).where(p);
+		return em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 }

+ 12 - 15
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ActionManageListWithPersonComplex.java

@@ -24,6 +24,7 @@ import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 class ActionManageListWithPersonComplex extends BaseAction {
 
@@ -33,7 +34,7 @@ class ActionManageListWithPersonComplex extends BaseAction {
 			List<Wo> wos = new ArrayList<>();
 			Business business = new Business(emc);
 
-			if (effectivePerson.isManager()){
+			if (effectivePerson.isManager()) {
 				List<String> identities = business.organization().identity().listWithPerson(person);
 				/** 去除部门以及上级部门,如果设置了一级部门可用,那么一级部门下属的二级部门也可用 */
 				List<String> units = business.organization().unit().listWithPersonSupNested(person);
@@ -127,7 +128,8 @@ class ActionManageListWithPersonComplex extends BaseAction {
 		}
 		cq.where(p);
 
-		list = em.createQuery(cq.select(root.get(Application_.id)).distinct(true)).getResultList();
+		list = em.createQuery(cq.select(root.get(Application_.id))).getResultList().stream().distinct()
+				.collect(Collectors.toList());
 		return list;
 	}
 
@@ -153,14 +155,13 @@ class ActionManageListWithPersonComplex extends BaseAction {
 			p = cb.or(p, root.get(Process_.startableUnitList).in(units));
 		}
 
-		cq.select(root.get(Process_.application)).distinct(true).where(p);
-		return em.createQuery(cq).getResultList();
+		cq.select(root.get(Process_.application)).where(p);
+		return em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 
 	private List<WoProcess> referenceProcess(Business business, EffectivePerson effectivePerson,
 			List<String> identities, List<String> units, Application application) throws Exception {
-		List<String> ids = this.listStartableWithApplication(business,effectivePerson, identities, units,
-				application);
+		List<String> ids = this.listStartableWithApplication(business, effectivePerson, identities, units, application);
 		List<WoProcess> wos = new ArrayList<>();
 		for (String id : ids) {
 			WoProcess o = WoProcess.copier.copy(business.process().pick(id));
@@ -171,9 +172,8 @@ class ActionManageListWithPersonComplex extends BaseAction {
 	}
 
 	/* 获取用户可启动的流程,如果applicationId 为空则取到所有可启动流程 */
-	private List<String> listStartableWithApplication(Business business, EffectivePerson effectivePerson, List<String> identities,
-													 List<String> units, Application application) throws Exception {
-		List<String> list = new ArrayList<>();
+	private List<String> listStartableWithApplication(Business business, EffectivePerson effectivePerson,
+			List<String> identities, List<String> units, Application application) throws Exception {
 		EntityManager em = business.entityManagerContainer().get(Process.class);
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
@@ -191,11 +191,8 @@ class ActionManageListWithPersonComplex extends BaseAction {
 		}
 
 		p = cb.and(p, cb.equal(root.get(Process_.application), application.getId()));
-		p = cb.and(p, cb.or(cb.isTrue(root.get(Process_.editionEnable)),
-				cb.isNull(root.get(Process_.editionEnable))));
-		cq.select(root.get(Process_.id)).where(p).distinct(true);
-
-		list = em.createQuery(cq).getResultList();
-		return list;
+		p = cb.and(p, cb.or(cb.isTrue(root.get(Process_.editionEnable)), cb.isNull(root.get(Process_.editionEnable))));
+		cq.select(root.get(Process_.id)).where(p);
+		return em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 }

+ 183 - 0
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/ActionCopyToWorkCompleted.java

@@ -0,0 +1,183 @@
+package com.x.processplatform.assemble.surface.jaxrs.attachment;
+
+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.Applications;
+import com.x.base.core.project.annotation.ActionLogger;
+import com.x.base.core.project.annotation.FieldDescribe;
+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.jaxrs.WoId;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ListTools;
+import com.x.base.core.project.x_processplatform_service_processing;
+import com.x.processplatform.assemble.surface.Business;
+import com.x.processplatform.assemble.surface.ThisApplication;
+import com.x.processplatform.assemble.surface.WorkControl;
+import com.x.processplatform.core.entity.content.Attachment;
+import com.x.processplatform.core.entity.content.WorkCompleted;
+
+import java.util.ArrayList;
+import java.util.List;
+
+class ActionCopyToWorkCompleted extends BaseAction {
+
+	@ActionLogger
+	private static Logger logger = LoggerFactory.getLogger(ActionCopyToWorkCompleted.class);
+
+	ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, String workCompletedId, JsonElement jsonElement)
+			throws Exception {
+
+		ActionResult<List<Wo>> result = new ActionResult<>();
+		List<Wo> wos = new ArrayList<>();
+		Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
+
+		WorkCompleted workCompleted = null;
+		Req req = new Req();
+
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+
+			workCompleted = emc.flag(workCompletedId, WorkCompleted.class);
+			if((null == workCompleted)){
+				throw new ExceptionEntityNotExist(workCompletedId, WorkCompleted.class);
+			}
+			if (!business.canManageApplicationOrProcess(effectivePerson, workCompleted.getApplication(),
+					workCompleted.getProcess())) {
+				throw new ExceptionAccessDenied(effectivePerson);
+			}
+
+			if (ListTools.isNotEmpty(wi.getAttachmentList())) {
+				for (WiAttachment w : wi.getAttachmentList()) {
+					Attachment o = emc.find(w.getId(), Attachment.class);
+					if (null == o) {
+						throw new ExceptionEntityNotExist(w.getId(), Attachment.class);
+					}
+					if (!business.readableWithJob(effectivePerson, o.getJob())) {
+						throw new ExceptionAccessDenied(effectivePerson, o.getJob());
+					}
+					ReqAttachment q = new ReqAttachment();
+					q.setId(o.getId());
+					q.setName(w.getName());
+					q.setSite(w.getSite());
+					req.getAttachmentList().add(q);
+				}
+			}
+		}
+
+		if (ListTools.isNotEmpty(req.getAttachmentList())) {
+			wos = ThisApplication.context().applications()
+					.postQuery(effectivePerson.getDebugger(), x_processplatform_service_processing.class,
+							Applications.joinQueryUri("attachment", "copy", "workcompleted", workCompleted.getId()), req, workCompleted.getJob())
+					.getDataAsList(Wo.class);
+		}
+
+		result.setData(wos);
+		return result;
+	}
+
+	public static class Wi extends GsonPropertyObject {
+
+		@FieldDescribe("附件对象")
+		private List<WiAttachment> attachmentList = new ArrayList<>();
+
+		public List<WiAttachment> getAttachmentList() {
+			return attachmentList;
+		}
+
+		public void setAttachmentList(List<WiAttachment> attachmentList) {
+			this.attachmentList = attachmentList;
+		}
+
+	}
+
+	public static class ReqAttachment extends GsonPropertyObject {
+
+		private String id;
+		private String name;
+		private String site;
+
+		public String getId() {
+			return id;
+		}
+
+		public void setId(String id) {
+			this.id = id;
+		}
+
+		public String getName() {
+			return name;
+		}
+
+		public void setName(String name) {
+			this.name = name;
+		}
+
+		public String getSite() {
+			return site;
+		}
+
+		public void setSite(String site) {
+			this.site = site;
+		}
+
+	}
+
+	public static class Req extends GsonPropertyObject {
+
+		List<ReqAttachment> attachmentList = new ArrayList<>();
+
+		public List<ReqAttachment> getAttachmentList() {
+			return attachmentList;
+		}
+
+		public void setAttachmentList(List<ReqAttachment> attachmentList) {
+			this.attachmentList = attachmentList;
+		}
+
+	}
+
+	public static class WiAttachment extends GsonPropertyObject {
+
+		private String id;
+		private String name;
+		private String site;
+
+		public String getId() {
+			return id;
+		}
+
+		public void setId(String id) {
+			this.id = id;
+		}
+
+		public String getName() {
+			return name;
+		}
+
+		public void setName(String name) {
+			this.name = name;
+		}
+
+		public String getSite() {
+			return site;
+		}
+
+		public void setSite(String site) {
+			this.site = site;
+		}
+
+	}
+
+	public static class Wo extends WoId {
+
+	}
+
+	public static class WoWorkControl extends WorkControl {
+	}
+}

+ 18 - 0
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/AttachmentAction.java

@@ -598,6 +598,24 @@ public class AttachmentAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
 
+	@JaxrsMethodDescribe(value = "由指定的工作拷贝附件.", action = ActionCopyToWorkCompleted.class)
+	@POST
+	@Path("copy/workcompleted/{workCompletedId}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void copyToWorkCompleted(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+						   @JaxrsParameterDescribe("已完成工作标识") @PathParam("workCompletedId") String workCompletedId, JsonElement jsonElement) {
+		ActionResult<List<ActionCopyToWorkCompleted.Wo>> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionCopyToWorkCompleted().execute(effectivePerson, workCompletedId, jsonElement);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
 	@JaxrsMethodDescribe(value = "更新附件.", action = ActionChangeSite.class)
 	@GET
 	@Path("{id}/work/{workId}/change/site/{site}")

+ 3 - 2
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/process/ActionListWithPersonWithApplicationFilter.java

@@ -2,6 +2,7 @@ package com.x.processplatform.assemble.surface.jaxrs.process;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -98,8 +99,8 @@ class ActionListWithPersonWithApplicationFilter extends BaseAction {
 							cb.equal(root.get(Process_.startableTerminal), Process.STARTABLETERMINAL_ALL)));
 		}
 
-		cq.select(root.get(Process_.id)).where(p).distinct(true);
-		return em.createQuery(cq).getResultList();
+		cq.select(root.get(Process_.id)).where(p);
+		return em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 
 	public static class Wo extends Process {

+ 11 - 10
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/read/ActionFilterAttribute.java

@@ -2,6 +2,7 @@ package com.x.processplatform.assemble.surface.jaxrs.read;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -104,8 +105,8 @@ class ActionFilterAttribute extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Read> root = cq.from(Read.class);
 		Predicate p = cb.equal(root.get(Read_.person), effectivePerson.getDistinguishedName());
-		cq.select(root.get(Read_.application)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(Read_.application)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -132,8 +133,8 @@ class ActionFilterAttribute extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Read> root = cq.from(Read.class);
 		Predicate p = cb.equal(root.get(Read_.person), effectivePerson.getDistinguishedName());
-		cq.select(root.get(Read_.process)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(Read_.process)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -160,8 +161,8 @@ class ActionFilterAttribute extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Read> root = cq.from(Read.class);
 		Predicate p = cb.equal(root.get(Read_.person), effectivePerson.getDistinguishedName());
-		cq.select(root.get(Read_.creatorUnit)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(Read_.creatorUnit)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -182,8 +183,8 @@ class ActionFilterAttribute extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Read> root = cq.from(Read.class);
 		Predicate p = cb.equal(root.get(Read_.person), effectivePerson.getDistinguishedName());
-		cq.select(root.get(Read_.activityName)).where(p).distinct(true);
-		List<String> list = em.createQuery(cq).getResultList();
+		cq.select(root.get(Read_.activityName)).where(p);
+		List<String> list = em.createQuery(cq).getResultList().stream().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : list) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -204,8 +205,8 @@ class ActionFilterAttribute extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Read> root = cq.from(Read.class);
 		Predicate p = cb.equal(root.get(Read_.person), effectivePerson.getDistinguishedName());
-		cq.select(root.get(Read_.startTimeMonth)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(Read_.startTimeMonth)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {

+ 10 - 10
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/read/ActionFilterAttributeFilter.java

@@ -187,8 +187,8 @@ class ActionFilterAttributeFilter extends BaseAction {
 		if (ListTools.isNotEmpty(wi.getActivityNameList())) {
 			p = cb.and(p, root.get(Read_.activityName).in(wi.getActivityNameList()));
 		}
-		cq.select(root.get(Read_.application)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(Read_.application)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -232,8 +232,8 @@ class ActionFilterAttributeFilter extends BaseAction {
 		if (ListTools.isNotEmpty(wi.getActivityNameList())) {
 			p = cb.and(p, root.get(Read_.activityName).in(wi.getActivityNameList()));
 		}
-		cq.select(root.get(Read_.process)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(Read_.process)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -277,8 +277,8 @@ class ActionFilterAttributeFilter extends BaseAction {
 		if (ListTools.isNotEmpty(wi.getActivityNameList())) {
 			p = cb.and(p, root.get(Read_.activityName).in(wi.getActivityNameList()));
 		}
-		cq.select(root.get(Read_.creatorUnit)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(Read_.creatorUnit)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -316,8 +316,8 @@ class ActionFilterAttributeFilter extends BaseAction {
 		if (ListTools.isNotEmpty(wi.getActivityNameList())) {
 			p = cb.and(p, root.get(Read_.activityName).in(wi.getActivityNameList()));
 		}
-		cq.select(root.get(Read_.activityName)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(Read_.activityName)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -355,8 +355,8 @@ class ActionFilterAttributeFilter extends BaseAction {
 		if (ListTools.isNotEmpty(wi.getActivityNameList())) {
 			p = cb.and(p, root.get(Read_.activityName).in(wi.getActivityNameList()));
 		}
-		cq.select(root.get(Read_.startTimeMonth)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(Read_.startTimeMonth)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {

+ 3 - 2
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/read/ActionListCountWithApplication.java

@@ -2,6 +2,7 @@ package com.x.processplatform.assemble.surface.jaxrs.read;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -32,8 +33,8 @@ class ActionListCountWithApplication extends BaseAction {
 			CriteriaQuery<String> cq = cb.createQuery(String.class);
 			Root<Read> root = cq.from(Read.class);
 			Predicate p = cb.equal(root.get(Read_.person), effectivePerson.getDistinguishedName());
-			cq.select(root.get(Read_.application)).where(p).distinct(true);
-			List<String> list = em.createQuery(cq).getResultList();
+			cq.select(root.get(Read_.application)).where(p);
+			List<String> list = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 			for (String str : list) {
 				NameValueCountPair o = this.concreteNameValueCountPair(business, effectivePerson, str);
 				wraps.add(o);

+ 3 - 2
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/read/ActionListCountWithProcess.java

@@ -2,6 +2,7 @@ package com.x.processplatform.assemble.surface.jaxrs.read;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -40,8 +41,8 @@ class ActionListCountWithProcess extends BaseAction {
 			Root<Read> root = cq.from(Read.class);
 			Predicate p = cb.equal(root.get(Read_.person), effectivePerson.getDistinguishedName());
 			p = cb.and(p, cb.equal(root.get(Read_.application), application.getId()));
-			cq.select(root.get(Read_.process)).where(p).distinct(true);
-			List<String> list = em.createQuery(cq).getResultList();
+			cq.select(root.get(Read_.process)).where(p);
+			List<String> list = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 			for (String str : list) {
 				NameValueCountPair o = this.concreteNameValueCountPair(business, effectivePerson, str);
 				wraps.add(o);

+ 15 - 12
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/readcompleted/ActionFilterAttribute.java

@@ -2,6 +2,7 @@ package com.x.processplatform.assemble.surface.jaxrs.readcompleted;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -115,8 +116,8 @@ class ActionFilterAttribute extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<ReadCompleted> root = cq.from(ReadCompleted.class);
 		Predicate p = cb.equal(root.get(ReadCompleted_.person), effectivePerson.getDistinguishedName());
-		cq.select(root.get(ReadCompleted_.application)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(ReadCompleted_.application)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -143,8 +144,8 @@ class ActionFilterAttribute extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<ReadCompleted> root = cq.from(ReadCompleted.class);
 		Predicate p = cb.equal(root.get(ReadCompleted_.person), effectivePerson.getDistinguishedName());
-		cq.select(root.get(ReadCompleted_.process)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(ReadCompleted_.process)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -171,8 +172,8 @@ class ActionFilterAttribute extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<ReadCompleted> root = cq.from(ReadCompleted.class);
 		Predicate p = cb.equal(root.get(ReadCompleted_.person), effectivePerson.getDistinguishedName());
-		cq.select(root.get(ReadCompleted_.creatorUnit)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(ReadCompleted_.creatorUnit)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -193,8 +194,8 @@ class ActionFilterAttribute extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<ReadCompleted> root = cq.from(ReadCompleted.class);
 		Predicate p = cb.equal(root.get(ReadCompleted_.person), effectivePerson.getDistinguishedName());
-		cq.select(root.get(ReadCompleted_.activityName)).where(p).distinct(true);
-		List<String> list = em.createQuery(cq).getResultList();
+		cq.select(root.get(ReadCompleted_.activityName)).where(p);
+		List<String> list = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : list) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -215,8 +216,9 @@ class ActionFilterAttribute extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<ReadCompleted> root = cq.from(ReadCompleted.class);
 		Predicate p = cb.equal(root.get(ReadCompleted_.person), effectivePerson.getDistinguishedName());
-		cq.select(root.get(ReadCompleted_.completedTimeMonth)).where(p).distinct(true);
-		List<String> list = em.createQuery(cq).getResultList();
+		cq.select(root.get(ReadCompleted_.completedTimeMonth)).where(p);
+		List<String> list = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
+		;
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : list) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -237,8 +239,9 @@ class ActionFilterAttribute extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<ReadCompleted> root = cq.from(ReadCompleted.class);
 		Predicate p = cb.equal(root.get(ReadCompleted_.person), effectivePerson.getDistinguishedName());
-		cq.select(root.get(ReadCompleted_.startTimeMonth)).where(p).distinct(true);
-		List<String> list = em.createQuery(cq).getResultList();
+		cq.select(root.get(ReadCompleted_.startTimeMonth)).where(p);
+		List<String> list = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
+		;
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : list) {
 			if (StringUtils.isNotEmpty(str)) {

+ 13 - 12
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/readcompleted/ActionFilterAttributeFilter.java

@@ -213,8 +213,9 @@ class ActionFilterAttributeFilter extends BaseAction {
 		if (ListTools.isNotEmpty(wi.getActivityNameList())) {
 			p = cb.and(p, root.get(ReadCompleted_.activityName).in(wi.getActivityNameList()));
 		}
-		cq.select(root.get(ReadCompleted_.application)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(ReadCompleted_.application)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
+		;
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -261,8 +262,8 @@ class ActionFilterAttributeFilter extends BaseAction {
 		if (ListTools.isNotEmpty(wi.getActivityNameList())) {
 			p = cb.and(p, root.get(ReadCompleted_.activityName).in(wi.getActivityNameList()));
 		}
-		cq.select(root.get(ReadCompleted_.process)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(ReadCompleted_.process)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -309,8 +310,8 @@ class ActionFilterAttributeFilter extends BaseAction {
 		if (ListTools.isNotEmpty(wi.getActivityNameList())) {
 			p = cb.and(p, root.get(ReadCompleted_.activityName).in(wi.getActivityNameList()));
 		}
-		cq.select(root.get(ReadCompleted_.creatorUnit)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(ReadCompleted_.creatorUnit)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -351,8 +352,8 @@ class ActionFilterAttributeFilter extends BaseAction {
 		if (ListTools.isNotEmpty(wi.getActivityNameList())) {
 			p = cb.and(p, root.get(ReadCompleted_.activityName).in(wi.getActivityNameList()));
 		}
-		cq.select(root.get(ReadCompleted_.activityName)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(ReadCompleted_.activityName)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -393,8 +394,8 @@ class ActionFilterAttributeFilter extends BaseAction {
 		if (ListTools.isNotEmpty(wi.getActivityNameList())) {
 			p = cb.and(p, root.get(ReadCompleted_.activityName).in(wi.getActivityNameList()));
 		}
-		cq.select(root.get(ReadCompleted_.startTimeMonth)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(ReadCompleted_.startTimeMonth)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -435,8 +436,8 @@ class ActionFilterAttributeFilter extends BaseAction {
 		if (ListTools.isNotEmpty(wi.getActivityNameList())) {
 			p = cb.and(p, root.get(ReadCompleted_.activityName).in(wi.getActivityNameList()));
 		}
-		cq.select(root.get(ReadCompleted_.completedTimeMonth)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(ReadCompleted_.completedTimeMonth)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {

+ 3 - 2
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/readcompleted/ActionListCountWithApplication.java

@@ -3,6 +3,7 @@ package com.x.processplatform.assemble.surface.jaxrs.readcompleted;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -43,8 +44,8 @@ class ActionListCountWithApplication extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<ReadCompleted> root = cq.from(ReadCompleted.class);
 		Predicate p = cb.equal(root.get(ReadCompleted_.person), effectivePerson.getDistinguishedName());
-		cq.select(root.get(ReadCompleted_.application)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(ReadCompleted_.application)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			NameValueCountPair o = new NameValueCountPair();

+ 3 - 2
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/readcompleted/ActionListCountWithProcess.java

@@ -3,6 +3,7 @@ package com.x.processplatform.assemble.surface.jaxrs.readcompleted;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -52,8 +53,8 @@ class ActionListCountWithProcess extends BaseAction {
 		Root<ReadCompleted> root = cq.from(ReadCompleted.class);
 		Predicate p = cb.equal(root.get(ReadCompleted_.person), effectivePerson.getDistinguishedName());
 		p = cb.and(p, cb.equal(root.get(ReadCompleted_.application), application.getId()));
-		cq.select(root.get(ReadCompleted_.process)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(ReadCompleted_.process)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		for (String str : os) {
 			NameValueCountPair o = new NameValueCountPair();
 			Process process = business.process().pick(str);

+ 0 - 31
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/readcompleted/BaseAction.java

@@ -14,16 +14,6 @@ import com.x.processplatform.core.entity.content.ReadCompleted_;
 
 abstract class BaseAction extends StandardJaxrsAction {
 
-//	static WrapCopier<ReadCompleted, WrapOutReadCompleted> readCompletedOutCopier = WrapCopierFactory
-//			.wo(ReadCompleted.class, WrapOutReadCompleted.class, null, WrapOutReadCompleted.FieldsInvisible);
-//
-//	static WrapCopier<Work, WrapOutWork> workOutCopier = WrapCopierFactory.wo(Work.class, WrapOutWork.class, null,
-//			WrapOutWork.Excludes);
-//
-//	static WrapCopier<WorkCompleted, WrapOutWorkCompleted> workCompletedOutCopier = WrapCopierFactory
-//			.wo(WorkCompleted.class, WrapOutWorkCompleted.class, null, WrapOutWorkCompleted.Excludes);
-	
-
 	Long countWithApplication(Business business, EffectivePerson effectivePerson, String id) throws Exception {
 		EntityManager em = business.entityManagerContainer().get(ReadCompleted.class);
 		CriteriaBuilder cb = em.getCriteriaBuilder();
@@ -35,27 +25,6 @@ abstract class BaseAction extends StandardJaxrsAction {
 		return em.createQuery(cq).getSingleResult();
 	}
 
-//	List<NameValueCountPair> listProcessPair(Business business, EffectivePerson effectivePerson,
-//			Application application) throws Exception {
-//		List<NameValueCountPair> wraps = new ArrayList<>();
-//		EntityManager em = business.entityManagerContainer().get(ReadCompleted.class);
-//		CriteriaBuilder cb = em.getCriteriaBuilder();
-//		CriteriaQuery<String> cq = cb.createQuery(String.class);
-//		Root<ReadCompleted> root = cq.from(ReadCompleted.class);
-//		Predicate p = cb.equal(root.get(ReadCompleted_.person), effectivePerson.getDistinguishedName());
-//		p = cb.and(p, cb.equal(root.get(ReadCompleted_.application), application.getId()));
-//		cq.select(root.get(ReadCompleted_.process)).where(p).distinct(true);
-//		List<String> list = em.createQuery(cq).getResultList();
-//		for (String str : list) {
-//			NameValueCountPair o = new NameValueCountPair();
-//			o.setValue(str);
-//			o.setName(business.process().pickName(str, ReadCompleted.class, effectivePerson.getDistinguishedName()));
-//			wraps.add(o);
-//		}
-//		SortTools.asc(wraps, "name");
-//		return wraps;
-//	}
-
 	Long countWithProcess(Business business, EffectivePerson effectivePerson, String id) throws Exception {
 		EntityManager em = business.entityManagerContainer().get(ReadCompleted.class);
 		CriteriaBuilder cb = em.getCriteriaBuilder();

+ 11 - 10
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/task/ActionFilterAttribute.java

@@ -2,6 +2,7 @@ package com.x.processplatform.assemble.surface.jaxrs.task;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -108,8 +109,8 @@ class ActionFilterAttribute extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Task> root = cq.from(Task.class);
 		Predicate p = cb.equal(root.get(Task_.person), effectivePerson.getDistinguishedName());
-		cq.select(root.get(Task_.application)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(Task_.application)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -136,8 +137,8 @@ class ActionFilterAttribute extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Task> root = cq.from(Task.class);
 		Predicate p = cb.equal(root.get(Task_.person), effectivePerson.getDistinguishedName());
-		cq.select(root.get(Task_.process)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(Task_.process)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -164,8 +165,8 @@ class ActionFilterAttribute extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Task> root = cq.from(Task.class);
 		Predicate p = cb.equal(root.get(Task_.person), effectivePerson.getDistinguishedName());
-		cq.select(root.get(Task_.creatorUnit)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(Task_.creatorUnit)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -186,8 +187,8 @@ class ActionFilterAttribute extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Task> root = cq.from(Task.class);
 		Predicate p = cb.equal(root.get(Task_.person), effectivePerson.getDistinguishedName());
-		cq.select(root.get(Task_.activityName)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(Task_.activityName)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -208,8 +209,8 @@ class ActionFilterAttribute extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Task> root = cq.from(Task.class);
 		Predicate p = cb.equal(root.get(Task_.person), effectivePerson.getDistinguishedName());
-		cq.select(root.get(Task_.startTimeMonth)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(Task_.startTimeMonth)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {

+ 10 - 10
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/task/ActionFilterAttributeFilter.java

@@ -187,8 +187,8 @@ class ActionFilterAttributeFilter extends BaseAction {
 		if (ListTools.isNotEmpty(wi.getActivityNameList())) {
 			p = cb.and(p, root.get(Task_.activityName).in(wi.getActivityNameList()));
 		}
-		cq.select(root.get(Task_.application)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(Task_.application)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -232,8 +232,8 @@ class ActionFilterAttributeFilter extends BaseAction {
 		if (ListTools.isNotEmpty(wi.getActivityNameList())) {
 			p = cb.and(p, root.get(Task_.activityName).in(wi.getActivityNameList()));
 		}
-		cq.select(root.get(Task_.process)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(Task_.process)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -277,8 +277,8 @@ class ActionFilterAttributeFilter extends BaseAction {
 		if (ListTools.isNotEmpty(wi.getActivityNameList())) {
 			p = cb.and(p, root.get(Task_.activityName).in(wi.getActivityNameList()));
 		}
-		cq.select(root.get(Task_.creatorUnit)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(Task_.creatorUnit)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -316,8 +316,8 @@ class ActionFilterAttributeFilter extends BaseAction {
 		if (ListTools.isNotEmpty(wi.getActivityNameList())) {
 			p = cb.and(p, root.get(Task_.activityName).in(wi.getActivityNameList()));
 		}
-		cq.select(root.get(Task_.activityName)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(Task_.activityName)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -355,8 +355,8 @@ class ActionFilterAttributeFilter extends BaseAction {
 		if (ListTools.isNotEmpty(wi.getActivityNameList())) {
 			p = cb.and(p, root.get(Task_.activityName).in(wi.getActivityNameList()));
 		}
-		cq.select(root.get(Task_.startTimeMonth)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(Task_.startTimeMonth)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {

+ 3 - 2
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/task/ActionListCountWithApplication.java

@@ -2,6 +2,7 @@ package com.x.processplatform.assemble.surface.jaxrs.task;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -32,8 +33,8 @@ class ActionListCountWithApplication extends BaseAction {
 			CriteriaQuery<String> cq = cb.createQuery(String.class);
 			Root<Task> root = cq.from(Task.class);
 			Predicate p = cb.equal(root.get(Task_.person), effectivePerson.getDistinguishedName());
-			cq.select(root.get(Task_.application)).where(p).distinct(true);
-			List<String> list = em.createQuery(cq).getResultList();
+			cq.select(root.get(Task_.application)).where(p);
+			List<String> list = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 			for (String str : list) {
 				this.addNameValueCountPair(business, effectivePerson, str, wraps);
 			}

+ 3 - 2
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/task/ActionListCountWithProcess.java

@@ -2,6 +2,7 @@ package com.x.processplatform.assemble.surface.jaxrs.task;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -37,8 +38,8 @@ class ActionListCountWithProcess extends BaseAction {
 				Root<Task> root = cq.from(Task.class);
 				Predicate p = cb.equal(root.get(Task_.person), effectivePerson.getDistinguishedName());
 				p = cb.and(p, cb.equal(root.get(Task_.application), application.getId()));
-				cq.select(root.get(Task_.process)).where(p).distinct(true);
-				List<String> list = em.createQuery(cq).getResultList();
+				cq.select(root.get(Task_.process)).where(p);
+				List<String> list = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 				for (String str : list) {
 					this.addNameValueCountPair(business, effectivePerson, str, wraps);
 				}

+ 157 - 84
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/task/ActionProcessing.java

@@ -3,8 +3,10 @@ package com.x.processplatform.assemble.surface.jaxrs.task;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.concurrent.LinkedBlockingQueue;
 import java.util.stream.Collectors;
 
+import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.StringUtils;
 
 import com.google.gson.JsonElement;
@@ -41,12 +43,15 @@ import com.x.processplatform.core.entity.content.WorkCompleted;
 import com.x.processplatform.core.entity.content.WorkLog;
 import com.x.processplatform.core.entity.element.Manual;
 import com.x.processplatform.core.entity.element.Route;
+import com.x.processplatform.core.entity.log.SignalStack;
 import com.x.processplatform.core.express.ProcessingAttributes;
+import com.x.processplatform.core.express.service.processing.jaxrs.task.ActionProcessingWo;
 import com.x.processplatform.core.express.service.processing.jaxrs.task.WrapAppend;
 import com.x.processplatform.core.express.service.processing.jaxrs.task.WrapProcessing;
 import com.x.processplatform.core.express.service.processing.jaxrs.task.WrapUpdatePrevTaskIdentity;
 import com.x.processplatform.core.express.service.processing.jaxrs.task.WrapUpdatePrevTaskIdentity.PrevTask;
 import com.x.processplatform.core.express.service.processing.jaxrs.taskcompleted.WrapUpdateNextTaskIdentity;
+import com.x.processplatform.core.express.service.processing.jaxrs.work.ActionProcessingSignalWo;
 
 class ActionProcessing extends BaseAction {
 
@@ -59,10 +64,12 @@ class ActionProcessing extends BaseAction {
 	private WorkLog workLog;
 	private Work work;
 	private String taskCompletedId;
-	private String type;
+	private String type = TYPE_TASK;
+	private Boolean asyncSupported = true;
 	private EffectivePerson effectivePerson;
 	private List<TaskCompleted> taskCompleteds = new ArrayList<>();
 	private List<Task> newTasks = new ArrayList<>();
+	private Exception exception = null;
 
 	private Record record;
 	private String series = StringTools.uniqueToken();
@@ -71,98 +78,152 @@ class ActionProcessing extends BaseAction {
 	private static final String TYPE_TASK = "task";
 
 	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id, JsonElement jsonElement) throws Exception {
+
 		Audit audit = logger.audit(effectivePerson);
-		this.effectivePerson = effectivePerson;
-		wi = this.convertToWrapIn(jsonElement, Wi.class);
+
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 			Business business = new Business(emc);
-			this.task = emc.find(id, Task.class);
-			if (null == this.task) {
-				throw new ExceptionEntityNotExist(id, Task.class);
-			}
-			// 获取当前环节已经完成的待办
-			this.taskCompleteds = emc.listEqual(TaskCompleted.class, TaskCompleted.activityToken_FIELDNAME,
-					task.getActivityToken());
-			this.workLog = emc.firstEqualAndEqual(WorkLog.class, WorkLog.job_FIELDNAME, task.getJob(),
-					WorkLog.fromActivityToken_FIELDNAME, task.getActivityToken());
-
-			if (null == workLog) {
-				throw new ExceptionEntityNotExist(WorkLog.class);
-			}
-			this.work = emc.find(this.task.getWork(), Work.class);
-			if (null == this.work) {
-				throw new ExceptionEntityNotExist(this.task.getWork(), Work.class);
-			}
-			if ((!effectivePerson.isCipher()) && effectivePerson.isNotPerson(this.task.getPerson())) {
-				throw new ExceptionAccessDenied(effectivePerson, this.task);
-			}
-			if (StringUtils.isNotEmpty(wi.getRouteName()) || StringUtils.isNotEmpty(wi.getOpinion())
-					|| (!StringUtils.equals(this.task.getMediaOpinion(), wi.getMediaOpinion()))) {
-				emc.beginTransaction(Task.class);
-				this.updateRouteNameOpinionMediaOpinion(task, wi);
-				emc.commit();
+			init(effectivePerson, business, id, jsonElement);
+			updateTaskIfNecessary(business);
+			seeManualRoute(business);
+		}
+
+		LinkedBlockingQueue<Wo> responeQueue = new LinkedBlockingQueue<>();
+
+		new Thread(() -> {
+			Wo wo = new Wo();
+			try {
+				if (StringUtils.equals(type, TYPE_APPENDTASK)) {
+					processingAppendTask();
+				} else {
+					processingTask();
+				}
+				wo = Wo.copier.copy(record);
+			} catch (Exception e) {
+				exception = e;
+			} finally {
+				try {
+					responeQueue.put(wo);
+				} catch (Exception e) {
+					exception = e;
+				}
 			}
-			this.type = this.type(business, task, wi);
+		}, String.format("%s:processing:%s", ActionProcessing.class.getName(), id)).start();
+
+		if (BooleanUtils.isNotFalse(this.asyncSupported)) {
+			new Thread(() -> {
+				RespProcessingSignal resp = null;
+				try {
+					resp = ThisApplication.context().applications()
+							.getQuery(effectivePerson.getDebugger(), x_processplatform_service_processing.class,
+									Applications.joinQueryUri("work", task.getWork(), "series", series, "activitytoken",
+											this.task.getActivityToken(), "processing", "signal"),
+									task.getJob())
+							.getData(RespProcessingSignal.class);
+				} catch (Exception e) {
+					exception = e;
+				} finally {
+					Wo wo = new Wo();
+					wo.setOccurSignalStack(true);
+					if ((null != resp) && (null != resp.getSignalStack()) && (!resp.getSignalStack().isEmpty())) {
+						wo.setSignalStack(resp.getSignalStack());
+					} else {
+						wo.setSignalStack(new SignalStack());
+					}
+					try {
+						responeQueue.put(wo);
+					} catch (Exception e) {
+						exception = e;
+					}
+				}
+			}, String.format("%s:processingSignal:%s", ActionProcessing.class.getName(), id)).start();
+		}
+
+		Wo wo = responeQueue.take();
+
+		if (exception != null) {
+			throw exception;
 		}
-		this.processing();
 		audit.log(null, "任务处理");
-		Wo wo = Wo.copier.copy(record);
 		result.setData(wo);
 		return result;
 	}
 
-	private void updateRouteNameOpinionMediaOpinion(Task task, Wi wi) {
-		/* 如果有输入新的路由决策覆盖原有决策 */
-		if (StringUtils.isNotEmpty(wi.getRouteName())) {
-			task.setRouteName(wi.getRouteName());
+	private void init(EffectivePerson effectivePerson, Business business, String id, JsonElement jsonElement)
+			throws Exception {
+		EntityManagerContainer emc = business.entityManagerContainer();
+		this.effectivePerson = effectivePerson;
+		this.wi = this.convertToWrapIn(jsonElement, Wi.class);
+		this.task = emc.find(id, Task.class);
+		if (null == this.task) {
+			throw new ExceptionEntityNotExist(id, Task.class);
 		}
-		/* 如果有新的流程意见那么覆盖原有流程意见 */
-		if (StringUtils.isNotEmpty(wi.getOpinion())) {
-			task.setOpinion(wi.getOpinion());
+		// 获取当前环节已经完成的待办
+		this.taskCompleteds = emc.listEqual(TaskCompleted.class, TaskCompleted.activityToken_FIELDNAME,
+				task.getActivityToken());
+		this.workLog = emc.firstEqualAndEqual(WorkLog.class, WorkLog.job_FIELDNAME, task.getJob(),
+				WorkLog.fromActivityToken_FIELDNAME, task.getActivityToken());
+
+		if (null == workLog) {
+			throw new ExceptionEntityNotExist(WorkLog.class);
+		}
+		this.work = emc.find(this.task.getWork(), Work.class);
+		if (null == this.work) {
+			throw new ExceptionEntityNotExist(this.task.getWork(), Work.class);
+		}
+		if ((!effectivePerson.isCipher()) && effectivePerson.isNotPerson(this.task.getPerson())) {
+			throw new ExceptionAccessDenied(effectivePerson, this.task);
 		}
-		/* 强制覆盖多媒体意见 */
-		task.setMediaOpinion(wi.getMediaOpinion());
 	}
 
-	private String type(Business business, Task task, Wi wi) throws Exception {
-		Manual manual = business.manual().pick(task.getActivity());
+	private void updateTaskIfNecessary(Business business) throws Exception {
+		if (StringUtils.isNotEmpty(this.wi.getRouteName()) || StringUtils.isNotEmpty(this.wi.getOpinion())
+				|| (!StringUtils.equals(this.task.getMediaOpinion(), this.wi.getMediaOpinion()))) {
+			business.entityManagerContainer().beginTransaction(Task.class);
+			// 如果有输入新的路由决策覆盖原有决策
+			if (StringUtils.isNotEmpty(this.wi.getRouteName())) {
+				this.task.setRouteName(this.wi.getRouteName());
+			}
+			// 如果有新的流程意见那么覆盖原有流程意见
+			if (StringUtils.isNotEmpty(this.wi.getOpinion())) {
+				this.task.setOpinion(this.wi.getOpinion());
+			}
+			// 强制覆盖多媒体意见
+			this.task.setMediaOpinion(this.wi.getMediaOpinion());
+			business.entityManagerContainer().commit();
+		}
+	}
+
+	private void seeManualRoute(Business business) throws Exception {
+		Manual manual = business.manual().pick(this.task.getActivity());
 		if (null != manual) {
 			Route route = null;
 			for (Route o : business.route().pick(manual.getRouteList())) {
-				if (StringUtils.equals(o.getName(), task.getRouteName())) {
+				if (StringUtils.equals(o.getName(), this.task.getRouteName())) {
 					route = o;
 					break;
 				}
 			}
-			if ((null != route) && (StringUtils.equals(route.getType(), Route.TYPE_APPENDTASK))
-					&& StringUtils.equals(manual.getId(), route.getActivity())) {
-				return TYPE_APPENDTASK;
+			if (null != route) {
+				this.asyncSupported = BooleanUtils.isNotFalse(route.getAsyncSupported());
+				if (StringUtils.equals(route.getType(), Route.TYPE_APPENDTASK)
+						&& StringUtils.equals(manual.getId(), route.getActivity())) {
+					this.type = TYPE_APPENDTASK;
+				}
 			}
 		}
-		return TYPE_TASK;
-	}
-
-	private void processing() throws Exception {
-		switch (type) {
-		case TYPE_APPENDTASK:
-			this.processingAppendTask();
-			break;
-		default:
-			this.processingTask();
-			break;
-		}
 	}
 
 	private void processingAppendTask() throws Exception {
-		this.processingAppendTask_append();
-		this.taskCompletedId = this.processing_processingTask(TaskCompleted.PROCESSINGTYPE_APPENDTASK);
-		this.processing_processingWork(ProcessingAttributes.TYPE_APPENDTASK);
-		this.processing_record(Record.TYPE_APPENDTASK);
-		this.processing_updateTaskCompleted();
-		this.processing_updateTask();
+		this.processingAppendTaskAppend();
+		this.taskCompletedId = this.processingProcessingTask(TaskCompleted.PROCESSINGTYPE_APPENDTASK);
+		this.processingProcessingWork(ProcessingAttributes.TYPE_APPENDTASK);
+		this.processingRecord(Record.TYPE_APPENDTASK);
+		this.processingUpdateTaskCompleted();
+		this.processingUpdateTask();
 	}
 
-	private void processingAppendTask_append() throws Exception {
+	private void processingAppendTaskAppend() throws Exception {
 		WrapAppend req = new WrapAppend();
 		req.setIdentityList(this.wi.getAppendTaskIdentityList());
 		ThisApplication.context().applications()
@@ -172,8 +233,8 @@ class ActionProcessing extends BaseAction {
 	}
 
 	private void processingTask() throws Exception {
-		this.taskCompletedId = this.processing_processingTask(TaskCompleted.PROCESSINGTYPE_TASK);
-		this.processing_processingWork(ProcessingAttributes.TYPE_TASK);
+		this.taskCompletedId = this.processingProcessingTask(TaskCompleted.PROCESSINGTYPE_TASK);
+		this.processingProcessingWork(ProcessingAttributes.TYPE_TASK);
 		// 流程流转到取消环节,此时工作已被删除
 		boolean flag = true;
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
@@ -183,9 +244,9 @@ class ActionProcessing extends BaseAction {
 			}
 		}
 		if (flag) {
-			this.processing_record(Record.TYPE_TASK);
-			this.processing_updateTaskCompleted();
-			this.processing_updateTask();
+			this.processingRecord(Record.TYPE_TASK);
+			this.processingUpdateTaskCompleted();
+			this.processingUpdateTask();
 		} else {
 			record = new Record(workLog, task);
 			record.setCompleted(true);
@@ -193,7 +254,7 @@ class ActionProcessing extends BaseAction {
 		}
 	}
 
-	private String processing_processingTask(String processType) throws Exception {
+	private String processingProcessingTask(String processType) throws Exception {
 		WrapProcessing req = new WrapProcessing();
 		req.setProcessingType(processType);
 		WoId resp = ThisApplication.context().applications()
@@ -208,10 +269,10 @@ class ActionProcessing extends BaseAction {
 		}
 	}
 
-	private void processing_processingWork(String type) throws Exception {
+	private void processingProcessingWork(String workProcessingType) throws Exception {
 		ProcessingAttributes req = new ProcessingAttributes();
 		req.setIgnoreEmpowerIdentityList(wi.getIgnoreEmpowerIdentityList());
-		req.setType(ProcessingAttributes.TYPE_TASK);
+		req.setType(workProcessingType);
 		req.setSeries(this.series);
 		req.setPerson(task.getPerson());
 		req.setIdentity(task.getIdentity());
@@ -224,7 +285,7 @@ class ActionProcessing extends BaseAction {
 		}
 	}
 
-	private void processing_record(String type) throws Exception {
+	private void processingRecord(String type) throws Exception {
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 			final List<String> nextTaskIdentities = new ArrayList<>();
 			record = new Record(workLog, task);
@@ -269,16 +330,23 @@ class ActionProcessing extends BaseAction {
 				record.getProperties().setMediaOpinion(taskCompleted.getMediaOpinion());
 			}
 		}
-		WoId resp = ThisApplication.context().applications()
-				.postQuery(effectivePerson.getDebugger(), x_processplatform_service_processing.class,
-						Applications.joinQueryUri("record", "job", this.work.getJob()), record, this.task.getJob())
-				.getData(WoId.class);
-		if (StringUtils.isBlank(resp.getId())) {
-			throw new ExceptionWorkProcessing(this.work.getId());
-		}
+		new Thread(() -> {
+			try {
+				WoId resp = ThisApplication.context().applications()
+						.postQuery(effectivePerson.getDebugger(), x_processplatform_service_processing.class,
+								Applications.joinQueryUri("record", "job", this.work.getJob()), record,
+								this.task.getJob())
+						.getData(WoId.class);
+				if (StringUtils.isBlank(resp.getId())) {
+					throw new ExceptionWorkProcessing(this.work.getId());
+				}
+			} catch (Exception e) {
+				logger.error(e);
+			}
+		}, String.format("%s:record:%s", ActionProcessing.class.getName(), this.task.getId())).start();
 	}
 
-	private void processing_updateTaskCompleted() throws Exception {
+	private void processingUpdateTaskCompleted() throws Exception {
 		// 记录下一处理人信息
 		WrapUpdateNextTaskIdentity req = new WrapUpdateNextTaskIdentity();
 		req.getTaskCompletedList().add(taskCompletedId);
@@ -289,7 +357,7 @@ class ActionProcessing extends BaseAction {
 				.getData(WrapBoolean.class);
 	}
 
-	private void processing_updateTask() throws Exception {
+	private void processingUpdateTask() throws Exception {
 		// 记录上一处理人信息
 		if (ListTools.isNotEmpty(newTasks)) {
 			WrapUpdatePrevTaskIdentity req = new WrapUpdatePrevTaskIdentity();
@@ -390,11 +458,12 @@ class ActionProcessing extends BaseAction {
 		return o;
 	}
 
-	public static class Wo extends Record {
+	public static class Wo extends ActionProcessingWo {
 
 		private static final long serialVersionUID = -1771383649634969945L;
 		static WrapCopier<Record, Wo> copier = WrapCopierFactory.wo(Record.class, Wo.class, null,
 				JpaObject.FieldsInvisible);
+
 	}
 
 	public static class WoTask extends Task {
@@ -408,6 +477,10 @@ class ActionProcessing extends BaseAction {
 
 	}
 
+	public static class RespProcessingSignal extends ActionProcessingSignalWo {
+
+	}
+
 	public static class Wi extends GsonPropertyObject {
 
 		@FieldDescribe("路由名称")

+ 480 - 0
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/task/ActionProcessing2.java

@@ -0,0 +1,480 @@
+package com.x.processplatform.assemble.surface.jaxrs.task;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.Applications;
+import com.x.base.core.project.x_processplatform_service_processing;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.config.Config;
+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.jaxrs.WoId;
+import com.x.base.core.project.jaxrs.WrapBoolean;
+import com.x.base.core.project.jaxrs.WrapStringList;
+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.ListTools;
+import com.x.base.core.project.tools.StringTools;
+import com.x.processplatform.assemble.surface.Business;
+import com.x.processplatform.assemble.surface.ThisApplication;
+import com.x.processplatform.core.entity.content.Record;
+import com.x.processplatform.core.entity.content.RecordProperties.NextManual;
+import com.x.processplatform.core.entity.content.Task;
+import com.x.processplatform.core.entity.content.TaskCompleted;
+import com.x.processplatform.core.entity.content.Work;
+import com.x.processplatform.core.entity.content.WorkCompleted;
+import com.x.processplatform.core.entity.content.WorkLog;
+import com.x.processplatform.core.entity.element.Manual;
+import com.x.processplatform.core.entity.element.Route;
+import com.x.processplatform.core.express.ProcessingAttributes;
+import com.x.processplatform.core.express.service.processing.jaxrs.task.WrapAppend;
+import com.x.processplatform.core.express.service.processing.jaxrs.task.WrapProcessing;
+import com.x.processplatform.core.express.service.processing.jaxrs.task.WrapUpdatePrevTaskIdentity;
+import com.x.processplatform.core.express.service.processing.jaxrs.task.WrapUpdatePrevTaskIdentity.PrevTask;
+import com.x.processplatform.core.express.service.processing.jaxrs.taskcompleted.WrapUpdateNextTaskIdentity;
+
+class ActionProcessing2 extends BaseAction {
+
+	private static Logger logger = LoggerFactory.getLogger(ActionProcessing2.class);
+
+	private ActionResult<Wo> result = new ActionResult<>();
+
+	private Wi wi;
+	private Task task;
+	private WorkLog workLog;
+	private Work work;
+	private String taskCompletedId;
+	private String type;
+	private EffectivePerson effectivePerson;
+	private List<TaskCompleted> taskCompleteds = new ArrayList<>();
+	private List<Task> newTasks = new ArrayList<>();
+
+	private Record record;
+	private String series = StringTools.uniqueToken();
+
+	private static final String TYPE_APPENDTASK = "appendTask";
+	private static final String TYPE_TASK = "task";
+
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id, JsonElement jsonElement) throws Exception {
+		Audit audit = logger.audit(effectivePerson);
+		this.effectivePerson = effectivePerson;
+		wi = this.convertToWrapIn(jsonElement, Wi.class);
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			this.task = emc.find(id, Task.class);
+			if (null == this.task) {
+				throw new ExceptionEntityNotExist(id, Task.class);
+			}
+			// 获取当前环节已经完成的待办
+			this.taskCompleteds = emc.listEqual(TaskCompleted.class, TaskCompleted.activityToken_FIELDNAME,
+					task.getActivityToken());
+			this.workLog = emc.firstEqualAndEqual(WorkLog.class, WorkLog.job_FIELDNAME, task.getJob(),
+					WorkLog.fromActivityToken_FIELDNAME, task.getActivityToken());
+
+			if (null == workLog) {
+				throw new ExceptionEntityNotExist(WorkLog.class);
+			}
+			this.work = emc.find(this.task.getWork(), Work.class);
+			if (null == this.work) {
+				throw new ExceptionEntityNotExist(this.task.getWork(), Work.class);
+			}
+			if ((!effectivePerson.isCipher()) && effectivePerson.isNotPerson(this.task.getPerson())) {
+				throw new ExceptionAccessDenied(effectivePerson, this.task);
+			}
+			if (StringUtils.isNotEmpty(wi.getRouteName()) || StringUtils.isNotEmpty(wi.getOpinion())
+					|| (!StringUtils.equals(this.task.getMediaOpinion(), wi.getMediaOpinion()))) {
+				emc.beginTransaction(Task.class);
+				this.updateRouteNameOpinionMediaOpinion(task, wi);
+				emc.commit();
+			}
+			this.type = this.type(business, task, wi);
+		}
+		this.processing();
+		audit.log(null, "任务处理");
+		Wo wo = Wo.copier.copy(record);
+		result.setData(wo);
+		return result;
+	}
+
+	private void updateRouteNameOpinionMediaOpinion(Task task, Wi wi) {
+		/* 如果有输入新的路由决策覆盖原有决策 */
+		if (StringUtils.isNotEmpty(wi.getRouteName())) {
+			task.setRouteName(wi.getRouteName());
+		}
+		/* 如果有新的流程意见那么覆盖原有流程意见 */
+		if (StringUtils.isNotEmpty(wi.getOpinion())) {
+			task.setOpinion(wi.getOpinion());
+		}
+		/* 强制覆盖多媒体意见 */
+		task.setMediaOpinion(wi.getMediaOpinion());
+	}
+
+	private String type(Business business, Task task, Wi wi) throws Exception {
+		Manual manual = business.manual().pick(task.getActivity());
+		if (null != manual) {
+			Route route = null;
+			for (Route o : business.route().pick(manual.getRouteList())) {
+				if (StringUtils.equals(o.getName(), task.getRouteName())) {
+					route = o;
+					break;
+				}
+			}
+			if ((null != route) && (StringUtils.equals(route.getType(), Route.TYPE_APPENDTASK))
+					&& StringUtils.equals(manual.getId(), route.getActivity())) {
+				return TYPE_APPENDTASK;
+			}
+		}
+		return TYPE_TASK;
+	}
+
+	private void processing() throws Exception {
+		switch (type) {
+		case TYPE_APPENDTASK:
+			this.processingAppendTask();
+			break;
+		default:
+			this.processingTask();
+			break;
+		}
+	}
+
+	private void processingAppendTask() throws Exception {
+		this.processingAppendTask_append();
+		this.taskCompletedId = this.processing_processingTask(TaskCompleted.PROCESSINGTYPE_APPENDTASK);
+		this.processing_processingWork(ProcessingAttributes.TYPE_APPENDTASK);
+		this.processing_record(Record.TYPE_APPENDTASK);
+		this.processing_updateTaskCompleted();
+		this.processing_updateTask();
+	}
+
+	private void processingAppendTask_append() throws Exception {
+		WrapAppend req = new WrapAppend();
+		req.setIdentityList(this.wi.getAppendTaskIdentityList());
+		ThisApplication.context().applications()
+				.putQuery(x_processplatform_service_processing.class,
+						Applications.joinQueryUri("task", this.task.getId(), "append"), req, this.task.getJob())
+				.getData(WrapStringList.class);
+	}
+
+	private void processingTask() throws Exception {
+		this.taskCompletedId = this.processing_processingTask(TaskCompleted.PROCESSINGTYPE_TASK);
+		this.processing_processingWork(ProcessingAttributes.TYPE_TASK);
+		// 流程流转到取消环节,此时工作已被删除
+		boolean flag = true;
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			if ((emc.countEqual(Work.class, Work.job_FIELDNAME, task.getJob()) == 0)
+					&& (emc.countEqual(WorkCompleted.class, WorkCompleted.job_FIELDNAME, task.getJob()) == 0)) {
+				flag = false;
+			}
+		}
+		if (flag) {
+			this.processing_record(Record.TYPE_TASK);
+			this.processing_updateTaskCompleted();
+			this.processing_updateTask();
+		} else {
+			record = new Record(workLog, task);
+			record.setCompleted(true);
+			record.setType(Record.TYPE_TASK);
+		}
+	}
+
+	private String processing_processingTask(String processType) throws Exception {
+		WrapProcessing req = new WrapProcessing();
+		req.setProcessingType(processType);
+		WoId resp = ThisApplication.context().applications()
+				.putQuery(x_processplatform_service_processing.class,
+						Applications.joinQueryUri("task", task.getId(), "processing"), req, task.getJob())
+				.getData(WoId.class);
+		if (StringUtils.isBlank(resp.getId())) {
+			throw new ExceptionTaskProcessing(task.getId());
+		} else {
+			/* 获得已办id */
+			return resp.getId();
+		}
+	}
+
+	private void processing_processingWork(String type) throws Exception {
+		ProcessingAttributes req = new ProcessingAttributes();
+		req.setIgnoreEmpowerIdentityList(wi.getIgnoreEmpowerIdentityList());
+		req.setType(ProcessingAttributes.TYPE_TASK);
+		req.setSeries(this.series);
+		req.setPerson(task.getPerson());
+		req.setIdentity(task.getIdentity());
+		WoId resp = ThisApplication.context().applications()
+				.putQuery(effectivePerson.getDebugger(), x_processplatform_service_processing.class,
+						Applications.joinQueryUri("work", task.getWork(), "processing"), req, task.getJob())
+				.getData(WoId.class);
+		if (StringUtils.isBlank(resp.getId())) {
+			throw new ExceptionWorkProcessing(task.getId());
+		}
+	}
+
+	private void processing_record(String type) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			final List<String> nextTaskIdentities = new ArrayList<>();
+			record = new Record(workLog, task);
+			// 校验workCompleted,如果存在,那么说明工作已经完成,标识状态为已经完成.
+			WorkCompleted workCompleted = emc.firstEqual(WorkCompleted.class, WorkCompleted.job_FIELDNAME,
+					task.getJob());
+			if (null != workCompleted) {
+				record.setCompleted(true);
+				record.setWorkCompleted(workCompleted.getId());
+			}
+			record.getProperties().setElapsed(
+					Config.workTime().betweenMinutes(record.getProperties().getStartTime(), record.getRecordTime()));
+			record.setType(type);
+			List<Task> list = emc.fetchEqualAndEqual(Task.class,
+					ListTools.toList(Task.person_FIELDNAME, Task.identity_FIELDNAME, Task.unit_FIELDNAME,
+							Task.job_FIELDNAME, Task.work_FIELDNAME, Task.activity_FIELDNAME,
+							Task.activityAlias_FIELDNAME, Task.activityName_FIELDNAME, Task.activityToken_FIELDNAME,
+							Task.activityType_FIELDNAME, Task.empowerFromIdentity_FIELDNAME),
+					Task.job_FIELDNAME, task.getJob(), Task.series_FIELDNAME, this.series);
+			list.stream().collect(Collectors.groupingBy(Task::getActivity, Collectors.toList())).entrySet().stream()
+					.forEach(o -> {
+						NextManual nextManual = new NextManual();
+						nextManual.setActivity(o.getValue().get(0).getActivity());
+						nextManual.setActivityAlias(o.getValue().get(0).getActivityAlias());
+						nextManual.setActivityName(o.getValue().get(0).getActivityName());
+						nextManual.setActivityToken(o.getValue().get(0).getActivityToken());
+						nextManual.setActivityType(o.getValue().get(0).getActivityType());
+						for (Task t : o.getValue()) {
+							nextManual.getTaskIdentityList().add(t.getIdentity());
+							this.newTasks.add(t);
+							nextTaskIdentities.add(t.getIdentity());
+						}
+						record.getProperties().getNextManualList().add(nextManual);
+					});
+			// 去重
+			record.getProperties().setNextManualTaskIdentityList(ListTools.trim(nextTaskIdentities, true, true));
+			TaskCompleted taskCompleted = emc.find(taskCompletedId, TaskCompleted.class);
+			if (null != taskCompleted) {
+				// 处理完成后在重新写入待办信息
+				record.getProperties().setOpinion(taskCompleted.getOpinion());
+				record.getProperties().setRouteName(taskCompleted.getRouteName());
+				record.getProperties().setMediaOpinion(taskCompleted.getMediaOpinion());
+			}
+		}
+		WoId resp = ThisApplication.context().applications()
+				.postQuery(effectivePerson.getDebugger(), x_processplatform_service_processing.class,
+						Applications.joinQueryUri("record", "job", this.work.getJob()), record, this.task.getJob())
+				.getData(WoId.class);
+		if (StringUtils.isBlank(resp.getId())) {
+			throw new ExceptionWorkProcessing(this.work.getId());
+		}
+	}
+
+	private void processing_updateTaskCompleted() throws Exception {
+		// 记录下一处理人信息
+		WrapUpdateNextTaskIdentity req = new WrapUpdateNextTaskIdentity();
+		req.getTaskCompletedList().add(taskCompletedId);
+		req.setNextTaskIdentityList(record.getProperties().getNextManualTaskIdentityList());
+		ThisApplication.context().applications()
+				.putQuery(effectivePerson.getDebugger(), x_processplatform_service_processing.class,
+						Applications.joinQueryUri("taskcompleted", "next", "task", "identity"), req, task.getJob())
+				.getData(WrapBoolean.class);
+	}
+
+	private void processing_updateTask() throws Exception {
+		// 记录上一处理人信息
+		if (ListTools.isNotEmpty(newTasks)) {
+			WrapUpdatePrevTaskIdentity req = new WrapUpdatePrevTaskIdentity();
+			req.setTaskList(ListTools.extractProperty(newTasks, JpaObject.id_FIELDNAME, String.class, true, true));
+			this.taskCompleteds.stream().forEach(o -> {
+				PrevTask prevTask = new PrevTask();
+				prevTask.setCompletedTime(o.getCompletedTime());
+				prevTask.setStartTime(o.getStartTime());
+				prevTask.setOpinion(o.getOpinion());
+				prevTask.setPerson(o.getPerson());
+				prevTask.setIdentity(o.getIdentity());
+				prevTask.setUnit(o.getUnit());
+				prevTask.setRouteName(o.getRouteName());
+				req.getPrevTaskIdentityList().add(prevTask.getIdentity());
+				req.getPrevTaskList().add(prevTask);
+			});
+			PrevTask prevTask = new PrevTask();
+			prevTask.setCompletedTime(new Date());
+			prevTask.setStartTime(task.getStartTime());
+			prevTask.setOpinion(task.getOpinion());
+			prevTask.setPerson(task.getPerson());
+			prevTask.setIdentity(task.getIdentity());
+			prevTask.setUnit(task.getUnit());
+			prevTask.setRouteName(task.getRouteName());
+			req.getPrevTaskIdentityList().add(prevTask.getIdentity());
+			req.setPrevTaskIdentity(prevTask.getIdentity());
+			req.getPrevTaskList().add(prevTask);
+			req.setPrevTask(prevTask);
+			// 去重
+			req.setPrevTaskIdentityList(ListTools.trim(req.getPrevTaskIdentityList(), true, true));
+			ThisApplication.context().applications()
+					.putQuery(effectivePerson.getDebugger(), x_processplatform_service_processing.class,
+							Applications.joinQueryUri("task", "prev", "task", "identity"), req, task.getJob())
+					.getData(WrapBoolean.class);
+		}
+
+		List<Task> empowerTasks = new ArrayList<>();
+		for (Task o : newTasks) {
+			if (StringUtils.isNotEmpty(o.getEmpowerFromIdentity())
+					&& (!StringUtils.equals(o.getEmpowerFromIdentity(), o.getIdentity()))) {
+				empowerTasks.add(o);
+			}
+		}
+
+		if (!empowerTasks.isEmpty()) {
+			List<Record> empowerRecords = new ArrayList<>();
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				Business business = new Business(emc);
+				for (Task o : empowerTasks) {
+					empowerRecords.add(createEmpowerRecord(business, o));
+				}
+			}
+			for (Record r : empowerRecords) {
+				WoId resp = ThisApplication.context().applications()
+						.postQuery(effectivePerson.getDebugger(), x_processplatform_service_processing.class,
+								Applications.joinQueryUri("record", "job", this.work.getJob()), r, this.task.getJob())
+						.getData(WoId.class);
+				if (StringUtils.isBlank(resp.getId())) {
+					throw new ExceptionWorkProcessing(this.work.getId());
+				}
+			}
+		}
+	}
+
+	private Record createEmpowerRecord(Business business, Task task) throws Exception {
+		Record o = new Record();
+		o.setType(Record.TYPE_EMPOWER);
+		o.setApplication(task.getApplication());
+		o.setProcess(task.getProcess());
+		o.setJob(task.getJob());
+		o.setCompleted(false);
+		o.setWork(task.getWork());
+		o.setFromActivity(task.getActivity());
+		o.setFromActivityAlias(task.getActivityAlias());
+		o.setFromActivityName(task.getActivityName());
+		o.setFromActivityToken(task.getActivityToken());
+		o.setFromActivityType(task.getActivityType());
+		o.setArrivedActivity(task.getActivity());
+		o.setArrivedActivityAlias(task.getActivityAlias());
+		o.setArrivedActivityName(task.getActivityName());
+		o.setArrivedActivityToken(task.getActivityToken());
+		o.setArrivedActivityType(task.getActivityType());
+		o.getProperties().setEmpowerToPerson(task.getPerson());
+		o.getProperties().setEmpowerToIdentity(task.getIdentity());
+		o.getProperties().setEmpowerToUnit(task.getUnit());
+		o.setIdentity(task.getEmpowerFromIdentity());
+		o.setPerson(business.organization().person().getWithIdentity(o.getIdentity()));
+		o.setUnit(business.organization().unit().getWithIdentity(o.getIdentity()));
+		o.getProperties().setElapsed(0L);
+		NextManual nextManual = new NextManual();
+		nextManual.setActivity(task.getActivity());
+		nextManual.setActivityAlias(task.getActivityAlias());
+		nextManual.setActivityName(task.getActivityName());
+		nextManual.setActivityToken(task.getActivityToken());
+		nextManual.setActivityType(task.getActivityType());
+		o.getProperties().getNextManualList().add(nextManual);
+		o.getProperties().getNextManualTaskIdentityList().add(task.getIdentity());
+		return o;
+	}
+
+	public static class Wo extends Record {
+
+		private static final long serialVersionUID = -1771383649634969945L;
+		static WrapCopier<Record, Wo> copier = WrapCopierFactory.wo(Record.class, Wo.class, null,
+				JpaObject.FieldsInvisible);
+	}
+
+	public static class WoTask extends Task {
+
+		private static final long serialVersionUID = 2702712453822143654L;
+
+		static WrapCopier<Task, WoTask> copier = WrapCopierFactory.wo(Task.class, WoTask.class,
+				ListTools.toList(JpaObject.id_FIELDNAME, Task.activity_FIELDNAME, Task.activityName_FIELDNAME,
+						Task.person_FIELDNAME, Task.identity_FIELDNAME, Task.unit_FIELDNAME),
+				null);
+
+	}
+
+	public static class Wi extends GsonPropertyObject {
+
+		@FieldDescribe("路由名称")
+		private String routeName;
+
+		@FieldDescribe("意见")
+		private String opinion;
+
+		@FieldDescribe("多媒体意见")
+		private String mediaOpinion;
+
+		@FieldDescribe("路由数据")
+		private JsonElement routeData;
+
+		@FieldDescribe("新添加的待办处理人")
+		private List<String> appendTaskIdentityList;
+
+		@FieldDescribe("忽略授权身份")
+		private List<String> ignoreEmpowerIdentityList;
+
+		public List<String> getAppendTaskIdentityList() {
+			return appendTaskIdentityList;
+		}
+
+		public void setAppendTaskIdentityList(List<String> appendTaskIdentityList) {
+			this.appendTaskIdentityList = appendTaskIdentityList;
+		}
+
+		public String getRouteName() {
+			return routeName;
+		}
+
+		public void setRouteName(String routeName) {
+			this.routeName = routeName;
+		}
+
+		public String getOpinion() {
+			return opinion;
+		}
+
+		public void setOpinion(String opinion) {
+			this.opinion = opinion;
+		}
+
+		public String getMediaOpinion() {
+			return mediaOpinion;
+		}
+
+		public void setMediaOpinion(String mediaOpinion) {
+			this.mediaOpinion = mediaOpinion;
+		}
+
+		public JsonElement getRouteData() {
+			return routeData;
+		}
+
+		public void setRouteData(JsonElement routeData) {
+			this.routeData = routeData;
+		}
+
+		public List<String> getIgnoreEmpowerIdentityList() {
+			return ignoreEmpowerIdentityList;
+		}
+
+		public void setIgnoreEmpowerIdentityList(List<String> ignoreEmpowerIdentityList) {
+			this.ignoreEmpowerIdentityList = ignoreEmpowerIdentityList;
+		}
+	}
+
+}

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

@@ -230,8 +230,8 @@ class ActionProcessingNeural extends BaseAction {
 		Root<FormField> root = cq.from(FormField.class);
 		Predicate p = root.get(FormField_.form).in(formIds);
 		p = cb.and(p, cb.equal(root.get(FormField_.dataType), "number"));
-		cq.select(root.get(FormField_.name)).where(p).distinct(true);
-		return em.createQuery(cq).getResultList();
+		cq.select(root.get(FormField_.name)).where(p);
+		return em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 	}
 
 	private List<String> listForm(Business business, Process process) throws Exception {

+ 15 - 14
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/taskcompleted/ActionFilterAttribute.java

@@ -2,6 +2,7 @@ package com.x.processplatform.assemble.surface.jaxrs.taskcompleted;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -135,8 +136,8 @@ class ActionFilterAttribute extends BaseAction {
 		Predicate p = cb.equal(root.get(TaskCompleted_.person), effectivePerson.getDistinguishedName());
 		p = cb.and(p,
 				cb.or(cb.equal(root.get(TaskCompleted_.latest), true), cb.isNull(root.get(TaskCompleted_.latest))));
-		cq.select(root.get(TaskCompleted_.application)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(TaskCompleted_.application)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -165,8 +166,8 @@ class ActionFilterAttribute extends BaseAction {
 		Predicate p = cb.equal(root.get(TaskCompleted_.person), effectivePerson.getDistinguishedName());
 		p = cb.and(p,
 				cb.or(cb.equal(root.get(TaskCompleted_.latest), true), cb.isNull(root.get(TaskCompleted_.latest))));
-		cq.select(root.get(TaskCompleted_.process)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(TaskCompleted_.process)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -195,8 +196,8 @@ class ActionFilterAttribute extends BaseAction {
 		Predicate p = cb.equal(root.get(TaskCompleted_.person), effectivePerson.getDistinguishedName());
 		p = cb.and(p,
 				cb.or(cb.equal(root.get(TaskCompleted_.latest), true), cb.isNull(root.get(TaskCompleted_.latest))));
-		cq.select(root.get(TaskCompleted_.creatorUnit)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(TaskCompleted_.creatorUnit)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -219,8 +220,8 @@ class ActionFilterAttribute extends BaseAction {
 		Predicate p = cb.equal(root.get(TaskCompleted_.person), effectivePerson.getDistinguishedName());
 		p = cb.and(p,
 				cb.or(cb.equal(root.get(TaskCompleted_.latest), true), cb.isNull(root.get(TaskCompleted_.latest))));
-		cq.select(root.get(TaskCompleted_.activityName)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(TaskCompleted_.activityName)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -243,8 +244,8 @@ class ActionFilterAttribute extends BaseAction {
 		Predicate p = cb.equal(root.get(TaskCompleted_.person), effectivePerson.getDistinguishedName());
 		p = cb.and(p,
 				cb.or(cb.equal(root.get(TaskCompleted_.latest), true), cb.isNull(root.get(TaskCompleted_.latest))));
-		cq.select(root.get(TaskCompleted_.startTimeMonth)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(TaskCompleted_.startTimeMonth)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -267,8 +268,8 @@ class ActionFilterAttribute extends BaseAction {
 		Predicate p = cb.equal(root.get(TaskCompleted_.person), effectivePerson.getDistinguishedName());
 		p = cb.and(p,
 				cb.or(cb.equal(root.get(TaskCompleted_.latest), true), cb.isNull(root.get(TaskCompleted_.latest))));
-		cq.select(root.get(TaskCompleted_.completedTimeMonth)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(TaskCompleted_.completedTimeMonth)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -292,8 +293,8 @@ class ActionFilterAttribute extends BaseAction {
 		Predicate p = cb.equal(root.get(TaskCompleted_.person), effectivePerson.getDistinguishedName());
 		p = cb.and(p,
 				cb.or(cb.equal(root.get(TaskCompleted_.latest), true), cb.isNull(root.get(TaskCompleted_.latest))));
-		cq.select(root.get(TaskCompleted_.completed)).where(p).distinct(true);
-		List<Boolean> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(TaskCompleted_.completed)).where(p);
+		List<Boolean> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (Boolean value : os) {
 			NameValueCountPair o = new NameValueCountPair();

+ 14 - 14
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/taskcompleted/ActionFilterAttributeFilter.java

@@ -242,8 +242,8 @@ class ActionFilterAttributeFilter extends BaseAction {
 		if (ListTools.isNotEmpty(wi.getCompletedList())) {
 			p = cb.and(p, root.get(TaskCompleted_.completed).in(wi.getCompletedList()));
 		}
-		cq.select(root.get(TaskCompleted_.application)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(TaskCompleted_.application)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -295,8 +295,8 @@ class ActionFilterAttributeFilter extends BaseAction {
 		if (ListTools.isNotEmpty(wi.getCompletedList())) {
 			p = cb.and(p, root.get(TaskCompleted_.completed).in(wi.getCompletedList()));
 		}
-		cq.select(root.get(TaskCompleted_.process)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(TaskCompleted_.process)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -348,8 +348,8 @@ class ActionFilterAttributeFilter extends BaseAction {
 		if (ListTools.isNotEmpty(wi.getCompletedList())) {
 			p = cb.and(p, root.get(TaskCompleted_.completed).in(wi.getCompletedList()));
 		}
-		cq.select(root.get(TaskCompleted_.creatorUnit)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(TaskCompleted_.creatorUnit)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -395,8 +395,8 @@ class ActionFilterAttributeFilter extends BaseAction {
 		if (ListTools.isNotEmpty(wi.getCompletedList())) {
 			p = cb.and(p, root.get(TaskCompleted_.completed).in(wi.getCompletedList()));
 		}
-		cq.select(root.get(TaskCompleted_.activityName)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(TaskCompleted_.activityName)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -442,8 +442,8 @@ class ActionFilterAttributeFilter extends BaseAction {
 		if (ListTools.isNotEmpty(wi.getCompletedList())) {
 			p = cb.and(p, root.get(TaskCompleted_.completed).in(wi.getCompletedList()));
 		}
-		cq.select(root.get(TaskCompleted_.startTimeMonth)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(TaskCompleted_.startTimeMonth)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -489,8 +489,8 @@ class ActionFilterAttributeFilter extends BaseAction {
 		if (ListTools.isNotEmpty(wi.getCompletedList())) {
 			p = cb.and(p, root.get(TaskCompleted_.completed).in(wi.getCompletedList()));
 		}
-		cq.select(root.get(TaskCompleted_.completedTimeMonth)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(TaskCompleted_.completedTimeMonth)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			if (StringUtils.isNotEmpty(str)) {
@@ -536,8 +536,8 @@ class ActionFilterAttributeFilter extends BaseAction {
 		if (ListTools.isNotEmpty(wi.getCompletedList())) {
 			p = cb.and(p, root.get(TaskCompleted_.completed).in(wi.getCompletedList()));
 		}
-		cq.select(root.get(TaskCompleted_.completed)).where(p).distinct(true);
-		List<Boolean> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(TaskCompleted_.completed)).where(p);
+		List<Boolean> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (Boolean value : os) {
 			NameValueCountPair o = new NameValueCountPair();

+ 3 - 2
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/taskcompleted/ActionListCountWithApplication.java

@@ -3,6 +3,7 @@ package com.x.processplatform.assemble.surface.jaxrs.taskcompleted;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -46,8 +47,8 @@ class ActionListCountWithApplication extends BaseAction {
 		Predicate p = cb.equal(root.get(TaskCompleted_.person), effectivePerson.getDistinguishedName());
 		p = cb.and(p,
 				cb.or(cb.equal(root.get(TaskCompleted_.latest), true), cb.isNull(root.get(TaskCompleted_.latest))));
-		cq.select(root.get(TaskCompleted_.application)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(TaskCompleted_.application)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		for (String str : os) {
 			NameValueCountPair o = new NameValueCountPair();
 			Application application = business.application().pick(str);

+ 3 - 2
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/taskcompleted/ActionListCountWithProcess.java

@@ -3,6 +3,7 @@ package com.x.processplatform.assemble.surface.jaxrs.taskcompleted;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -54,8 +55,8 @@ class ActionListCountWithProcess extends BaseAction {
 		p = cb.and(p,
 				cb.or(cb.equal(root.get(TaskCompleted_.latest), true), cb.isNull(root.get(TaskCompleted_.latest))));
 		p = cb.and(p, cb.equal(root.get(TaskCompleted_.application), application.getId()));
-		cq.select(root.get(TaskCompleted_.process)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(TaskCompleted_.process)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		for (String str : os) {
 			NameValueCountPair o = new NameValueCountPair();
 			Process process = business.process().pick(str);

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

@@ -3,6 +3,12 @@ package com.x.processplatform.assemble.surface.jaxrs.work;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
 
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
 import org.apache.commons.lang3.StringUtils;
 
 import com.x.base.core.container.EntityManagerContainer;
@@ -18,6 +24,7 @@ import com.x.processplatform.core.entity.content.ReadCompleted;
 import com.x.processplatform.core.entity.content.Review;
 import com.x.processplatform.core.entity.content.Task;
 import com.x.processplatform.core.entity.content.TaskCompleted;
+import com.x.processplatform.core.entity.content.TaskCompleted_;
 
 class ActionCountWithPerson extends ActionComplex {
 
@@ -39,9 +46,16 @@ class ActionCountWithPerson extends ActionComplex {
 				});
 				/* 已办仅取latest */
 				CompletableFuture<Void> future_taskCompleted = CompletableFuture.runAsync(() -> {
+					EntityManager em;
 					try {
-						wo.setTaskCompleted(emc.countEqualAndNotEqual(TaskCompleted.class,
-								TaskCompleted.person_FIELDNAME, person, TaskCompleted.latest_FIELDNAME, false));
+						em = business.entityManagerContainer().get(TaskCompleted.class);
+						CriteriaBuilder cb = em.getCriteriaBuilder();
+						CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+						Root<TaskCompleted> root = cq.from(TaskCompleted.class);
+						Predicate p = cb.equal(root.get(TaskCompleted_.person), person);
+						p = cb.and(p, cb.or(cb.equal(root.get(TaskCompleted_.latest), true),
+								cb.isNull(root.get(TaskCompleted_.latest))));
+						wo.setTaskCompleted(em.createQuery(cq.select(cb.count(root)).where(p)).getSingleResult());
 					} catch (Exception e) {
 						logger.error(e);
 					}

+ 12 - 11
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionFilterAttribute.java

@@ -2,6 +2,7 @@ package com.x.processplatform.assemble.surface.jaxrs.work;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -64,7 +65,7 @@ class ActionFilterAttribute extends BaseAction {
 		private List<NameValueCountPair> activityNameList = new ArrayList<>();
 
 		@FieldDescribe("可选择的工作状态")
-		@FieldTypeDescribe(fieldType="enum",fieldValue="start|processing|hanging",fieldTypeName = "com.x.processplatform.core.entity.content.WorkStatus")
+		@FieldTypeDescribe(fieldType = "enum", fieldValue = "start|processing|hanging", fieldTypeName = "com.x.processplatform.core.entity.content.WorkStatus")
 		private List<NameValueCountPair> workStatusList = new ArrayList<>();
 
 		public List<NameValueCountPair> getProcessList() {
@@ -118,8 +119,8 @@ class ActionFilterAttribute extends BaseAction {
 		Root<Work> root = cq.from(Work.class);
 		Predicate p = cb.equal(root.get(Work_.application), application.getId());
 		p = cb.and(p, cb.equal(root.get(Work_.creatorPerson), effectivePerson.getDistinguishedName()));
-		cq.select(root.get(Work_.process)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(Work_.process)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		for (String str : os) {
 			NameValueCountPair o = new NameValueCountPair();
 			Process process = business.process().pick(str);
@@ -144,8 +145,8 @@ class ActionFilterAttribute extends BaseAction {
 		Root<Work> root = cq.from(Work.class);
 		Predicate p = cb.equal(root.get(Work_.application), application.getId());
 		p = cb.and(p, cb.equal(root.get(Work_.creatorPerson), effectivePerson.getDistinguishedName()));
-		cq.select(root.get(Work_.creatorUnit)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(Work_.creatorUnit)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			NameValueCountPair o = new NameValueCountPair();
@@ -166,8 +167,8 @@ class ActionFilterAttribute extends BaseAction {
 		Root<Work> root = cq.from(Work.class);
 		Predicate p = cb.equal(root.get(Work_.application), application.getId());
 		p = cb.and(p, cb.equal(root.get(Work_.creatorPerson), effectivePerson.getDistinguishedName()));
-		cq.select(root.get(Work_.activityName)).where(p).distinct(true);
-		List<String> list = em.createQuery(cq).getResultList();
+		cq.select(root.get(Work_.activityName)).where(p);
+		List<String> list = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		for (String str : list) {
 			NameValueCountPair o = new NameValueCountPair();
 			o.setValue(str);
@@ -187,8 +188,8 @@ class ActionFilterAttribute extends BaseAction {
 		Root<Work> root = cq.from(Work.class);
 		Predicate p = cb.equal(root.get(Work_.application), application.getId());
 		p = cb.and(p, cb.equal(root.get(Work_.creatorPerson), effectivePerson.getDistinguishedName()));
-		cq.select(root.get(Work_.startTimeMonth)).where(p).distinct(true);
-		List<String> list = em.createQuery(cq).getResultList();
+		cq.select(root.get(Work_.startTimeMonth)).where(p);
+		List<String> list = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		for (String str : list) {
 			NameValueCountPair o = new NameValueCountPair();
 			o.setValue(str);
@@ -208,8 +209,8 @@ class ActionFilterAttribute extends BaseAction {
 		Root<Work> root = cq.from(Work.class);
 		Predicate p = cb.equal(root.get(Work_.application), application.getId());
 		p = cb.and(p, cb.equal(root.get(Work_.creatorPerson), effectivePerson.getDistinguishedName()));
-		cq.select(root.get(Work_.workStatus)).where(p).distinct(true);
-		List<WorkStatus> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(Work_.workStatus)).where(p);
+		List<WorkStatus> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		for (WorkStatus status : os) {
 			NameValueCountPair o = new NameValueCountPair();
 			o.setValue(status);

+ 13 - 21
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionManageFilterAttribute.java

@@ -2,6 +2,7 @@ package com.x.processplatform.assemble.surface.jaxrs.work;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -68,8 +69,8 @@ class ActionManageFilterAttribute extends BaseAction {
 		private List<NameValueCountPair> activityNameList = new ArrayList<>();
 
 		@FieldDescribe("可选择的工作状态")
-		@FieldTypeDescribe(fieldType="class",fieldValue="{name='',value='',count=0}",fieldTypeName = "com.x.base.core.project.bean.NameValueCountPair")
-		
+		@FieldTypeDescribe(fieldType = "class", fieldValue = "{name='',value='',count=0}", fieldTypeName = "com.x.base.core.project.bean.NameValueCountPair")
+
 		private List<NameValueCountPair> workStatusList = new ArrayList<>();
 
 		public List<NameValueCountPair> getProcessList() {
@@ -80,15 +81,6 @@ class ActionManageFilterAttribute extends BaseAction {
 			this.processList = processList;
 		}
 
-		// public List<NameValueCountPair> getCreatorTopUnitList() {
-		// return creatorTopUnitList;
-		// }
-		//
-		// public void setCreatorTopUnitList(List<NameValueCountPair>
-		// creatorTopUnitList) {
-		// this.creatorTopUnitList = creatorTopUnitList;
-		// }
-
 		public List<NameValueCountPair> getCreatorUnitList() {
 			return creatorUnitList;
 		}
@@ -130,8 +122,8 @@ class ActionManageFilterAttribute extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Work> root = cq.from(Work.class);
 		Predicate p = cb.equal(root.get(Work_.application), application.getId());
-		cq.select(root.get(Work_.process)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(Work_.process)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		for (String str : os) {
 			NameValueCountPair o = new NameValueCountPair();
 			Process process = business.process().pick(str);
@@ -155,8 +147,8 @@ class ActionManageFilterAttribute extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Work> root = cq.from(Work.class);
 		Predicate p = cb.equal(root.get(Work_.application), application.getId());
-		cq.select(root.get(Work_.creatorUnit)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(Work_.creatorUnit)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		for (String str : os) {
 			NameValueCountPair o = new NameValueCountPair();
 			o.setValue(str);
@@ -174,8 +166,8 @@ class ActionManageFilterAttribute extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Work> root = cq.from(Work.class);
 		Predicate p = cb.equal(root.get(Work_.application), application.getId());
-		cq.select(root.get(Work_.activityName)).where(p).distinct(true);
-		List<String> list = em.createQuery(cq).getResultList();
+		cq.select(root.get(Work_.activityName)).where(p);
+		List<String> list = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		for (String str : list) {
 			NameValueCountPair o = new NameValueCountPair();
 			o.setValue(str);
@@ -193,8 +185,8 @@ class ActionManageFilterAttribute extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Work> root = cq.from(Work.class);
 		Predicate p = cb.equal(root.get(Work_.application), application.getId());
-		cq.select(root.get(Work_.startTimeMonth)).where(p).distinct(true);
-		List<String> list = em.createQuery(cq).getResultList();
+		cq.select(root.get(Work_.startTimeMonth)).where(p);
+		List<String> list = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		for (String str : list) {
 			NameValueCountPair o = new NameValueCountPair();
 			o.setValue(str);
@@ -212,8 +204,8 @@ class ActionManageFilterAttribute extends BaseAction {
 		CriteriaQuery<WorkStatus> cq = cb.createQuery(WorkStatus.class);
 		Root<Work> root = cq.from(Work.class);
 		Predicate p = cb.equal(root.get(Work_.application), application.getId());
-		cq.select(root.get(Work_.workStatus)).where(p).distinct(true);
-		List<WorkStatus> list = em.createQuery(cq).getResultList();
+		cq.select(root.get(Work_.workStatus)).where(p);
+		List<WorkStatus> list = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		for (WorkStatus status : list) {
 			NameValueCountPair o = new NameValueCountPair();
 			o.setValue(status);

+ 7 - 6
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/workcompleted/ActionFilterAttribute.java

@@ -4,6 +4,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -53,8 +54,8 @@ public class ActionFilterAttribute extends BaseAction {
 		Root<WorkCompleted> root = cq.from(WorkCompleted.class);
 		Predicate p = cb.equal(root.get(WorkCompleted_.creatorPerson), effectivePerson.getDistinguishedName());
 		p = cb.and(p, cb.equal(root.get(WorkCompleted_.application), applicationId));
-		cq.select(root.get(WorkCompleted_.process)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(WorkCompleted_.process)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			NameValueCountPair o = new NameValueCountPair();
@@ -80,8 +81,8 @@ public class ActionFilterAttribute extends BaseAction {
 		Root<WorkCompleted> root = cq.from(WorkCompleted.class);
 		Predicate p = cb.equal(root.get(WorkCompleted_.creatorPerson), effectivePerson.getDistinguishedName());
 		p = cb.and(p, cb.equal(root.get(WorkCompleted_.application), applicationId));
-		cq.select(root.get(WorkCompleted_.startTimeMonth)).where(p).distinct(true);
-		List<String> list = em.createQuery(cq).getResultList();
+		cq.select(root.get(WorkCompleted_.startTimeMonth)).where(p);
+		List<String> list = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wraps = new ArrayList<>();
 		for (String str : list) {
 			NameValueCountPair o = new NameValueCountPair();
@@ -100,8 +101,8 @@ public class ActionFilterAttribute extends BaseAction {
 		Root<WorkCompleted> root = cq.from(WorkCompleted.class);
 		Predicate p = cb.equal(root.get(WorkCompleted_.creatorPerson), effectivePerson.getDistinguishedName());
 		p = cb.and(p, cb.equal(root.get(WorkCompleted_.application), applicationId));
-		cq.select(root.get(WorkCompleted_.completedTimeMonth)).where(p).distinct(true);
-		List<String> list = em.createQuery(cq).getResultList();
+		cq.select(root.get(WorkCompleted_.completedTimeMonth)).where(p);
+		List<String> list = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wraps = new ArrayList<>();
 		for (String str : list) {
 			NameValueCountPair o = new NameValueCountPair();

+ 3 - 2
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/workcompleted/ActionListCountWithApplication.java

@@ -2,6 +2,7 @@ package com.x.processplatform.assemble.surface.jaxrs.workcompleted;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -30,8 +31,8 @@ class ActionListCountWithApplication extends BaseAction {
 			CriteriaQuery<String> cq = cb.createQuery(String.class);
 			Root<WorkCompleted> root = cq.from(WorkCompleted.class);
 			Predicate p = cb.equal(root.get(WorkCompleted_.creatorPerson), effectivePerson.getDistinguishedName());
-			cq.select(root.get(WorkCompleted_.application)).where(p).distinct(true);
-			for (String str : em.createQuery(cq).getResultList()) {
+			cq.select(root.get(WorkCompleted_.application)).where(p);
+			for (String str : em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList())) {
 				NameValueCountPair o = new NameValueCountPair();
 				o.setValue(str);
 				o.setName(this.getApplicationName(business, effectivePerson, str));

+ 3 - 2
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/workcompleted/ActionListCountWithProcess.java

@@ -2,6 +2,7 @@ package com.x.processplatform.assemble.surface.jaxrs.workcompleted;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -36,8 +37,8 @@ class ActionListCountWithProcess extends BaseAction {
 			Root<WorkCompleted> root = cq.from(WorkCompleted.class);
 			Predicate p = cb.equal(root.get(WorkCompleted_.creatorPerson), effectivePerson.getDistinguishedName());
 			p = cb.and(p, cb.equal(root.get(WorkCompleted_.application), applicationId));
-			cq.select(root.get(WorkCompleted_.process)).where(p).distinct(true);
-			List<String> os = em.createQuery(cq).getResultList();
+			cq.select(root.get(WorkCompleted_.process)).where(p);
+			List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 			List<NameValueCountPair> wos = new ArrayList<>();
 			for (String str : os) {
 				NameValueCountPair o = new NameValueCountPair();

+ 7 - 6
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/workcompleted/ActionManageFilterAttribute.java

@@ -2,6 +2,7 @@ package com.x.processplatform.assemble.surface.jaxrs.workcompleted;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -87,8 +88,8 @@ class ActionManageFilterAttribute extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<WorkCompleted> root = cq.from(WorkCompleted.class);
 		Predicate p = cb.equal(root.get(WorkCompleted_.application), applicationId);
-		cq.select(root.get(WorkCompleted_.process)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(WorkCompleted_.process)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			NameValueCountPair o = new NameValueCountPair();
@@ -113,8 +114,8 @@ class ActionManageFilterAttribute extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<WorkCompleted> root = cq.from(WorkCompleted.class);
 		Predicate p = cb.equal(root.get(WorkCompleted_.application), applicationId);
-		cq.select(root.get(WorkCompleted_.startTimeMonth)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(WorkCompleted_.startTimeMonth)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			NameValueCountPair o = new NameValueCountPair();
@@ -133,8 +134,8 @@ class ActionManageFilterAttribute extends BaseAction {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<WorkCompleted> root = cq.from(WorkCompleted.class);
 		Predicate p = cb.equal(root.get(WorkCompleted_.application), applicationId);
-		cq.select(root.get(WorkCompleted_.completedTimeMonth)).where(p).distinct(true);
-		List<String> os = em.createQuery(cq).getResultList();
+		cq.select(root.get(WorkCompleted_.completedTimeMonth)).where(p);
+		List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 		List<NameValueCountPair> wos = new ArrayList<>();
 		for (String str : os) {
 			NameValueCountPair o = new NameValueCountPair();

+ 3 - 2
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/workcompleted/ActionManageListCountWithProcess.java

@@ -2,6 +2,7 @@ package com.x.processplatform.assemble.surface.jaxrs.workcompleted;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -37,8 +38,8 @@ class ActionManageListCountWithProcess extends BaseAction {
 			CriteriaQuery<String> cq = cb.createQuery(String.class);
 			Root<WorkCompleted> root = cq.from(WorkCompleted.class);
 			Predicate p = cb.equal(root.get(WorkCompleted_.application), applicationId);
-			cq.select(root.get(WorkCompleted_.process)).where(p).distinct(true);
-			List<String> os = em.createQuery(cq).getResultList();
+			cq.select(root.get(WorkCompleted_.process)).where(p);
+			List<String> os = em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
 			List<NameValueCountPair> wos = new ArrayList<>();
 			for (String str : os) {
 				NameValueCountPair o = new NameValueCountPair();

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