Преглед на файлове

Merge branch 'fix/develop_update' into 'develop'

Fix/develop update

See merge request o2oa/o2oa!2549
o2null преди 5 години
родител
ревизия
fae662bd5d
променени са 88 файла, в които са добавени 4539 реда и са изтрити 9869 реда
  1. 1 0
      .gitignore
  2. 0 12
      o2server/configSample/appStyle.json
  3. 0 28
      o2server/configSample/cache.json
  4. 0 33
      o2server/configSample/centerServer.json
  5. 0 21
      o2server/configSample/clientInit.json
  6. 0 22
      o2server/configSample/collect.json
  7. 0 24
      o2server/configSample/communicate.json
  8. 0 255
      o2server/configSample/components.json
  9. 0 32
      o2server/configSample/dingding.json
  10. 0 19
      o2server/configSample/dumpRestoreData.json
  11. 0 13
      o2server/configSample/dumpRestoreStorage.json
  12. 0 20
      o2server/configSample/exmail.json
  13. 0 10
      o2server/configSample/externalDataSources.json
  14. 0 10
      o2server/configSample/externalDataSources_db2.json
  15. 0 10
      o2server/configSample/externalDataSources_dm.json
  16. 0 10
      o2server/configSample/externalDataSources_informix.json
  17. 0 10
      o2server/configSample/externalDataSources_kingbase.json
  18. 0 10
      o2server/configSample/externalDataSources_mysql.json
  19. 0 10
      o2server/configSample/externalDataSources_oracle.json
  20. 0 10
      o2server/configSample/externalDataSources_postgresql.json
  21. 0 10
      o2server/configSample/externalDataSources_sqlserver.json
  22. 0 314
      o2server/configSample/externalStorageSources.json
  23. 0 8
      o2server/configSample/jpushConfig.json
  24. 0 70
      o2server/configSample/logLevel.json
  25. 0 38
      o2server/configSample/manifest.cfg
  26. 0 17
      o2server/configSample/meeting.json
  27. 0 18
      o2server/configSample/messageSendRule.js
  28. 0 198
      o2server/configSample/messages.json
  29. 0 31
      o2server/configSample/mq.json
  30. 0 185
      o2server/configSample/node_127.0.0.1.json
  31. 0 40
      o2server/configSample/person.json
  32. 0 21
      o2server/configSample/portal.json
  33. 0 109
      o2server/configSample/processPlatform.json
  34. 0 8
      o2server/configSample/pushConfig.json
  35. 0 36
      o2server/configSample/qiyeweixin.json
  36. 0 55
      o2server/configSample/query.json
  37. 0 85
      o2server/configSample/token.json
  38. 0 11
      o2server/configSample/vfs.json
  39. 0 4
      o2server/configSample/web.json
  40. 0 20
      o2server/configSample/welink.json
  41. 0 19
      o2server/configSample/workTime.json
  42. 0 33
      o2server/configSample/zhengwuDingding.json
  43. 15 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceschedulesetting/ActionSave.java
  44. 1 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/selfholiday/ActionSave.java
  45. 1 1
      o2server/x_attendance_core_entity/src/main/java/com/x/attendance/entity/AttendanceSelfHoliday.java
  46. 7 2
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/schedule/JobReportListener.java
  47. 29 0
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/schedule/ScheduleLogRequest.java
  48. 38 1
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/StringTools.java
  49. 1 1
      o2server/x_calendar_assemble_control/src/main/java/com/x/calendar/assemble/control/ThisApplication.java
  50. 132 0
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/script/ActionManagerList.java
  51. 19 1
      o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/script/ScriptAction.java
  52. 65 48
      o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/share/ActionSaveToFolder.java
  53. 5 4
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/inputperson/ActionInputAll.java
  54. 260 14
      o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/identity/ActionListObject.java
  55. 144 0
      o2server/x_portal_assemble_designer/src/main/java/com/x/portal/assemble/designer/jaxrs/script/ActionManagerList.java
  56. 19 1
      o2server/x_portal_assemble_designer/src/main/java/com/x/portal/assemble/designer/jaxrs/script/ScriptAction.java
  57. 144 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/script/ActionManagerList.java
  58. 19 1
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/script/ScriptAction.java
  59. 10 3
      o2server/x_program_center/src/main/java/com/x/program/center/LogQueue.java
  60. 14 1
      o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/schedule/ActionReport.java
  61. 13 14
      o2server/x_program_center/src/main/java/com/x/program/center/schedule/FireSchedule.java
  62. 21 5
      o2server/x_query_assemble_designer/src/main/java/com/x/query/assemble/designer/jaxrs/statement/ActionExecute.java
  63. 20 5
      o2server/x_query_assemble_designer/src/main/java/com/x/query/assemble/designer/jaxrs/statement/ActionExecuteV2.java
  64. 21 5
      o2server/x_query_assemble_surface/src/main/java/com/x/query/assemble/surface/jaxrs/statement/ActionExecute.java
  65. 20 5
      o2server/x_query_assemble_surface/src/main/java/com/x/query/assemble/surface/jaxrs/statement/ActionExecuteV2.java
  66. 4 0
      o2server/x_query_service_processing/pom.xml
  67. 2 0
      o2server/x_query_service_processing/src/main/java/com/x/query/service/processing/jaxrs/ActionApplication.java
  68. 10 0
      o2server/x_query_service_processing/src/main/java/com/x/query/service/processing/jaxrs/DesignJaxrsFilter.java
  69. 311 0
      o2server/x_query_service_processing/src/main/java/com/x/query/service/processing/jaxrs/design/ActionSearch.java
  70. 59 0
      o2server/x_query_service_processing/src/main/java/com/x/query/service/processing/jaxrs/design/BaseAction.java
  71. 45 0
      o2server/x_query_service_processing/src/main/java/com/x/query/service/processing/jaxrs/design/DesignAction.java
  72. 14 0
      o2server/x_query_service_processing/src/main/java/com/x/query/service/processing/jaxrs/design/ExceptionFieldEmpty.java
  73. 12 0
      o2server/x_query_service_processing/src/main/java/com/x/query/service/processing/jaxrs/design/ModuleType.java
  74. 109 0
      o2server/x_query_service_processing/src/main/java/com/x/query/service/processing/jaxrs/design/WrapScript.java
  75. 1 1
      o2web/source/x_component_Selector/Application.js
  76. 21 3
      o2web/source/x_component_Selector/Person.js
  77. 92 12
      o2web/source/x_component_process_FormDesigner/Module/Form/template/form.json
  78. 134 0
      o2web/source/x_component_process_FormDesigner/Module/Form/template/form_classical.json
  79. 612 1335
      o2web/source/x_component_process_FormDesigner/Module/Form/template/form_cms_publish.json
  80. 260 1067
      o2web/source/x_component_process_FormDesigner/Module/Form/template/form_common.json
  81. 427 2286
      o2web/source/x_component_process_FormDesigner/Module/Form/template/form_file.json
  82. 106 0
      o2web/source/x_component_process_FormDesigner/Module/Form/template/form_mobile.json
  83. 362 1054
      o2web/source/x_component_process_FormDesigner/Module/Form/template/form_project.json
  84. 108 0
      o2web/source/x_component_process_FormDesigner/Module/Form/template/form_project2.json
  85. 108 0
      o2web/source/x_component_process_FormDesigner/Module/Form/template/form_reimbursement.json
  86. 358 1052
      o2web/source/x_component_process_FormDesigner/Module/Form/template/form_tab.json
  87. 363 1056
      o2web/source/x_component_process_FormDesigner/Module/Form/template/form_tab_red.json
  88. 2 1
      o2web/source/x_desktop/js/cmsDocMobile.js

+ 1 - 0
.gitignore

@@ -13,6 +13,7 @@
 /o2server/commons/
 /o2server/jvm/
 /o2server/local/
+/o2server/configSample/
 /o2server/*/src/main/webapp/describe/
 /o2server/*/src/main/webapp/WEB-INF/
 **/.settings/

+ 0 - 12
o2server/configSample/appStyle.json

@@ -1,12 +0,0 @@
-{
-  "indexType": "default",
-  "indexPortal": "",
-  "simpleMode": false,
-  "nativeAppList": [],
-  "images": [],
-  "###indexType": "首页展现类型,default是移动端原来的首页,portal是门户.###",
-  "###indexPortal": "门户首页.###",
-  "###simpleMode": "移动端简易模式.###",
-  "###nativeAppList": "导航设置###",
-  "###images": "图片设置.###"
-}

+ 0 - 28
o2server/configSample/cache.json

@@ -1,28 +0,0 @@
-{
-  "type": "ehcache",
-  "redis": {
-    "host": "127.0.0.1",
-    "port": 6379.0,
-    "user": "",
-    "password": "",
-    "connectionTimeout": 3000.0,
-    "socketTimeout": 3000.0,
-    "sslEnable": false,
-    "index": 0.0,
-    "###host": "redis服务器地址###",
-    "###port": "redis服务器端口###",
-    "###user": "认证用户###",
-    "###password": "认证口令###",
-    "###connectionTimeout": "连接等待时间###",
-    "###socketTimeout": "response返回等待时间###",
-    "###sslEnable": "是否启用ssl###",
-    "###index": "数据库编号###"
-  },
-  "ehcache": {
-    "jmxEnable": false,
-    "###jmxEnable": "是否启用jmx###"
-  },
-  "###type": "缓存类型:ehcache,type###",
-  "###redis": "redis配置###",
-  "###ehcache": "ehcache配置###"
-}

+ 0 - 33
o2server/configSample/centerServer.json

@@ -1,33 +0,0 @@
-{
-  "enable": true,
-  "order": 0.0,
-  "sslEnable": false,
-  "redeploy": true,
-  "port": 20030.0,
-  "httpProtocol": "",
-  "proxyHost": "",
-  "proxyPort": 20030.0,
-  "scanInterval": 0.0,
-  "configApiEnable": true,
-  "statEnable": true,
-  "statExclusions": "*.js,*.gif,*.jpg,*.png,*.css,*.ico",
-  "maxFormContent": 20.0,
-  "exposeJest": true,
-  "persistentConnectionsEnable": true,
-  "###enable": "是否启用###",
-  "###order": "center节点顺序,顺序排列0,1,2...###",
-  "###sslEnable": "是否启用ssl传输加密,如果启用将使用config/keystore文件作为密钥文件.使用config/token.json文件中的sslKeyStorePassword字段为密钥密码,sslKeyManagerPassword为管理密码.###",
-  "###redeploy": "每次启动是否重新部署所有应用.###",
-  "###port": "端口,center服务器端口,默认20030###",
-  "###httpProtocol": "对外http访问协议,http/https###",
-  "###proxyHost": "代理主机,当服务器是通过apache/nginx等代理服务器映射到公网或者通过路由器做端口映射,在这样的情况下需要设置此地址以标明公网访问地址.###",
-  "###proxyPort": "代理端口,当服务器是通过apache/nginx等代理服务器映射到公网或者通过路由器做端口映射,在这样的情况下需要设置此地址以标明公网访问端口.###",
-  "###scanInterval": "重新扫描war包时间间隔(秒)###",
-  "###config": "其他参数###",
-  "###configApiEnable": "允许通过Api修改config###",
-  "###statEnable": "启用统计,默认启用统计.###",
-  "###statExclusions": "统计忽略路径,默认忽略*.js,*.gif,*.jpg,*.png,*.css,*.ico###",
-  "###maxFormContent": "最大提交数据限制(M),限制有所上传的内容大小,包括附件.###",
-  "###exposeJest": "暴露jest接口.###",
-  "###persistentConnectionsEnable": "是否启用长连接,默认false.###"
-}

+ 0 - 21
o2server/configSample/clientInit.json

@@ -1,21 +0,0 @@
-{
-  "enable": false,
-  "center": [
-    {}
-  ],
-  "footer": "",
-  "title": "",
-  "app_protocol": "auto",
-  "loginPage": {
-    "###enable": "是否启用定制的登录页面.###",
-    "###portal": "登录的门户.###",
-    "###page": "登录页面.###"
-  },
-  "###enable": "是否启用.###",
-  "###center": "center节点信息.###",
-  "###footer": "网页底部说明.###",
-  "###title": "网页头部说明.###",
-  "###app_protocol": "APP使用协议,auto,http,https.###",
-  "###loginPage": "登录页面配置.###",
-  "###webSocketEnable": "是否启用webSocket###"
-}

+ 0 - 22
o2server/configSample/collect.json

@@ -1,22 +0,0 @@
-{
-  "enable": false,
-  "name": "",
-  "password": "",
-  "title": "",
-  "footer": "",
-  "appUrl": "",
-  "server": "",
-  "port": 20080.0,
-  "sslEnable": false,
-  "###enable": "是否启用连接到云平台###",
-  "###name": "云平台账户名称,同时显示在登录页面底部.###",
-  "###password": "云平台密码###",
-  "###title": "系统标题,同时显示在登录页面上部.###",
-  "###footer": "底部申明###",
-  "###appUrl": "app下载地址###",
-  "###server": "云平台服务器地址###",
-  "###port": "云平台端口###",
-  "###sslEnable": "云平台连接是否启用ssl###",
-  "###secret": "推送消息secret###",
-  "###key": "推送消息key###"
-}

+ 0 - 24
o2server/configSample/communicate.json

@@ -1,24 +0,0 @@
-{
-  "wsEnable": true,
-  "pmsEnable": true,
-  "calendarEnable": true,
-  "###wsEnable": "是否启用ws消息.###",
-  "###pmsEnable": "是否启用pms消息.###",
-  "###calendarEnable": "是否启用calendar消息.###",
-  "###cronMq": "定时触发发送到消息队列MQ.###",
-  "cronMq": {
-    "enable": false,
-    "cron": "0 0 * * * ? *",
-    "###enable": "是否启用###",
-    "###cron": "定时cron表达式###"
-  },
-  "###clean": "清理设置.###",
-  "clean": {
-    "enable": true,
-    "cron": "30 30 6 * * ?",
-    "keep": 7.0,
-    "###enable": "是否启用###",
-    "###cron": "定时cron表达式###",
-    "###keep": "消息保留天数###"
-  }
-}

+ 0 - 255
o2server/configSample/components.json

@@ -1,255 +0,0 @@
-{
-  "systems": [
-    {
-      "name": "Setting",
-      "path": "Setting",
-      "title": "系统设置",
-      "iconPath": "appicon.png",
-      "orderNumber": 1.0,
-      "type": "system",
-      "allowList": [],
-      "dentyList": []
-    },
-    {
-      "name": "Org",
-      "path": "Org",
-      "title": "组织管理",
-      "iconPath": "appicon.png",
-      "orderNumber": 2.0,
-      "type": "system",
-      "allowList": [],
-      "dentyList": []
-    },
-    {
-      "name": "cmsManager",
-      "path": "cms.Column",
-      "title": "内容管理平台",
-      "iconPath": "appicon.png",
-      "orderNumber": 3.0,
-      "type": "system",
-      "allowList": [],
-      "dentyList": []
-    },
-    {
-      "name": "cms",
-      "path": "cms.Index",
-      "title": "信息平台",
-      "iconPath": "appicon.png",
-      "orderNumber": 12.0,
-      "type": "system",
-      "allowList": [],
-      "dentyList": []
-    },
-    {
-      "name": "ApplicationExplorer",
-      "path": "process.ApplicationExplorer",
-      "title": "流程管理平台",
-      "iconPath": "appicon.png",
-      "orderNumber": 4.0,
-      "type": "system",
-      "allowList": [],
-      "dentyList": []
-    },
-    {
-      "name": "PortalExplorer",
-      "path": "portal.PortalExplorer",
-      "title": "门户管理平台",
-      "iconPath": "appicon.png",
-      "orderNumber": 5.0,
-      "type": "system",
-      "allowList": [],
-      "dentyList": []
-    },
-    {
-      "name": "DataExplorer",
-      "path": "query.QueryExplorer",
-      "title": "数据中心平台",
-      "iconPath": "appicon.png",
-      "orderNumber": 6.0,
-      "type": "system",
-      "allowList": [],
-      "dentyList": []
-    },
-    {
-      "name": "service.ServiceManager",
-      "path": "service.ServiceManager",
-      "title": "服务管理平台",
-      "iconPath": "appicon.png",
-      "orderNumber": 7.0,
-      "type": "system",
-      "allowList": [],
-      "dentyList": []
-    },
-    {
-      "name": "AppMarketV2",
-      "path": "AppMarketV2",
-      "title": "应用市场",
-      "iconPath": "appicon.png",
-      "orderNumber": 8.0,
-      "type": "system",
-      "allowList": [],
-      "dentyList": []
-    },
-    {
-      "name": "AppCenter",
-      "path": "AppCenter",
-      "title": "应用管理",
-      "iconPath": "appicon.png",
-      "orderNumber": 9.0,
-      "type": "system",
-      "allowList": [],
-      "dentyList": []
-    },
-    {
-      "name": "LogViewer",
-      "path": "LogViewer",
-      "title": "日志",
-      "iconPath": "appicon.png",
-      "orderNumber": 10.0,
-      "type": "system",
-      "allowList": [],
-      "dentyList": []
-    },
-    {
-      "name": "Profile",
-      "path": "Profile",
-      "title": "个人设置",
-      "iconPath": "appicon.png",
-      "orderNumber": 11.0,
-      "type": "system",
-      "allowList": [],
-      "dentyList": []
-    },
-    {
-      "name": "BAM",
-      "path": "BAM",
-      "title": "流程监控",
-      "iconPath": "appicon.png",
-      "orderNumber": 12.0,
-      "type": "system",
-      "allowList": [],
-      "dentyList": []
-    },
-    {
-      "name": "TaskCenter",
-      "path": "process.TaskCenter",
-      "title": "办公中心",
-      "iconPath": "appicon.png",
-      "orderNumber": 13.0,
-      "type": "system",
-      "allowList": [],
-      "dentyList": []
-    },
-    {
-      "name": "Homepage",
-      "path": "Homepage",
-      "title": "首页",
-      "iconPath": "appicon.png",
-      "orderNumber": 14.0,
-      "type": "system",
-      "allowList": [],
-      "dentyList": []
-    },
-    {
-      "name": "HotArticle",
-      "path": "HotArticle",
-      "title": "热点",
-      "iconPath": "appicon.png",
-      "orderNumber": 15.0,
-      "type": "system",
-      "allowList": [],
-      "dentyList": []
-    },
-    {
-      "name": "Note",
-      "path": "Note",
-      "title": "便签",
-      "iconPath": "appicon.png",
-      "orderNumber": 17.0,
-      "type": "system",
-      "allowList": [],
-      "dentyList": []
-    },
-    {
-      "name": "Meeting",
-      "path": "Meeting",
-      "title": "会议管理",
-      "iconPath": "appicon.png",
-      "orderNumber": 18.0,
-      "type": "system",
-      "allowList": [],
-      "dentyList": []
-    },
-    {
-      "name": "Attendance",
-      "path": "Attendance",
-      "title": "考勤管理",
-      "iconPath": "appicon.png",
-      "orderNumber": 20.0,
-      "type": "system",
-      "allowList": [],
-      "dentyList": []
-    },
-    {
-      "name": "Forum",
-      "path": "Forum",
-      "title": "论坛",
-      "iconPath": "appicon.png",
-      "orderNumber": 21.0,
-      "type": "system",
-      "allowList": [],
-      "dentyList": []
-    },
-    {
-      "name": "Minder",
-      "path": "Minder",
-      "title": "脑图编辑器",
-      "iconPath": "appicon.png",
-      "orderNumber": 22.0,
-      "type": "system",
-      "allowList": [],
-      "dentyList": []
-    },
-    {
-      "name": "Calendar",
-      "path": "Calendar",
-      "title": "日程安排",
-      "iconPath": "appicon.png",
-      "orderNumber": 23.0,
-      "type": "system",
-      "allowList": [],
-      "dentyList": []
-    },
-    {
-      "name": "ANN",
-      "path": "ANN",
-      "title": "神经网络",
-      "iconPath": "appicon.png",
-      "orderNumber": 24.0,
-      "type": "system",
-      "allowList": [],
-      "dentyList": []
-    },
-    {
-      "name": "Search",
-      "path": "Search",
-      "title": "搜索",
-      "iconPath": "appicon.png",
-      "orderNumber": 25.0,
-      "type": "system",
-      "allowList": [],
-      "dentyList": []
-    },
-    {
-      "name": "IMV2",
-      "path": "IMV2",
-      "title": "聊天",
-      "iconPath": "appicon.png",
-      "orderNumber": 26.0,
-      "type": "system",
-      "allowList": [],
-      "dentyList": []
-    }
-  ],
-  "###systems": "默认模块###"
-}

+ 0 - 32
o2server/configSample/dingding.json

@@ -1,32 +0,0 @@
-{
-  "enable": false,
-  "corpId": "",
-  "agentId": "",
-  "appKey": "",
-  "appSecret": "",
-  "syncCron": "10 0/10 * * * ?",
-  "forceSyncCron": "10 45 8,12 * * ?",
-  "oapiAddress": "https://oapi.dingtalk.com",
-  "workUrl": "",
-  "messageRedirectPortal": "",
-  "messageEnable": true,
-  "scanLoginEnable": false,
-  "scanLoginAppId": "",
-  "scanLoginAppSecret": "",
-  "attendanceSyncEnable": false,
-  "###enable": "是否启用###",
-  "###corpId": "钉钉corpId###",
-  "###agentId": "agentId###",
-  "###appKey": "应用的key,唯一标识###",
-  "###appSecret": "应用的密钥###",
-  "###syncCron": "回调信号触发同步检查,默认每10分钟运行一次,如果期间内有钉钉回调信号接收到,那么触发同步任务进行人员同步.###",
-  "###forceSyncCron": "强制拉入同步cron,默认在每天的8点和12点强制进行同步.###",
-  "###oapiAddress": "oapi服务器地址###",
-  "###workUrl": "钉钉消息打开工作的url地址,如:http://dev.o2oa.net/x_desktop/###",
-  "###messageRedirectPortal": "钉钉消息处理完成后跳转到特定的门户页面的Id###",
-  "###messageEnable": "是否启用消息推送###",
-  "###scanLoginEnable": "是否开启钉钉扫码登录###",
-  "###scanLoginAppId": "钉钉扫码登录的AppId###",
-  "###scanLoginAppSecret": "钉钉扫码登录的appSecret###",
-  "###attendanceSyncEnable": "是否启用考勤信息###"
-}

+ 0 - 19
o2server/configSample/dumpRestoreData.json

@@ -1,19 +0,0 @@
-{
-  "enable": false,
-  "includes": [],
-  "excludes": [],
-  "mode": "lite",
-  "parallel": true,
-  "redistribute": true,
-  "exceptionInvalidStorage": true,
-  "itemCategory": "",
-  "###enable": "是否启用.###",
-  "###includes": "导出导入包含对象,可以使用通配符*.###",
-  "###excludes": "导出导入排除对象,可以使用通配符*.###",
-  "###mode": "导出数据模式,lite|full,默认使用lite###",
-  "###parallel": "使用并行导出,默认true###",
-  "###redistribute": "是否进行重新分布.###",
-  "###exceptionInvalidStorage": "无法获取storage是否升起错误.###",
-  "###restoreOverride": "数据导入方式,clean:清空重新导入,skipExisted:如果有相同id的数据跳过.默认方式为clean.###",
-  "###itemCategory": "对于com.x.query.core.entity.Item的itemCategory进行单独过滤,可选值pp, cms, bbs, pp_dict.###"
-}

+ 0 - 13
o2server/configSample/dumpRestoreStorage.json

@@ -1,13 +0,0 @@
-{
-  "includes": [],
-  "excludes": [],
-  "batchSize": 100.0,
-  "redistribute": true,
-  "exceptionInvalidStorage": true,
-  "###enable": "是否启用.###",
-  "###includes": "导出导入包含对象,可以使用通配符*.###",
-  "###excludes": "导出导入排除对象,可以使用通配符*.###",
-  "###batchSize": "批量对象数量.###",
-  "###redistribute": "是否进行重新分布.###",
-  "###exceptionInvalidStorage": "无法获取storage是否升起错误.###"
-}

+ 0 - 20
o2server/configSample/exmail.json

@@ -1,20 +0,0 @@
-{
-  "enable": false,
-  "corpId": "",
-  "corpAccessTokenAddress": "https://api.exmail.qq.com/cgi-bin/gettoken",
-  "newCountAddress": "https://api.exmail.qq.com/cgi-bin/mail/newcount",
-  "ssoAddress": "https://api.exmail.qq.com/cgi-bin/service/get_login_url",
-  "personAttributeNewCountName": "exmailNewCount",
-  "personAttributeTitleName": "exmailTitle",
-  "###enable": "是否启用.###",
-  "###corpId": "腾讯企业邮corpId###",
-  "###newRemindSecret": "新邮件提醒secret###",
-  "###ssoSecret": "单点登录secret###",
-  "###corpAccessTokenAddress": "corpAccessToken获取地址###",
-  "###newCountAddress": "新邮件数量获取地址###",
-  "###ssoAddress": "单点登录获取地址###",
-  "###token": "回调token###",
-  "###encodingAesKey": "回调encodingAesKey###",
-  "###personAttributeNewCountName": "存储邮件数量个人属性值.###",
-  "###personAttributeTitleName": "存储邮件标题个人属性值.###"
-}

+ 0 - 10
o2server/configSample/externalDataSources.json

@@ -1,10 +0,0 @@
-[
-	{
-		"url":"jdbc:mysql://127.0.0.1:3306/X?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8",      
-		"username" : "root",
-		"password" :"password",
-		"includes": [],
-		"excludes": [],
-		"enable" : true
-	}
-]

+ 0 - 10
o2server/configSample/externalDataSources_db2.json

@@ -1,10 +0,0 @@
-[
-	{
-		"url" : "jdbc:db2://127.0.0.1:50000/X",
-		"username" : "db2admin",
-		"password" :"password",
-		"includes": [],
-		"excludes": [],
-		"enable" : true
-	}
-]

+ 0 - 10
o2server/configSample/externalDataSources_dm.json

@@ -1,10 +0,0 @@
-[
-	{
-		"url" : "jdbc:dm://127.0.0.1/X",
-		"username" : "admin",
-		"password" :"password",
-		"includes": [],
-		"excludes": [],
-		"enable" : true
-	}
-]

+ 0 - 10
o2server/configSample/externalDataSources_informix.json

@@ -1,10 +0,0 @@
-[
-	{
-		"url" : "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=X;selectMethod=cursor;sendStringParametersAsUnicode=false",
-		"username" : "sa",
-		"password" :"password",
-		"includes": [],
-		"excludes": [],
-		"enable" : true
-	}
-]

+ 0 - 10
o2server/configSample/externalDataSources_kingbase.json

@@ -1,10 +0,0 @@
-[
-	{
-		"url" : "jdbc:kingbase://127.0.0.1:54321/X",
-		"username" : "system",
-		"password" :"krms",
-		"includes": [],
-		"excludes": [],
-		"enable" : true
-	}
-]

+ 0 - 10
o2server/configSample/externalDataSources_mysql.json

@@ -1,10 +0,0 @@
-[
-	{
-		"url":"jdbc:mysql://127.0.0.1:3306/X?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8",
-		"username" : "root",
-		"password" :"password",
-		"includes": [],
-		"excludes": [],
-		"enable" : true
-	}
-]

+ 0 - 10
o2server/configSample/externalDataSources_oracle.json

@@ -1,10 +0,0 @@
-[
-	{
-		"url":"jdbc:oracle:thin:@//127.0.0.1:1521/orcl",
-		"username" : "X",
-		"password" :"password",
-		"includes": [],
-		"excludes": [],
-		"enable" : true
-	}
-]

+ 0 - 10
o2server/configSample/externalDataSources_postgresql.json

@@ -1,10 +0,0 @@
-[
-	{
-		"url" : "jdbc:postgresql://localhost:5432/X",
-		"username" : "postgres",
-		"password" :"password",
-		"includes": [],
-		"excludes": [],
-		"enable" : true
-	}
-]

+ 0 - 10
o2server/configSample/externalDataSources_sqlserver.json

@@ -1,10 +0,0 @@
-[
-	{
-		"url" : "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=X;selectMethod=cursor;sendStringParametersAsUnicode=false",
-		"username" : "sa",
-		"password" :"password",
-		"includes": [],
-		"excludes": [],
-		"enable" : true
-	}
-]

+ 0 - 314
o2server/configSample/externalStorageSources.json

@@ -1,314 +0,0 @@
-{
-  "file": [
-    {
-      "protocol": "webdav",
-      "username": "admin",
-      "password": "admin",
-      "host": "127.0.0.1",
-      "port": 8080.0,
-      "prefix": "",
-      "enable": true,
-      "weight": 100.0,
-      "name": "251",
-      "deepPath": false,
-      "###protocol": "协议,可选值ftp,webdav###",
-      "###username": "登录用户名.###",
-      "###password": "登录密码.###",
-      "###host": "主机地址.###",
-      "###port": "端口.###",
-      "###prefix": "前缀路径.###",
-      "###enable": "是否启用###",
-      "###weight": "设置权重.###",
-      "###name": "存储节点名,对应存储名称,谨慎修改.###",
-      "###deepPath": "是否使用更深的路径.###"
-    }
-  ],
-  "processPlatform": [
-    {
-      "protocol": "webdav",
-      "username": "admin",
-      "password": "admin",
-      "host": "127.0.0.1",
-      "port": 8080.0,
-      "prefix": "",
-      "enable": true,
-      "weight": 100.0,
-      "name": "251",
-      "deepPath": false,
-      "###protocol": "协议,可选值ftp,webdav###",
-      "###username": "登录用户名.###",
-      "###password": "登录密码.###",
-      "###host": "主机地址.###",
-      "###port": "端口.###",
-      "###prefix": "前缀路径.###",
-      "###enable": "是否启用###",
-      "###weight": "设置权重.###",
-      "###name": "存储节点名,对应存储名称,谨慎修改.###",
-      "###deepPath": "是否使用更深的路径.###"
-    }
-  ],
-  "mind": [
-    {
-      "protocol": "webdav",
-      "username": "admin",
-      "password": "admin",
-      "host": "127.0.0.1",
-      "port": 8080.0,
-      "prefix": "",
-      "enable": true,
-      "weight": 100.0,
-      "name": "251",
-      "deepPath": false,
-      "###protocol": "协议,可选值ftp,webdav###",
-      "###username": "登录用户名.###",
-      "###password": "登录密码.###",
-      "###host": "主机地址.###",
-      "###port": "端口.###",
-      "###prefix": "前缀路径.###",
-      "###enable": "是否启用###",
-      "###weight": "设置权重.###",
-      "###name": "存储节点名,对应存储名称,谨慎修改.###",
-      "###deepPath": "是否使用更深的路径.###"
-    }
-  ],
-  "meeting": [
-    {
-      "protocol": "webdav",
-      "username": "admin",
-      "password": "admin",
-      "host": "127.0.0.1",
-      "port": 8080.0,
-      "prefix": "",
-      "enable": true,
-      "weight": 100.0,
-      "name": "251",
-      "deepPath": false,
-      "###protocol": "协议,可选值ftp,webdav###",
-      "###username": "登录用户名.###",
-      "###password": "登录密码.###",
-      "###host": "主机地址.###",
-      "###port": "端口.###",
-      "###prefix": "前缀路径.###",
-      "###enable": "是否启用###",
-      "###weight": "设置权重.###",
-      "###name": "存储节点名,对应存储名称,谨慎修改.###",
-      "###deepPath": "是否使用更深的路径.###"
-    }
-  ],
-  "calendar": [
-    {
-      "protocol": "webdav",
-      "username": "admin",
-      "password": "admin",
-      "host": "127.0.0.1",
-      "port": 8080.0,
-      "prefix": "",
-      "enable": true,
-      "weight": 100.0,
-      "name": "251",
-      "deepPath": false,
-      "###protocol": "协议,可选值ftp,webdav###",
-      "###username": "登录用户名.###",
-      "###password": "登录密码.###",
-      "###host": "主机地址.###",
-      "###port": "端口.###",
-      "###prefix": "前缀路径.###",
-      "###enable": "是否启用###",
-      "###weight": "设置权重.###",
-      "###name": "存储节点名,对应存储名称,谨慎修改.###",
-      "###deepPath": "是否使用更深的路径.###"
-    }
-  ],
-  "okr": [
-    {
-      "protocol": "webdav",
-      "username": "admin",
-      "password": "admin",
-      "host": "127.0.0.1",
-      "port": 8080.0,
-      "prefix": "",
-      "enable": true,
-      "weight": 100.0,
-      "name": "251",
-      "deepPath": false,
-      "###protocol": "协议,可选值ftp,webdav###",
-      "###username": "登录用户名.###",
-      "###password": "登录密码.###",
-      "###host": "主机地址.###",
-      "###port": "端口.###",
-      "###prefix": "前缀路径.###",
-      "###enable": "是否启用###",
-      "###weight": "设置权重.###",
-      "###name": "存储节点名,对应存储名称,谨慎修改.###",
-      "###deepPath": "是否使用更深的路径.###"
-    }
-  ],
-  "cms": [
-    {
-      "protocol": "webdav",
-      "username": "admin",
-      "password": "admin",
-      "host": "127.0.0.1",
-      "port": 8080.0,
-      "prefix": "",
-      "enable": true,
-      "weight": 100.0,
-      "name": "251",
-      "deepPath": false,
-      "###protocol": "协议,可选值ftp,webdav###",
-      "###username": "登录用户名.###",
-      "###password": "登录密码.###",
-      "###host": "主机地址.###",
-      "###port": "端口.###",
-      "###prefix": "前缀路径.###",
-      "###enable": "是否启用###",
-      "###weight": "设置权重.###",
-      "###name": "存储节点名,对应存储名称,谨慎修改.###",
-      "###deepPath": "是否使用更深的路径.###"
-    }
-  ],
-  "bbs": [
-    {
-      "protocol": "webdav",
-      "username": "admin",
-      "password": "admin",
-      "host": "127.0.0.1",
-      "port": 8080.0,
-      "prefix": "",
-      "enable": true,
-      "weight": 100.0,
-      "name": "251",
-      "deepPath": false,
-      "###protocol": "协议,可选值ftp,webdav###",
-      "###username": "登录用户名.###",
-      "###password": "登录密码.###",
-      "###host": "主机地址.###",
-      "###port": "端口.###",
-      "###prefix": "前缀路径.###",
-      "###enable": "是否启用###",
-      "###weight": "设置权重.###",
-      "###name": "存储节点名,对应存储名称,谨慎修改.###",
-      "###deepPath": "是否使用更深的路径.###"
-    }
-  ],
-  "report": [
-    {
-      "protocol": "webdav",
-      "username": "admin",
-      "password": "admin",
-      "host": "127.0.0.1",
-      "port": 8080.0,
-      "prefix": "",
-      "enable": true,
-      "weight": 100.0,
-      "name": "251",
-      "deepPath": false,
-      "###protocol": "协议,可选值ftp,webdav###",
-      "###username": "登录用户名.###",
-      "###password": "登录密码.###",
-      "###host": "主机地址.###",
-      "###port": "端口.###",
-      "###prefix": "前缀路径.###",
-      "###enable": "是否启用###",
-      "###weight": "设置权重.###",
-      "###name": "存储节点名,对应存储名称,谨慎修改.###",
-      "###deepPath": "是否使用更深的路径.###"
-    }
-  ],
-  "strategyDeploy": [
-    {
-      "protocol": "webdav",
-      "username": "admin",
-      "password": "admin",
-      "host": "127.0.0.1",
-      "port": 8080.0,
-      "prefix": "",
-      "enable": true,
-      "weight": 100.0,
-      "name": "251",
-      "deepPath": false,
-      "###protocol": "协议,可选值ftp,webdav###",
-      "###username": "登录用户名.###",
-      "###password": "登录密码.###",
-      "###host": "主机地址.###",
-      "###port": "端口.###",
-      "###prefix": "前缀路径.###",
-      "###enable": "是否启用###",
-      "###weight": "设置权重.###",
-      "###name": "存储节点名,对应存储名称,谨慎修改.###",
-      "###deepPath": "是否使用更深的路径.###"
-    }
-  ],
-  "teamwork": [
-    {
-      "protocol": "webdav",
-      "username": "admin",
-      "password": "admin",
-      "host": "127.0.0.1",
-      "port": 8080.0,
-      "prefix": "",
-      "enable": true,
-      "weight": 100.0,
-      "name": "251",
-      "deepPath": false,
-      "###protocol": "协议,可选值ftp,webdav###",
-      "###username": "登录用户名.###",
-      "###password": "登录密码.###",
-      "###host": "主机地址.###",
-      "###port": "端口.###",
-      "###prefix": "前缀路径.###",
-      "###enable": "是否启用###",
-      "###weight": "设置权重.###",
-      "###name": "存储节点名,对应存储名称,谨慎修改.###",
-      "###deepPath": "是否使用更深的路径.###"
-    }
-  ],
-  "structure": [
-    {
-      "protocol": "webdav",
-      "username": "admin",
-      "password": "admin",
-      "host": "127.0.0.1",
-      "port": 8080.0,
-      "prefix": "",
-      "enable": true,
-      "weight": 100.0,
-      "name": "251",
-      "deepPath": false,
-      "###protocol": "协议,可选值ftp,webdav###",
-      "###username": "登录用户名.###",
-      "###password": "登录密码.###",
-      "###host": "主机地址.###",
-      "###port": "端口.###",
-      "###prefix": "前缀路径.###",
-      "###enable": "是否启用###",
-      "###weight": "设置权重.###",
-      "###name": "存储节点名,对应存储名称,谨慎修改.###",
-      "###deepPath": "是否使用更深的路径.###"
-    }
-  ],
-  "general": [
-    {
-      "protocol": "webdav",
-      "username": "admin",
-      "password": "admin",
-      "host": "127.0.0.1",
-      "port": 8080.0,
-      "prefix": "",
-      "enable": true,
-      "weight": 100.0,
-      "name": "251",
-      "deepPath": false,
-      "###protocol": "协议,可选值ftp,webdav###",
-      "###username": "登录用户名.###",
-      "###password": "登录密码.###",
-      "###host": "主机地址.###",
-      "###port": "端口.###",
-      "###prefix": "前缀路径.###",
-      "###enable": "是否启用###",
-      "###weight": "设置权重.###",
-      "###name": "存储节点名,对应存储名称,谨慎修改.###",
-      "###deepPath": "是否使用更深的路径.###"
-    }
-  ]
-}

+ 0 - 8
o2server/configSample/jpushConfig.json

@@ -1,8 +0,0 @@
-{
-  "enable": false,
-  "appKey": "9aca7cc20fe0cc987cd913ca",
-  "masterSecret": "96ee7e2e0daffd51bac57815",
-  "###enable": "是否启用.###",
-  "###appKey": "极光推送应用的AppKey###",
-  "###masterSecret": "极光推送应用的Master Secret###"
-}

+ 0 - 70
o2server/configSample/logLevel.json

@@ -1,70 +0,0 @@
-{
-  "x_program_center": "",
-  "x_processplatform_service_processing": "",
-  "x_processplatform_assemble_surface": "",
-  "x_processplatform_assemble_designer": "",
-  "x_query_assemble_designer": "",
-  "x_query_assemble_surface": "",
-  "x_query_service_processing": "",
-  "x_meeting_assemble_control": "",
-  "x_organization_assemble_authentication": "",
-  "x_organization_assemble_control": "",
-  "x_general_assemble_control": "",
-  "x_file_assemble_control": "",
-  "x_attendance_assemble_control": "",
-  "x_collaboration_core_message": "",
-  "x_organization_core_express": "",
-  "x_query_core_express": "",
-  "x_bbs_assemble_control": "",
-  "x_calendar_assemble_control": "",
-  "x_cms_assemble_control": "",
-  "x_component_assemble_control": "",
-  "x_hotpic_assemble_control": "",
-  "x_message_assemble_communicate": "",
-  "x_mind_assemble_control": "",
-  "x_okr_assemble_control": "",
-  "x_organization_assemble_express": "",
-  "x_organization_assemble_personal": "",
-  "x_portal_assemble_designer": "",
-  "x_portal_assemble_surface": "",
-  "x_processplatform_assemble_bam": "",
-  "x_jpush_assemble_control": "",
-  "audit": {
-    "###enable": "是否启用审计日志###",
-    "###logSize": "审计日志保留天数###",
-    "###system": "审计日志归属系统code###",
-    "###systemName": "审计日志归属系统名称###",
-    "###extend1": "扩展字段1###"
-  },
-  "###x_program_center": "是否启用调试###",
-  "###x_processplatform_service_processing": "是否启用调试###",
-  "###x_processplatform_assemble_surface": "是否启用调试###",
-  "###x_processplatform_assemble_designer": "是否启用调试###",
-  "###x_query_assemble_designer": "是否启用调试###",
-  "###x_query_assemble_surface": "是否启用调试###",
-  "###x_query_service_processing": "是否启用调试###",
-  "###x_meeting_assemble_control": "是否启用调试###",
-  "###x_organization_assemble_authentication": "是否启用调试###",
-  "###x_organization_assemble_control": "是否启用调试###",
-  "###x_general_assemble_control": "是否启用调试###",
-  "###x_file_assemble_control": "是否启用调试###",
-  "###x_attendance_assemble_control": "是否启用调试###",
-  "###x_collaboration_core_message": "是否启用调试###",
-  "###x_organization_core_express": "是否启用调试###",
-  "###x_query_core_express": "是否启用调试###",
-  "###x_bbs_assemble_control": "是否启用调试###",
-  "###x_calendar_assemble_control": "是否启用调试###",
-  "###x_cms_assemble_control": "是否启用调试###",
-  "###x_component_assemble_control": "是否启用调试###",
-  "###x_hotpic_assemble_control": "是否启用调试###",
-  "###x_message_assemble_communicate": "是否启用调试###",
-  "###x_mind_assemble_control": "是否启用调试###",
-  "###x_okr_assemble_control": "是否启用调试###",
-  "###x_organization_assemble_express": "是否启用调试###",
-  "###x_organization_assemble_personal": "是否启用调试###",
-  "###x_portal_assemble_designer": "是否启用调试###",
-  "###x_portal_assemble_surface": "是否启用调试###",
-  "###x_processplatform_assemble_bam": "是否启用调试###",
-  "###x_jpush_assemble_control": "是否启用调试###",
-  "###audit": "审计日志配置###"
-}

+ 0 - 38
o2server/configSample/manifest.cfg

@@ -1,38 +0,0 @@
-{"node_127.0.0.1.json":"节点配置",
- "appStyle.json":"移动端应用样式配置",
- "centerServer.json":"中心服务配置",
- "clientInit.json":"客户端初始化配置",
- "collect.json":"连接到云平台配置",
- "communicate.json":"消息配置",
- "components.json":"组件配置",
- "dingding.json":"钉钉配置",
- "dumpRestoreData.json":"导出导入数据配置",
- "exmail.json":"腾讯企业邮邮件配置",
- "externalDataSources.json":"数据库配置",
- "externalDataSources_db2.json":"db2数据库配置",
- "externalDataSources_dm.json":"达梦数据库配置",
- "externalDataSources_informix.json":"informix数据库配置",
- "externalDataSources_kingbase.json":"金仓数据库配置",
- "externalDataSources_mysql.json":"mysql数据库配置",
- "externalDataSources_oracle.json":"oracle数据库配置",
- "externalDataSources_postgresql.json":"postgresql数据库配置",
- "externalDataSources_sqlserver.json":"sqlserver数据库配置",
- "externalStorageSources.json":"文件存储配置",
- "jpushConfig.json":"极光推送配置",
- "logLevel.json":"日志配置",
- "meeting.json":"openMeeting配置",
- "messages.json":"消息发送配置",
- "messageSendRule.js":"消息发送规则",
- "mq.json":"消息队列配置",
- "person.json":"个人信息配置",
- "portal.json":"门户配置",
- "processPlatform.json":"流程平台配置",
- "qiyeweixin.json":"企业微信配置",
- "query.json":"数据中心配置",
- "token.json":"令牌,密钥配置",
- "vfs.json":"虚拟文件存储配置",
- "welink.json":"华为WeLink配置",
- "workTime.json":"工作时间配置",
- "zhengwuDingding.json":"政务钉钉配置",
- "web.json":"前端相关配置"
-}

+ 0 - 17
o2server/configSample/meeting.json

@@ -1,17 +0,0 @@
-{
-  "enable": false,
-  "oauth2Id": "5",
-  "port": 5080.0,
-  "host": "127.0.0.1",
-  "user": "xadmin",
-  "pass": "",
-  "anonymousAccessAttachment": false,
-  "###enable": "是否启用###",
-  "###oauth2Id": "openMeeting单点序号###",
-  "###port": "openMeeting端口###",
-  "###host": "openMeeting服务器###",
-  "###user": "openMeeting管理员账户###",
-  "###pass": "openMeeting管理员密码###",
-  "###httpProtocol": "openMeeting协议###",
-  "###anonymousAccessAttachment": "匿名用户是否可以访问附件###"
-}

+ 0 - 18
o2server/configSample/messageSendRule.js

@@ -1,18 +0,0 @@
-/**
- * 统一消息推送执行脚本,使用在messages.json配置文件
- * 方法返回boolean类型,true表示满足发送条件且接受对body体的修改,false表示不发送
- * 变量body表示消息体,每个消息类型的消息体可能不同,是一个Gson的JsonObject对象
- * 以下excute方法表示拟稿状态的待办不发送消息;excute1方法表示变更或者添加body对象中的modifyFlag参数
- */
-function excute() {
-    if(body.has("first") && body.has("workCreateType")){
-        if (body.get("first").getAsBoolean() && "surface".equals(body.get("workCreateType").getAsString())){
-            return false;
-        }
-    }
-    return true;
-}
-function excute1() {
-    body.addProperty("modifyFlag","1");
-    return true;
-}

+ 0 - 198
o2server/configSample/messages.json

@@ -1,198 +0,0 @@
-{
-  "##sample##": {
-    "consumers": [],
-    "consumersV2": {
-      "qiyeweixin": "excute",
-      "describe": "excute表示脚本messageSendRule.js中的方法名称,该js文件需放在与messages.json同目录下,更改脚本需重启服务"
-    }
-  },
-  "attachment_editor": {
-    "consumers": [],
-    "consumersV2": {
-      "mq": "",
-      "pms": "",
-      "zhengwuDingding": "",
-      "qiyeweixin": "",
-      "welink": "",
-      "ws": "",
-      "dingding": ""
-    }
-  },
-  "attachment_editorCancel": {
-    "consumers": [],
-    "consumersV2": {
-      "mq": "",
-      "pms": "",
-      "zhengwuDingding": "",
-      "qiyeweixin": "",
-      "welink": "",
-      "ws": "",
-      "dingding": ""
-    }
-  },
-  "attachment_editorModify": {
-    "consumers": [],
-    "consumersV2": {
-      "mq": "",
-      "pms": "",
-      "zhengwuDingding": "",
-      "qiyeweixin": "",
-      "welink": "",
-      "ws": "",
-      "dingding": ""
-    }
-  },
-  "attachment_share": {
-    "consumers": [],
-    "consumersV2": {
-      "mq": "",
-      "pms": "",
-      "zhengwuDingding": "",
-      "qiyeweixin": "",
-      "welink": "",
-      "ws": "",
-      "dingding": ""
-    }
-  },
-  "attachment_shareCancel": {
-    "consumers": [],
-    "consumersV2": {
-      "mq": "",
-      "pms": "",
-      "zhengwuDingding": "",
-      "qiyeweixin": "",
-      "welink": "",
-      "ws": "",
-      "dingding": ""
-    }
-  },
-  "bbs_replyCreate": {
-    "consumers": [],
-    "consumersV2": {
-      "pms": "",
-      "ws": ""
-    }
-  },
-  "bbs_subjectCreate": {
-    "consumers": [],
-    "consumersV2": {
-      "pms": "",
-      "ws": ""
-    }
-  },
-  "calendar_alarm": {
-    "consumers": [],
-    "consumersV2": {
-      "pms": "",
-      "zhengwuDingding": "",
-      "qiyeweixin": "",
-      "welink": "",
-      "ws": "",
-      "dingding": ""
-    }
-  },
-  "im_create": {
-    "consumers": [],
-    "consumersV2": {
-      "ws": ""
-    }
-  },
-  "meeting_delete": {
-    "consumers": [],
-    "consumersV2": {
-      "mq": "",
-      "pms": "",
-      "zhengwuDingding": "",
-      "qiyeweixin": "",
-      "welink": "",
-      "ws": "",
-      "dingding": ""
-    }
-  },
-  "meeting_invite": {
-    "consumers": [],
-    "consumersV2": {
-      "mq": "",
-      "pms": "",
-      "zhengwuDingding": "",
-      "qiyeweixin": "",
-      "welink": "",
-      "ws": "",
-      "dingding": ""
-    }
-  },
-  "mind_fileSend": {
-    "consumers": [],
-    "consumersV2": {
-      "pms": "",
-      "ws": ""
-    }
-  },
-  "mind_fileShare": {
-    "consumers": [],
-    "consumersV2": {
-      "pms": "",
-      "ws": ""
-    }
-  },
-  "readCompleted_create": {
-    "consumers": [],
-    "consumersV2": {}
-  },
-  "readCompleted_delete": {
-    "consumers": [],
-    "consumersV2": {}
-  },
-  "read_create": {
-    "consumers": [],
-    "consumersV2": {
-      "mq": "",
-      "pms": "",
-      "zhengwuDingding": "",
-      "qiyeweixin": "",
-      "welink": "",
-      "ws": "",
-      "dingding": ""
-    }
-  },
-  "read_delete": {
-    "consumers": [],
-    "consumersV2": {}
-  },
-  "taskCompleted_create": {
-    "consumers": [],
-    "consumersV2": {}
-  },
-  "taskCompleted_delete": {
-    "consumers": [],
-    "consumersV2": {}
-  },
-  "task_create": {
-    "consumers": [],
-    "consumersV2": {
-      "mq": "",
-      "pms": "",
-      "zhengwuDingding": "",
-      "qiyeweixin": "",
-      "welink": "",
-      "ws": "",
-      "dingding": ""
-    }
-  },
-  "task_delete": {
-    "consumers": [],
-    "consumersV2": {}
-  },
-  "task_press": {
-    "consumers": [],
-    "consumersV2": {
-      "mq": "",
-      "pms": "",
-      "zhengwuDingding": "",
-      "qiyeweixin": "",
-      "welink": "",
-      "ws": "",
-      "dingding": ""
-    }
-  }
-}

+ 0 - 31
o2server/configSample/mq.json

@@ -1,31 +0,0 @@
-{
-  "enable": true,
-  "mq":"kafka",
-  "kafka":{
-	  "bootstrap_servers": "localhost:9092",
-	  "topic":"topic-test",
-	  "acks": "all",
-	  "retries": 0,
-	  "batch_size": 16384,
-	  "linger_ms": 1,
-	  "buffer_memory": 33554432,
-	  "key_deserializer": "org.apache.kafka.common.serialization.StringDeserializer",
-	  "value_deserializer": "org.apache.kafka.common.serialization.StringDeserializer",
-	  "###bootstrap_servers": "服务器地址###",
-	  "###acks": "指定必须有多少个分区副本接收消息,生产者才认为消息写入成功,用户检测数据丢失的可能性###",
-	  "###retries": "生产者从服务器收到的错误有可能是临时性的错误的次数###",
-	  "###batch_size": "该参数指定了一个批次可以使用的内存大小,按照字节数计算(而不是消息个数)。###",
-	  "###linger_ms": "该参数指定了生产者在发送批次之前等待更多消息加入批次的时间,增加延迟,提高吞吐量###",
-	  "###buffer_memory": "该参数用来设置生产者内存缓冲区的大小,生产者用它缓冲要发送到服务器的消息###",
-	  "###key_deserializer": "key值的序列化类###",
-	  "###value_deserializer": "value的序列化类###"
-  },
-  "activeMQ":{
-	   "url":"tcp://127.0.0.1:61616",
-	   "queueName":"queue-test",
-	   "###url": "服务地址,端口默认61616.###",
-	   "###queueName": "要创建的消息名称###"
-  },
-  "###enable": "是否启用.###",
-  "###mq": "消息服务类型.###"
-}

+ 0 - 185
o2server/configSample/node_127.0.0.1.json

@@ -1,185 +0,0 @@
-{
-  "enable": true,
-  "isPrimaryCenter": true,
-  "center": {
-    "enable": true,
-    "order": 0.0,
-    "sslEnable": false,
-    "redeploy": true,
-    "port": 20030.0,
-    "httpProtocol": "",
-    "proxyHost": "",
-    "proxyPort": 20030.0,
-    "scanInterval": 0.0,
-    "configApiEnable": true,
-    "statEnable": true,
-    "statExclusions": "*.js,*.gif,*.jpg,*.png,*.css,*.ico",
-    "maxFormContent": 20.0,
-    "exposeJest": true,
-    "persistentConnectionsEnable": true,
-    "###enable": "是否启用###",
-    "###order": "center节点顺序,顺序排列0,1,2...###",
-    "###sslEnable": "是否启用ssl传输加密,如果启用将使用config/keystore文件作为密钥文件.使用config/token.json文件中的sslKeyStorePassword字段为密钥密码,sslKeyManagerPassword为管理密码.###",
-    "###redeploy": "每次启动是否重新部署所有应用.###",
-    "###port": "端口,center服务器端口,默认20030###",
-    "###httpProtocol": "对外http访问协议,http/https###",
-    "###proxyHost": "代理主机,当服务器是通过apache/nginx等代理服务器映射到公网或者通过路由器做端口映射,在这样的情况下需要设置此地址以标明公网访问地址.###",
-    "###proxyPort": "代理端口,当服务器是通过apache/nginx等代理服务器映射到公网或者通过路由器做端口映射,在这样的情况下需要设置此地址以标明公网访问端口.###",
-    "###scanInterval": "重新扫描war包时间间隔(秒)###",
-    "###config": "其他参数###",
-    "###configApiEnable": "允许通过Api修改config###",
-    "###statEnable": "启用统计,默认启用统计.###",
-    "###statExclusions": "统计忽略路径,默认忽略*.js,*.gif,*.jpg,*.png,*.css,*.ico###",
-    "###maxFormContent": "最大提交数据限制(M),限制有所上传的内容大小,包括附件.###",
-    "###exposeJest": "暴露jest接口.###",
-    "###persistentConnectionsEnable": "是否启用长连接,默认false.###"
-  },
-  "application": {
-    "enable": true,
-    "port": 20020.0,
-    "sslEnable": false,
-    "proxyHost": "",
-    "proxyPort": 20020.0,
-    "redeploy": true,
-    "scanInterval": 0.0,
-    "includes": [],
-    "excludes": [],
-    "weights": [],
-    "scheduleWeights": [],
-    "statEnable": true,
-    "statExclusions": "*.js,*.gif,*.jpg,*.png,*.css,*.ico",
-    "maxFormContent": 20.0,
-    "exposeJest": true,
-    "persistentConnectionsEnable": true,
-    "###enable": "是否启用###",
-    "###port": "http/https端口,负责向前端提供数据访问接口.默认为20020端口.###",
-    "###sslEnable": "是否启用ssl传输加密,如果启用将使用config/keystore文件作为密钥文件.使用config/token.json文件中的sslKeyStorePassword字段为密钥密码,sslKeyManagerPassword为管理密码.###",
-    "###proxyHost": "代理主机,当服务器是通过apache/nginx等代理服务器映射到公网或者通过路由器做端口映射,在这样的情况下需要设置此地址以标明公网访问地址.###",
-    "###proxyPort": "代理端口,当服务器是通过apache/nginx等代理服务器映射到公网或者通过路由器做端口映射,在这样的情况下需要设置此地址以标明公网访问端口.###",
-    "###redeploy": "每次启动是否重载全部应用.###",
-    "###scanInterval": "应用reload扫描间隔,\u003c0 表示不会reload应用,扫描到应用文件发生了变化.###",
-    "###includes": "承载的应用,在集群环境下可以选择仅承载部分应用以降低服务器负载,可以使用*作为通配符.###",
-    "###excludes": "选择不承载的应用,和includes的值配合使用可以选择或者排除承载的应用,可以使用*作为通配符.###",
-    "###weights": "设置应用的Web访问权重,在集群环境中,一个应用可以部署多个实例提供负载均衡.通过合计占比来分配应用占比.###",
-    "###scheduleWeights": "设置应用的定时任务权重,在集群环境中,一个应用可以部署多个实例提供负载均衡.通过合计占比来分配应用占比.###",
-    "###statEnable": "启用统计,默认启用统计.###",
-    "###statExclusions": "统计忽略路径,默认忽略*.js,*.gif,*.jpg,*.png,*.css,*.ico###",
-    "###maxFormContent": "最大提交数据限制(M),限制有所上传的内容大小,包括附件.###",
-    "###exposeJest": "暴露jest接口.###",
-    "###persistentConnectionsEnable": "是否启用长连接,默认false.###"
-  },
-  "web": {
-    "enable": true,
-    "sslEnable": false,
-    "proxyHost": "",
-    "weight": 100.0,
-    "dirAllowed": false,
-    "statEnable": false,
-    "statExclusions": "*.gif,*.jpg,*.png,*.ico",
-    "cacheControlMaxAge": 0.0,
-    "persistentConnectionsEnable": true,
-    "###enable": "是否启用###",
-    "###port": "http/https端口,用户输入网址后实际访问的第一个端口.http协议默认为80端口,https默认为443端口.###",
-    "###sslEnable": "是否启用ssl传输加密,如果启用将使用config/keystore文件作为密钥文件.使用config/token.json文件中的sslKeyStorePassword字段为密钥密码,sslKeyManagerPassword为管理密码.###",
-    "###proxyHost": "代理主机,当服务器是通过apache/nginx等代理服务器映射到公网或者通过路由器做端口映射,在这样的情况下需要设置此地址以标明公网访问地址.###",
-    "###proxyPort": "代理端口,当服务器是通过apache/nginx等代理服务器映射到公网或者通过路由器做端口映射,在这样的情况下需要设置此地址以标明公网访问端口.###",
-    "###weight": "设置权重.当前没有作用,###",
-    "###dirAllowed": "允许浏览目录,###",
-    "###statEnable": "启用统计,默认启用统计.###",
-    "###statExclusions": "统计忽略路径,默认忽略*.gif,*.jpg,*.png,*.ico###",
-    "###cacheControlMaxAge": "服务器max-age缓存时间(秒)###",
-    "###proxyCenterEnable": "是否启用center服务器代理.###",
-    "###proxyApplicationEnable": "是否启用application服务器代理###",
-    "###persistentConnectionsEnable": "是否启用长连接,默认true.###"
-  },
-  "data": {
-    "enable": true,
-    "tcpPort": 20050.0,
-    "webPort": 20051.0,
-    "includes": [],
-    "excludes": [],
-    "jmxEnable": false,
-    "cacheSize": 512.0,
-    "logLevel": "WARN",
-    "maxTotal": 50.0,
-    "maxIdle": 0.0,
-    "statEnable": true,
-    "statFilter": "mergeStat",
-    "slowSqlMillis": 2000.0,
-    "lockTimeout": 120000.0,
-    "###enable": "是否启用,如果没有可用的externalDataSources.json文件,那么默认会在节点中启用本地的H2数据库作为默认的数据库.###",
-    "###tcpPort": "H2数据库jdbc连接端口,登录的用户名:sa,密码为xadmin的密码.数据库创建在/o2server/local/repository/data/X.mv.db,一旦数据库文件被创建,那么该数据库的密码被创建.###",
-    "###webPort": "H2数据库web端口,H2提供一个web端的client,此端口为web端client的访问端口.用户名sa,密码为xadmin数据库初始创建的密码.###",
-    "###includes": "设置此数据库存储的类,默认情况下存储所有类型,如果需要对每个类进行单独的控制以达到高性能,可以将不同的类存储到不同的节点上提高性能.可以使用通配符*###",
-    "###excludes": "在此节点上不存储的类,和includes一起设置实际存储的类,可以使用通配符*###",
-    "###jmxEnable": "是否启动jmx,如果启用,可以通过本地的jmx客户端进行访问,不支持远程jmx客户端.###",
-    "###cacheSize": "H2数据库缓存大小,设置H2用于作为缓存的内存大小,以M作为单位,这里默认为512M.###",
-    "###logLevel": "默认日志级别,FATAL, ERROR, WARN, INFO, TRACE. 完整的配置为DefaultLevel\u003dWARN, Tool\u003dTRACE, Enhance\u003dTRACE, METADATA\u003dTRACE, Runtime\u003dTRACE, Query\u003dTRACE, DataCache\u003dTRACE, JDBC\u003dTRACE, SQL\u003dTRACE###",
-    "###maxTotal": "最大使用连接数###",
-    "###maxIdle": "最大空闲连接数###",
-    "###statEnable": "启用统计,默认启用###",
-    "###statFilter": "统计方式配置,默认mergeStat###",
-    "###slowSqlMillis": "执行缓慢sql毫秒数,默认2000毫秒,执行缓慢的sql将被单独记录.###",
-    "###lockTimeout": "默认锁超时时间()毫秒).###"
-  },
-  "storage": {
-    "enable": true,
-    "port": 20040.0,
-    "sslEnable": false,
-    "name": "251",
-    "accounts": [],
-    "prefix": "",
-    "deepPath": false,
-    "###enable": "是否启用,对于二进制流文件,比如附件,图片等存储在单独的文件服务器中,可以支持多种文件服务器,默认情况下使用ftp服务器作为文件服务器,每个节点可以启动一个文件服务器以提供高性能.###",
-    "###port": "ftp服务器端口,此端口可以不对外开放,仅有ApplicationServer进行访问,并不直接对用户提供服务.###",
-    "###sslEnable": "是否启用ssl传输加密,如果启用将使用config/keystore文件作为密钥文件.使用config/token.json文件中的sslKeyStorePassword字段为密钥密码,sslKeyManagerPassword为管理密码.###",
-    "###name": "名称,多个节点中不能重名,默认为251.###",
-    "###accounts": "二进制流文件是分多个账号分段存储的,可以单独设置每个分类的存储配置,一般不需要设置.###",
-    "###passivePorts": "ftp传输有主动和被动之分,如果使用了被动传输,设置被动端口范围,默认为29000-30000.###",
-    "###prefix": "路径前缀.###",
-    "###deepPath": "使用更深的路径###"
-  },
-  "logLevel": "warn",
-  "dumpData": {
-    "enable": false,
-    "cron": "",
-    "size": 7.0,
-    "path": "",
-    "###enable": "是否启用,默认禁用.###",
-    "###cron": "定时任务cron表达式,默认每天凌晨2点进行备份.###",
-    "###size": "最大保留份数,超过将自动删除最久的数据.###",
-    "###path": "备份路径###"
-  },
-  "restoreData": {
-    "enable": false,
-    "cron": "",
-    "path": "",
-    "###enable": "是否启用.###",
-    "###cron": "定时任务cron表达式###",
-    "###path": "恢复路径###"
-  },
-  "nodeAgentEnable": true,
-  "nodeAgentPort": 20010.0,
-  "nodeAgentEncrypt": true,
-  "quickStartWebApp": false,
-  "autoStart": true,
-  "###enable": "是否启用###",
-  "###isPrimaryCenter": "是否是center节点,仅允许存在一个center节点###",
-  "###center": "Center服务器配置###",
-  "###application": "Application服务器配置###",
-  "###web": "Web服务器配置###",
-  "###data": "Data服务器配置###",
-  "###storage": "Storage服务器配置###",
-  "###logLevel": "日志级别,默认当前节点的slf4j日志级别,通过系统变量\"org.slf4j.simpleLogger.defaultLogLevel\"设置到当前jvm中.###",
-  "###dumpData": "定时数据导出配置###",
-  "###restoreData": "定时数据导入配置###",
-  "###logSize": "日志文件保留天数.###",
-  "###auditLogSize": "审计日志文件保留天数.###",
-  "###nodeAgentEnable": "是否启用节点代理###",
-  "###nodeAgentPort": "是否启用节点端口###",
-  "###nodeAgentEncrypt": "是否启用节点代理加密###",
-  "###quickStartWebApp": "是否使用快速应用部署###",
-  "###banner": "服务器控制台启动标识###",
-  "###autoStart": "是否自动启动###",
-  "###eraseContentEnable": "是否允许使用擦除数据功能###"
-}

+ 0 - 40
o2server/configSample/person.json

@@ -1,40 +0,0 @@
-{
-  "MAX_PASSWORDPERIOD": 3650.0,
-  "captchaLogin": true,
-  "codeLogin": true,
-  "bindLogin": true,
-  "faceLogin": true,
-  "password": "(var v \\u003d person.getMobile();\\u000a return v.substring(v.length - 6))",
-  "passwordPeriod": 0.0,
-  "passwordRegex": "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,}$",
-  "passwordRegexHint": "6位以上,包含数字和字母.",
-  "register": "disable",
-  "superPermission": true,
-  "tokenCookieHttpOnly": false,
-  "personUnitOrderByAsc": true,
-  "###captchaLogin": "是否启用验证码登录,默认值:true###",
-  "###codeLogin": "是否启用验证码登录,默认值:true###",
-  "###bindLogin": "是否启用扫描二维码登录,默认值:false###",
-  "###faceLogin": "是否启用刷脸登录,默认值:false###",
-  "###password": "注册初始密码,使用()调用脚本生成初始密码,默认为:(var v \\u003d person.getMobile();\\u000a return v.substring(v.length - 6))###",
-  "###passwordPeriod": "密码过期时间(天),0表示不过期,默认值:0.###",
-  "###passwordRegex": "密码校验正则表达式,默认6位以上,包含数字和字母.###",
-  "###passwordRegexHint": "密码校验不通过的提示信息.###",
-  "###register": "是否允许用户自注册,disable:不允许,captcha通过验证码注册,code:通过短信注册,默认值:disable###",
-  "###superPermission": "是否启用超级管理员权限,默认值:true###",
-  "###mobileRegex": "手机号码校验正则表达式,()表示脚本内容,默认值:(^(\\+)?0{0,2}852\\d{8}$)|(^(\\+)?0{0,2}853\\d{8}$)|(^(\\+)?0{0,2}886\\d{9}$)|(^1(3|4|5|7|8|9)\\d{9}$)###",
-  "###loginPage": "定制登录页面设置.###",
-  "loginPage": {
-    "enable": false,
-    "portal": "",
-    "page": "",
-    "###enable": "是否启用定制登录页面.###",
-    "###portal": "指定登录页面所属的portal,可以用id,name,alias.###",
-    "###page": "指定的登录页面,可以使用name,alias,id###"
-  },
-  "###failureInterval": "登录限制时间(分钟)###",
-  "###failureCount": "尝试登录次数###",
-  "###tokenExpiredMinutes": "token时长,分钟###",
-  "###tokenCookieHttpOnly": "保存token的cookie是否启用httpOnly###",
-  "###personUnitOrderByAsc": "人员组织排序是否为升序,true为升序(默认),false为降序###"
-}

+ 0 - 21
o2server/configSample/portal.json

@@ -1,21 +0,0 @@
-{
-  "indexPage": {
-    "enable": false,
-    "portal": "",
-    "page": "",
-    "###enable": "是否启用定制的首页面.###",
-    "###portal": "指定首页面所属的portal,可以用id,name,alias.###",
-    "###page": "指定的首页面,可以使用name,alias,id###"
-  },
-  "loginPage": {
-    "enable": false,
-    "portal": "",
-    "page": "",
-    "###enable": "是否启用定制登录页面.###",
-    "###portal": "指定登录页面所属的portal,可以用id,name,alias.###",
-    "###page": "指定的登录页面,可以使用name,alias,id###"
-  },
-  "###urlMapping": "url转换配置.###",
-  "###indexPage": "定制首页面设置.###",
-  "###loginPage": "定制登录页面设置.###"
-}

+ 0 - 109
o2server/configSample/processPlatform.json

@@ -1,109 +0,0 @@
-{
-  "maintenanceIdentity": "",
-  "formVersionCount": 30.0,
-  "processVersionCount": 30.0,
-  "scriptVersionCount": 30.0,
-  "docToWordType": "local",
-  "docToWordDefaultFileName": "正文.docx",
-  "docToWordDefaultSite": "$doc",
-  "executorCount": 32.0,
-  "updateDataProjectionEnable": false,
-  "urge": {
-    "enable": false,
-    "cron": "30 0/10 8-18 * * ?",
-    "###enable": "是否启用###",
-    "###cron": "定时cron表达式.###"
-  },
-  "expire": {
-    "enable": true,
-    "cron": "45 0/15 8-18 * * ?",
-    "###enable": "是否启用###",
-    "###cron": "定时cron表达式###"
-  },
-  "touchDelay": {
-    "enable": true,
-    "cron": "5 0/5 * * * ?",
-    "###enable": "是否启用###",
-    "###cron": "定时cron表达式###"
-  },
-  "merge": {
-    "enable": false,
-    "cron": "30 30 6 * * ?",
-    "thresholdDays": 730.0,
-    "batchSize": 100.0,
-    "###enable": "是否启用###",
-    "###cron": "定时cron表达式###",
-    "###thresholdDays": "期限,已完成工作结束间隔指定时间进行merge,默认两年后进行merge###",
-    "###batchSize": "批量大小.###"
-  },
-  "deleteDraft": {
-    "enable": false,
-    "cron": "0 0 20 * * ?",
-    "thresholdMinutes": 86400.0,
-    "###enable": "是否启用###",
-    "###cron": "定时cron表达式###",
-    "###thresholdMinutes": "设定阈值,如果超过这个时间认为是可以删除的草稿,默认为10天.###"
-  },
-  "passExpired": {
-    "enable": true,
-    "cron": "5 5 8-18 * * ?",
-    "###enable": "是否启用###",
-    "###cron": "定时cron表达式###"
-  },
-  "touchDetained": {
-    "enable": true,
-    "cron": "30 30 12 * * ?",
-    "thresholdMinutes": 1440.0,
-    "###enable": "是否启用###",
-    "###cron": "定时cron表达式###",
-    "###thresholdMinutes": "当工作滞留设定时间后,将尝试触发工作流转,可以自动处理由于人员变动的引起的工作滞留,默认24*60分钟.###"
-  },
-  "processingSignalPersistEnable": false,
-  "attachmentConfig": {
-    "fileSize": 0.0,
-    "fileTypeIncludes": [],
-    "fileTypeExcludes": [],
-    "###fileSize": "附件大小限制(单位M,默认不限制).###",
-    "###fileTypeIncludes": "只允许上传的文件后缀###",
-    "###fileTypeExcludes": "不允许上传的文件后缀###"
-  },
-  "###maintenanceIdentity": "维护身份,当工作发生意外错误,无法找到对应的处理人情况下,先尝试将工作分配给创建身份,如果创建身份也不可获取,那么分配给指定人员,默认情况下这个值为空.###",
-  "###formVersionCount": "表单历史版本保留数量,0为不保留.###",
-  "###processVersionCount": "流程历史版本保留数量,0为不保留.###",
-  "###scriptVersionCount": "脚本历史版本保留数量,0为不保留.###",
-  "###docToWordType": "HTML版式公文转换成Word文件方式,local,cloud.###",
-  "###docToWordDefaultFileName": "HTML版式公文转换成Word文件缺省文件名.###",
-  "###docToWordDefaultSite": "HTML版式公文转换成Word文件缺省site.###",
-  "###executorCount": "执行器数量###",
-  "###updateDataProjectionEnable": "更新data数据是否执行映射.###",
-  "###urge": "催办任务设置,发现即将过期时发送提醒消息.###",
-  "###expire": "将已经过了截至时间的待办标记过期.###",
-  "###touchDelay": "延时任务设置,定时触发延时任务,当超过延时时间后继续流转.###",
-  "###merge": "合并任务设置,定时触发合并任务,将已完成工作的Data从Item表中提取合并到WorkCompleted的Data字段中,默认工作完成后2年开始进行合并.###",
-  "###deleteDraft": "清除草稿状态的工作.###",
-  "###passExpired": "超时工作路由设置.###",
-  "###touchDetained": "触发长时间未处理的工作.###",
-  "###logLongDetained": "记录长期滞留工作,待办,待阅设置.###",
-  "logLongDetained": {
-    "enable": true,
-    "cron": "0 0 4 * * ?",
-    "taskThresholdMinutes": 14400.0,
-    "readThresholdMinutes": 14400.0,
-    "workThresholdMinutes": 14400.0,
-    "###enable": "是否启用###",
-    "###cron": "定时cron表达式###",
-    "###taskThresholdMinutes": "设定待办滞留阈值,.###",
-    "###readThresholdMinutes": "设定待阅滞留阈值,.###",
-    "###workThresholdMinutes": "设定工作滞留阈值,.###"
-  },
-  "###press": "提醒设置,设置提醒间隔.###",
-  "press": {
-    "intervalMinutes": 10.0,
-    "count": 3.0,
-    "###intervalMinutes": "提醒间隔(分钟)###",
-    "###count": "提醒数量限制.###"
-  },
-  "###extensionEvents": "事件扩充.###",
-  "###processingSignalPersistEnable": "是否保存工作处理信号内容,默认false.###",
-  "###attachmentConfig": "流程附件上传限制大小或者类型.###"
-}

+ 0 - 8
o2server/configSample/pushConfig.json

@@ -1,8 +0,0 @@
-{
-  "enable": false,
-  "appKey": "9aca7cc20fe0cc987cd913ca",
-  "masterSecret": "96ee7e2e0daffd51bac57815",
-  "###enable": "是否启用.###",
-  "###appKey": "极光推送应用的AppKey###",
-  "###masterSecret": "极光推送应用的Master Secret###"
-}

+ 0 - 36
o2server/configSample/qiyeweixin.json

@@ -1,36 +0,0 @@
-{
-  "enable": false,
-  "syncCron": "10 0/10 * * * ?",
-  "forceSyncCron": "10 45 8,12 * * ?",
-  "apiAddress": "https://qyapi.weixin.qq.com",
-  "corpId": "",
-  "syncSecret": "",
-  "corpSecret": "",
-  "agentId": "",
-  "token": "",
-  "encodingAesKey": "",
-  "workUrl": "",
-  "messageRedirectPortal": "",
-  "messageEnable": false,
-  "scanLoginEnable": false,
-  "attendanceSyncEnable": false,
-  "attendanceSyncAgentId": "",
-  "attendanceSyncSecret": "",
-  "###enable": "是否启用.###",
-  "###syncCron": "回调信号触发同步检查,默认每10分钟运行一次,如果期间内有企业微信回调信号接收到,那么触发同步任务进行人员同步.###",
-  "###forceSyncCron": "强制拉入同步cron,默认在每天的8点和12点强制进行同步.###",
-  "###apiAddress": "api服务器地址###",
-  "###corpId": "企业微信corpId###",
-  "###syncSecret": "企业微信同步通讯录Secret###",
-  "###corpSecret": "企业微信corpSecret###",
-  "###agentId": "企业微信agentId###",
-  "###token": "回调token###",
-  "###encodingAesKey": "回调encodingAesKey###",
-  "###workUrl": "企业微信消息打开工作的url地址,如:http://dev.o2oa.net/x_desktop/###",
-  "###messageRedirectPortal": "企业微信消息处理完成后跳转到特定的门户页面的Id###",
-  "###messageEnable": "推送消息到企业微信###",
-  "###scanLoginEnable": "企业微信扫码登录###",
-  "###attendanceSyncEnable": "是否启用考勤信息###",
-  "###attendanceSyncAgentId": "企业微信考勤打卡应用id###",
-  "###attendanceSyncSecret": "企业微信考勤打卡应用secret###"
-}

+ 0 - 55
o2server/configSample/query.json

@@ -1,55 +0,0 @@
-{
-  "crawlWorkCompleted": {
-    "enable": true,
-    "cron": "50 50 21 * * ?",
-    "count": 500.0,
-    "excludeAttachment": [],
-    "excludeSite": [],
-    "maxAttachmentSize": 5242880.0,
-    "###enable": "是否启用###",
-    "###cron": "定时cron表达式.###",
-    "###count": "每次处理的数量,默认每小时处理所以默认为500,同时每次将重爬最旧的25%,按时间轮询25%.###",
-    "###excludeAttachment": "忽略附件名称.###",
-    "###excludeSite": "忽略附件位置.###",
-    "###maxAttachmentSize": "最大附件大小.###"
-  },
-  "crawlWork": {
-    "enable": true,
-    "cron": "40 40 10,12,14,16 * * ?",
-    "count": 50.0,
-    "excludeAttachment": [],
-    "excludeSite": [],
-    "maxAttachmentSize": 5242880.0,
-    "###enable": "是否启用###",
-    "###cron": "定时cron表达式.###",
-    "###count": "每次处理的数量,默认每小时处理所以默认为50,同时每次将重爬最旧的50%,按时间轮询50%.###",
-    "###excludeAttachment": "忽略附件名称.###",
-    "###excludeSite": "忽略附件位置.###",
-    "###maxAttachmentSize": "最大附件大小.###"
-  },
-  "crawlCms": {
-    "enable": true,
-    "cron": "30 30 9,12,15,18 * * ?",
-    "count": 30.0,
-    "excludeAttachment": [],
-    "maxAttachmentSize": 5242880.0,
-    "###enable": "是否启用###",
-    "###cron": "定时cron表达式.###",
-    "###count": "每次处理的数量,默认每小时处理所以默认为30,同时每次将重爬最旧的50%,按时间轮询50%.###",
-    "###excludeAttachment": "忽略附件名称.###",
-    "###maxAttachmentSize": "最大附件大小.###"
-  },
-  "extractOffice": true,
-  "extractPdf": true,
-  "extractText": true,
-  "extractImage": false,
-  "tessLanguage": "chi_sim",
-  "###crawlWorkCompleted": "已完成工作收集器设置.###",
-  "###crawlWork": "工作收集器设置.###",
-  "###crawlCms": "内容管理收集器设置.###",
-  "###extractOffice": "抽取office中的文本.###",
-  "###extractPdf": "抽取pdf中的文本.###",
-  "###extractText": "抽取文本中的文本.###",
-  "###extractImage": "抽取图像中的文本.###",
-  "###tessLanguage": "tess使用语言.###"
-}

+ 0 - 85
o2server/configSample/token.json

@@ -1,85 +0,0 @@
-{
-  "key": "",
-  "password": "",
-  "sslKeyStorePassword": "123456",
-  "sslKeyManagerPassword": "123456",
-  "initialManager": "xadmin",
-  "initialManagerDistinguishedName": "xadmin@o2oa@P",
-  "ssos": [
-    {
-      "enable": false,
-      "client": "",
-      "key": "",
-      "###enable": "是否启用###",
-      "###client": "名称###",
-      "###key": "密钥###"
-    }
-  ],
-  "oauths": [
-    {
-      "enable": false,
-      "clientId": "",
-      "mapping": {},
-      "###enable": "是否启用###",
-      "###clientId": "客户端名称###",
-      "###clientSecret": "密钥###",
-      "###loginUrl": "登录地址###",
-      "###mapping": "返回值###"
-    }
-  ],
-  "oauthClients": [
-    {
-      "enable": false,
-      "name": "",
-      "displayName": "",
-      "icon": "",
-      "clientId": "",
-      "clientSecret": "",
-      "authAddress": "",
-      "authParameter": "client_id\u003d{$client_id}\u0026redirect_uri\u003d{$redirect_uri}",
-      "authMethod": "GET",
-      "tokenAddress": "",
-      "tokenParameter": "client_id\u003d{$client_id}\u0026client_secret\u003d{$client_secret}\u0026redirect_uri\u003d{$redirect_uri}\u0026grant_type\u003dauthorization_code\u0026code\u003d{$code}",
-      "tokenMethod": "POST",
-      "tokenType": "json",
-      "infoAddress": "",
-      "infoParameter": "access_token\u003d{$access_token}",
-      "infoMethod": "GET",
-      "infoType": "json",
-      "infoCredentialField": "openId",
-      "infoScriptText": "",
-      "bindingEnable": false,
-      "bindingField": "",
-      "###enable": "是否启用.###",
-      "###name": "名称.###",
-      "###displayName": "显示名称.###",
-      "###icon": "图标.###",
-      "###clientId": "用户oauth2认证的client_id.###",
-      "###clientSecret": "用户oauth2认证的client_secret.###",
-      "###authAddress": "认证后的跳转地址.###",
-      "###authParameter": "请求密钥方法参数.###",
-      "###authMethod": "请求密钥方法.一般为GET###",
-      "###tokenAddress": "请求令牌网址.###",
-      "###tokenParameter": "请求令牌方法参数.###",
-      "###tokenMethod": "请求令牌方法.一般为POST###",
-      "###tokenType": "token信息格式.json格式或者form格式###",
-      "###infoAddress": "请求信息网址.###",
-      "###infoParameter": "请求信息方法参数.###",
-      "###infoMethod": "请求信息方法.一般为GET###",
-      "###infoType": "info信息格式.json格式或者form格式或者script格式###",
-      "###infoCredentialField": "info信息中用于标识个人的字段.###",
-      "###infoScriptText": "info信息中用于标识个人的字段.###",
-      "###bindingEnable": "是否允许绑定到用户,如果允许,用户可以自行绑定.###",
-      "###bindingField": "绑定字段,对端的用户标识,一般为openId绑定到个人字段,可选值为open1Id,open2Id,open3Id,open4Id,open5Id###"
-    }
-  ],
-  "###key": "加密用口令的密钥,修改后会导致用户口令验证失败.###",
-  "###password": "初始管理员密码,用于内部数据库和FTP文件服务器,以及http的token加密.###",
-  "###sslKeyStorePassword": "ssl密码###",
-  "###sslKeyManagerPassword": "ssl管理密码###",
-  "###initialManager": "初始管理员名称,目前不可更改.###",
-  "###initialManagerDistinguishedName": "初始管理员DistinguishedName,不可更改.###",
-  "###ssos": "sso登录配置###",
-  "###oauths": "oauth单点登录配置###",
-  "###oauthClients": "作为客户端单点登录配置###"
-}

+ 0 - 11
o2server/configSample/vfs.json

@@ -1,11 +0,0 @@
-{
-  "ftp": {
-    "passive": true
-  },
-  "ftps": {
-    "passive": true
-  },
-  "sftp": {
-    "passive": true
-  }
-}

+ 0 - 4
o2server/configSample/web.json

@@ -1,4 +0,0 @@
-{
-  "mock": {},
-  "###mock": "使用Post模拟Put,Get模拟Delete的模块.###"
-}

+ 0 - 20
o2server/configSample/welink.json

@@ -1,20 +0,0 @@
-{
-  "enable": false,
-  "clientId": "",
-  "clientSecret": "",
-  "syncCron": "10 0/10 * * * ?",
-  "forceSyncCron": "10 45 8,12 * * ?",
-  "oapiAddress": "https://open.welink.huaweicloud.com/api",
-  "messageEnable": false,
-  "workUrl": "",
-  "messageRedirectPortal": "",
-  "###enable": "是否启用.###",
-  "###syncCron": "拉入同步cron,默认每10分钟同步一次.###",
-  "###forceSyncCron": "强制拉入同步cron,默认在每天的8点和12点强制进行同步.###",
-  "###oapiAddress": "api服务器地址###",
-  "###clientId": "华为WeLink轻应用的client_id###",
-  "###clientSecret": "华为WeLink轻应用的client_secret###",
-  "###messageEnable": "推送消息到华为WeLink###",
-  "###workUrl": "华为WeLink消息打开工作的url地址,如:http://dev.o2oa.net/x_desktop/###",
-  "###messageRedirectPortal": "华为WeLink消息处理完成后跳转到特定的门户页面的Id###"
-}

+ 0 - 19
o2server/configSample/workTime.json

@@ -1,19 +0,0 @@
-{
-  "amStart": "09:00:00",
-  "amEnd": "11:30:00",
-  "pmStart": "13:00:00",
-  "pmEnd": "17:30:00",
-  "holidays": [],
-  "workdays": [],
-  "weekends": [
-    1.0,
-    7.0
-  ],
-  "###amStart": "工作时间上午开始时间###",
-  "###amEnd": "工作时间上午结束时间###",
-  "###pmStart": "工作时间下午开始时间###",
-  "###pmEnd": "工作时间下午结束时间###",
-  "###holidays": "固定节假日,格式为[\"2019-01-01\",\"2019-05-01\"]###",
-  "###workdays": "固定工作时间,格式为[\"2019-01-01\",\"2019-05-01\"]###",
-  "###weekends": "周末设定,默认格式为[1,7]其中1代表周日,7代表周六.###"
-}

+ 0 - 33
o2server/configSample/zhengwuDingding.json

@@ -1,33 +0,0 @@
-{
-  "enable": false,
-  "appSecret": "",
-  "agentId": "",
-  "syncCron": "10 0/10 * * * ?",
-  "forceSyncCron": "10 45 8,12 * * ?",
-  "oapiAddress": "https://oapi.dingtalk.com",
-  "corpId": "",
-  "corpSecret": "",
-  "titleSplit": [
-    ",",
-    "、",
-    ",",
-    " ",
-    " "
-  ],
-  "personAttributeTitleName": "职务",
-  "nonce": "o2oa",
-  "messageEnable": true,
-  "###enable": "是否启用.###",
-  "###appId": "政务钉钉appId###",
-  "###appSecret": "政务钉钉appSecret###",
-  "###agentId": "政务钉钉agentId###",
-  "###syncCron": "回调信号触发同步检查,默认每10分钟运行一次,如果期间内有政务钉钉回调信号接收到,那么触发同步任务进行人员同步.###",
-  "###forceSyncCron": "强制拉入同步cron,默认在每天的8点和12点强制进行同步.###",
-  "###oapiAddress": "oapi服务器地址###",
-  "###corpId": "政务钉钉corpId###",
-  "###corpSecret": "政务钉钉corpSecret###",
-  "###titleSplit": "title分隔符###",
-  "###personAttributeTitleName": "title对应个人属性名称###",
-  "###nonce": "政务钉钉nonce###",
-  "###messageEnable": "推送消息到政务钉钉消息###"
-}

+ 15 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceschedulesetting/ActionSave.java

@@ -96,6 +96,21 @@ public class ActionSave extends BaseAction {
 			}
 		}
 		if (check) {
+			//计算由于打卡次数发生变化引起的打开时间值变化
+			Integer signProxy = attendanceScheduleSetting.getSignProxy();
+			switch(signProxy){
+				case 1 :
+					attendanceScheduleSetting.setMiddayRestStartTime("");
+					attendanceScheduleSetting.setMiddayRestEndTime("");
+					attendanceScheduleSetting.setLateStartTimeAfternoon("");
+					attendanceScheduleSetting.setLeaveEarlyStartTimeMorning("");
+					break;
+				case 2 :
+					attendanceScheduleSetting.setLateStartTimeAfternoon("");
+					break;
+			}
+
+
 			try {
 				attendanceScheduleSetting = attendanceScheduleSettingServiceAdv.save(attendanceScheduleSetting);
 				result.setData(new Wo(attendanceScheduleSetting.getId()));

+ 1 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/selfholiday/ActionSave.java

@@ -204,7 +204,7 @@ public class ActionSave extends BaseAction {
 
 		private String employeeNumber;
 
-		@FieldDescribe("请假类型:带薪年休假|带薪病假|带薪福利假|扣薪事假|其他")
+		@FieldDescribe("请假类型:带薪年休假|带薪病假|带薪福利假|扣薪事假|出差|培训|其他,<font color='red'>必填</font>")
 		private String leaveType;
 
 		@FieldDescribe("开始时间,<font color='red'>必填</font>: yyyy-mm-dd hh24:mi:ss")

+ 1 - 1
o2server/x_attendance_core_entity/src/main/java/com/x/attendance/entity/AttendanceSelfHoliday.java

@@ -92,7 +92,7 @@ public class AttendanceSelfHoliday extends SliceJpaObject {
 	private String employeeNumber;
 
 	public static final String leaveType_FIELDNAME = "leaveType";
-	@FieldDescribe("请假类型:带薪年休假|带薪病假|带薪福利假|扣薪事假|其他")
+	@FieldDescribe("请假类型:带薪年休假|带薪病假|带薪福利假|扣薪事假|出差|培训|其他")
 	@Column( length = JpaObject.length_32B, name = ColumnNamePrefix + leaveType_FIELDNAME )
 	@CheckPersist(allowEmpty = false)
 	private String leaveType;

+ 7 - 2
o2server/x_base_core_project/src/main/java/com/x/base/core/project/schedule/JobReportListener.java

@@ -6,13 +6,13 @@ import org.quartz.JobListener;
 
 import com.x.base.core.project.config.Config;
 import com.x.base.core.project.connection.CipherConnectionAction;
-import com.x.base.core.project.gson.XGsonBuilder;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 
 public class JobReportListener implements JobListener {
 
 	private static Logger logger = LoggerFactory.getLogger(JobReportListener.class);
+
 	@Override
 	public String getName() {
 		return this.getClass().getName();
@@ -25,7 +25,12 @@ public class JobReportListener implements JobListener {
 
 	@Override
 	public void jobToBeExecuted(JobExecutionContext jobExecutionContext) {
-
+		ScheduleLogRequest request = new ScheduleLogRequest(jobExecutionContext);
+		try {
+			CipherConnectionAction.post(false, Config.url_x_program_center_jaxrs("schedule", "report"), request);
+		} catch (Exception e) {
+			logger.error(e);
+		}
 	}
 
 	@Override

+ 29 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/project/schedule/ScheduleLogRequest.java

@@ -1,6 +1,7 @@
 package com.x.base.core.project.schedule;
 
 import java.util.Date;
+import java.util.Objects;
 
 import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.quartz.JobDetail;
@@ -8,9 +9,17 @@ import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
 
 import com.x.base.core.project.gson.GsonPropertyObject;
+import com.x.base.core.project.tools.StringTools;
 
 public class ScheduleLogRequest extends GsonPropertyObject {
 
+	private static final long serialVersionUID = -1472780383077011677L;
+
+	public static final String FIELDSCHEDULELOGID = "scheduleLogId";
+
+	// 新增id字段,用于保存ScheduleLog的时候覆盖自动生成的id
+	private String scheduleLogId;
+
 	private String type;
 
 	private String node;
@@ -27,8 +36,20 @@ public class ScheduleLogRequest extends GsonPropertyObject {
 
 	private Boolean success;
 
+	public ScheduleLogRequest(JobExecutionContext jobExecutionContext) {
+		JobDetail jobDetail = jobExecutionContext.getJobDetail();
+		this.scheduleLogId = StringTools.uniqueToken();
+		jobExecutionContext.put(FIELDSCHEDULELOGID, scheduleLogId);
+		this.className = jobDetail.getKey().getName();
+		this.application = jobDetail.getKey().getGroup();
+		this.node = jobDetail.getDescription();
+		this.type = jobExecutionContext.getTrigger().getDescription();
+		this.fireTime = jobExecutionContext.getFireTime();
+	}
+
 	public ScheduleLogRequest(JobExecutionContext jobExecutionContext, JobExecutionException jobExecutionException) {
 		JobDetail jobDetail = jobExecutionContext.getJobDetail();
+		this.scheduleLogId = Objects.toString(jobExecutionContext.get(FIELDSCHEDULELOGID));
 		this.className = jobDetail.getKey().getName();
 		this.application = jobDetail.getKey().getGroup();
 		this.node = jobDetail.getDescription();
@@ -107,4 +128,12 @@ public class ScheduleLogRequest extends GsonPropertyObject {
 		this.success = success;
 	}
 
+	public String getScheduleLogId() {
+		return scheduleLogId;
+	}
+
+	public void setScheduleLogId(String scheduleLogId) {
+		this.scheduleLogId = scheduleLogId;
+	}
+
 }

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

@@ -27,6 +27,7 @@ import org.apache.commons.collections4.ListUtils;
 import org.apache.commons.collections4.set.ListOrderedSet;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.reflect.FieldUtils;
 import org.slf4j.helpers.MessageFormatter;
@@ -548,4 +549,40 @@ public class StringTools {
 		}
 		return sb.toString();
 	}
-}
+
+	/**
+	 * 文本搜索
+	 * @param keyword 搜索关键字
+	 * @param content 文本
+	 * @param caseSensitive 大小写敏感
+	 * @param matchWholeWord 是否全字匹配
+	 * @param matchRegExp 正则表达式搜索
+	 * @return
+	 */
+	public static boolean matchKeyword(String keyword, String content, Boolean caseSensitive, Boolean matchWholeWord, Boolean matchRegExp){
+		if(StringUtils.isBlank(keyword) || StringUtils.isBlank(content)){
+			return false;
+		}
+		if(BooleanUtils.isTrue(matchRegExp)){
+			Pattern pattern = Pattern.compile(keyword);
+			Matcher matcher = pattern.matcher(content);
+			return matcher.find();
+		}else if(BooleanUtils.isTrue(matchWholeWord)){
+			if(BooleanUtils.isTrue(caseSensitive)) {
+				Pattern pattern = Pattern.compile("\\b(" + keyword + ")\\b");
+				Matcher matcher = pattern.matcher(content);
+				return matcher.find();
+			}else{
+				Pattern pattern = Pattern.compile("\\b(" + keyword + ")\\b", Pattern.CASE_INSENSITIVE);
+				Matcher matcher = pattern.matcher(content);
+				return matcher.find();
+			}
+		}else{
+			if(BooleanUtils.isTrue(caseSensitive)) {
+				return (content.indexOf(keyword) > -1);
+			}else{
+				return (content.toLowerCase().indexOf(keyword.toLowerCase()) > -1);
+			}
+		}
+	}
+}

+ 1 - 1
o2server/x_calendar_assemble_control/src/main/java/com/x/calendar/assemble/control/ThisApplication.java

@@ -38,7 +38,7 @@ public class ThisApplication {
 			// 每30秒检查一次需要推送的消息
 			context.schedule(AlarmTrigger.class, "0/30 * * * * ?");
 			// 每两小时检查一次comment信息的引用情况,删除多余的不必要的数据
-			context.schedule(CheckEventComment.class, "* * */2 * * ?");
+			context.schedule(CheckEventComment.class, "4 4 */2 * * ?");
 		} catch (Exception e) {
 			e.printStackTrace();
 		}

+ 132 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/script/ActionManagerList.java

@@ -0,0 +1,132 @@
+package com.x.cms.assemble.control.jaxrs.script;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.exception.ExceptionAccessDenied;
+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.tools.ListTools;
+import com.x.base.core.project.tools.StringTools;
+import com.x.cms.core.entity.AppInfo;
+import com.x.cms.core.entity.element.Script;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+class ActionManagerList extends BaseAction {
+	ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, JsonElement jsonElement) throws Exception {
+		if(!effectivePerson.isManager()){
+			throw new ExceptionAccessDenied(effectivePerson);
+		}
+		Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<List<Wo>> result = new ActionResult<>();
+			List<Wo> wos;
+			if(ListTools.isEmpty(wi.getAppIdList())){
+				wos = emc.fetchAll(Script.class,  Wo.copier);
+			}else{
+				wos = emc.fetchIn(Script.class, Wo.copier, Script.appId_FIELDNAME, wi.getAppIdList());
+			}
+			final List<Wo> resWos = new ArrayList<>();
+			wos.stream().forEach(wo -> {
+				try {
+					AppInfo appInfo = emc.find( wo.getAppId(), AppInfo.class );
+					if(appInfo != null){
+						wo.setAppName(appInfo.getAppName());
+					}
+				} catch (Exception e) {
+				}
+				if(StringUtils.isNotBlank(wi.getKeyword())){
+					if(StringTools.matchKeyword(wi.getKeyword(), wo.getText(), wi.getCaseSensitive(), wi.getMatchWholeWord(), wi.getMatchRegExp())){
+						resWos.add(wo);
+					}
+				}else{
+					resWos.add(wo);
+				}
+			});
+			wos.clear();
+			result.setData(resWos);
+			result.setCount((long)resWos.size());
+			return result;
+		}
+	}
+
+	public static class Wi extends GsonPropertyObject{
+		@FieldDescribe("搜索关键字.")
+		private String keyword;
+		@FieldDescribe("是否区分大小写.")
+		private Boolean caseSensitive;
+		@FieldDescribe("是否全字匹配.")
+		private Boolean matchWholeWord;
+		@FieldDescribe("是否正则表达式匹配.")
+		private Boolean matchRegExp;
+		@FieldDescribe("应用ID列表.")
+		private List<String> appIdList = new ArrayList<>();
+
+		public String getKeyword() {
+			return keyword;
+		}
+
+		public void setKeyword(String keyword) {
+			this.keyword = keyword;
+		}
+
+		public Boolean getCaseSensitive() {
+			return caseSensitive;
+		}
+
+		public void setCaseSensitive(Boolean caseSensitive) {
+			this.caseSensitive = caseSensitive;
+		}
+
+		public Boolean getMatchWholeWord() {
+			return matchWholeWord;
+		}
+
+		public void setMatchWholeWord(Boolean matchWholeWord) {
+			this.matchWholeWord = matchWholeWord;
+		}
+
+		public Boolean getMatchRegExp() {
+			return matchRegExp;
+		}
+
+		public void setMatchRegExp(Boolean matchRegExp) {
+			this.matchRegExp = matchRegExp;
+		}
+
+		public List<String> getAppIdList() {
+			return appIdList;
+		}
+
+		public void setAppIdList(List<String> appIdList) {
+			this.appIdList = appIdList;
+		}
+	}
+
+	public static class Wo extends Script {
+
+		private static final long serialVersionUID = -8095369685452823624L;
+
+		static WrapCopier<Script, Wo> copier = WrapCopierFactory.wo(Script.class, Wo.class,
+				JpaObject.singularAttributeField(Script.class, true, false),null);
+
+		@FieldDescribe("应用名称.")
+		private String appName;
+
+		public String getAppName() {
+			return appName;
+		}
+
+		public void setAppName(String appName) {
+			this.appName = appName;
+		}
+	}
+}

+ 19 - 1
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/script/ScriptAction.java

@@ -258,4 +258,22 @@ public class ScriptAction extends StandardJaxrsAction {
 		}
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
-}
+
+	@JaxrsMethodDescribe(value = "列示Script对象(管理员权限).", action = ActionManagerList.class)
+	@POST
+	@Path("list/manager")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void managerList(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+							JsonElement jsonElement) {
+		ActionResult<List<ActionManagerList.Wo>> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionManagerList().execute(effectivePerson, jsonElement);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+}

+ 65 - 48
o2server/x_file_assemble_control/src/main/java/com/x/file/assemble/control/jaxrs/share/ActionSaveToFolder.java

@@ -18,6 +18,8 @@ import java.util.List;
 
 class ActionSaveToFolder extends BaseAction {
 
+	private long usedSize;
+
 	ActionResult<Wo> execute(EffectivePerson effectivePerson, String shareId, String fileId, String folderId, String password) throws Exception {
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 			ActionResult<Wo> result = new ActionResult<>();
@@ -55,54 +57,9 @@ class ActionSaveToFolder extends BaseAction {
 			if(StringUtils.isEmpty(fileId)){
 				throw new Exception("fileId can not be empty.");
 			}
+
 			/* 转存文件或目录到指定的目录下 */
-			long usedSize = business.attachment2().getUseCapacity(effectivePerson.getDistinguishedName());
-			if("attachment".equals(share.getFileType())){
-				Attachment2 att = emc.find(fileId, Attachment2.class);
-				if(att!=null) {
-					usedSize = usedSize + att.getLength();
-					int vResult = business.verifyConstraint(effectivePerson.getDistinguishedName(), usedSize);
-					if(vResult > 0){
-						long usedCapacity = usedSize / (1024 * 1024);
-						throw new ExceptionCapacityOut(usedCapacity, vResult);
-					}
-					Attachment2 newAtt = new Attachment2(att.getName(), effectivePerson.getDistinguishedName(),
-							folderId, att.getOriginFile(), att.getLength(), att.getType());
-					emc.check(newAtt, CheckPersistType.all);
-					emc.beginTransaction(Attachment2.class);
-					emc.persist(newAtt);
-					emc.commit();
-				}
-			}else{
-				Folder2 folder = emc.find(fileId, Folder2.class);
-				Folder2 newFolder = new Folder2(folder.getName(),effectivePerson.getDistinguishedName(),folderId,folder.getStatus());
-				EntityManager em = emc.beginTransaction(Folder2.class);
-				emc.check(newFolder, CheckPersistType.all);
-				em.persist(newFolder);
-				em.getTransaction().commit();
-				List<String> subIds = business.folder2().listSubNested(folder.getId(), FileStatus.VALID.getName());
-				for(String subFold : subIds){
-					folder = emc.find(subFold, Folder2.class);
-					Folder2 newSubFolder = new Folder2(folder.getName(),effectivePerson.getDistinguishedName(),folderId,folder.getStatus());
-					EntityManager em1 = emc.beginTransaction(Folder2.class);
-					em1.persist(newSubFolder);
-					em1.getTransaction().commit();
-					List<Attachment2> attachments = business.attachment2().listWithFolder2(subFold,FileStatus.VALID.getName());
-					for (Attachment2 att : attachments) {
-						usedSize = usedSize + att.getLength();
-						int vResult = business.verifyConstraint(effectivePerson.getDistinguishedName(), usedSize);
-						if(vResult > 0){
-							long usedCapacity = usedSize / (1024 * 1024);
-							throw new ExceptionCapacityOut(usedCapacity, vResult);
-						}
-						Attachment2 newAtt = new Attachment2(att.getName(), effectivePerson.getDistinguishedName(),
-								folderId, att.getOriginFile(), att.getLength(), att.getType());
-						EntityManager em2 = emc.beginTransaction(Attachment2.class);
-						em2.persist(newAtt);
-						em2.getTransaction().commit();
-					}
-				}
-			}
+			saveToFolder(business, share, fileId, folderId, effectivePerson);
 
 			Wo wo = new Wo();
 			wo.setValue(true);
@@ -111,6 +68,66 @@ class ActionSaveToFolder extends BaseAction {
 		}
 	}
 
+	private void saveToFolder(Business business, Share share, String fileId, String folderId, EffectivePerson effectivePerson) throws Exception {
+		EntityManagerContainer emc = business.entityManagerContainer();
+
+		this.usedSize = business.attachment2().getUseCapacity(effectivePerson.getDistinguishedName());
+		if("attachment".equals(share.getFileType())){
+			Attachment2 att = emc.find(fileId, Attachment2.class);
+			if(att!=null) {
+				usedSize = usedSize + att.getLength();
+				int vResult = business.verifyConstraint(effectivePerson.getDistinguishedName(), usedSize);
+				if(vResult > 0){
+					long usedCapacity = usedSize / (1024 * 1024);
+					throw new ExceptionCapacityOut(usedCapacity, vResult);
+				}
+				Attachment2 newAtt = new Attachment2(att.getName(), effectivePerson.getDistinguishedName(),
+						folderId, att.getOriginFile(), att.getLength(), att.getType());
+				emc.check(newAtt, CheckPersistType.all);
+				emc.beginTransaction(Attachment2.class);
+				emc.persist(newAtt);
+				emc.commit();
+			}
+		}else{
+			Folder2 folder = emc.find(fileId, Folder2.class);
+			Folder2 newFolder = new Folder2(folder.getName(),effectivePerson.getDistinguishedName(),folderId,folder.getStatus());
+			EntityManager em = emc.beginTransaction(Folder2.class);
+			emc.check(newFolder, CheckPersistType.all);
+			em.persist(newFolder);
+			em.getTransaction().commit();
+			saveSubFolder(business, folder.getId(), newFolder.getId(), effectivePerson);
+		}
+	}
+
+	private void saveSubFolder(Business business, String folderId, String newFolderId, EffectivePerson effectivePerson) throws Exception {
+		EntityManagerContainer emc = business.entityManagerContainer();
+
+		List<Attachment2> attachments = business.attachment2().listWithFolder2(folderId,FileStatus.VALID.getName());
+		for (Attachment2 att : attachments) {
+			usedSize = usedSize + att.getLength();
+			int vResult = business.verifyConstraint(effectivePerson.getDistinguishedName(), usedSize);
+			if(vResult > 0){
+				long usedCapacity = usedSize / (1024 * 1024);
+				throw new ExceptionCapacityOut(usedCapacity, vResult);
+			}
+			Attachment2 newAtt = new Attachment2(att.getName(), effectivePerson.getDistinguishedName(),
+					newFolderId, att.getOriginFile(), att.getLength(), att.getType());
+			EntityManager em2 = emc.beginTransaction(Attachment2.class);
+			em2.persist(newAtt);
+			em2.getTransaction().commit();
+		}
+
+		List<Folder2> subFolders = business.folder2().listSubDirect1(folderId, FileStatus.VALID.getName());
+		for(Folder2 folder : subFolders){
+			Folder2 newSubFolder = new Folder2(folder.getName(),effectivePerson.getDistinguishedName(),newFolderId,folder.getStatus());
+			EntityManager em1 = emc.beginTransaction(Folder2.class);
+			em1.persist(newSubFolder);
+			em1.getTransaction().commit();
+			saveSubFolder(business, folder.getId(), newSubFolder.getId(), effectivePerson);
+		}
+
+	}
+
 	public static class Wo extends WrapBoolean {
 	}
-}
+}

+ 5 - 4
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/inputperson/ActionInputAll.java

@@ -620,7 +620,7 @@ class ActionInputAll extends BaseAction {
 					validate = false;
 					continue;
 				}
-				this.setUnitMemo(workbook, configurator, o, "校验通过.");
+				//this.setUnitMemo(workbook, configurator, o, "校验通过.");
 			}
 		}
 		return validate;
@@ -633,6 +633,7 @@ class ActionInputAll extends BaseAction {
 		boolean validate = true;
 		for (PersonItem o : person) {
 			//System.out.println("正在校验用户:{}."+ o.getName());
+			this.setPersonMemo(workbook, configurator, o, "校验通过.");
 			if (StringUtils.isEmpty(o.getName())) {
 				this.setPersonMemo(workbook, configurator, o, "人员姓名不能为空.");
 				validate = false;
@@ -658,7 +659,6 @@ class ActionInputAll extends BaseAction {
 				validate = false;
 				continue;
 			}
-			this.setPersonMemo(workbook, configurator, o, "校验通过.");
 			/*if(o.getAttributes().isEmpty()|| StringUtils.isEmpty(o.getAttributes().get("idNumber"))){
 				this.setPersonMemo(workbook, configurator, o, "身份证号不能为空.");
 				validate = false;
@@ -702,7 +702,7 @@ class ActionInputAll extends BaseAction {
 					continue;
 				}
 				
-				this.setPersonMemo(workbook, configurator, o, "校验通过.");
+				//this.setPersonMemo(workbook, configurator, o, "校验通过.");
 			}
 		}
 		return validate;
@@ -732,6 +732,7 @@ class ActionInputAll extends BaseAction {
 				IdentityItem identityItem = new IdentityItem();
 				identityItem.setRow(i);
 				identitys.add(identityItem);
+				this.setIdentityMemo(workbook, configurator, identityItem, "校验通过.");
 				if (StringUtils.isEmpty(unique)) {
 					this.setIdentityMemo(workbook, configurator, identityItem, "员工唯一编码不能为空.");
 					validate = false;
@@ -788,7 +789,7 @@ class ActionInputAll extends BaseAction {
 				}
 				
 				//if (validate) {
-					this.setIdentityMemo(workbook, configurator, identityItem, "校验通过.");
+					//this.setIdentityMemo(workbook, configurator, identityItem, "校验通过.");
 				//}
 				
 			}

+ 260 - 14
o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/identity/ActionListObject.java

@@ -7,14 +7,26 @@ import java.util.Optional;
 import com.google.gson.JsonElement;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.JpaObject;
 import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
 import com.x.base.core.project.cache.Cache.CacheKey;
 import com.x.base.core.project.cache.CacheManager;
 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.tools.ListTools;
 import com.x.organization.assemble.express.Business;
-import com.x.organization.core.entity.Identity;
+import com.x.organization.core.entity.*;
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
 
 class ActionListObject extends BaseAction {
 
@@ -24,7 +36,7 @@ class ActionListObject extends BaseAction {
 			Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
 			ActionResult<List<Wo>> result = new ActionResult<>();
 			Business business = new Business(emc);
-			CacheKey cacheKey = new CacheKey(this.getClass(), wi.getIdentityList());
+			CacheKey cacheKey = new CacheKey(this.getClass(), wi.getIdentityList(), wi.getReferenceFlag(), wi.getRecursiveFlag());
 			Optional<?> optional = CacheManager.get(cacheCategory, cacheKey);
 			if (optional.isPresent()) {
 				result.setData((List<Wo>) optional.get());
@@ -37,11 +49,128 @@ class ActionListObject extends BaseAction {
 		}
 	}
 
+	private List<Wo> list(Business business, Wi wi) throws Exception {
+		List<Wo> wos = new ArrayList<>();
+		for (String str : wi.getIdentityList()) {
+			Identity o = business.identity().pick(str);
+			if(o!=null){
+				Wo wo = Wo.copier.copy(o);
+				wo.setMatchKey(str);
+				Person p = business.person().pick(o.getPerson());
+				if (null != p) {
+					wo.setPerson(p.getDistinguishedName());
+				}
+				if (BooleanUtils.isTrue(wi.getReferenceFlag())){
+					referenceUnit(business, wo, wi);
+					referenceUnitDuty(business, wo);
+					referenceGroup(business, wo, wi);
+				}else {
+					Unit u = business.unit().pick(o.getUnit());
+					if (null != u) {
+						wo.setUnit(u.getDistinguishedName());
+					}
+				}
+				wos.add(wo);
+			}
+		}
+		return wos;
+	}
+
+	private void referenceUnit(Business business, Wo woIdentity, Wi wi) throws Exception {
+		if (StringUtils.isNotEmpty(woIdentity.getUnit())) {
+			Unit unit = business.unit().pick(woIdentity.getUnit());
+			if (null != unit) {
+				WoUnit wo = WoUnit.copier.copy(unit);
+				List<String> unitIdList = new ArrayList<>();
+				unitIdList.add(wo.getId());
+				if(BooleanUtils.isTrue(wi.getRecursiveFlag())){
+					referenceUnit(business, wo, unitIdList);
+				}
+				wo.setUnitIdList(unitIdList);
+				woIdentity.setWoUnit(wo);
+				woIdentity.setUnit(wo.getDistinguishedName());
+
+			}
+		}
+	}
+
+	private void referenceUnit(Business business, WoUnit woUnit, List<String> unitIdList) throws Exception {
+		if (StringUtils.isNotEmpty(woUnit.getSuperior())) {
+			Unit unit = business.unit().pick(woUnit.getSuperior());
+			if (null != unit) {
+				WoUnit wo = WoUnit.copier.copy(unit);
+				unitIdList.add(wo.getId());
+				if (StringUtils.isNotEmpty(wo.getSuperior()) && wo.getLevel()>1) {
+					referenceUnit(business, wo, unitIdList);
+				}
+				woUnit.setWoSupDirectUnit(wo);
+			}
+		}
+	}
+
+
+	private void referenceUnitDuty(Business business, Wo woIdentity) throws Exception {
+		EntityManager em = business.entityManagerContainer().get(UnitDuty.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<UnitDuty> cq = cb.createQuery(UnitDuty.class);
+		Root<UnitDuty> root = cq.from(UnitDuty.class);
+		Predicate p = cb.isMember(woIdentity.getId(), root.get(UnitDuty_.identityList));
+		List<UnitDuty> os = em.createQuery(cq.select(root).where(p)).getResultList();
+		List<WoUnitDuty> wos = WoUnitDuty.copier.copy(os);
+		wos = business.unitDuty().sort(wos);
+		for (WoUnitDuty woUnitDuty : wos) {
+			this.referenceUnit(business, woUnitDuty);
+		}
+		woIdentity.setWoUnitDutyList(wos);
+	}
+
+	private void referenceUnit(Business business, WoUnitDuty woUnitDuty) throws Exception {
+		if (StringUtils.isNotEmpty(woUnitDuty.getUnit())) {
+			Unit unit = business.unit().pick(woUnitDuty.getUnit());
+			if (null != unit) {
+				WoUnit wo = WoUnit.copier.copy(unit);
+				woUnitDuty.setWoUnit(wo);
+			}
+		}
+	}
+
+	private void referenceGroup(Business business, Wo wo, Wi wi) throws Exception {
+		EntityManager em = business.entityManagerContainer().get(Group.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Group> cq = cb.createQuery(Group.class);
+		Root<Group> root = cq.from(Group.class);
+		Predicate p = cb.isMember(wo.getId(), root.get(Group_.identityList));
+		if(wo.getWoUnit()!=null){
+			p = cb.or(p, root.get(Group_.unitList).in(wo.getWoUnit().getUnitIdList()));
+		}
+		List<Group> os = em.createQuery(cq.select(root).where(p)).getResultList();
+		final List<WoGroup> wos = new ArrayList<>();
+		os.stream().forEach(o -> {
+			try {
+				WoGroup woGroup = WoGroup.copier.copy(o);
+				if(BooleanUtils.isTrue(wi.getRecursiveFlag())) {
+					woGroup.setWoSupGroupList(WoGroup.copier.copy(business.group().listSupNestedObject(o)));
+				}
+				wos.add(woGroup);
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		});
+
+		wo.setWoGroupList(wos);
+	}
+
 	public static class Wi extends GsonPropertyObject {
 
 		@FieldDescribe("身份")
 		private List<String> identityList = new ArrayList<>();
 
+		@FieldDescribe("是否关联查询身份所属对象信息:组织、角色、群组")
+		private Boolean referenceFlag;
+
+		@FieldDescribe("是否递归查询上级组织或群组,默认false")
+		private Boolean recursiveFlag;
+
 		public List<String> getIdentityList() {
 			return identityList;
 		}
@@ -50,23 +179,140 @@ class ActionListObject extends BaseAction {
 			this.identityList = identityList;
 		}
 
+		public Boolean getReferenceFlag() {
+			return referenceFlag;
+		}
+
+		public void setReferenceFlag(Boolean referenceFlag) {
+			this.referenceFlag = referenceFlag;
+		}
+
+		public Boolean getRecursiveFlag() {
+			return recursiveFlag;
+		}
+
+		public void setRecursiveFlag(Boolean recursiveFlag) {
+			this.recursiveFlag = recursiveFlag;
+		}
 	}
 
-	public static class Wo extends com.x.base.core.project.organization.Identity {
+	public static class Wo extends Identity {
+
+		private static final long serialVersionUID = -7628608775316429534L;
+
+		static WrapCopier<Identity, Wo> copier = WrapCopierFactory.wo(Identity.class, Wo.class, null,
+				ListTools.toList(JpaObject.FieldsInvisible));
+
+		@FieldDescribe("匹配字段")
+		private String matchKey;
+
+		@FieldDescribe("组织对象")
+		private WoUnit woUnit;
+
+		@FieldDescribe("组织职务对象")
+		private List<WoUnitDuty> woUnitDutyList;
+
+		@FieldDescribe("群组对象")
+		private List<WoGroup> woGroupList;
+
+		public String getMatchKey() {
+			return matchKey;
+		}
 
+		public void setMatchKey(String matchKey) {
+			this.matchKey = matchKey;
+		}
+
+		public WoUnit getWoUnit() {
+			return woUnit;
+		}
+
+		public void setWoUnit(WoUnit woUnit) {
+			this.woUnit = woUnit;
+		}
+
+		public List<WoUnitDuty> getWoUnitDutyList() {
+			return woUnitDutyList;
+		}
+
+		public void setWoUnitDutyList(List<WoUnitDuty> woUnitDutyList) {
+			this.woUnitDutyList = woUnitDutyList;
+		}
+
+		public List<WoGroup> getWoGroupList() {
+			return woGroupList;
+		}
+
+		public void setWoGroupList(List<WoGroup> woGroupList) {
+			this.woGroupList = woGroupList;
+		}
 	}
 
-	private List<Wo> list(Business business, Wi wi) throws Exception {
-		List<Wo> wos = new ArrayList<>();
-		for (String str : wi.getIdentityList()) {
-			Identity o = business.identity().pick(str);
-			if(o!=null){
-				Wo wo = this.convert(business, o, Wo.class);
-				wo.setMatchKey(str);
-				wos.add(wo);
-			}
+	public static class WoUnit extends Unit {
+
+		private static final long serialVersionUID = -7760842451561513441L;
+
+		static WrapCopier<Unit, WoUnit> copier = WrapCopierFactory.wo(Unit.class, WoUnit.class, null,
+				ListTools.toList(JpaObject.FieldsInvisible, Unit.controllerList_FIELDNAME));
+
+		@FieldDescribe("上级组织对象.")
+		private WoUnit woSupDirectUnit;
+
+		private List<String> unitIdList;
+
+		public WoUnit getWoSupDirectUnit() {
+			return woSupDirectUnit;
+		}
+
+		public void setWoSupDirectUnit(WoUnit woSupDirectUnit) {
+			this.woSupDirectUnit = woSupDirectUnit;
+		}
+
+		public List<String> getUnitIdList() {
+			return unitIdList;
+		}
+
+		public void setUnitIdList(List<String> unitIdList) {
+			this.unitIdList = unitIdList;
+		}
+	}
+
+	public static class WoUnitDuty extends UnitDuty {
+
+		private static final long serialVersionUID = -2375022310349169180L;
+
+		@FieldDescribe("组织对象")
+		private WoUnit woUnit;
+
+		static WrapCopier<UnitDuty, WoUnitDuty> copier = WrapCopierFactory.wo(UnitDuty.class, WoUnitDuty.class, null,
+				ListTools.toList(JpaObject.FieldsInvisible));
+
+		public WoUnit getWoUnit() {
+			return woUnit;
+		}
+
+		public void setWoUnit(WoUnit woUnit) {
+			this.woUnit = woUnit;
+		}
+	}
+
+	public static class WoGroup extends Group {
+
+		private static final long serialVersionUID = 1430979713075568834L;
+
+		@FieldDescribe("上级群组对象列表.")
+		private List<WoGroup> woSupGroupList;
+
+		static WrapCopier<Group, WoGroup> copier = WrapCopierFactory.wo(Group.class, WoGroup.class, null,
+				ListTools.toList(JpaObject.FieldsInvisible));
+
+		public List<WoGroup> getWoSupGroupList() {
+			return woSupGroupList;
+		}
+
+		public void setWoSupGroupList(List<WoGroup> woSupGroupList) {
+			this.woSupGroupList = woSupGroupList;
 		}
-		return wos;
 	}
 
-}
+}

+ 144 - 0
o2server/x_portal_assemble_designer/src/main/java/com/x/portal/assemble/designer/jaxrs/script/ActionManagerList.java

@@ -0,0 +1,144 @@
+package com.x.portal.assemble.designer.jaxrs.script;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.exception.ExceptionAccessDenied;
+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.tools.ListTools;
+import com.x.base.core.project.tools.StringTools;
+import com.x.portal.core.entity.Portal;
+import com.x.portal.core.entity.Script;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+class ActionManagerList extends BaseAction {
+	ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, JsonElement jsonElement) throws Exception {
+		if(!effectivePerson.isManager()){
+			throw new ExceptionAccessDenied(effectivePerson);
+		}
+		Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<List<Wo>> result = new ActionResult<>();
+			List<Wo> wos;
+			if(ListTools.isEmpty(wi.getAppIdList())){
+				wos = emc.fetchAll(Script.class,  Wo.copier);
+			}else{
+				wos = emc.fetchIn(Script.class, Wo.copier, Script.portal_FIELDNAME, wi.getAppIdList());
+			}
+			final List<Wo> resWos = new ArrayList<>();
+			wos.stream().forEach(wo -> {
+				try {
+					Portal portal = emc.find(wo.getPortal(), Portal.class);
+					if(portal != null){
+						wo.setAppId(portal.getId());
+						wo.setAppName(portal.getName());
+					}
+				} catch (Exception e) {
+				}
+				if(StringUtils.isNotBlank(wi.getKeyword())){
+					if(StringTools.matchKeyword(wi.getKeyword(), wo.getText(), wi.getCaseSensitive(), wi.getMatchWholeWord(), wi.getMatchRegExp())){
+						resWos.add(wo);
+					}
+				}else{
+					resWos.add(wo);
+				}
+			});
+			wos.clear();
+			result.setData(resWos);
+			result.setCount((long)resWos.size());
+			return result;
+		}
+	}
+
+	public static class Wi extends GsonPropertyObject{
+		@FieldDescribe("搜索关键字.")
+		private String keyword;
+		@FieldDescribe("是否区分大小写.")
+		private Boolean caseSensitive;
+		@FieldDescribe("是否全字匹配.")
+		private Boolean matchWholeWord;
+		@FieldDescribe("是否正则表达式匹配.")
+		private Boolean matchRegExp;
+		@FieldDescribe("应用ID列表.")
+		private List<String> appIdList = new ArrayList<>();
+
+		public String getKeyword() {
+			return keyword;
+		}
+
+		public void setKeyword(String keyword) {
+			this.keyword = keyword;
+		}
+
+		public Boolean getCaseSensitive() {
+			return caseSensitive;
+		}
+
+		public void setCaseSensitive(Boolean caseSensitive) {
+			this.caseSensitive = caseSensitive;
+		}
+
+		public Boolean getMatchWholeWord() {
+			return matchWholeWord;
+		}
+
+		public void setMatchWholeWord(Boolean matchWholeWord) {
+			this.matchWholeWord = matchWholeWord;
+		}
+
+		public Boolean getMatchRegExp() {
+			return matchRegExp;
+		}
+
+		public void setMatchRegExp(Boolean matchRegExp) {
+			this.matchRegExp = matchRegExp;
+		}
+
+		public List<String> getAppIdList() {
+			return appIdList;
+		}
+
+		public void setAppIdList(List<String> appIdList) {
+			this.appIdList = appIdList;
+		}
+	}
+
+	public static class Wo extends Script {
+
+		private static final long serialVersionUID = -8095369685452823624L;
+
+		static WrapCopier<Script, Wo> copier = WrapCopierFactory.wo(Script.class, Wo.class,
+				JpaObject.singularAttributeField(Script.class, true, false),null);
+
+		@FieldDescribe("应用Id.")
+		private String appId;
+
+		@FieldDescribe("应用名称.")
+		private String appName;
+
+		public String getAppId() {
+			return appId;
+		}
+
+		public void setAppId(String appId) {
+			this.appId = appId;
+		}
+
+		public String getAppName() {
+			return appName;
+		}
+
+		public void setAppName(String appName) {
+			this.appName = appName;
+		}
+	}
+}

+ 19 - 1
o2server/x_portal_assemble_designer/src/main/java/com/x/portal/assemble/designer/jaxrs/script/ScriptAction.java

@@ -142,4 +142,22 @@ public class ScriptAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
 
-}
+	@JaxrsMethodDescribe(value = "列示Script对象(管理员权限).", action = ActionManagerList.class)
+	@POST
+	@Path("list/manager")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void managerList(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+							JsonElement jsonElement) {
+		ActionResult<List<ActionManagerList.Wo>> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionManagerList().execute(effectivePerson, jsonElement);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+}

+ 144 - 0
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/script/ActionManagerList.java

@@ -0,0 +1,144 @@
+package com.x.processplatform.assemble.designer.jaxrs.script;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.exception.ExceptionAccessDenied;
+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.tools.ListTools;
+import com.x.base.core.project.tools.StringTools;
+import com.x.processplatform.core.entity.element.Application;
+import com.x.processplatform.core.entity.element.Script;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+class ActionManagerList extends BaseAction {
+	ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, JsonElement jsonElement) throws Exception {
+		if(!effectivePerson.isManager()){
+			throw new ExceptionAccessDenied(effectivePerson);
+		}
+		Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<List<Wo>> result = new ActionResult<>();
+			List<Wo> wos;
+			if(ListTools.isEmpty(wi.getAppIdList())){
+				wos = emc.fetchAll(Script.class,  Wo.copier);
+			}else{
+				wos = emc.fetchIn(Script.class, Wo.copier, Script.application_FIELDNAME, wi.getAppIdList());
+			}
+			final List<Wo> resWos = new ArrayList<>();
+			wos.stream().forEach(wo -> {
+				try {
+					Application app = emc.find(wo.getApplication(), Application.class);
+					if(app != null){
+						wo.setAppId(app.getId());
+						wo.setAppName(app.getName());
+					}
+				} catch (Exception e) {
+				}
+				if(StringUtils.isNotBlank(wi.getKeyword())){
+					if(StringTools.matchKeyword(wi.getKeyword(), wo.getText(), wi.getCaseSensitive(), wi.getMatchWholeWord(), wi.getMatchRegExp())){
+						resWos.add(wo);
+					}
+				}else{
+					resWos.add(wo);
+				}
+			});
+			wos.clear();
+			result.setData(resWos);
+			result.setCount((long)resWos.size());
+			return result;
+		}
+	}
+
+	public static class Wi extends GsonPropertyObject{
+		@FieldDescribe("搜索关键字.")
+		private String keyword;
+		@FieldDescribe("是否区分大小写.")
+		private Boolean caseSensitive;
+		@FieldDescribe("是否全字匹配.")
+		private Boolean matchWholeWord;
+		@FieldDescribe("是否正则表达式匹配.")
+		private Boolean matchRegExp;
+		@FieldDescribe("应用ID列表.")
+		private List<String> appIdList = new ArrayList<>();
+
+		public String getKeyword() {
+			return keyword;
+		}
+
+		public void setKeyword(String keyword) {
+			this.keyword = keyword;
+		}
+
+		public Boolean getCaseSensitive() {
+			return caseSensitive;
+		}
+
+		public void setCaseSensitive(Boolean caseSensitive) {
+			this.caseSensitive = caseSensitive;
+		}
+
+		public Boolean getMatchWholeWord() {
+			return matchWholeWord;
+		}
+
+		public void setMatchWholeWord(Boolean matchWholeWord) {
+			this.matchWholeWord = matchWholeWord;
+		}
+
+		public Boolean getMatchRegExp() {
+			return matchRegExp;
+		}
+
+		public void setMatchRegExp(Boolean matchRegExp) {
+			this.matchRegExp = matchRegExp;
+		}
+
+		public List<String> getAppIdList() {
+			return appIdList;
+		}
+
+		public void setAppIdList(List<String> appIdList) {
+			this.appIdList = appIdList;
+		}
+	}
+
+	public static class Wo extends Script {
+
+		private static final long serialVersionUID = -8095369685452823624L;
+
+		static WrapCopier<Script, Wo> copier = WrapCopierFactory.wo(Script.class, Wo.class,
+				JpaObject.singularAttributeField(Script.class, true, false),null);
+
+		@FieldDescribe("应用Id.")
+		private String appId;
+
+		@FieldDescribe("应用名称.")
+		private String appName;
+
+		public String getAppId() {
+			return appId;
+		}
+
+		public void setAppId(String appId) {
+			this.appId = appId;
+		}
+
+		public String getAppName() {
+			return appName;
+		}
+
+		public void setAppName(String appName) {
+			this.appName = appName;
+		}
+	}
+}

+ 19 - 1
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/script/ScriptAction.java

@@ -199,4 +199,22 @@ public class ScriptAction extends StandardJaxrsAction {
 		}
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
-}
+
+	@JaxrsMethodDescribe(value = "列示Script对象(管理员权限).", action = ActionManagerList.class)
+	@POST
+	@Path("list/manager")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void managerList(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+							JsonElement jsonElement) {
+		ActionResult<List<ActionManagerList.Wo>> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionManagerList().execute(effectivePerson, jsonElement);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+}

+ 10 - 3
o2server/x_program_center/src/main/java/com/x/program/center/LogQueue.java

@@ -57,9 +57,16 @@ public class LogQueue extends AbstractQueue<NameValuePair> {
 
 	private <T extends JpaObject> void concrete(Class<T> cls, T o) throws Exception {
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			emc.beginTransaction(cls);
-			emc.persist(o, CheckPersistType.all);
-			emc.commit();
+			T t = emc.find(o.getId(), cls);
+			if (null != t) {
+				o.copyTo(t, JpaObject.FieldsUnmodify);
+				emc.beginTransaction(cls);
+				emc.commit();
+			} else {
+				emc.beginTransaction(cls);
+				emc.persist(o, CheckPersistType.all);
+				emc.commit();
+			}
 		}
 	}
 

+ 14 - 1
o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/schedule/ActionReport.java

@@ -21,8 +21,10 @@ class ActionReport extends BaseAction {
 		Wi wi = gson.fromJson(jsonElement, Wi.class);
 		ScheduleLog o = Wi.copier.copy(wi);
 		/** 默认使用传递过来的id,如果不存在那么重新赋值 */
-		if (StringUtils.isEmpty(o.getId())) {
+		if (StringUtils.isEmpty(wi.getScheduleLogId())) {
 			o.setId(StringTools.uniqueToken());
+		} else {
+			o.setId(wi.getScheduleLogId());
 		}
 		NameValuePair pair = new NameValuePair();
 		pair.setName(ScheduleLog.class.getName());
@@ -39,6 +41,17 @@ class ActionReport extends BaseAction {
 		private static final long serialVersionUID = 1996856138701159925L;
 		static WrapCopier<Wi, ScheduleLog> copier = WrapCopierFactory.wi(Wi.class, ScheduleLog.class, null,
 				JpaObject.FieldsUnmodify);
+
+		private String scheduleLogId;
+
+		public String getScheduleLogId() {
+			return scheduleLogId;
+		}
+
+		public void setScheduleLogId(String scheduleLogId) {
+			this.scheduleLogId = scheduleLogId;
+		}
+
 	}
 
 	public static class Wo extends WrapBoolean {

+ 13 - 14
o2server/x_program_center/src/main/java/com/x/program/center/schedule/FireSchedule.java

@@ -79,22 +79,21 @@ public class FireSchedule extends BaseAction {
 
 	private Date getLastStartTime(ScheduleRequest request) throws Exception {
 		Date lastStartTime = request.getLastStartTime();
-		if (null == lastStartTime) {
-			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-				EntityManager em = emc.get(ScheduleLog.class);
-				CriteriaBuilder cb = em.getCriteriaBuilder();
-				CriteriaQuery<ScheduleLog> cq = cb.createQuery(ScheduleLog.class);
-				Root<ScheduleLog> root = cq.from(ScheduleLog.class);
-				Predicate p = cb.equal(root.get(ScheduleLog_.className), request.getClassName());
-				List<ScheduleLog> os = em
-						.createQuery(cq.select(root).where(p).orderBy(cb.desc(root.get(ScheduleLog_.fireTime))))
-						.setMaxResults(1).getResultList();
-				if (!os.isEmpty()) {
-					lastStartTime = os.get(0).getFireTime();
-				}
+		// if (null == lastStartTime) {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			EntityManager em = emc.get(ScheduleLog.class);
+			CriteriaBuilder cb = em.getCriteriaBuilder();
+			CriteriaQuery<ScheduleLog> cq = cb.createQuery(ScheduleLog.class);
+			Root<ScheduleLog> root = cq.from(ScheduleLog.class);
+			Predicate p = cb.equal(root.get(ScheduleLog_.className), request.getClassName());
+			List<ScheduleLog> os = em
+					.createQuery(cq.select(root).where(p).orderBy(cb.desc(root.get(ScheduleLog_.fireTime))))
+					.setMaxResults(1).getResultList();
+			if (!os.isEmpty()) {
+				lastStartTime = os.get(0).getFireTime();
 			}
-
 		}
+		// }
 		return lastStartTime;
 	}
 }

+ 21 - 5
o2server/x_query_assemble_designer/src/main/java/com/x/query/assemble/designer/jaxrs/statement/ActionExecute.java

@@ -33,6 +33,8 @@ import com.x.query.core.express.statement.Runtime;
 
 class ActionExecute extends BaseAction {
 
+	private final static String[] pageKeys = { "GROUP BY", " COUNT(" };
+
 	ActionResult<Object> execute(EffectivePerson effectivePerson, String flag, Integer page, Integer size,
 			JsonElement jsonElement) throws Exception {
 
@@ -87,8 +89,10 @@ class ActionExecute extends BaseAction {
 			}
 		}
 		if (StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)) {
-			query.setFirstResult((runtime.page - 1) * runtime.size);
-			query.setMaxResults(runtime.size);
+			if(isPageSql(text)) {
+				query.setFirstResult((runtime.page - 1) * runtime.size);
+				query.setMaxResults(runtime.size);
+			}
 			data = query.getResultList();
 		} else {
 			business.entityManagerContainer().beginTransaction(cls);
@@ -116,8 +120,10 @@ class ActionExecute extends BaseAction {
 			}
 		}
 		if (StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)) {
-			query.setFirstResult((runtime.page - 1) * runtime.size);
-			query.setMaxResults(runtime.size);
+			if(isPageSql(statement.getData())) {
+				query.setFirstResult((runtime.page - 1) * runtime.size);
+				query.setMaxResults(runtime.size);
+			}
 			data = query.getResultList();
 		} else {
 			business.entityManagerContainer().beginTransaction(cls);
@@ -127,6 +133,16 @@ class ActionExecute extends BaseAction {
 		return data;
 	}
 
+	private boolean isPageSql(String sql){
+		sql = sql.toUpperCase().replaceAll("\\s{1,}", " ");
+		for (String key : pageKeys) {
+			if (sql.indexOf(key) > -1) {
+				return false;
+			}
+		}
+		return true;
+	}
+
 	private Class<? extends JpaObject> clazz(Business business, Statement statement) throws Exception {
 		Class<? extends JpaObject> cls = null;
 		if (StringUtils.equals(Statement.ENTITYCATEGORY_OFFICIAL, statement.getEntityCategory())
@@ -173,4 +189,4 @@ class ActionExecute extends BaseAction {
 
 	}
 
-}
+}

+ 20 - 5
o2server/x_query_assemble_designer/src/main/java/com/x/query/assemble/designer/jaxrs/statement/ActionExecuteV2.java

@@ -37,6 +37,7 @@ class ActionExecuteV2 extends BaseAction {
 
 	private static Logger logger = LoggerFactory.getLogger(ActionExecuteV2.class);
 
+	private final static String[] pageKeys = { "GROUP BY", " COUNT(" };
 	private final static String JOIN_KEY = " JOIN ";
 	private final static String JOIN_ON_KEY = " ON ";
 
@@ -137,8 +138,10 @@ class ActionExecuteV2 extends BaseAction {
 			if(Statement.MODE_COUNT.equals(mode)) {
 				data = query.getSingleResult();
 			}else{
-				query.setFirstResult((runtime.page - 1) * runtime.size);
-				query.setMaxResults(runtime.size);
+				if(isPageSql(jpql)) {
+					query.setFirstResult((runtime.page - 1) * runtime.size);
+					query.setMaxResults(runtime.size);
+				}
 				data = query.getResultList();
 			}
 		} else {
@@ -181,8 +184,10 @@ class ActionExecuteV2 extends BaseAction {
 			if(Statement.MODE_COUNT.equals(mode)) {
 				data = query.getSingleResult();
 			}else{
-				query.setFirstResult((runtime.page - 1) * runtime.size);
-				query.setMaxResults(runtime.size);
+				if(isPageSql(jpql)) {
+					query.setFirstResult((runtime.page - 1) * runtime.size);
+					query.setMaxResults(runtime.size);
+				}
 				data = query.getResultList();
 			}
 		} else {
@@ -193,6 +198,16 @@ class ActionExecuteV2 extends BaseAction {
 		return data;
 	}
 
+	private boolean isPageSql(String sql){
+		sql = sql.toUpperCase().replaceAll("\\s{1,}", " ");
+		for (String key : pageKeys) {
+			if (sql.indexOf(key) > -1) {
+				return false;
+			}
+		}
+		return true;
+	}
+
 	private Class<? extends JpaObject> clazz(Business business, Statement statement) throws Exception {
 		Class<? extends JpaObject> cls = null;
 		if (StringUtils.equals(Statement.ENTITYCATEGORY_OFFICIAL, statement.getEntityCategory())
@@ -252,4 +267,4 @@ class ActionExecuteV2 extends BaseAction {
 
 	}
 
-}
+}

+ 21 - 5
o2server/x_query_assemble_surface/src/main/java/com/x/query/assemble/surface/jaxrs/statement/ActionExecute.java

@@ -36,6 +36,8 @@ import com.x.query.core.express.statement.Runtime;
 
 class ActionExecute extends BaseAction {
 
+	private final static String[] pageKeys = { "GROUP BY", " COUNT(" };
+
 	ActionResult<Object> execute(EffectivePerson effectivePerson, String flag, Integer page, Integer size,
 			JsonElement jsonElement) throws Exception {
 
@@ -119,8 +121,10 @@ class ActionExecute extends BaseAction {
 				}
 			}
 			if (StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)) {
-				query.setFirstResult((runtime.page - 1) * runtime.size);
-				query.setMaxResults(runtime.size);
+				if(isPageSql(text)) {
+					query.setFirstResult((runtime.page - 1) * runtime.size);
+					query.setMaxResults(runtime.size);
+				}
 				data = query.getResultList();
 			} else {
 				business.entityManagerContainer().beginTransaction(cls);
@@ -151,8 +155,10 @@ class ActionExecute extends BaseAction {
 				}
 			}
 			if (StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)) {
-				query.setFirstResult((runtime.page - 1) * runtime.size);
-				query.setMaxResults(runtime.size);
+				if(isPageSql(statement.getData())) {
+					query.setFirstResult((runtime.page - 1) * runtime.size);
+					query.setMaxResults(runtime.size);
+				}
 				data = query.getResultList();
 			} else {
 				business.entityManagerContainer().beginTransaction(cls);
@@ -163,6 +169,16 @@ class ActionExecute extends BaseAction {
 		return data;
 	}
 
+	private boolean isPageSql(String sql){
+		sql = sql.toUpperCase().replaceAll("\\s{1,}", " ");
+		for (String key : pageKeys) {
+			if (sql.indexOf(key) > -1) {
+				return false;
+			}
+		}
+		return true;
+	}
+
 	@SuppressWarnings("unchecked")
 	private Class<? extends JpaObject> clazz(Business business, Statement statement) throws Exception {
 		Class<? extends JpaObject> cls = null;
@@ -210,4 +226,4 @@ class ActionExecute extends BaseAction {
 
 	}
 
-}
+}

+ 20 - 5
o2server/x_query_assemble_surface/src/main/java/com/x/query/assemble/surface/jaxrs/statement/ActionExecuteV2.java

@@ -44,6 +44,7 @@ class ActionExecuteV2 extends BaseAction {
 
 	private static Logger logger = LoggerFactory.getLogger(ActionExecuteV2.class);
 	private final static String[] keys = { "group by", "GROUP BY", "order by", "ORDER BY", "limit", "LIMIT" };
+	private final static String[] pageKeys = { "GROUP BY", " COUNT(" };
 	private final static String JOIN_KEY = " JOIN ";
 	private final static String JOIN_ON_KEY = " ON ";
 
@@ -146,8 +147,10 @@ class ActionExecuteV2 extends BaseAction {
 				if (Statement.MODE_COUNT.equals(mode)) {
 					data = query.getSingleResult();
 				} else {
-					query.setFirstResult((runtime.page - 1) * runtime.size);
-					query.setMaxResults(runtime.size);
+					if(isPageSql(jpql)) {
+						query.setFirstResult((runtime.page - 1) * runtime.size);
+						query.setMaxResults(runtime.size);
+					}
 					data = query.getResultList();
 				}
 			} else {
@@ -194,8 +197,10 @@ class ActionExecuteV2 extends BaseAction {
 				if (Statement.MODE_COUNT.equals(mode)) {
 					data = query.getSingleResult();
 				} else {
-					query.setFirstResult((runtime.page - 1) * runtime.size);
-					query.setMaxResults(runtime.size);
+					if(isPageSql(jpql)) {
+						query.setFirstResult((runtime.page - 1) * runtime.size);
+						query.setMaxResults(runtime.size);
+					}
 					data = query.getResultList();
 				}
 			} else {
@@ -207,6 +212,16 @@ class ActionExecuteV2 extends BaseAction {
 		return data;
 	}
 
+	private boolean isPageSql(String sql){
+		sql = sql.toUpperCase().replaceAll("\\s{1,}", " ");
+		for (String key : pageKeys) {
+			if (sql.indexOf(key) > -1) {
+				return false;
+			}
+		}
+		return true;
+	}
+
 	private Class<? extends JpaObject> clazz(Business business, Statement statement) throws Exception {
 		Class<? extends JpaObject> cls = null;
 		if (StringUtils.equals(Statement.ENTITYCATEGORY_OFFICIAL, statement.getEntityCategory())
@@ -356,4 +371,4 @@ class ActionExecuteV2 extends BaseAction {
 		}
 	}
 
-}
+}

+ 4 - 0
o2server/x_query_service_processing/pom.xml

@@ -44,6 +44,10 @@
 			<groupId>o2oa</groupId>
 			<artifactId>x_cms_core_express</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>o2oa</groupId>
+			<artifactId>x_portal_core_entity</artifactId>
+		</dependency>
 	</dependencies>
 	<build>
 		<plugins>

+ 2 - 0
o2server/x_query_service_processing/src/main/java/com/x/query/service/processing/jaxrs/ActionApplication.java

@@ -5,6 +5,7 @@ import java.util.Set;
 import javax.ws.rs.ApplicationPath;
 
 import com.x.base.core.project.jaxrs.AbstractActionApplication;
+import com.x.query.service.processing.jaxrs.design.DesignAction;
 import com.x.query.service.processing.jaxrs.neural.NeuralAction;
 import com.x.query.service.processing.jaxrs.segment.SegmentAction;
 import com.x.query.service.processing.jaxrs.test.TestAction;
@@ -16,6 +17,7 @@ public class ActionApplication extends AbstractActionApplication {
 		classes.add(TestAction.class);
 		classes.add(NeuralAction.class);
 		classes.add(SegmentAction.class);
+		classes.add(DesignAction.class);
 		return classes;
 	}
 

+ 10 - 0
o2server/x_query_service_processing/src/main/java/com/x/query/service/processing/jaxrs/DesignJaxrsFilter.java

@@ -0,0 +1,10 @@
+package com.x.query.service.processing.jaxrs;
+
+import com.x.base.core.project.jaxrs.CipherManagerUserJaxrsFilter;
+
+import javax.servlet.annotation.WebFilter;
+
+@WebFilter(urlPatterns = "/jaxrs/design/*", asyncSupported = true)
+public class DesignJaxrsFilter extends CipherManagerUserJaxrsFilter {
+
+}

+ 311 - 0
o2server/x_query_service_processing/src/main/java/com/x/query/service/processing/jaxrs/design/ActionSearch.java

@@ -0,0 +1,311 @@
+package com.x.query.service.processing.jaxrs.design;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.project.Applications;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.annotation.FieldTypeDescribe;
+import com.x.base.core.project.gson.GsonPropertyObject;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ListTools;
+import com.x.base.core.project.tools.SortTools;
+import com.x.base.core.project.tools.StringTools;
+import com.x.base.core.project.x_cms_assemble_control;
+import com.x.base.core.project.x_portal_assemble_designer;
+import com.x.base.core.project.x_processplatform_assemble_designer;
+import com.x.query.service.processing.ThisApplication;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.*;
+import java.util.concurrent.CompletableFuture;
+
+class ActionSearch extends BaseAction {
+
+	private static Logger logger = LoggerFactory.getLogger(ActionSearch.class);
+
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, JsonElement jsonElement)
+			throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
+		Wo wo = new Wo();
+		wo.setType(wi.getType());
+		if(StringUtils.isBlank(wi.getKeyword())){
+			throw new ExceptionFieldEmpty("keyword");
+		}
+		if(StringUtils.isBlank(wi.getType())){
+			throw new ExceptionFieldEmpty("type");
+		}
+		logger.print("{}搜索全局设计:{},关键字:{}", effectivePerson.getDistinguishedName(), wi.getType(), wi.getKeyword());
+		switch (wi.getType()) {
+			case "script":
+				wo.setScriptWrapList(searchScript(wi));
+				break;
+			default:
+				throw new ExceptionFieldEmpty("type");
+		}
+		result.setData(wo);
+		return result;
+	}
+
+	private List<ScriptWo> searchScript(final Wi wi) throws Exception{
+		final Map<String, List<String>> moduleMap = new HashMap<>();
+		if(!ListTools.isEmpty(wi.getModuleList())){
+			for (Module module: wi.getModuleList()){
+				if(module.getModuleType().equalsIgnoreCase(ModuleType.cms.toString())){
+					moduleMap.put(ModuleType.cms.toString(), module.getFlagList());
+				}
+				if(module.getModuleType().equalsIgnoreCase(ModuleType.portal.toString())){
+					moduleMap.put(ModuleType.portal.toString(), module.getFlagList());
+				}
+				if(module.getModuleType().equalsIgnoreCase(ModuleType.processPlatform.toString())){
+					moduleMap.put(ModuleType.processPlatform.toString(), module.getFlagList());
+				}
+			}
+		}else{
+			List<String> list = new ArrayList<>();
+			moduleMap.put(ModuleType.cms.toString(), list);
+			moduleMap.put(ModuleType.portal.toString(), list);
+			moduleMap.put(ModuleType.processPlatform.toString(), list);
+		}
+
+		CompletableFuture<List<ScriptWo>> processPlatformCf = scriptSearchAsync(wi, moduleMap, ModuleType.processPlatform.toString(), x_processplatform_assemble_designer.class);
+		CompletableFuture<List<ScriptWo>> portalCf = scriptSearchAsync(wi, moduleMap, ModuleType.portal.toString(), x_portal_assemble_designer.class);
+		CompletableFuture<List<ScriptWo>> cmsCf = scriptSearchAsync(wi, moduleMap, ModuleType.cms.toString(), x_cms_assemble_control.class);
+
+		List<ScriptWo> scriptWoList = new ArrayList<>();
+		scriptWoList.addAll(processPlatformCf.get());
+		scriptWoList.addAll(portalCf.get());
+		scriptWoList.addAll(cmsCf.get());
+
+		return scriptWoList;
+	}
+
+	private CompletableFuture<List<ScriptWo>> scriptSearchAsync(final Wi wi, final Map<String, List<String>> moduleMap, final String moduleType, final Class<?> applicationClass){
+		CompletableFuture<List<ScriptWo>> cf = CompletableFuture.supplyAsync(() -> {
+			List<ScriptWo> swList = new ArrayList<>();
+			if(moduleMap.containsKey(moduleType)) {
+				try {
+					Map<String, Object> map = new HashMap<>();
+					map.put("appIdList", moduleMap.get(moduleType));
+					map.put("keyword", wi.getKeyword());
+					map.put("caseSensitive", wi.getCaseSensitive());
+					map.put("matchWholeWord", wi.getMatchWholeWord());
+					map.put("matchRegExp", wi.getMatchRegExp());
+					List<WrapScript> scriptList = ThisApplication.context().applications().postQuery(applicationClass,
+							Applications.joinQueryUri("script", "list", "manager"), map).getDataAsList(WrapScript.class);
+					logger.print("设计搜索关联{}的匹配脚本个数:{}", moduleType, scriptList.size());
+					getScriptSearchRes(wi, moduleType, swList, scriptList);
+				} catch (Exception e) {
+					logger.error(e);
+				}
+				if (swList.size() > 2) {
+					try {
+						SortTools.desc(swList, "appId");
+					} catch (Exception e) {
+					}
+				}
+			}
+			return swList;
+		});
+		return cf;
+	}
+
+	private void getScriptSearchRes(final Wi wi, String moduleType, List<ScriptWo> swList, List<WrapScript> scriptList){
+		if (!ListTools.isEmpty(scriptList)){
+			for (WrapScript script:scriptList) {
+				if (StringTools.matchKeyword(wi.getKeyword(), script.getText(), wi.getCaseSensitive(), wi.getMatchWholeWord(), wi.getMatchRegExp())){
+					List<Integer> list = patternLines(script.getId()+"-"+script.getUpdateTime().getTime(),
+							wi.getKeyword(), script.getText(), wi.getCaseSensitive(), wi.getMatchWholeWord(), wi.getMatchRegExp());
+					if (!ListTools.isEmpty(list)){
+						ScriptWo scriptWo = new ScriptWo();
+						scriptWo.setModuleType(moduleType);
+						scriptWo.setAppId(script.getAppId());
+						scriptWo.setAppName(script.getAppName());
+						scriptWo.setScriptId(script.getId());
+						scriptWo.setScriptName(script.getName());
+						scriptWo.setPatternLines(list);
+						swList.add(scriptWo);
+					}
+				}
+			}
+		}
+	}
+
+	public static class Wi extends GsonPropertyObject {
+		private static final long serialVersionUID = 4015406081411685640L;
+
+		@FieldDescribe("搜索关键字.")
+		private String keyword;
+		@FieldDescribe("搜索类型:script|form|process")
+		private String type;
+		@FieldDescribe("是否区分大小写.")
+		private Boolean caseSensitive;
+		@FieldDescribe("是否全字匹配.")
+		private Boolean matchWholeWord;
+		@FieldDescribe("是否正则表达式匹配.")
+		private Boolean matchRegExp;
+		@FieldDescribe("限制查询的模块列表.")
+		@FieldTypeDescribe(fieldType = "class", fieldTypeName = "Module", fieldValue = "{\"moduleType\": \"cms\", \"flagList\": []}")
+		private List<Module> moduleList;
+
+		public String getKeyword() {
+			return keyword;
+		}
+
+		public void setKeyword(String keyword) {
+			this.keyword = keyword;
+		}
+
+		public String getType() {
+			return type;
+		}
+
+		public void setType(String type) {
+			this.type = type;
+		}
+
+		public Boolean getCaseSensitive() {
+			return caseSensitive;
+		}
+
+		public void setCaseSensitive(Boolean caseSensitive) {
+			this.caseSensitive = caseSensitive;
+		}
+
+		public Boolean getMatchWholeWord() {
+			return matchWholeWord;
+		}
+
+		public void setMatchWholeWord(Boolean matchWholeWord) {
+			this.matchWholeWord = matchWholeWord;
+		}
+
+		public Boolean getMatchRegExp() {
+			return matchRegExp;
+		}
+
+		public void setMatchRegExp(Boolean matchRegExp) {
+			this.matchRegExp = matchRegExp;
+		}
+
+		public List<Module> getModuleList() {
+			return moduleList;
+		}
+
+		public void setModuleList(List<Module> moduleList) {
+			this.moduleList = moduleList;
+		}
+	}
+
+	public static class Module extends GsonPropertyObject {
+		@FieldDescribe("模块的应用id列表.")
+		private List<String> flagList;
+		@FieldDescribe("模块类型:processPlatform|cms|portal|query|service")
+		private String moduleType;
+
+		public List<String> getFlagList() {
+			return flagList == null ? new ArrayList<>() : flagList;
+		}
+
+		public void setFlagList(List<String> flagList) {
+			this.flagList = flagList;
+		}
+
+		public String getModuleType() {
+			return moduleType;
+		}
+
+		public void setModuleType(String moduleType) {
+			this.moduleType = moduleType;
+		}
+	}
+
+	public static class Wo extends GsonPropertyObject {
+		@FieldDescribe("搜索类型:script|form|process")
+		private String type;
+		@FieldDescribe("脚本搜索结果集")
+		private List<ScriptWo> scriptWrapList = new ArrayList<>();
+
+		public String getType() {
+			return type;
+		}
+
+		public void setType(String type) {
+			this.type = type;
+		}
+
+		public List<ScriptWo> getScriptWrapList() {
+			return scriptWrapList;
+		}
+
+		public void setScriptWrapList(List<ScriptWo> scriptWrapList) {
+			this.scriptWrapList = scriptWrapList;
+		}
+	}
+
+	public static class ScriptWo extends GsonPropertyObject {
+		@FieldDescribe("模块类型:processPlatform|cms|portal|query|service")
+		private String moduleType;
+		@FieldDescribe("应用ID")
+		private String appId;
+		@FieldDescribe("应用名称")
+		private String appName;
+		@FieldDescribe("脚本Id")
+		private String scriptId;
+		@FieldDescribe("脚本名称")
+		private String scriptName;
+		@FieldDescribe("匹配行")
+		private List<Integer> patternLines;
+
+		public String getModuleType() {
+			return moduleType;
+		}
+
+		public void setModuleType(String moduleType) {
+			this.moduleType = moduleType;
+		}
+
+		public String getAppId() {
+			return appId;
+		}
+
+		public void setAppId(String appId) {
+			this.appId = appId;
+		}
+
+		public String getAppName() {
+			return appName;
+		}
+
+		public void setAppName(String appName) {
+			this.appName = appName;
+		}
+
+		public String getScriptId() {
+			return scriptId;
+		}
+
+		public void setScriptId(String scriptId) {
+			this.scriptId = scriptId;
+		}
+
+		public String getScriptName() {
+			return scriptName;
+		}
+
+		public void setScriptName(String scriptName) {
+			this.scriptName = scriptName;
+		}
+
+		public List<Integer> getPatternLines() {
+			return patternLines;
+		}
+
+		public void setPatternLines(List<Integer> patternLines) {
+			this.patternLines = patternLines;
+		}
+	}
+
+}

+ 59 - 0
o2server/x_query_service_processing/src/main/java/com/x/query/service/processing/jaxrs/design/BaseAction.java

@@ -0,0 +1,59 @@
+package com.x.query.service.processing.jaxrs.design;
+
+import com.x.base.core.project.config.Config;
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.base.core.project.tools.DefaultCharset;
+import com.x.base.core.project.tools.FileTools;
+import com.x.base.core.project.tools.StringTools;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.File;
+import java.io.RandomAccessFile;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+abstract class BaseAction extends StandardJaxrsAction {
+
+    protected List<Integer> patternLines(String id, String keyword, String content, Boolean caseSensitive, Boolean matchWholeWord, Boolean matchRegExp){
+        List<Integer> list = new ArrayList<>();
+        File file = readFile(id, content);
+        if (file!=null){
+            try (RandomAccessFile randomFile = new RandomAccessFile(file, "r")) {
+                int curReadLine = 0;
+                String tmp = "";
+                while ((tmp = randomFile.readLine()) != null) {
+                    curReadLine++;
+                    byte[] bytes = tmp.getBytes("ISO8859-1");
+                    String lineStr = new String(bytes);
+                    if(StringUtils.isNotBlank(lineStr) && lineStr.length()>=keyword.length()){
+                        if(StringTools.matchKeyword(keyword, lineStr, caseSensitive, matchWholeWord, matchRegExp)){
+                            list.add(curReadLine);
+                        }
+                    }
+                }
+            }catch (Exception e){
+                e.printStackTrace();
+            }
+        }
+        return list;
+    }
+
+    private synchronized File readFile(String id, String content){
+        try {
+            File searchFile = new File(Config.base(), "local/search");
+            FileTools.forceMkdir(searchFile);
+            File file = new File(searchFile.getAbsolutePath(), id+".txt");
+            if (!file.exists()){
+                FileUtils.writeByteArrayToFile(file, content.getBytes(DefaultCharset.name));
+            }
+            return file;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}

+ 45 - 0
o2server/x_query_service_processing/src/main/java/com/x/query/service/processing/jaxrs/design/DesignAction.java

@@ -0,0 +1,45 @@
+package com.x.query.service.processing.jaxrs.design;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.project.annotation.JaxrsDescribe;
+import com.x.base.core.project.annotation.JaxrsMethodDescribe;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.http.HttpMediaType;
+import com.x.base.core.project.jaxrs.ResponseFactory;
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.*;
+import javax.ws.rs.container.AsyncResponse;
+import javax.ws.rs.container.Suspended;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+
+@Path("design")
+@JaxrsDescribe("设计")
+public class DesignAction extends StandardJaxrsAction {
+
+	private static Logger logger = LoggerFactory.getLogger(DesignAction.class);
+
+	@JaxrsMethodDescribe(value = "全局设计搜索.", action = ActionSearch.class)
+	@POST
+	@Path("search")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void search(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+					   JsonElement jsonElement) {
+		ActionResult<ActionSearch.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionSearch().execute(effectivePerson, jsonElement);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+}

+ 14 - 0
o2server/x_query_service_processing/src/main/java/com/x/query/service/processing/jaxrs/design/ExceptionFieldEmpty.java

@@ -0,0 +1,14 @@
+package com.x.query.service.processing.jaxrs.design;
+
+import com.x.base.core.project.exception.PromptException;
+
+public class ExceptionFieldEmpty extends PromptException {
+
+
+	private static final long serialVersionUID = -87643358931771164L;
+
+	public ExceptionFieldEmpty(String field) {
+		super("参数: {} 值无效.", field);
+	}
+
+}

+ 12 - 0
o2server/x_query_service_processing/src/main/java/com/x/query/service/processing/jaxrs/design/ModuleType.java

@@ -0,0 +1,12 @@
+package com.x.query.service.processing.jaxrs.design;
+
+import com.x.base.core.entity.JpaObject;
+
+/**
+ *
+ */
+public enum ModuleType {
+
+	processPlatform, portal, cms;
+	public static final int length = JpaObject.length_64B;
+}

+ 109 - 0
o2server/x_query_service_processing/src/main/java/com/x/query/service/processing/jaxrs/design/WrapScript.java

@@ -0,0 +1,109 @@
+package com.x.query.service.processing.jaxrs.design;
+
+import com.x.base.core.project.gson.GsonPropertyObject;
+
+import java.util.Date;
+
+public class WrapScript extends GsonPropertyObject {
+    private static final long serialVersionUID = 2563902286060447795L;
+
+    private String id;
+    private String name;
+    private String alias;
+    private String text;
+    private String appName;
+    private String appId;
+    private String portalName;
+    private String portal;
+    private String applicationName;
+    private String application;
+    private Date updateTime;
+
+    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 getAlias() {
+        return alias;
+    }
+
+    public void setAlias(String alias) {
+        this.alias = alias;
+    }
+
+    public String getText() {
+        return text;
+    }
+
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    public String getAppName() {
+        return appName;
+    }
+
+    public void setAppName(String appName) {
+        this.appName = appName;
+    }
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
+
+    public String getPortalName() {
+        return portalName;
+    }
+
+    public void setPortalName(String portalName) {
+        this.portalName = portalName;
+    }
+
+    public String getPortal() {
+        return portal;
+    }
+
+    public void setPortal(String portal) {
+        this.portal = portal;
+    }
+
+    public String getApplicationName() {
+        return applicationName;
+    }
+
+    public void setApplicationName(String applicationName) {
+        this.applicationName = applicationName;
+    }
+
+    public String getApplication() {
+        return application;
+    }
+
+    public void setApplication(String application) {
+        this.application = application;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+}

+ 1 - 1
o2web/source/x_component_Selector/Application.js

@@ -15,7 +15,7 @@ MWF.xApplication.Selector.Application = new Class({
         this.className = "Application"
     },
     loadSelectItems: function(addToNext){
-        this.processAction.listApplications(function(json){
+        o2.Actions.load("x_processplatform_assemble_designer").ApplicationAction.list(function(json){
             json.data.each(function(data){
                 var category = this._newItem(data, this, this.itemAreaNode);
                 this.items.push( category );

+ 21 - 3
o2web/source/x_component_Selector/Person.js

@@ -1462,7 +1462,7 @@ MWF.xApplication.Selector.Person = new Class({
             if(this.items.length === 1 || this.subItems.length === 1 ){
                 if( this.items.length === 1 && this.subItems.length === 0 ){
                     if( !this.items[0].isSelected )this.items[0].clickItem();
-                    this.fireEvent("afterSelectSingleItem",[this, this.items[0]])
+                    this.fireEvent("afterSelectSingleItem",[this, this.items[0]]);
                 }else if( this.items.length === 0 && this.subItems.length === 1 ){
                     if( !this.items[0].isSelected )this.subItems[0].clickItem();
                     this.fireEvent("afterSelectSingleItem",[this, this.items[0]])
@@ -1470,20 +1470,31 @@ MWF.xApplication.Selector.Person = new Class({
                     if( this.items[0] === this.subItems[0] ){
                         if( !this.items[0].isSelected )this.items[0].clickItem();
                         this.fireEvent("afterSelectSingleItem",[this, this.items[0]])
+                    }else{
+                        _self.fireEvent("afterCheckSelectSingleItem",[_self])
                     }
+                }else{
+                    _self.fireEvent("afterCheckSelectSingleItem",[_self])
                 }
+            }else{
+                _self.fireEvent("afterCheckSelectSingleItem",[_self])
             }
         }.bind(this);
 
         var checkCategoryItem = function (category) {
             if( !category.subCategorys || category.subCategorys.length === 0 ){
                 if( category.subItems && category.subItems.length === 1 ){
+                    isSingleItem = true;
                     if( !category.subItems[0].isSelected )category.subItems[0].clickItem();
                     _self.fireEvent("afterSelectSingleItem",[_self, category.subItems[0]])
+                }else{
+                    _self.fireEvent("afterCheckSelectSingleItem",[_self])
                 }
             }else if(category.subCategorys.length === 1){
                 if( category.subItems && category.subItems.length > 0 ){
+                    _self.fireEvent("afterCheckSelectSingleItem",[_self])
                 }else if( !category.subCategorys[0]._hasChild || !category.subCategorys[0]._hasChild() ){ //category.subCategorys[0].isItem &&
+                    isSingleItem = true;
                     if( !category.subItems[0].isSelected )category.subItems[0].clickItem();
                     _self.fireEvent("afterSelectSingleItem",[_self, category.subItems[0]])
                 }else{
@@ -1503,9 +1514,14 @@ MWF.xApplication.Selector.Person = new Class({
                 }
                 if( list.length === 0 ){
                     if( category.subItems && category.subItems.length === 1 ){
+                        isSingleItem = true;
                         if( !category.subItems[0].isSelected )category.subItems[0].clickItem();
                         _self.fireEvent("afterSelectSingleItem",[_self, category.subItems[0]])
+                    }else{
+                        _self.fireEvent("afterCheckSelectSingleItem",[_self])
                     }
+                }else{
+                    _self.fireEvent("afterCheckSelectSingleItem",[_self])
                 }
             }
         };
@@ -1521,10 +1537,12 @@ MWF.xApplication.Selector.Person = new Class({
             }
         };
 
-        if( this.subCategorys.length === 1 ) {
+        if( this.subCategorys.length === 1 && this.subItems.length === 0) {
             checkCategory( this.subCategorys[0] );
         }else if( this.subCategorys.length === 0 ){
             checkItem();
+        }else{
+            _self.fireEvent("afterCheckSelectSingleItem",[_self])
         }
     },
     setSize : function(){
@@ -2034,7 +2052,7 @@ MWF.xApplication.Selector.Person.Item = new Class({
         this.selector.fireEvent("unselectItem",[this]);
         if( checkValid )this.selector.fireEvent("valid", [this.selector, this]);
     },
-    selected: function( checkValid, callback, selectedNode, byelectAll ){
+    selected: function( checkValid, callback, selectedNode, bySelectAll ){
         debugger;
         var count = this.selector.options.maxCount || this.selector.options.count;
         count = count.toInt();

+ 92 - 12
o2web/source/x_component_process_FormDesigner/Module/Form/template/form.json

@@ -31,22 +31,10 @@
           "code": "",
           "html": ""
         },
-        "beforeModulesLoad":{
-          "code": "",
-          "html": ""
-        },
         "postLoad": {
           "code": "",
           "html": ""
         },
-        "load": {
-          "code": "",
-          "html": ""
-        },
-        "afterModulesLoad":{
-          "code": "",
-          "html": ""
-        },
         "afterLoad": {
           "code": "",
           "html": ""
@@ -107,10 +95,22 @@
           "code": "",
           "html": ""
         },
+        "beforeModulesLoad":{
+          "code": "",
+          "html": ""
+        },
+        "afterModulesLoad":{
+          "code": "",
+          "html": ""
+        },
         "help": {
           "code": "",
           "html": ""
         },
+        "load": {
+          "code": "",
+          "html": ""
+        },
         "unload": {
           "code": "",
           "html": ""
@@ -203,6 +203,86 @@
         "html": ""
       },
       "events": {
+        "queryLoad" : {
+          "code": "",
+          "html": ""
+        },
+        "beforeLoad" : {
+          "code": "",
+          "html": ""
+        },
+        "postLoad": {
+          "code": "",
+          "html": ""
+        },
+        "afterLoad": {
+          "code": "",
+          "html": ""
+        },
+        "beforeSave": {
+          "code": "",
+          "html": ""
+        },
+        "afterSave": {
+          "code": "",
+          "html": ""
+        },
+        "beforeClose": {
+          "code": "",
+          "html": ""
+        },
+        "beforeProcess": {
+          "code": "",
+          "html": ""
+        },
+        "beforeProcessWork": {
+          "code": "",
+          "html": ""
+        },
+        "afterProcess": {
+          "code": "",
+          "html": ""
+        },
+        "beforeReset":{
+          "code": "",
+          "html": ""
+        },
+        "afterReset":{
+          "code": "",
+          "html": ""
+        },
+        "beforeRetract":{
+          "code": "",
+          "html": ""
+        },
+        "afterRetract":{
+          "code": "",
+          "html": ""
+        },
+        "beforeReroute":{
+          "code": "",
+          "html": ""
+        },
+        "afterReroute":{
+          "code": "",
+          "html": ""
+        },
+        "beforeDelete":{
+          "code": "",
+          "html": ""
+        },
+        "afterDelete":{
+          "code": "",
+          "html": ""
+        },
+        "beforeModulesLoad":{
+          "code": "",
+          "html": ""
+        },
+        "afterModulesLoad":{
+          "code": "",
+          "html": ""
+        },
         "help": {
           "code": "",
           "html": ""

+ 134 - 0
o2web/source/x_component_process_FormDesigner/Module/Form/template/form_classical.json

@@ -21,6 +21,14 @@
         "html": ""
       },
       "events": {
+        "queryLoad" : {
+          "code": "",
+          "html": ""
+        },
+        "beforeLoad" : {
+          "code": "",
+          "html": ""
+        },
         "postLoad": {
           "code": "",
           "html": ""
@@ -45,10 +53,54 @@
           "code": "",
           "html": ""
         },
+        "beforeProcessWork": {
+          "code": "",
+          "html": ""
+        },
         "afterProcess": {
           "code": "",
           "html": ""
         },
+        "beforeReset":{
+          "code": "",
+          "html": ""
+        },
+        "afterReset":{
+          "code": "",
+          "html": ""
+        },
+        "beforeRetract":{
+          "code": "",
+          "html": ""
+        },
+        "afterRetract":{
+          "code": "",
+          "html": ""
+        },
+        "beforeReroute":{
+          "code": "",
+          "html": ""
+        },
+        "afterReroute":{
+          "code": "",
+          "html": ""
+        },
+        "beforeDelete":{
+          "code": "",
+          "html": ""
+        },
+        "afterDelete":{
+          "code": "",
+          "html": ""
+        },
+        "beforeModulesLoad":{
+          "code": "",
+          "html": ""
+        },
+        "afterModulesLoad":{
+          "code": "",
+          "html": ""
+        },
         "help": {
           "code": "",
           "html": ""
@@ -81,6 +133,7 @@
           "code": "",
           "html": ""
         },
+
         "mousedown": {
           "code": "",
           "html": ""
@@ -117,6 +170,7 @@
           "code": "",
           "html": ""
         }
+
       },
       "moduleList": {
         "div": {
@@ -3407,6 +3461,86 @@
         "html": ""
       },
       "events": {
+        "queryLoad" : {
+          "code": "",
+          "html": ""
+        },
+        "beforeLoad" : {
+          "code": "",
+          "html": ""
+        },
+        "postLoad": {
+          "code": "",
+          "html": ""
+        },
+        "afterLoad": {
+          "code": "",
+          "html": ""
+        },
+        "beforeSave": {
+          "code": "",
+          "html": ""
+        },
+        "afterSave": {
+          "code": "",
+          "html": ""
+        },
+        "beforeClose": {
+          "code": "",
+          "html": ""
+        },
+        "beforeProcess": {
+          "code": "",
+          "html": ""
+        },
+        "beforeProcessWork": {
+          "code": "",
+          "html": ""
+        },
+        "afterProcess": {
+          "code": "",
+          "html": ""
+        },
+        "beforeReset":{
+          "code": "",
+          "html": ""
+        },
+        "afterReset":{
+          "code": "",
+          "html": ""
+        },
+        "beforeRetract":{
+          "code": "",
+          "html": ""
+        },
+        "afterRetract":{
+          "code": "",
+          "html": ""
+        },
+        "beforeReroute":{
+          "code": "",
+          "html": ""
+        },
+        "afterReroute":{
+          "code": "",
+          "html": ""
+        },
+        "beforeDelete":{
+          "code": "",
+          "html": ""
+        },
+        "afterDelete":{
+          "code": "",
+          "html": ""
+        },
+        "beforeModulesLoad":{
+          "code": "",
+          "html": ""
+        },
+        "afterModulesLoad":{
+          "code": "",
+          "html": ""
+        },
         "help": {
           "code": "",
           "html": ""

Файловите разлики са ограничени, защото са твърде много
+ 612 - 1335
o2web/source/x_component_process_FormDesigner/Module/Form/template/form_cms_publish.json


Файловите разлики са ограничени, защото са твърде много
+ 260 - 1067
o2web/source/x_component_process_FormDesigner/Module/Form/template/form_common.json


Файловите разлики са ограничени, защото са твърде много
+ 427 - 2286
o2web/source/x_component_process_FormDesigner/Module/Form/template/form_file.json


+ 106 - 0
o2web/source/x_component_process_FormDesigner/Module/Form/template/form_mobile.json

@@ -22,6 +22,14 @@
         "html": ""
       },
       "events": {
+        "queryLoad" : {
+          "code": "",
+          "html": ""
+        },
+        "beforeLoad" : {
+          "code": "",
+          "html": ""
+        },
         "postLoad": {
           "code": "",
           "html": ""
@@ -46,10 +54,54 @@
           "code": "",
           "html": ""
         },
+        "beforeProcessWork": {
+          "code": "",
+          "html": ""
+        },
         "afterProcess": {
           "code": "",
           "html": ""
         },
+        "beforeReset":{
+          "code": "",
+          "html": ""
+        },
+        "afterReset":{
+          "code": "",
+          "html": ""
+        },
+        "beforeRetract":{
+          "code": "",
+          "html": ""
+        },
+        "afterRetract":{
+          "code": "",
+          "html": ""
+        },
+        "beforeReroute":{
+          "code": "",
+          "html": ""
+        },
+        "afterReroute":{
+          "code": "",
+          "html": ""
+        },
+        "beforeDelete":{
+          "code": "",
+          "html": ""
+        },
+        "afterDelete":{
+          "code": "",
+          "html": ""
+        },
+        "beforeModulesLoad":{
+          "code": "",
+          "html": ""
+        },
+        "afterModulesLoad":{
+          "code": "",
+          "html": ""
+        },
         "help": {
           "code": "",
           "html": ""
@@ -149,6 +201,14 @@
         "html": ""
       },
       "events": {
+        "queryLoad" : {
+          "code": "",
+          "html": ""
+        },
+        "beforeLoad" : {
+          "code": "",
+          "html": ""
+        },
         "postLoad": {
           "code": "",
           "html": ""
@@ -173,10 +233,54 @@
           "code": "",
           "html": ""
         },
+        "beforeProcessWork": {
+          "code": "",
+          "html": ""
+        },
         "afterProcess": {
           "code": "",
           "html": ""
         },
+        "beforeReset":{
+          "code": "",
+          "html": ""
+        },
+        "afterReset":{
+          "code": "",
+          "html": ""
+        },
+        "beforeRetract":{
+          "code": "",
+          "html": ""
+        },
+        "afterRetract":{
+          "code": "",
+          "html": ""
+        },
+        "beforeReroute":{
+          "code": "",
+          "html": ""
+        },
+        "afterReroute":{
+          "code": "",
+          "html": ""
+        },
+        "beforeDelete":{
+          "code": "",
+          "html": ""
+        },
+        "afterDelete":{
+          "code": "",
+          "html": ""
+        },
+        "beforeModulesLoad":{
+          "code": "",
+          "html": ""
+        },
+        "afterModulesLoad":{
+          "code": "",
+          "html": ""
+        },
         "help": {
           "code": "",
           "html": ""
@@ -209,6 +313,7 @@
           "code": "",
           "html": ""
         },
+
         "mousedown": {
           "code": "",
           "html": ""
@@ -245,6 +350,7 @@
           "code": "",
           "html": ""
         }
+
       },
       "moduleList": {
         "div": {

Файловите разлики са ограничени, защото са твърде много
+ 362 - 1054
o2web/source/x_component_process_FormDesigner/Module/Form/template/form_project.json


+ 108 - 0
o2web/source/x_component_process_FormDesigner/Module/Form/template/form_project2.json

@@ -23,6 +23,14 @@
         "html": ""
       },
       "events": {
+        "queryLoad" : {
+          "code": "",
+          "html": ""
+        },
+        "beforeLoad" : {
+          "code": "",
+          "html": ""
+        },
         "postLoad": {
           "code": "",
           "html": ""
@@ -47,10 +55,54 @@
           "code": "",
           "html": ""
         },
+        "beforeProcessWork": {
+          "code": "",
+          "html": ""
+        },
         "afterProcess": {
           "code": "",
           "html": ""
         },
+        "beforeReset":{
+          "code": "",
+          "html": ""
+        },
+        "afterReset":{
+          "code": "",
+          "html": ""
+        },
+        "beforeRetract":{
+          "code": "",
+          "html": ""
+        },
+        "afterRetract":{
+          "code": "",
+          "html": ""
+        },
+        "beforeReroute":{
+          "code": "",
+          "html": ""
+        },
+        "afterReroute":{
+          "code": "",
+          "html": ""
+        },
+        "beforeDelete":{
+          "code": "",
+          "html": ""
+        },
+        "afterDelete":{
+          "code": "",
+          "html": ""
+        },
+        "beforeModulesLoad":{
+          "code": "",
+          "html": ""
+        },
+        "afterModulesLoad":{
+          "code": "",
+          "html": ""
+        },
         "help": {
           "code": "",
           "html": ""
@@ -83,6 +135,7 @@
           "code": "",
           "html": ""
         },
+
         "mousedown": {
           "code": "",
           "html": ""
@@ -119,6 +172,7 @@
           "code": "",
           "html": ""
         }
+
       },
       "moduleList": {
         "div": {
@@ -3871,6 +3925,14 @@
         "html": ""
       },
       "events": {
+        "queryLoad" : {
+          "code": "",
+          "html": ""
+        },
+        "beforeLoad" : {
+          "code": "",
+          "html": ""
+        },
         "postLoad": {
           "code": "",
           "html": ""
@@ -3895,10 +3957,54 @@
           "code": "",
           "html": ""
         },
+        "beforeProcessWork": {
+          "code": "",
+          "html": ""
+        },
         "afterProcess": {
           "code": "",
           "html": ""
         },
+        "beforeReset":{
+          "code": "",
+          "html": ""
+        },
+        "afterReset":{
+          "code": "",
+          "html": ""
+        },
+        "beforeRetract":{
+          "code": "",
+          "html": ""
+        },
+        "afterRetract":{
+          "code": "",
+          "html": ""
+        },
+        "beforeReroute":{
+          "code": "",
+          "html": ""
+        },
+        "afterReroute":{
+          "code": "",
+          "html": ""
+        },
+        "beforeDelete":{
+          "code": "",
+          "html": ""
+        },
+        "afterDelete":{
+          "code": "",
+          "html": ""
+        },
+        "beforeModulesLoad":{
+          "code": "",
+          "html": ""
+        },
+        "afterModulesLoad":{
+          "code": "",
+          "html": ""
+        },
         "help": {
           "code": "",
           "html": ""
@@ -3931,6 +4037,7 @@
           "code": "",
           "html": ""
         },
+
         "mousedown": {
           "code": "",
           "html": ""
@@ -3967,6 +4074,7 @@
           "code": "",
           "html": ""
         }
+
       },
       "moduleList": {
         "div": {

+ 108 - 0
o2web/source/x_component_process_FormDesigner/Module/Form/template/form_reimbursement.json

@@ -19,6 +19,14 @@
         "html": ""
       },
       "events": {
+        "queryLoad" : {
+          "code": "",
+          "html": ""
+        },
+        "beforeLoad" : {
+          "code": "",
+          "html": ""
+        },
         "postLoad": {
           "code": "",
           "html": ""
@@ -43,10 +51,54 @@
           "code": "",
           "html": ""
         },
+        "beforeProcessWork": {
+          "code": "",
+          "html": ""
+        },
         "afterProcess": {
           "code": "",
           "html": ""
         },
+        "beforeReset":{
+          "code": "",
+          "html": ""
+        },
+        "afterReset":{
+          "code": "",
+          "html": ""
+        },
+        "beforeRetract":{
+          "code": "",
+          "html": ""
+        },
+        "afterRetract":{
+          "code": "",
+          "html": ""
+        },
+        "beforeReroute":{
+          "code": "",
+          "html": ""
+        },
+        "afterReroute":{
+          "code": "",
+          "html": ""
+        },
+        "beforeDelete":{
+          "code": "",
+          "html": ""
+        },
+        "afterDelete":{
+          "code": "",
+          "html": ""
+        },
+        "beforeModulesLoad":{
+          "code": "",
+          "html": ""
+        },
+        "afterModulesLoad":{
+          "code": "",
+          "html": ""
+        },
         "help": {
           "code": "",
           "html": ""
@@ -79,6 +131,7 @@
           "code": "",
           "html": ""
         },
+
         "mousedown": {
           "code": "",
           "html": ""
@@ -115,6 +168,7 @@
           "code": "",
           "html": ""
         }
+
       },
       "moduleList": {
         "div": {
@@ -7354,6 +7408,14 @@
         "html": ""
       },
       "events": {
+        "queryLoad" : {
+          "code": "",
+          "html": ""
+        },
+        "beforeLoad" : {
+          "code": "",
+          "html": ""
+        },
         "postLoad": {
           "code": "",
           "html": ""
@@ -7378,10 +7440,54 @@
           "code": "",
           "html": ""
         },
+        "beforeProcessWork": {
+          "code": "",
+          "html": ""
+        },
         "afterProcess": {
           "code": "",
           "html": ""
         },
+        "beforeReset":{
+          "code": "",
+          "html": ""
+        },
+        "afterReset":{
+          "code": "",
+          "html": ""
+        },
+        "beforeRetract":{
+          "code": "",
+          "html": ""
+        },
+        "afterRetract":{
+          "code": "",
+          "html": ""
+        },
+        "beforeReroute":{
+          "code": "",
+          "html": ""
+        },
+        "afterReroute":{
+          "code": "",
+          "html": ""
+        },
+        "beforeDelete":{
+          "code": "",
+          "html": ""
+        },
+        "afterDelete":{
+          "code": "",
+          "html": ""
+        },
+        "beforeModulesLoad":{
+          "code": "",
+          "html": ""
+        },
+        "afterModulesLoad":{
+          "code": "",
+          "html": ""
+        },
         "help": {
           "code": "",
           "html": ""
@@ -7414,6 +7520,7 @@
           "code": "",
           "html": ""
         },
+
         "mousedown": {
           "code": "",
           "html": ""
@@ -7450,6 +7557,7 @@
           "code": "",
           "html": ""
         }
+
       },
       "moduleList": {
         "div": {

Файловите разлики са ограничени, защото са твърде много
+ 358 - 1052
o2web/source/x_component_process_FormDesigner/Module/Form/template/form_tab.json


Файловите разлики са ограничени, защото са твърде много
+ 363 - 1056
o2web/source/x_component_process_FormDesigner/Module/Form/template/form_tab_red.json


+ 2 - 1
o2web/source/x_desktop/js/cmsDocMobile.js

@@ -32,7 +32,7 @@ o2.addReady(function () {
                         //var preview = window.frameElement.retrieve("preview");
                         //layout.desktop = window.frameElement.ownerDocument.window.layout.desktop;
                         //
-                        this.node = $("layout");
+                        this.node = $("appContent")||$("layout");
                         this.content = $(document.body);
                         this.path = "../x_component_cms_Document/$Main/";
                         this.cssPath = "../x_component_cms_Document/$Main/default/css.wcss";
@@ -279,6 +279,7 @@ o2.addReady(function () {
                 layout.openDocument = function () {
                     if (this.form) {
                         MWF.xDesktop.requireApp("cms.Xform", "Form", function () {
+
                             this.appForm = new MWF.CMSForm(this.node, this.form, {
                                 "readonly": this.readonly,
                                 "autoSave": !this.readonly,

Някои файлове не бяха показани, защото твърде много файлове са промени