Zhou Rui 5 лет назад
Родитель
Сommit
b4b4d09167
100 измененных файлов с 20682 добавлено и 57 удалено
  1. 5 1
      .gitignore
  2. 0 28
      o2server/.gitignore
  3. 0 22
      o2server/.gitlab-ci.yml
  4. 2 0
      o2server/.settings/org.eclipse.core.resources.prefs
  5. 4 0
      o2server/.settings/org.eclipse.m2e.core.prefs
  6. 10 0
      o2server/configSample/appStyle.json
  7. 29 0
      o2server/configSample/centerServer.json
  8. 22 0
      o2server/configSample/collect.json
  9. 17 0
      o2server/configSample/communicate.json
  10. 32 0
      o2server/configSample/dingding.json
  11. 10 0
      o2server/configSample/dumpRestoreData.json
  12. 13 0
      o2server/configSample/dumpRestoreStorage.json
  13. 20 0
      o2server/configSample/exmail.json
  14. 68 0
      o2server/configSample/logLevel.json
  15. 17 0
      o2server/configSample/meeting.json
  16. 177 0
      o2server/configSample/messages.json
  17. 189 0
      o2server/configSample/node_127.0.0.1.json
  18. 36 0
      o2server/configSample/person.json
  19. 93 0
      o2server/configSample/processPlatform.json
  20. 30 0
      o2server/configSample/qiyeweixin.json
  21. 55 0
      o2server/configSample/query.json
  22. 85 0
      o2server/configSample/token.json
  23. 8 0
      o2server/configSample/vfs.json
  24. 19 0
      o2server/configSample/workTime.json
  25. 33 0
      o2server/configSample/zhengwuDingding.json
  26. 1 0
      o2server/localSample/node.cfg
  27. 0 1
      o2server/pom.xml
  28. BIN
      o2server/store/jars/x_attendance_core_entity.jar
  29. BIN
      o2server/store/jars/x_base_core_project.jar
  30. BIN
      o2server/store/jars/x_bbs_core_entity.jar
  31. BIN
      o2server/store/jars/x_calendar_core_entity.jar
  32. BIN
      o2server/store/jars/x_cms_core_entity.jar
  33. BIN
      o2server/store/jars/x_cms_core_express.jar
  34. BIN
      o2server/store/jars/x_component_core_entity.jar
  35. BIN
      o2server/store/jars/x_file_core_entity.jar
  36. BIN
      o2server/store/jars/x_general_core_entity.jar
  37. BIN
      o2server/store/jars/x_hotpic_core_entity.jar
  38. BIN
      o2server/store/jars/x_meeting_core_entity.jar
  39. BIN
      o2server/store/jars/x_message_core_entity.jar
  40. BIN
      o2server/store/jars/x_mind_core_entity.jar
  41. BIN
      o2server/store/jars/x_okr_core_entity.jar
  42. BIN
      o2server/store/jars/x_organization_core_entity.jar
  43. BIN
      o2server/store/jars/x_organization_core_express.jar
  44. BIN
      o2server/store/jars/x_portal_core_entity.jar
  45. BIN
      o2server/store/jars/x_processplatform_core_entity.jar
  46. BIN
      o2server/store/jars/x_processplatform_core_express.jar
  47. BIN
      o2server/store/jars/x_program_center_core_entity.jar
  48. BIN
      o2server/store/jars/x_query_core_entity.jar
  49. BIN
      o2server/store/jars/x_query_core_express.jar
  50. BIN
      o2server/store/jars/x_teamwork_core_entity.jar
  51. 28 0
      o2server/store/manifest.cfg
  52. 1 1
      o2server/version.o2
  53. 1 4
      o2server/x_attendance_assemble_control/.gitignore
  54. 6 0
      o2server/x_attendance_assemble_control/.settings/org.eclipse.core.resources.prefs
  55. 8 0
      o2server/x_attendance_assemble_control/.settings/org.eclipse.jdt.core.prefs
  56. 4 0
      o2server/x_attendance_assemble_control/.settings/org.eclipse.m2e.core.prefs
  57. 743 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/api.json
  58. 11788 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/describe.json
  59. 776 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/common/date/DateOperation.java
  60. 276 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/common/excel/reader/Excel2003Reader.java
  61. 233 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/common/excel/reader/Excel2007Reader.java
  62. 58 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/common/excel/reader/ExcelReaderUtil.java
  63. 13 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/common/excel/reader/IRowReader.java
  64. 23 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/common/excel/reader/ImportExcelReader.java
  65. 225 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/common/excel/reader/UserModelEventListener.java
  66. 225 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/common/excel/writer/AbstractExcel2007Writer.java
  67. 60 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/common/excel/writer/Excel2003Writer.java
  68. 44 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/common/excel/writer/Excel2007WriterImpl.java
  69. 48 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/common/excel/writer/XMLEncoder.java
  70. 24 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/AbstractFactory.java
  71. 33 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/ApplicationServletContextListener.java
  72. 216 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/Business.java
  73. 17 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/CacheUtil.java
  74. 107 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/DingdingAttendanceQueue.java
  75. 13 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/ExceptionWrapInConvert.java
  76. 7 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/MimeTypeDefinition.java
  77. 52 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/ThisApplication.java
  78. 16 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/exception/PersonHasNoIdentityException.java
  79. 53 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceAdminFactory.java
  80. 508 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceAppealInfoFactory.java
  81. 959 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceDetailFactory.java
  82. 160 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceDetailMobileFactory.java
  83. 926 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceDetailStatisticFactory.java
  84. 68 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceEmployeeConfigFactory.java
  85. 54 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceImportFileInfoFactory.java
  86. 98 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceScheduleSettingFactory.java
  87. 275 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceSelfHolidayFactory.java
  88. 86 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceSettingFactory.java
  89. 125 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceStatisticRequireLogFactory.java
  90. 74 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceStatisticalCycleFactory.java
  91. 218 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceWorkDayConfigFactory.java
  92. 53 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceWorkPlaceFactory.java
  93. 12 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/CycleMonthEmptyException.java
  94. 12 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/CycleYearEmptyException.java
  95. 12 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/EmployeeNamesEmptyException.java
  96. 12 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/RecordDateEmptyException.java
  97. 12 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/StatisticDateEmptyException.java
  98. 12 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/StatisticMonthEmptyException.java
  99. 652 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/StatisticPersonForMonthFactory.java
  100. 281 0
      o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/StatisticTopUnitForDayFactory.java

+ 5 - 1
.gitignore

@@ -49,4 +49,8 @@ $RECYCLE.BIN/
 hs_err_pid*
 hs_err_pid*
 #jpa enhance class
 #jpa enhance class
 *_.java
 *_.java
-*.iml
+*.iml
+#ignore mvn test directory
+**/src/test/
+command.swap
+**/bin/

+ 0 - 28
o2server/.gitignore

@@ -1,28 +0,0 @@
-.project
-/.settings/
-/local/
-/localSample/
-/config/
-/configSample/
-/logs/
-/target/
-/x_build/
-/servers/
-command.swap
-/store/
-/node_modules/
-**/src/main/resources/META-INF/persistence.xml
-**/src/main/resources/META-INF/x_persistence.xml
-**/*_.java
-**/src/main/webapp/describe/
-console.jar
-**/.DS_Store
-.DS_Store
-/commons/
-/jvm/
-*.zip
-*.swap
-version.o2
-/custom/
-/dynamic/
-

+ 0 - 22
o2server/.gitlab-ci.yml

@@ -1,22 +0,0 @@
-stages:
-  - build
-
-cache:
-  paths:
-    - commons/
-    - jvm/
-    - common.tar.gz
-    - jvm.tar.gz
-
-before_script:
-  - mvn clean
-  - cp /data/commons.tar.gz .
-  - cp /data/jvm.tar.gz .
-  - tar -zxf commons.tar.gz
-  - tar -zxf jvm.tar.gz 
-
-build:
-  stage: build
-  script:
-    - mvn clean
-    - mvn install

+ 2 - 0
o2server/.settings/org.eclipse.core.resources.prefs

@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8

+ 4 - 0
o2server/.settings/org.eclipse.m2e.core.prefs

@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1

+ 10 - 0
o2server/configSample/appStyle.json

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

+ 29 - 0
o2server/configSample/centerServer.json

@@ -0,0 +1,29 @@
+{
+  "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,
+  "###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),限制有所上传的内容大小,包括附件.###"
+}

+ 22 - 0
o2server/configSample/collect.json

@@ -0,0 +1,22 @@
+{
+  "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###"
+}

+ 17 - 0
o2server/configSample/communicate.json

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

+ 32 - 0
o2server/configSample/dingding.json

@@ -0,0 +1,32 @@
+{
+  "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": "组织同步cron,默认每10分钟同步一次.###",
+  "###forceSyncCron": "强制拉入同步cron,默认在每天的8点和12点强制进行同步.###",
+  "###oapiAddress": "oapi服务器地址###",
+  "###workUrl": "钉钉消息打开工作的url地址,如:http://dev.o2oa.net/x_desktop/###",
+  "###messageRedirectPortal": "钉钉消息处理完成后跳转到特定的门户页面的Id###",
+  "###messageEnable": "是否启用消息推送###",
+  "###scanLoginEnable": "是否开启钉钉扫码登录###",
+  "###scanLoginAppId": "钉钉扫码登录的AppId###",
+  "###scanLoginAppSecret": "钉钉扫码登录的appSecret###",
+  "###attendanceSyncEnable": "是否启用考勤信息###"
+}

+ 10 - 0
o2server/configSample/dumpRestoreData.json

@@ -0,0 +1,10 @@
+{
+  "enable": false,
+  "includes": [],
+  "excludes": [],
+  "batchSize": 1000.0,
+  "###enable": "是否启用.###",
+  "###includes": "导出导入包含对象,可以使用通配符*.###",
+  "###excludes": "导出导入排除对象,可以使用通配符*.###",
+  "###batchSize": "批量对象数量.###"
+}

+ 13 - 0
o2server/configSample/dumpRestoreStorage.json

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

+ 20 - 0
o2server/configSample/exmail.json

@@ -0,0 +1,20 @@
+{
+  "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": " 存储邮件标题个人属性值.###"
+}

+ 68 - 0
o2server/configSample/logLevel.json

@@ -0,0 +1,68 @@
+{
+  "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": "",
+  "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": "是否启用调试###",
+  "###audit": "审计日志配置###"
+}

+ 17 - 0
o2server/configSample/meeting.json

@@ -0,0 +1,17 @@
+{
+  "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": "匿名用户是否可以访问附件###"
+}

+ 177 - 0
o2server/configSample/messages.json

@@ -0,0 +1,177 @@
+{
+  "##sample##": {
+    "consumers": [],
+    "consumersV2": {
+      "qiyeweixin": "excute",
+      "describe": "excute表示脚本messageRule.js中的方法名称,该js文件需放在与messages.json同目录下,更改脚本需重启服务"
+    }
+  },
+  "attachment_editor": {
+    "consumers": [],
+    "consumersV2": {
+      "pms": "",
+      "zhengwuDingding": "",
+      "qiyeweixin": "",
+      "ws": "",
+      "dingding": ""
+    }
+  },
+  "attachment_editorCancel": {
+    "consumers": [],
+    "consumersV2": {
+      "pms": "",
+      "zhengwuDingding": "",
+      "qiyeweixin": "",
+      "ws": "",
+      "dingding": ""
+    }
+  },
+  "attachment_editorModify": {
+    "consumers": [],
+    "consumersV2": {
+      "pms": "",
+      "zhengwuDingding": "",
+      "qiyeweixin": "",
+      "ws": "",
+      "dingding": ""
+    }
+  },
+  "attachment_share": {
+    "consumers": [],
+    "consumersV2": {
+      "pms": "",
+      "zhengwuDingding": "",
+      "qiyeweixin": "",
+      "ws": "",
+      "dingding": ""
+    }
+  },
+  "attachment_shareCancel": {
+    "consumers": [],
+    "consumersV2": {
+      "pms": "",
+      "zhengwuDingding": "",
+      "qiyeweixin": "",
+      "ws": "",
+      "dingding": ""
+    }
+  },
+  "bbs_replyCreate": {
+    "consumers": [],
+    "consumersV2": {
+      "pms": "",
+      "ws": ""
+    }
+  },
+  "bbs_subjectCreate": {
+    "consumers": [],
+    "consumersV2": {
+      "pms": "",
+      "ws": ""
+    }
+  },
+  "calendar_alarm": {
+    "consumers": [],
+    "consumersV2": {
+      "pms": "",
+      "zhengwuDingding": "",
+      "qiyeweixin": "",
+      "ws": "",
+      "dingding": ""
+    }
+  },
+  "im_create": {
+    "consumers": [],
+    "consumersV2": {
+      "ws": ""
+    }
+  },
+  "meeting_delete": {
+    "consumers": [],
+    "consumersV2": {
+      "pms": "",
+      "zhengwuDingding": "",
+      "qiyeweixin": "",
+      "ws": "",
+      "dingding": ""
+    }
+  },
+  "meeting_invite": {
+    "consumers": [],
+    "consumersV2": {
+      "pms": "",
+      "zhengwuDingding": "",
+      "qiyeweixin": "",
+      "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": {
+      "pms": "",
+      "zhengwuDingding": "",
+      "qiyeweixin": "",
+      "ws": "",
+      "dingding": ""
+    }
+  },
+  "read_delete": {
+    "consumers": [],
+    "consumersV2": {}
+  },
+  "taskCompleted_create": {
+    "consumers": [],
+    "consumersV2": {}
+  },
+  "taskCompleted_delete": {
+    "consumers": [],
+    "consumersV2": {}
+  },
+  "task_create": {
+    "consumers": [],
+    "consumersV2": {
+      "pms": "",
+      "zhengwuDingding": "",
+      "qiyeweixin": "",
+      "ws": "",
+      "dingding": ""
+    }
+  },
+  "task_delete": {
+    "consumers": [],
+    "consumersV2": {}
+  },
+  "task_press": {
+    "consumers": [],
+    "consumersV2": {
+      "pms": "",
+      "zhengwuDingding": "",
+      "qiyeweixin": "",
+      "ws": "",
+      "dingding": ""
+    }
+  }
+}

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

@@ -0,0 +1,189 @@
+{
+  "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,
+    "###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),限制有所上传的内容大小,包括附件.###"
+  },
+  "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,
+    "###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),限制有所上传的内容大小,包括附件.###"
+  },
+  "web": {
+    "enable": true,
+    "sslEnable": false,
+    "proxyHost": "",
+    "weight": 100.0,
+    "dirAllowed": false,
+    "statEnable": false,
+    "statExclusions": "*.gif,*.jpg,*.png,*.ico",
+    "cacheControlMaxAge": 0.0,
+    "###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缓存时间(秒)###"
+  },
+  "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,
+    "###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": "默认日志级别###",
+    "###maxTotal": "最大使用连接数###",
+    "###maxIdle": "最大空闲连接数###",
+    "###statEnable": "启用统计,默认启用###",
+    "###statFilter": "统计方式配置,默认mergeStat###",
+    "###slowSqlMillis": "执行缓慢sql毫秒数,默认2000毫秒,执行缓慢的sql将被单独记录.###"
+  },
+  "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": true,
+    "cron": "",
+    "size": 7.0,
+    "path": "",
+    "###enable": "是否启用,默认每天凌晨2点进行备份.###",
+    "###cron": "定时任务cron表达式###",
+    "###size": "最大保留份数,超过将自动删除最久的数据.###",
+    "###path": "备份路径###"
+  },
+  "dumpStorage": {
+    "enable": true,
+    "cron": "",
+    "size": 7.0,
+    "path": "",
+    "###enable": "是否启用,默认每天凌晨4点进行备份.###",
+    "###cron": "定时任务cron表达式###",
+    "###size": "最大保留份数,超过将自动删除最久的数据.###",
+    "###path": "备份路径###"
+  },
+  "restoreData": {
+    "enable": false,
+    "cron": "",
+    "path": "",
+    "###enable": "是否启用,默认每天凌晨2点进行备份.###",
+    "###cron": "定时任务cron表达式###",
+    "###path": "恢复路径###"
+  },
+  "restoreStorage": {
+    "enable": false,
+    "cron": "",
+    "path": "",
+    "###enable": "是否启用,默认每天凌晨2点进行备份.###",
+    "###cron": "定时任务cron表达式###",
+    "###path": "恢复路径###"
+  },
+  "nodeAgentEnable": true,
+  "nodeAgentPort": 20010.0,
+  "nodeAgentEncrypt": true,
+  "quickStartWebApp": false,
+  "###enable": "是否启用###",
+  "###isPrimaryCenter": "是否是center节点,仅允许存在一个center节点###",
+  "###center": "Center服务器配置###",
+  "###application": "Application服务器配置###",
+  "###web": "Web服务器配置###",
+  "###data": "Data服务器配置###",
+  "###storage": "Storage服务器配置###",
+  "###logLevel": "日志级别,默认当前节点的slf4j日志级别,通过系统变量\"org.slf4j.simpleLogger.defaultLogLevel\"设置到当前jvm中.###",
+  "###dumpData": "定时数据导出配置###",
+  "###dumpStorage": "定时存储文件导出配置###",
+  "###restoreData": "定时数据导入配置###",
+  "###restoreStorage": "定时存储文件导入配置###",
+  "###logSize": "日志文件保留天数.###",
+  "###auditLogSize": "审计日志文件保留天数.###",
+  "###nodeAgentEnable": "是否启用节点代理###",
+  "###nodeAgentPort": "是否启用节点端口###",
+  "###nodeAgentEncrypt": "是否启用节点代理加密###",
+  "###quickStartWebApp": "是否使用快速应用部署###",
+  "###banner": "服务器控制台启动标识###",
+  "###autoStart": "是否自动启动###"
+}

+ 36 - 0
o2server/configSample/person.json

@@ -0,0 +1,36 @@
+{
+  "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,
+  "###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时长,分钟###"
+}

+ 93 - 0
o2server/configSample/processPlatform.json

@@ -0,0 +1,93 @@
+{
+  "maintenanceIdentity": "",
+  "formVersionCount": 30.0,
+  "processVersionCount": 30.0,
+  "scriptVersionCount": 30.0,
+  "docToWordType": "local",
+  "docToWordDefaultFileName": "正文.docx",
+  "docToWordDefaultSite": "$doc",
+  "executorCount": 32.0,
+  "urge": {
+    "enable": true,
+    "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表达式###"
+  },
+  "dataMerge": {
+    "enable": false,
+    "cron": "30 30 6 * * ?",
+    "thresholdDays": 730.0,
+    "###enable": "是否启用###",
+    "###cron": "定时cron表达式###",
+    "###thresholdDays": "期限,已完成工作结束间隔指定时间进行merge,默认两年后进行merge###"
+  },
+  "deleteDraft": {
+    "enable": false,
+    "cron": "0 0 20 * * ?",
+    "thresholdMinutes": 14400.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分钟.###"
+  },
+  "###maintenanceIdentity": "维护身份,当工作发生意外错误,无法找到对应的处理人情况下,先尝试将工作分配给创建身份,如果创建身份也不可获取,那么分配给指定人员,默认情况下这个值为空.###",
+  "###formVersionCount": "表单历史版本保留数量,0为不保留.###",
+  "###processVersionCount": "流程历史版本保留数量,0为不保留.###",
+  "###scriptVersionCount": "脚本历史版本保留数量,0为不保留.###",
+  "###docToWordType": "HTML版式公文转换成Word文件方式,local,cloud.###",
+  "###docToWordDefaultFileName": "HTML版式公文转换成Word文件缺省文件名.###",
+  "###docToWordDefaultSite": "HTML版式公文转换成Word文件缺省site.###",
+  "###executorCount": "执行器数量###",
+  "###urge": "催办任务设置,发现即将过期时发送提醒消息.###",
+  "###expire": "将已经过了截至时间的待办标记过期.###",
+  "###touchDelay": "延时任务设置,定时触发延时任务,当超过延时时间后继续流转.###",
+  "###dataMerge": "合并任务设置,定时触发合并任务,将已完成工作的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": "提醒数量限制.###"
+  }
+}

+ 30 - 0
o2server/configSample/qiyeweixin.json

@@ -0,0 +1,30 @@
+{
+  "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,
+  "###enable": "是否启用.###",
+  "###syncCron": "拉入同步cron,默认每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": "企业微信扫码登录###"
+}

+ 55 - 0
o2server/configSample/query.json

@@ -0,0 +1,55 @@
+{
+  "crawlWorkCompleted": {
+    "enable": true,
+    "cron": "50 50 22 * * ?",
+    "count": 2000.0,
+    "excludeAttachment": [],
+    "excludeSite": [],
+    "maxAttachmentSize": 5242880.0,
+    "###enable": "是否启用###",
+    "###cron": "定时cron表达式.###",
+    "###count": "每次处理的数量,默认每小时处理所以默认为2000,同时每次将重爬最旧的25%,按时间轮询25%.###",
+    "###excludeAttachment": "忽略附件名称.###",
+    "###excludeSite": "忽略附件位置.###",
+    "###maxAttachmentSize": "最大附件大小.###"
+  },
+  "crawlWork": {
+    "enable": true,
+    "cron": "40 40 7-21 * * ?",
+    "count": 100.0,
+    "excludeAttachment": [],
+    "excludeSite": [],
+    "maxAttachmentSize": 5242880.0,
+    "###enable": "是否启用###",
+    "###cron": "定时cron表达式.###",
+    "###count": "每次处理的数量,默认每小时处理所以默认为100,同时每次将重爬最旧的50%,按时间轮询50%.###",
+    "###excludeAttachment": "忽略附件名称.###",
+    "###excludeSite": "忽略附件位置.###",
+    "###maxAttachmentSize": "最大附件大小.###"
+  },
+  "crawlCms": {
+    "enable": true,
+    "cron": "30 30 7-21 * * ?",
+    "count": 100.0,
+    "excludeAttachment": [],
+    "maxAttachmentSize": 5242880.0,
+    "###enable": "是否启用###",
+    "###cron": "定时cron表达式.###",
+    "###count": "每次处理的数量,默认每小时处理所以默认为100,同时每次将重爬最旧的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使用语言.###"
+}

+ 85 - 0
o2server/configSample/token.json

@@ -0,0 +1,85 @@
+{
+  "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": "作为客户端单点登录配置###"
+}

+ 8 - 0
o2server/configSample/vfs.json

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

+ 19 - 0
o2server/configSample/workTime.json

@@ -0,0 +1,19 @@
+{
+  "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代表周六.###"
+}

+ 33 - 0
o2server/configSample/zhengwuDingding.json

@@ -0,0 +1,33 @@
+{
+  "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": "拉入同步cron,默认每10分钟同步一次.###",
+  "###forceSyncCron": "强制拉入同步cron,默认在每天的8点和12点强制进行同步.###",
+  "###oapiAddress": "oapi服务器地址###",
+  "###corpId": "政务钉钉corpId###",
+  "###corpSecret": "政务钉钉corpSecret###",
+  "###titleSplit": "title分隔符###",
+  "###personAttributeTitleName": "title对应个人属性名称###",
+  "###nonce": "政务钉钉nonce###",
+  "###messageEnable": "推送消息到政务钉钉消息###"
+}

+ 1 - 0
o2server/localSample/node.cfg

@@ -0,0 +1 @@
+127.0.0.1

+ 0 - 1
o2server/pom.xml

@@ -888,7 +888,6 @@
 	</dependencyManagement>
 	</dependencyManagement>
 	<repositories>
 	<repositories>
 		<repository>
 		<repository>
-		<!-- o2oa mvn -->
 			<id>nexus-o2oa</id>
 			<id>nexus-o2oa</id>
 			<name>nexus-o2oa</name>
 			<name>nexus-o2oa</name>
 			<url>http://maven.o2oa.net/repository/maven-public/</url>
 			<url>http://maven.o2oa.net/repository/maven-public/</url>

BIN
o2server/store/jars/x_attendance_core_entity.jar


BIN
o2server/store/jars/x_base_core_project.jar


BIN
o2server/store/jars/x_bbs_core_entity.jar


BIN
o2server/store/jars/x_calendar_core_entity.jar


BIN
o2server/store/jars/x_cms_core_entity.jar


BIN
o2server/store/jars/x_cms_core_express.jar


BIN
o2server/store/jars/x_component_core_entity.jar


BIN
o2server/store/jars/x_file_core_entity.jar


BIN
o2server/store/jars/x_general_core_entity.jar


BIN
o2server/store/jars/x_hotpic_core_entity.jar


BIN
o2server/store/jars/x_meeting_core_entity.jar


BIN
o2server/store/jars/x_message_core_entity.jar


BIN
o2server/store/jars/x_mind_core_entity.jar


BIN
o2server/store/jars/x_okr_core_entity.jar


BIN
o2server/store/jars/x_organization_core_entity.jar


BIN
o2server/store/jars/x_organization_core_express.jar


BIN
o2server/store/jars/x_portal_core_entity.jar


BIN
o2server/store/jars/x_processplatform_core_entity.jar


BIN
o2server/store/jars/x_processplatform_core_express.jar


BIN
o2server/store/jars/x_program_center_core_entity.jar


BIN
o2server/store/jars/x_query_core_entity.jar


BIN
o2server/store/jars/x_query_core_express.jar


BIN
o2server/store/jars/x_teamwork_core_entity.jar


+ 28 - 0
o2server/store/manifest.cfg

@@ -0,0 +1,28 @@
+x_attendance_assemble_control.war
+x_bbs_assemble_control.war
+x_calendar_assemble_control.war
+x_cms_assemble_control.war
+x_component_assemble_control.war
+x_file_assemble_control.war
+x_general_assemble_control.war
+x_hotpic_assemble_control.war
+x_meeting_assemble_control.war
+x_message_assemble_communicate.war
+x_mind_assemble_control.war
+x_okr_assemble_control.war
+x_organization_assemble_authentication.war
+x_organization_assemble_control.war
+x_organization_assemble_express.war
+x_organization_assemble_personal.war
+x_portal_assemble_designer.war
+x_portal_assemble_surface.war
+x_processplatform_assemble_bam.war
+x_processplatform_assemble_designer.war
+x_processplatform_assemble_surface.war
+x_processplatform_service_processing.war
+x_program_center.war
+x_query_assemble_designer.war
+x_query_assemble_surface.war
+x_query_service_processing.war
+x_teamwork_assemble_control.war
+x_jpush_assemble_control.war

+ 1 - 1
o2server/version.o2

@@ -1 +1 @@
-2020-03-14 17:23:22
+2020-03-17 17:51:26

+ 1 - 4
o2server/x_attendance_assemble_control/.gitignore

@@ -1,5 +1,2 @@
-.classpath
-.project
-/.settings/
-/target/
 /bin/
 /bin/
+/target/

+ 6 - 0
o2server/x_attendance_assemble_control/.settings/org.eclipse.core.resources.prefs

@@ -0,0 +1,6 @@
+eclipse.preferences.version=1
+encoding//src/main/java=UTF-8
+encoding//src/main/resources=UTF-8
+encoding//src/test/java=UTF-8
+encoding//src/test/resources=UTF-8
+encoding/<project>=UTF-8

+ 8 - 0
o2server/x_attendance_assemble_control/.settings/org.eclipse.jdt.core.prefs

@@ -0,0 +1,8 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
+org.eclipse.jdt.core.compiler.release=disabled
+org.eclipse.jdt.core.compiler.source=1.8

+ 4 - 0
o2server/x_attendance_assemble_control/.settings/org.eclipse.m2e.core.prefs

@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1

+ 743 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/api.json

@@ -0,0 +1,743 @@
+{
+  "jaxrs": [
+    {
+      "name": "AttendanceAdminAction",
+      "methods": [
+        {
+          "name": "get",
+          "uri": "jaxrs/attendanceadmin/{id}",
+          "method": "GET"
+        },
+        {
+          "name": "delete",
+          "uri": "jaxrs/attendanceadmin/{id}",
+          "method": "DELETE",
+          "enctype": "application/json"
+        },
+        {
+          "name": "post",
+          "uri": "jaxrs/attendanceadmin",
+          "method": "POST",
+          "enctype": "application/json"
+        },
+        {
+          "name": "listAllAttendanceAdmin",
+          "uri": "jaxrs/attendanceadmin/list/all",
+          "method": "GET"
+        }
+      ]
+    },
+    {
+      "name": "AttendanceAppealInfoAction",
+      "methods": [
+        {
+          "name": "get",
+          "uri": "jaxrs/attendanceappealInfo/{id}",
+          "method": "GET"
+        },
+        {
+          "name": "delete",
+          "uri": "jaxrs/attendanceappealInfo/{id}",
+          "method": "DELETE",
+          "enctype": "application/json"
+        },
+        {
+          "name": "check",
+          "uri": "jaxrs/attendanceappealInfo/check ",
+          "method": "PUT",
+          "enctype": "application/json"
+        },
+        {
+          "name": "create",
+          "uri": "jaxrs/attendanceappealInfo/appeal/{id}",
+          "method": "PUT",
+          "enctype": "application/json"
+        },
+        {
+          "name": "audit",
+          "uri": "jaxrs/attendanceappealInfo/audit",
+          "method": "PUT",
+          "enctype": "application/json"
+        },
+        {
+          "name": "archive",
+          "uri": "jaxrs/attendanceappealInfo/archive/{id}",
+          "method": "GET"
+        },
+        {
+          "name": "listNextWithFilter",
+          "uri": "jaxrs/attendanceappealInfo/filter/list/{id}/next/{count}",
+          "method": "PUT",
+          "enctype": "application/json"
+        },
+        {
+          "name": "listPrevWithFilter",
+          "uri": "jaxrs/attendanceappealInfo/filter/list/{id}/prev/{count}",
+          "method": "PUT",
+          "enctype": "application/json"
+        }
+      ]
+    },
+    {
+      "name": "AttendanceDetailAction",
+      "methods": [
+        {
+          "name": "get",
+          "uri": "jaxrs/attendancedetail/{id}",
+          "method": "GET"
+        },
+        {
+          "name": "delete",
+          "uri": "jaxrs/attendancedetail/{id}",
+          "method": "DELETE",
+          "enctype": "application/json"
+        },
+        {
+          "name": "recive",
+          "uri": "jaxrs/attendancedetail/recive",
+          "method": "POST",
+          "enctype": "application/json"
+        },
+        {
+          "name": "checkDetailWithPersonByCycle",
+          "uri": "jaxrs/attendancedetail/checkDetailWithPersonByCycle/{cycleYear}/{cycleMonth}",
+          "method": "GET"
+        },
+        {
+          "name": "listUnitAttendanceDetail",
+          "uri": "jaxrs/attendancedetail/filter/list/unit",
+          "method": "PUT",
+          "enctype": "application/json"
+        },
+        {
+          "name": "analyseAttendanceDetails",
+          "uri": "jaxrs/attendancedetail/analyse/{startDate}/{endDate}",
+          "method": "GET"
+        },
+        {
+          "name": "analyseAttendanceDetail",
+          "uri": "jaxrs/attendancedetail/analyse/id/{id}",
+          "method": "GET"
+        },
+        {
+          "name": "archiveAttendanceDetail",
+          "uri": "jaxrs/attendancedetail/archive/{id}",
+          "method": "GET"
+        },
+        {
+          "name": "listTopUnitAttendanceDetail",
+          "uri": "jaxrs/attendancedetail/filter/list/topUnit",
+          "method": "PUT",
+          "enctype": "application/json"
+        },
+        {
+          "name": "listUserAttendanceDetail",
+          "uri": "jaxrs/attendancedetail/filter/list/user",
+          "method": "PUT",
+          "enctype": "application/json"
+        },
+        {
+          "name": "listAttendanceDetailByBatchName",
+          "uri": "jaxrs/attendancedetail/list/{file_id}",
+          "method": "GET"
+        },
+        {
+          "name": "listAttendanceDetail",
+          "uri": "jaxrs/attendancedetail/filter/list",
+          "method": "PUT",
+          "enctype": "application/json"
+        },
+        {
+          "name": "listNextWithFilter",
+          "uri": "jaxrs/attendancedetail/filter/list/{id}/next/{count}",
+          "method": "PUT",
+          "enctype": "application/json"
+        },
+        {
+          "name": "listPrevWithFilter",
+          "uri": "jaxrs/attendancedetail/filter/list/{id}/prev/{count}",
+          "method": "PUT",
+          "enctype": "application/json"
+        }
+      ]
+    },
+    {
+      "name": "AttendanceDetailFileImportAction",
+      "methods": [
+        {
+          "name": "getStatus",
+          "uri": "jaxrs/fileimport/getStatus/{file_id}",
+          "method": "GET"
+        },
+        {
+          "name": "getStatusDetail",
+          "uri": "jaxrs/fileimport/getStatus/{file_id}/detail",
+          "method": "GET"
+        },
+        {
+          "name": "getStatusAll",
+          "uri": "jaxrs/fileimport/getStatus/all",
+          "method": "GET"
+        }
+      ]
+    },
+    {
+      "name": "AttendanceDetailMobileAction",
+      "methods": [
+        {
+          "name": "get",
+          "uri": "jaxrs/attendancedetail/mobile/{id}",
+          "method": "GET"
+        },
+        {
+          "name": "delete",
+          "uri": "jaxrs/attendancedetail/mobile/{id}",
+          "method": "DELETE",
+          "enctype": "application/json"
+        },
+        {
+          "name": "reciveForMobile",
+          "uri": "jaxrs/attendancedetail/mobile/recive",
+          "method": "POST",
+          "enctype": "application/json"
+        },
+        {
+          "name": "listDataForMobile",
+          "uri": "jaxrs/attendancedetail/mobile/filter/list/page/{page}/count/{count}",
+          "method": "PUT",
+          "enctype": "application/json"
+        }
+      ]
+    },
+    {
+      "name": "AttendanceEmployeeConfigAction",
+      "methods": [
+        {
+          "name": "get",
+          "uri": "jaxrs/attendanceemployeeconfig/{id}",
+          "method": "GET"
+        },
+        {
+          "name": "delete",
+          "uri": "jaxrs/attendanceemployeeconfig/{id}",
+          "method": "DELETE",
+          "enctype": "application/json"
+        },
+        {
+          "name": "post",
+          "uri": "jaxrs/attendanceemployeeconfig",
+          "method": "POST",
+          "enctype": "application/json"
+        },
+        {
+          "name": "listAllAttendanceEmployeeConfig",
+          "uri": "jaxrs/attendanceemployeeconfig/list/all",
+          "method": "GET"
+        }
+      ]
+    },
+    {
+      "name": "AttendanceImportFileInfoAction",
+      "methods": [
+        {
+          "name": "get",
+          "uri": "jaxrs/attendanceimportfileinfo/{id}",
+          "method": "GET"
+        },
+        {
+          "name": "delete",
+          "uri": "jaxrs/attendanceimportfileinfo/{id}",
+          "method": "DELETE",
+          "enctype": "application/json"
+        },
+        {
+          "name": "listAllAttendanceImportFileInfo",
+          "uri": "jaxrs/attendanceimportfileinfo/list/all",
+          "method": "GET"
+        }
+      ]
+    },
+    {
+      "name": "AttendanceScheduleSettingAction",
+      "methods": [
+        {
+          "name": "get",
+          "uri": "jaxrs/attendanceschedulesetting/{id}",
+          "method": "GET"
+        },
+        {
+          "name": "delete",
+          "uri": "jaxrs/attendanceschedulesetting/{id}",
+          "method": "DELETE",
+          "enctype": "application/json"
+        },
+        {
+          "name": "post",
+          "uri": "jaxrs/attendanceschedulesetting",
+          "method": "POST",
+          "enctype": "application/json"
+        },
+        {
+          "name": "listAllAttendanceScheduleSetting",
+          "uri": "jaxrs/attendanceschedulesetting/list/all",
+          "method": "GET"
+        },
+        {
+          "name": "listAttendanceScheduleSettingByUnit",
+          "uri": "jaxrs/attendanceschedulesetting/list/unit/{name}",
+          "method": "GET"
+        },
+        {
+          "name": "listAttendanceScheduleSettingByTopUnit",
+          "uri": "jaxrs/attendanceschedulesetting/list/topUnit/{name}",
+          "method": "GET"
+        }
+      ]
+    },
+    {
+      "name": "AttendanceSelfHolidayAction",
+      "methods": [
+        {
+          "name": "delete",
+          "uri": "jaxrs/attendanceselfholiday/{id}",
+          "method": "DELETE",
+          "enctype": "application/json"
+        },
+        {
+          "name": "post",
+          "uri": "jaxrs/attendanceselfholiday",
+          "method": "POST",
+          "enctype": "application/json"
+        },
+        {
+          "name": "listNextWithFilter",
+          "uri": "jaxrs/attendanceselfholiday/filter/list/{id}/next/{count}",
+          "method": "PUT",
+          "enctype": "application/json"
+        },
+        {
+          "name": "listPrevWithFilter",
+          "uri": "jaxrs/attendanceselfholiday/filter/list/{id}/prev/{count}",
+          "method": "PUT",
+          "enctype": "application/json"
+        },
+        {
+          "name": "listAllAttendanceSelfHoliday",
+          "uri": "jaxrs/attendanceselfholiday/list/all",
+          "method": "GET"
+        }
+      ]
+    },
+    {
+      "name": "AttendanceSelfHolidaySimpleAction",
+      "methods": [
+        {
+          "name": "post",
+          "uri": "jaxrs/selfholidaysimple",
+          "method": "POST",
+          "enctype": "application/json"
+        },
+        {
+          "name": "deleteByWfDocId",
+          "uri": "jaxrs/selfholidaysimple/docId/{docId}",
+          "method": "DELETE",
+          "enctype": "application/json"
+        }
+      ]
+    },
+    {
+      "name": "AttendanceSettingAction",
+      "methods": [
+        {
+          "name": "get",
+          "uri": "jaxrs/attendancesetting/{id}",
+          "method": "GET"
+        },
+        {
+          "name": "delete",
+          "uri": "jaxrs/attendancesetting/{id}",
+          "method": "DELETE",
+          "enctype": "application/json"
+        },
+        {
+          "name": "save",
+          "uri": "jaxrs/attendancesetting",
+          "method": "POST",
+          "enctype": "application/json"
+        },
+        {
+          "name": "getWithCode",
+          "uri": "jaxrs/attendancesetting/code/{code}",
+          "method": "GET"
+        },
+        {
+          "name": "listAllAttendanceSetting",
+          "uri": "jaxrs/attendancesetting/list/all",
+          "method": "GET"
+        }
+      ]
+    },
+    {
+      "name": "AttendanceStatisticAction",
+      "methods": [
+        {
+          "name": "doStatistic",
+          "uri": "jaxrs/statistic/do",
+          "method": "GET"
+        }
+      ]
+    },
+    {
+      "name": "AttendanceStatisticRequireLogAction",
+      "methods": [
+        {
+          "name": "get",
+          "uri": "jaxrs/attendancestatisticrequirelog/{id}",
+          "method": "GET"
+        },
+        {
+          "name": "delete",
+          "uri": "jaxrs/attendancestatisticrequirelog/{id}",
+          "method": "DELETE",
+          "enctype": "application/json"
+        },
+        {
+          "name": "post",
+          "uri": "jaxrs/attendancestatisticrequirelog",
+          "method": "POST",
+          "enctype": "application/json"
+        },
+        {
+          "name": "listAllAttendanceStatisticRequireLog",
+          "uri": "jaxrs/attendancestatisticrequirelog/list/all",
+          "method": "GET"
+        }
+      ]
+    },
+    {
+      "name": "AttendanceStatisticShowAction",
+      "methods": [
+        {
+          "name": "showStmForPerson",
+          "uri": "jaxrs/statisticshow/person/{name}/{year}/{month}",
+          "method": "GET"
+        },
+        {
+          "name": "showStmForUnit",
+          "uri": "jaxrs/statisticshow/unit/{name}/{year}/{month}",
+          "method": "GET"
+        },
+        {
+          "name": "sumUnitStatistic",
+          "uri": "jaxrs/statisticshow/unit/sum/{name}/{year}/{month}",
+          "method": "GET"
+        },
+        {
+          "name": "showStdForUnit",
+          "uri": "jaxrs/statisticshow/unit/day/{name}/{year}/{month}",
+          "method": "GET"
+        },
+        {
+          "name": "showStdForTopUnit",
+          "uri": "jaxrs/statisticshow/topUnit/day/{name}/{year}/{month}",
+          "method": "GET"
+        },
+        {
+          "name": "listStmForPersonNextWithFilter",
+          "uri": "jaxrs/statisticshow/filter/personMonth/list/{id}/next/{count}",
+          "method": "PUT",
+          "enctype": "application/json"
+        },
+        {
+          "name": "listStmForTopUnitPrevWithFilter",
+          "uri": "jaxrs/statisticshow/filter/topUnitMonth/list/{id}/prev/{count}",
+          "method": "PUT",
+          "enctype": "application/json"
+        },
+        {
+          "name": "listStdForUnitNextWithFilter",
+          "uri": "jaxrs/statisticshow/filter/unitDay/list/{id}/next/{count}",
+          "method": "PUT",
+          "enctype": "application/json"
+        },
+        {
+          "name": "listStdForUnitPrevWithFilter",
+          "uri": "jaxrs/statisticshow/filter/unitDay/list/{id}/prev/{count}",
+          "method": "PUT",
+          "enctype": "application/json"
+        },
+        {
+          "name": "listStdForTopUnitNextWithFilter",
+          "uri": "jaxrs/statisticshow/filter/topUnitDay/list/{id}/next/{count}",
+          "method": "PUT",
+          "enctype": "application/json"
+        },
+        {
+          "name": "listStdForTopUnitPrevWithFilter",
+          "uri": "jaxrs/statisticshow/filter/topUnitDay/list/{id}/prev/{count}",
+          "method": "PUT",
+          "enctype": "application/json"
+        },
+        {
+          "name": "showStmForUnitSubnested",
+          "uri": "jaxrs/statisticshow/unit/subnested/{name}/{year}/{month}",
+          "method": "GET"
+        },
+        {
+          "name": "showStdForUnitInTopUnitWithDate",
+          "uri": "jaxrs/statisticshow/unit/day/topUnit/{name}/{date}",
+          "method": "GET"
+        },
+        {
+          "name": "listStmForPersonPrevWithFilter",
+          "uri": "jaxrs/statisticshow/filter/personMonth/list/{id}/prev/{count}",
+          "method": "PUT",
+          "enctype": "application/json"
+        },
+        {
+          "name": "showStForPersonInUnit",
+          "uri": "jaxrs/statisticshow/persons/unit/{name}/{year}/{month}",
+          "method": "GET"
+        },
+        {
+          "name": "showStForPersonInUnitSubNested",
+          "uri": "jaxrs/statisticshow/persons/unit/subnested/{name}/{year}/{month}",
+          "method": "GET"
+        },
+        {
+          "name": "showStmForTopUnit",
+          "uri": "jaxrs/statisticshow/topUnit/{name}/{year}/{month}",
+          "method": "GET"
+        },
+        {
+          "name": "showStdForUnitWithDate",
+          "uri": "jaxrs/statisticshow/unit/day/{name}/{date}",
+          "method": "GET"
+        },
+        {
+          "name": "listStmForUnitPrevWithFilter",
+          "uri": "jaxrs/statisticshow/filter/unitMonth/list/{id}/prev/{count}",
+          "method": "PUT",
+          "enctype": "application/json"
+        },
+        {
+          "name": "listStmForUnitNextWithFilter",
+          "uri": "jaxrs/statisticshow/filter/unitMonth/list/{id}/next/{count}",
+          "method": "PUT",
+          "enctype": "application/json"
+        },
+        {
+          "name": "listStmForTopUnitNextWithFilter",
+          "uri": "jaxrs/statisticshow/filter/topUnitMonth/list/{id}/next/{count}",
+          "method": "PUT",
+          "enctype": "application/json"
+        },
+        {
+          "name": "showStForUnitInTopUnit",
+          "uri": "jaxrs/statisticshow/unit/topUnit/{name}/{year}/{month}",
+          "method": "GET"
+        }
+      ]
+    },
+    {
+      "name": "AttendanceStatisticalCycleAction",
+      "methods": [
+        {
+          "name": "get",
+          "uri": "jaxrs/attendancestatisticalcycle/{id}",
+          "method": "GET"
+        },
+        {
+          "name": "delete",
+          "uri": "jaxrs/attendancestatisticalcycle/{id}",
+          "method": "DELETE",
+          "enctype": "application/json"
+        },
+        {
+          "name": "post",
+          "uri": "jaxrs/attendancestatisticalcycle",
+          "method": "POST",
+          "enctype": "application/json"
+        },
+        {
+          "name": "cycleDetail",
+          "uri": "jaxrs/attendancestatisticalcycle/cycleDetail/{year}/{month}",
+          "method": "GET"
+        },
+        {
+          "name": "listAllAttendanceStatisticalCycle",
+          "uri": "jaxrs/attendancestatisticalcycle/list/all",
+          "method": "GET"
+        }
+      ]
+    },
+    {
+      "name": "AttendanceWorkDayConfigAction",
+      "methods": [
+        {
+          "name": "get",
+          "uri": "jaxrs/attendanceworkdayconfig/{id}",
+          "method": "GET"
+        },
+        {
+          "name": "delete",
+          "uri": "jaxrs/attendanceworkdayconfig/{id}",
+          "method": "DELETE",
+          "enctype": "application/json"
+        },
+        {
+          "name": "post",
+          "uri": "jaxrs/attendanceworkdayconfig",
+          "method": "POST",
+          "enctype": "application/json"
+        },
+        {
+          "name": "listWithFilter",
+          "uri": "jaxrs/attendanceworkdayconfig/filter",
+          "method": "PUT",
+          "enctype": "application/json"
+        },
+        {
+          "name": "listAllAttendanceWorkDayConfig",
+          "uri": "jaxrs/attendanceworkdayconfig/list/all",
+          "method": "GET"
+        }
+      ]
+    },
+    {
+      "name": "AttendanceWorkPlaceAction",
+      "methods": [
+        {
+          "name": "get",
+          "uri": "jaxrs/workplace/{id}",
+          "method": "GET"
+        },
+        {
+          "name": "delete",
+          "uri": "jaxrs/workplace/{id}",
+          "method": "DELETE",
+          "enctype": "application/json"
+        },
+        {
+          "name": "post",
+          "uri": "jaxrs/workplace",
+          "method": "POST",
+          "enctype": "application/json"
+        },
+        {
+          "name": "listAllAttendanceWorkPlace",
+          "uri": "jaxrs/workplace/list/all",
+          "method": "GET"
+        }
+      ]
+    },
+    {
+      "name": "CacheAction",
+      "methods": [
+        {
+          "name": "receive",
+          "uri": "jaxrs/cache",
+          "method": "PUT",
+          "enctype": "application/json"
+        },
+        {
+          "name": "configFlush",
+          "uri": "jaxrs/cache/config/flush",
+          "method": "GET"
+        }
+      ]
+    },
+    {
+      "name": "EchoAction",
+      "methods": [
+        {
+          "name": "get",
+          "uri": "jaxrs/echo",
+          "method": "GET"
+        }
+      ]
+    },
+    {
+      "name": "FileImportExportAction",
+      "methods": [
+        {
+          "name": "upload",
+          "uri": "jaxrs/file/upload",
+          "method": "POST",
+          "enctype": "formData"
+        },
+        {
+          "name": "fileDownloadStream",
+          "uri": "jaxrs/file/download/{id}/stream/{stream}",
+          "method": "GET"
+        },
+        {
+          "name": "selfHolidayExportStream",
+          "uri": "jaxrs/file/export/selfholiday/{startdate}/{enddate}/stream/{stream}",
+          "method": "GET"
+        },
+        {
+          "name": "abnormalDetailsExportStream",
+          "uri": "jaxrs/file/export/abnormaldetails/year/{year}/month/{month}/stream/{stream}",
+          "method": "GET"
+        }
+      ]
+    },
+    {
+      "name": "FireScheduleAction",
+      "methods": [
+        {
+          "name": "execute",
+          "uri": "jaxrs/fireschedule/classname/{className}",
+          "method": "GET"
+        }
+      ]
+    },
+    {
+      "name": "LoggerAction",
+      "methods": [
+        {
+          "name": "get",
+          "uri": "jaxrs/logger",
+          "method": "GET"
+        },
+        {
+          "name": "debug",
+          "uri": "jaxrs/logger/debug",
+          "method": "GET"
+        },
+        {
+          "name": "trace",
+          "uri": "jaxrs/logger/trace",
+          "method": "GET"
+        },
+        {
+          "name": "info",
+          "uri": "jaxrs/logger/info",
+          "method": "GET"
+        },
+        {
+          "name": "warn",
+          "uri": "jaxrs/logger/warn",
+          "method": "GET"
+        }
+      ]
+    },
+    {
+      "name": "SysResourceAction",
+      "methods": [
+        {
+          "name": "uploadResource",
+          "uri": "jaxrs/sysresource/upload/resource/as/new/{asNew}",
+          "method": "POST",
+          "enctype": "formData"
+        },
+        {
+          "name": "listResource",
+          "uri": "jaxrs/sysresource/filePath/{filePath}",
+          "method": "GET"
+        }
+      ]
+    }
+  ]
+}

+ 11788 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/describe.json

@@ -0,0 +1,11788 @@
+{
+  "jaxrs": [
+    {
+      "name": "AttendanceAdminAction",
+      "className": "com.x.attendance.assemble.control.jaxrs.attendanceadmin.AttendanceAdminAction",
+      "description": "考勤管理员信息配置管理服务",
+      "methods": [
+        {
+          "name": "delete",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceadmin.ActionDelete",
+          "description": "根据ID删除考勤管理员信息",
+          "type": "DELETE",
+          "path": "jaxrs/attendanceadmin/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "考勤管理员配置信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "get",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceadmin.ActionGet",
+          "description": "根据ID获取指定的考勤管理员信息",
+          "type": "GET",
+          "path": "jaxrs/attendanceadmin/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "考勤管理员配置信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "unitOu",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织编号"
+            },
+            {
+              "name": "adminName",
+              "type": "String",
+              "isCollection": false,
+              "description": "管理员姓名"
+            },
+            {
+              "name": "adminLevel",
+              "type": "String",
+              "isCollection": false,
+              "description": "管理级别:UNIT|TOPUNIT"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listAllAttendanceAdmin",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceadmin.ActionListAll",
+          "description": "获取所有的考勤管理员信息",
+          "type": "GET",
+          "path": "jaxrs/attendanceadmin/list/all",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "unitOu",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织编号"
+            },
+            {
+              "name": "adminName",
+              "type": "String",
+              "isCollection": false,
+              "description": "管理员姓名"
+            },
+            {
+              "name": "adminLevel",
+              "type": "String",
+              "isCollection": false,
+              "description": "管理级别:UNIT|TOPUNIT"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "post",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceadmin.ActionSave",
+          "description": "新建或者更新考勤管理员信息",
+          "type": "POST",
+          "path": "jaxrs/attendanceadmin",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成.",
+              "isBaseType": true
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称",
+              "isBaseType": true
+            },
+            {
+              "name": "unitOu",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织编号",
+              "isBaseType": true
+            },
+            {
+              "name": "adminName",
+              "type": "String",
+              "isCollection": false,
+              "description": "管理员姓名",
+              "isBaseType": true
+            },
+            {
+              "name": "adminLevel",
+              "type": "String",
+              "isCollection": false,
+              "description": "管理级别:UNIT|TOPUNIT",
+              "isBaseType": true
+            },
+            {
+              "name": "distributeFactor",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "分布式存储标识位.",
+              "isBaseType": true
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中.",
+              "isBaseType": true
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中.",
+              "isBaseType": true
+            },
+            {
+              "name": "sequence",
+              "type": "String",
+              "isCollection": false,
+              "description": "列表序号,由创建时间以及ID组成.在保存时自动生成,索引创建在约束中.",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "AttendanceAppealInfoAction",
+      "className": "com.x.attendance.assemble.control.jaxrs.attendanceappealinfo.AttendanceAppealInfoAction",
+      "description": "考勤结果申诉信息管理服务",
+      "methods": [
+        {
+          "name": "archive",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceappealinfo.ActionAppealArchive",
+          "description": "根据ID对考勤申诉信息进行归档",
+          "type": "GET",
+          "path": "jaxrs/attendanceappealInfo/archive/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "考勤申诉信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "audit",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceappealinfo.ActionAppealAudit",
+          "description": "根据ID列表对考勤申诉信息进行审核操作, 参数:ids(申诉ID列表),opinion(审核意见), status(审核状态:1-通过;2-需要进行复核;-1-不通过)",
+          "type": "PUT",
+          "path": "jaxrs/attendanceappealInfo/audit",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成.",
+              "isBaseType": true
+            },
+            {
+              "name": "detailId",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉的打卡记录ID.",
+              "isBaseType": true
+            },
+            {
+              "name": "empName",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉员工姓名",
+              "isBaseType": true
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称",
+              "isBaseType": true
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称",
+              "isBaseType": true
+            },
+            {
+              "name": "yearString",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉年份",
+              "isBaseType": true
+            },
+            {
+              "name": "monthString",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉月份",
+              "isBaseType": true
+            },
+            {
+              "name": "appealDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉日期字符串",
+              "isBaseType": true
+            },
+            {
+              "name": "recordDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "记录日期字符串",
+              "isBaseType": true
+            },
+            {
+              "name": "recordDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "记录日期",
+              "isBaseType": true
+            },
+            {
+              "name": "status",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "审批状态:0-待处理,1-审批通过,-1-审批不能过,2-需要下一次审批",
+              "isBaseType": true
+            },
+            {
+              "name": "startTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "开始时间",
+              "isBaseType": true
+            },
+            {
+              "name": "endTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "结束时间",
+              "isBaseType": true
+            },
+            {
+              "name": "appealReason",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉原因",
+              "isBaseType": true
+            },
+            {
+              "name": "selfHolidayType",
+              "type": "String",
+              "isCollection": false,
+              "description": "请假类型",
+              "isBaseType": true
+            },
+            {
+              "name": "address",
+              "type": "String",
+              "isCollection": false,
+              "description": "地址",
+              "isBaseType": true
+            },
+            {
+              "name": "reason",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉事由",
+              "isBaseType": true
+            },
+            {
+              "name": "appealDescription",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉详细说明",
+              "isBaseType": true
+            },
+            {
+              "name": "currentProcessor",
+              "type": "String",
+              "isCollection": false,
+              "description": "当前审核人",
+              "isBaseType": true
+            },
+            {
+              "name": "processPerson1",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人一",
+              "isBaseType": true
+            },
+            {
+              "name": "processPersonUnit1",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人组织一",
+              "isBaseType": true
+            },
+            {
+              "name": "processPersonTopUnit1",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人顶层组织一",
+              "isBaseType": true
+            },
+            {
+              "name": "opinion1",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批意见一",
+              "isBaseType": true
+            },
+            {
+              "name": "processTime1",
+              "type": "Date",
+              "isCollection": false,
+              "description": "审批日期一",
+              "isBaseType": true
+            },
+            {
+              "name": "processPerson2",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人二",
+              "isBaseType": true
+            },
+            {
+              "name": "processPersonUnit2",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人组织二",
+              "isBaseType": true
+            },
+            {
+              "name": "processPersonTopUnit2",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人顶层组织二",
+              "isBaseType": true
+            },
+            {
+              "name": "opinion2",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批意见二",
+              "isBaseType": true
+            },
+            {
+              "name": "processTime2",
+              "type": "Date",
+              "isCollection": false,
+              "description": "审批日期二",
+              "isBaseType": true
+            },
+            {
+              "name": "archiveTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "归档时间",
+              "isBaseType": true
+            },
+            {
+              "name": "distributeFactor",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "分布式存储标识位.",
+              "isBaseType": true
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中.",
+              "isBaseType": true
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中.",
+              "isBaseType": true
+            },
+            {
+              "name": "sequence",
+              "type": "String",
+              "isCollection": false,
+              "description": "列表序号,由创建时间以及ID组成.在保存时自动生成,索引创建在约束中.",
+              "isBaseType": true
+            }
+          ],
+          "outs": []
+        },
+        {
+          "name": "check",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceappealinfo.ActionAppealCheck",
+          "description": "根据ID列表对考勤申诉信息进行复核操作, 参数:ids(申诉ID列表),opinion2(审核意见), status(审核状态:1-通过;-1-不通过)",
+          "type": "PUT",
+          "path": "jaxrs/attendanceappealInfo/check ",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成.",
+              "isBaseType": true
+            },
+            {
+              "name": "detailId",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉的打卡记录ID.",
+              "isBaseType": true
+            },
+            {
+              "name": "empName",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉员工姓名",
+              "isBaseType": true
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称",
+              "isBaseType": true
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称",
+              "isBaseType": true
+            },
+            {
+              "name": "yearString",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉年份",
+              "isBaseType": true
+            },
+            {
+              "name": "monthString",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉月份",
+              "isBaseType": true
+            },
+            {
+              "name": "appealDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉日期字符串",
+              "isBaseType": true
+            },
+            {
+              "name": "recordDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "记录日期字符串",
+              "isBaseType": true
+            },
+            {
+              "name": "recordDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "记录日期",
+              "isBaseType": true
+            },
+            {
+              "name": "status",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "审批状态:0-待处理,1-审批通过,-1-审批不能过,2-需要下一次审批",
+              "isBaseType": true
+            },
+            {
+              "name": "startTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "开始时间",
+              "isBaseType": true
+            },
+            {
+              "name": "endTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "结束时间",
+              "isBaseType": true
+            },
+            {
+              "name": "appealReason",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉原因",
+              "isBaseType": true
+            },
+            {
+              "name": "selfHolidayType",
+              "type": "String",
+              "isCollection": false,
+              "description": "请假类型",
+              "isBaseType": true
+            },
+            {
+              "name": "address",
+              "type": "String",
+              "isCollection": false,
+              "description": "地址",
+              "isBaseType": true
+            },
+            {
+              "name": "reason",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉事由",
+              "isBaseType": true
+            },
+            {
+              "name": "appealDescription",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉详细说明",
+              "isBaseType": true
+            },
+            {
+              "name": "currentProcessor",
+              "type": "String",
+              "isCollection": false,
+              "description": "当前审核人",
+              "isBaseType": true
+            },
+            {
+              "name": "processPerson1",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人一",
+              "isBaseType": true
+            },
+            {
+              "name": "processPersonUnit1",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人组织一",
+              "isBaseType": true
+            },
+            {
+              "name": "processPersonTopUnit1",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人顶层组织一",
+              "isBaseType": true
+            },
+            {
+              "name": "opinion1",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批意见一",
+              "isBaseType": true
+            },
+            {
+              "name": "processTime1",
+              "type": "Date",
+              "isCollection": false,
+              "description": "审批日期一",
+              "isBaseType": true
+            },
+            {
+              "name": "processPerson2",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人二",
+              "isBaseType": true
+            },
+            {
+              "name": "processPersonUnit2",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人组织二",
+              "isBaseType": true
+            },
+            {
+              "name": "processPersonTopUnit2",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人顶层组织二",
+              "isBaseType": true
+            },
+            {
+              "name": "opinion2",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批意见二",
+              "isBaseType": true
+            },
+            {
+              "name": "processTime2",
+              "type": "Date",
+              "isCollection": false,
+              "description": "审批日期二",
+              "isBaseType": true
+            },
+            {
+              "name": "archiveTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "归档时间",
+              "isBaseType": true
+            },
+            {
+              "name": "distributeFactor",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "分布式存储标识位.",
+              "isBaseType": true
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中.",
+              "isBaseType": true
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中.",
+              "isBaseType": true
+            },
+            {
+              "name": "sequence",
+              "type": "String",
+              "isCollection": false,
+              "description": "列表序号,由创建时间以及ID组成.在保存时自动生成,索引创建在约束中.",
+              "isBaseType": true
+            }
+          ],
+          "outs": []
+        },
+        {
+          "name": "create",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceappealinfo.ActionAppealCreate",
+          "description": "根据ID对考勤结果申诉信息提起申诉",
+          "type": "PUT",
+          "path": "jaxrs/attendanceappealInfo/appeal/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "考勤申诉信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成.",
+              "isBaseType": true
+            },
+            {
+              "name": "detailId",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉的打卡记录ID.",
+              "isBaseType": true
+            },
+            {
+              "name": "empName",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉员工姓名",
+              "isBaseType": true
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称",
+              "isBaseType": true
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称",
+              "isBaseType": true
+            },
+            {
+              "name": "yearString",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉年份",
+              "isBaseType": true
+            },
+            {
+              "name": "monthString",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉月份",
+              "isBaseType": true
+            },
+            {
+              "name": "appealDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉日期字符串",
+              "isBaseType": true
+            },
+            {
+              "name": "recordDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "记录日期字符串",
+              "isBaseType": true
+            },
+            {
+              "name": "recordDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "记录日期",
+              "isBaseType": true
+            },
+            {
+              "name": "status",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "审批状态:0-待处理,1-审批通过,-1-审批不能过,2-需要下一次审批",
+              "isBaseType": true
+            },
+            {
+              "name": "startTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "开始时间",
+              "isBaseType": true
+            },
+            {
+              "name": "endTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "结束时间",
+              "isBaseType": true
+            },
+            {
+              "name": "appealReason",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉原因",
+              "isBaseType": true
+            },
+            {
+              "name": "selfHolidayType",
+              "type": "String",
+              "isCollection": false,
+              "description": "请假类型",
+              "isBaseType": true
+            },
+            {
+              "name": "address",
+              "type": "String",
+              "isCollection": false,
+              "description": "地址",
+              "isBaseType": true
+            },
+            {
+              "name": "reason",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉事由",
+              "isBaseType": true
+            },
+            {
+              "name": "appealDescription",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉详细说明",
+              "isBaseType": true
+            },
+            {
+              "name": "currentProcessor",
+              "type": "String",
+              "isCollection": false,
+              "description": "当前审核人",
+              "isBaseType": true
+            },
+            {
+              "name": "processPerson1",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人一",
+              "isBaseType": true
+            },
+            {
+              "name": "processPersonUnit1",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人组织一",
+              "isBaseType": true
+            },
+            {
+              "name": "processPersonTopUnit1",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人顶层组织一",
+              "isBaseType": true
+            },
+            {
+              "name": "opinion1",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批意见一",
+              "isBaseType": true
+            },
+            {
+              "name": "processTime1",
+              "type": "Date",
+              "isCollection": false,
+              "description": "审批日期一",
+              "isBaseType": true
+            },
+            {
+              "name": "processPerson2",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人二",
+              "isBaseType": true
+            },
+            {
+              "name": "processPersonUnit2",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人组织二",
+              "isBaseType": true
+            },
+            {
+              "name": "processPersonTopUnit2",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人顶层组织二",
+              "isBaseType": true
+            },
+            {
+              "name": "opinion2",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批意见二",
+              "isBaseType": true
+            },
+            {
+              "name": "processTime2",
+              "type": "Date",
+              "isCollection": false,
+              "description": "审批日期二",
+              "isBaseType": true
+            },
+            {
+              "name": "archiveTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "归档时间",
+              "isBaseType": true
+            },
+            {
+              "name": "distributeFactor",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "分布式存储标识位.",
+              "isBaseType": true
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中.",
+              "isBaseType": true
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中.",
+              "isBaseType": true
+            },
+            {
+              "name": "sequence",
+              "type": "String",
+              "isCollection": false,
+              "description": "列表序号,由创建时间以及ID组成.在保存时自动生成,索引创建在约束中.",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "delete",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceappealinfo.ActionDelete",
+          "description": "根据ID删除考勤结果申诉信息",
+          "type": "DELETE",
+          "path": "jaxrs/attendanceappealInfo/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "考勤申诉信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "get",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceappealinfo.ActionGet",
+          "description": "根据ID获取考勤结果申诉信息",
+          "type": "GET",
+          "path": "jaxrs/attendanceappealInfo/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "考勤申诉信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "detailId",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉的打卡记录ID."
+            },
+            {
+              "name": "empName",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉员工姓名"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "yearString",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉年份"
+            },
+            {
+              "name": "monthString",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉月份"
+            },
+            {
+              "name": "appealDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉日期字符串"
+            },
+            {
+              "name": "recordDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "记录日期字符串"
+            },
+            {
+              "name": "recordDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "记录日期"
+            },
+            {
+              "name": "status",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "审批状态:0-待处理,1-审批通过,-1-审批不能过,2-需要下一次审批"
+            },
+            {
+              "name": "startTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "开始时间"
+            },
+            {
+              "name": "endTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "结束时间"
+            },
+            {
+              "name": "appealReason",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉原因"
+            },
+            {
+              "name": "selfHolidayType",
+              "type": "String",
+              "isCollection": false,
+              "description": "请假类型"
+            },
+            {
+              "name": "address",
+              "type": "String",
+              "isCollection": false,
+              "description": "地址"
+            },
+            {
+              "name": "reason",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉事由"
+            },
+            {
+              "name": "appealDescription",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉详细说明"
+            },
+            {
+              "name": "currentProcessor",
+              "type": "String",
+              "isCollection": false,
+              "description": "当前审核人"
+            },
+            {
+              "name": "processPerson1",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人一"
+            },
+            {
+              "name": "processPersonUnit1",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人组织一"
+            },
+            {
+              "name": "processPersonTopUnit1",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人顶层组织一"
+            },
+            {
+              "name": "opinion1",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批意见一"
+            },
+            {
+              "name": "processTime1",
+              "type": "Date",
+              "isCollection": false,
+              "description": "审批日期一"
+            },
+            {
+              "name": "processPerson2",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人二"
+            },
+            {
+              "name": "processPersonUnit2",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人组织二"
+            },
+            {
+              "name": "processPersonTopUnit2",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人顶层组织二"
+            },
+            {
+              "name": "opinion2",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批意见二"
+            },
+            {
+              "name": "processTime2",
+              "type": "Date",
+              "isCollection": false,
+              "description": "审批日期二"
+            },
+            {
+              "name": "archiveTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "归档时间"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listNextWithFilter",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceappealinfo.ActionListNextWithFilter",
+          "description": "根据根据过滤条件对考勤申诉信息进行下一页查询",
+          "type": "PUT",
+          "path": "jaxrs/attendanceappealInfo/filter/list/{id}/next/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": true,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "最后一条信息ID"
+            },
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "每页显示的条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "detailId",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉的打卡记录ID."
+            },
+            {
+              "name": "empName",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉员工姓名"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "yearString",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉年份"
+            },
+            {
+              "name": "monthString",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉月份"
+            },
+            {
+              "name": "appealDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉日期字符串"
+            },
+            {
+              "name": "recordDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "记录日期字符串"
+            },
+            {
+              "name": "recordDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "记录日期"
+            },
+            {
+              "name": "status",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "审批状态:0-待处理,1-审批通过,-1-审批不能过,2-需要下一次审批"
+            },
+            {
+              "name": "startTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "开始时间"
+            },
+            {
+              "name": "endTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "结束时间"
+            },
+            {
+              "name": "appealReason",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉原因"
+            },
+            {
+              "name": "selfHolidayType",
+              "type": "String",
+              "isCollection": false,
+              "description": "请假类型"
+            },
+            {
+              "name": "address",
+              "type": "String",
+              "isCollection": false,
+              "description": "地址"
+            },
+            {
+              "name": "reason",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉事由"
+            },
+            {
+              "name": "appealDescription",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉详细说明"
+            },
+            {
+              "name": "currentProcessor",
+              "type": "String",
+              "isCollection": false,
+              "description": "当前审核人"
+            },
+            {
+              "name": "processPerson1",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人一"
+            },
+            {
+              "name": "processPersonUnit1",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人组织一"
+            },
+            {
+              "name": "processPersonTopUnit1",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人顶层组织一"
+            },
+            {
+              "name": "opinion1",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批意见一"
+            },
+            {
+              "name": "processTime1",
+              "type": "Date",
+              "isCollection": false,
+              "description": "审批日期一"
+            },
+            {
+              "name": "processPerson2",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人二"
+            },
+            {
+              "name": "processPersonUnit2",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人组织二"
+            },
+            {
+              "name": "processPersonTopUnit2",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人顶层组织二"
+            },
+            {
+              "name": "opinion2",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批意见二"
+            },
+            {
+              "name": "processTime2",
+              "type": "Date",
+              "isCollection": false,
+              "description": "审批日期二"
+            },
+            {
+              "name": "archiveTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "归档时间"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listPrevWithFilter",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceappealinfo.ActionListPrevWithFilter",
+          "description": "根据根据过滤条件对考勤申诉信息进行上一页查询",
+          "type": "PUT",
+          "path": "jaxrs/attendanceappealInfo/filter/list/{id}/prev/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": true,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "最后一条信息ID"
+            },
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "每页显示的条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "detailId",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉的打卡记录ID."
+            },
+            {
+              "name": "empName",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉员工姓名"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "yearString",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉年份"
+            },
+            {
+              "name": "monthString",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉月份"
+            },
+            {
+              "name": "appealDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉日期字符串"
+            },
+            {
+              "name": "recordDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "记录日期字符串"
+            },
+            {
+              "name": "recordDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "记录日期"
+            },
+            {
+              "name": "status",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "审批状态:0-待处理,1-审批通过,-1-审批不能过,2-需要下一次审批"
+            },
+            {
+              "name": "startTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "开始时间"
+            },
+            {
+              "name": "endTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "结束时间"
+            },
+            {
+              "name": "appealReason",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉原因"
+            },
+            {
+              "name": "selfHolidayType",
+              "type": "String",
+              "isCollection": false,
+              "description": "请假类型"
+            },
+            {
+              "name": "address",
+              "type": "String",
+              "isCollection": false,
+              "description": "地址"
+            },
+            {
+              "name": "reason",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉事由"
+            },
+            {
+              "name": "appealDescription",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉详细说明"
+            },
+            {
+              "name": "currentProcessor",
+              "type": "String",
+              "isCollection": false,
+              "description": "当前审核人"
+            },
+            {
+              "name": "processPerson1",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人一"
+            },
+            {
+              "name": "processPersonUnit1",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人组织一"
+            },
+            {
+              "name": "processPersonTopUnit1",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人顶层组织一"
+            },
+            {
+              "name": "opinion1",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批意见一"
+            },
+            {
+              "name": "processTime1",
+              "type": "Date",
+              "isCollection": false,
+              "description": "审批日期一"
+            },
+            {
+              "name": "processPerson2",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人二"
+            },
+            {
+              "name": "processPersonUnit2",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人组织二"
+            },
+            {
+              "name": "processPersonTopUnit2",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批人顶层组织二"
+            },
+            {
+              "name": "opinion2",
+              "type": "String",
+              "isCollection": false,
+              "description": "审批意见二"
+            },
+            {
+              "name": "processTime2",
+              "type": "Date",
+              "isCollection": false,
+              "description": "审批日期二"
+            },
+            {
+              "name": "archiveTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "归档时间"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "AttendanceDetailAction",
+      "className": "com.x.attendance.assemble.control.jaxrs.attendancedetail.AttendanceDetailAction",
+      "description": "考勤打卡信息管理服务",
+      "methods": [
+        {
+          "name": "analyseAttendanceDetail",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancedetail.ActionAnalyseAttendanceDetail",
+          "description": "分析打卡数据",
+          "type": "GET",
+          "path": "jaxrs/attendancedetail/analyse/id/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "移动考勤打卡信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "analyseAttendanceDetails",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancedetail.ActionAnalyseAttendanceDetails",
+          "description": "分析打卡数据",
+          "type": "GET",
+          "path": "jaxrs/attendancedetail/analyse/{startDate}/{endDate}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "startDate",
+              "type": "String",
+              "description": "开始日期"
+            },
+            {
+              "name": "endDate",
+              "type": "String",
+              "description": "结束日期"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "archiveAttendanceDetail",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancedetail.ActionArchiveAttendanceDetail",
+          "description": "将指定的打卡记录归档",
+          "type": "GET",
+          "path": "jaxrs/attendancedetail/archive/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "移动考勤打卡信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "checkDetailWithPersonByCycle",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancedetail.ActionCheckWithPersonByCycle",
+          "description": "根据周期的年份月份,以及需要考勤人员的名单,检查人员在周期内每天的考核数据是否存在,如果不存在,则进行补齐",
+          "type": "GET",
+          "path": "jaxrs/attendancedetail/checkDetailWithPersonByCycle/{cycleYear}/{cycleMonth}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "cycleYear",
+              "type": "String",
+              "description": "统计周期年份"
+            },
+            {
+              "name": "cycleMonth",
+              "type": "String",
+              "description": "统计周期月份"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "delete",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancedetail.ActionDelete",
+          "description": "根据ID删除打卡信息记录",
+          "type": "DELETE",
+          "path": "jaxrs/attendancedetail/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "移动考勤打卡信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "get",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancedetail.ActionGet",
+          "description": "根据ID获取考勤打卡信息",
+          "type": "GET",
+          "path": "jaxrs/attendancedetail/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "移动考勤打卡信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "empNo",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工号"
+            },
+            {
+              "name": "empName",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工姓名"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "yearString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录年份"
+            },
+            {
+              "name": "monthString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录月份"
+            },
+            {
+              "name": "recordDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录日期字符串"
+            },
+            {
+              "name": "recordDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "打卡记录日期"
+            },
+            {
+              "name": "cycleYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计周期年份"
+            },
+            {
+              "name": "cycleMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计周期月份"
+            },
+            {
+              "name": "selfHolidayDayTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "请假时段:上午|下午|全天"
+            },
+            {
+              "name": "absentDayTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "缺勤时段:上午|下午|全天"
+            },
+            {
+              "name": "abnormalDutyDayTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "异常打卡时段:上午|下午|全天"
+            },
+            {
+              "name": "getSelfHolidayDays",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假天数: 0|0.5|1"
+            },
+            {
+              "name": "onWorkTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "上班时间"
+            },
+            {
+              "name": "offWorkTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "下班时间"
+            },
+            {
+              "name": "onDutyTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "上班打卡时间"
+            },
+            {
+              "name": "offDutyTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "下班打卡时间"
+            },
+            {
+              "name": "lateTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到时长"
+            },
+            {
+              "name": "leaveEarlierTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退时长"
+            },
+            {
+              "name": "workOvertimeTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "加班时长"
+            },
+            {
+              "name": "workTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "出勤时长"
+            },
+            {
+              "name": "attendance",
+              "type": "Double",
+              "isCollection": false,
+              "description": "出勤天数(0|0.5|1)"
+            },
+            {
+              "name": "absence",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤天数(0|0.5|1)"
+            },
+            {
+              "name": "recordStatus",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "记录状态:0-未分析 1-已分析"
+            },
+            {
+              "name": "batchName",
+              "type": "String",
+              "isCollection": false,
+              "description": "导入批次号:导入文件的ID"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "说明备注"
+            },
+            {
+              "name": "appealStatus",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "申诉状态:0-未申诉,1-申诉中,-1-申诉未通过,9-申诉通过"
+            },
+            {
+              "name": "appealReason",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉原因"
+            },
+            {
+              "name": "appealProcessor",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉处理人"
+            },
+            {
+              "name": "appealDescription",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉具体说明"
+            },
+            {
+              "name": "archiveTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "归档时间"
+            },
+            {
+              "name": "isHoliday",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否法定节假日"
+            },
+            {
+              "name": "isWorkday",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否调休工作日"
+            },
+            {
+              "name": "isGetSelfHolidays",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否休假"
+            },
+            {
+              "name": "isAbsent",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否缺勤"
+            },
+            {
+              "name": "isAbnormalDuty",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否异常打卡"
+            },
+            {
+              "name": "isLackOfTime",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否工时不足"
+            },
+            {
+              "name": "isWorkOvertime",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否加班"
+            },
+            {
+              "name": "isLeaveEarlier",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否早退"
+            },
+            {
+              "name": "isLate",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否迟到"
+            },
+            {
+              "name": "isWeekend",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否周末"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listAttendanceDetail",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancedetail.ActionListWithFilter",
+          "description": "获取指定年月的打卡数据列表",
+          "type": "PUT",
+          "path": "jaxrs/attendancedetail/filter/list",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "q_empName",
+              "type": "String",
+              "isCollection": false,
+              "description": "用于查询的人员:DistinguishedName.",
+              "isBaseType": true
+            },
+            {
+              "name": "q_year",
+              "type": "String",
+              "isCollection": false,
+              "description": "查询的年份.",
+              "isBaseType": true
+            },
+            {
+              "name": "q_month",
+              "type": "String",
+              "isCollection": false,
+              "description": "查询的月份.",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "empNo",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工号"
+            },
+            {
+              "name": "empName",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工姓名"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "yearString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录年份"
+            },
+            {
+              "name": "monthString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录月份"
+            },
+            {
+              "name": "recordDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录日期字符串"
+            },
+            {
+              "name": "recordDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "打卡记录日期"
+            },
+            {
+              "name": "cycleYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计周期年份"
+            },
+            {
+              "name": "cycleMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计周期月份"
+            },
+            {
+              "name": "selfHolidayDayTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "请假时段:上午|下午|全天"
+            },
+            {
+              "name": "absentDayTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "缺勤时段:上午|下午|全天"
+            },
+            {
+              "name": "abnormalDutyDayTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "异常打卡时段:上午|下午|全天"
+            },
+            {
+              "name": "getSelfHolidayDays",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假天数: 0|0.5|1"
+            },
+            {
+              "name": "onWorkTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "上班时间"
+            },
+            {
+              "name": "offWorkTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "下班时间"
+            },
+            {
+              "name": "onDutyTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "上班打卡时间"
+            },
+            {
+              "name": "offDutyTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "下班打卡时间"
+            },
+            {
+              "name": "lateTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到时长"
+            },
+            {
+              "name": "leaveEarlierTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退时长"
+            },
+            {
+              "name": "workOvertimeTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "加班时长"
+            },
+            {
+              "name": "workTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "出勤时长"
+            },
+            {
+              "name": "attendance",
+              "type": "Double",
+              "isCollection": false,
+              "description": "出勤天数(0|0.5|1)"
+            },
+            {
+              "name": "absence",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤天数(0|0.5|1)"
+            },
+            {
+              "name": "recordStatus",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "记录状态:0-未分析 1-已分析"
+            },
+            {
+              "name": "batchName",
+              "type": "String",
+              "isCollection": false,
+              "description": "导入批次号:导入文件的ID"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "说明备注"
+            },
+            {
+              "name": "appealStatus",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "申诉状态:0-未申诉,1-申诉中,-1-申诉未通过,9-申诉通过"
+            },
+            {
+              "name": "appealReason",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉原因"
+            },
+            {
+              "name": "appealProcessor",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉处理人"
+            },
+            {
+              "name": "appealDescription",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉具体说明"
+            },
+            {
+              "name": "archiveTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "归档时间"
+            },
+            {
+              "name": "isHoliday",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否法定节假日"
+            },
+            {
+              "name": "isWorkday",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否调休工作日"
+            },
+            {
+              "name": "isGetSelfHolidays",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否休假"
+            },
+            {
+              "name": "isAbsent",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否缺勤"
+            },
+            {
+              "name": "isAbnormalDuty",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否异常打卡"
+            },
+            {
+              "name": "isLackOfTime",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否工时不足"
+            },
+            {
+              "name": "isWorkOvertime",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否加班"
+            },
+            {
+              "name": "isLeaveEarlier",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否早退"
+            },
+            {
+              "name": "isLate",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否迟到"
+            },
+            {
+              "name": "isWeekend",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否周末"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listAttendanceDetailByBatchName",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancedetail.ActionListImportByFileName",
+          "description": "获取数据库中指定导入文件名称的数据列表",
+          "type": "GET",
+          "path": "jaxrs/attendancedetail/list/{file_id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "file_id",
+              "type": "String",
+              "description": "导入文件信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "empNo",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工号"
+            },
+            {
+              "name": "empName",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工姓名"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "yearString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录年份"
+            },
+            {
+              "name": "monthString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录月份"
+            },
+            {
+              "name": "recordDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录日期字符串"
+            },
+            {
+              "name": "recordDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "打卡记录日期"
+            },
+            {
+              "name": "cycleYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计周期年份"
+            },
+            {
+              "name": "cycleMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计周期月份"
+            },
+            {
+              "name": "selfHolidayDayTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "请假时段:上午|下午|全天"
+            },
+            {
+              "name": "absentDayTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "缺勤时段:上午|下午|全天"
+            },
+            {
+              "name": "abnormalDutyDayTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "异常打卡时段:上午|下午|全天"
+            },
+            {
+              "name": "getSelfHolidayDays",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假天数: 0|0.5|1"
+            },
+            {
+              "name": "onWorkTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "上班时间"
+            },
+            {
+              "name": "offWorkTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "下班时间"
+            },
+            {
+              "name": "onDutyTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "上班打卡时间"
+            },
+            {
+              "name": "offDutyTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "下班打卡时间"
+            },
+            {
+              "name": "lateTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到时长"
+            },
+            {
+              "name": "leaveEarlierTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退时长"
+            },
+            {
+              "name": "workOvertimeTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "加班时长"
+            },
+            {
+              "name": "workTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "出勤时长"
+            },
+            {
+              "name": "attendance",
+              "type": "Double",
+              "isCollection": false,
+              "description": "出勤天数(0|0.5|1)"
+            },
+            {
+              "name": "absence",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤天数(0|0.5|1)"
+            },
+            {
+              "name": "recordStatus",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "记录状态:0-未分析 1-已分析"
+            },
+            {
+              "name": "batchName",
+              "type": "String",
+              "isCollection": false,
+              "description": "导入批次号:导入文件的ID"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "说明备注"
+            },
+            {
+              "name": "appealStatus",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "申诉状态:0-未申诉,1-申诉中,-1-申诉未通过,9-申诉通过"
+            },
+            {
+              "name": "appealReason",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉原因"
+            },
+            {
+              "name": "appealProcessor",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉处理人"
+            },
+            {
+              "name": "appealDescription",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉具体说明"
+            },
+            {
+              "name": "archiveTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "归档时间"
+            },
+            {
+              "name": "isHoliday",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否法定节假日"
+            },
+            {
+              "name": "isWorkday",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否调休工作日"
+            },
+            {
+              "name": "isGetSelfHolidays",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否休假"
+            },
+            {
+              "name": "isAbsent",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否缺勤"
+            },
+            {
+              "name": "isAbnormalDuty",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否异常打卡"
+            },
+            {
+              "name": "isLackOfTime",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否工时不足"
+            },
+            {
+              "name": "isWorkOvertime",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否加班"
+            },
+            {
+              "name": "isLeaveEarlier",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否早退"
+            },
+            {
+              "name": "isLate",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否迟到"
+            },
+            {
+              "name": "isWeekend",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否周末"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listNextWithFilter",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancedetail.ActionListNextWithFilter",
+          "description": "列示符合过滤条件的打卡记录归档",
+          "type": "PUT",
+          "path": "jaxrs/attendancedetail/filter/list/{id}/next/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": true,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "最后一条信息ID"
+            },
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "每页显示的条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "empNo",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工号"
+            },
+            {
+              "name": "empName",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工姓名"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "yearString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录年份"
+            },
+            {
+              "name": "monthString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录月份"
+            },
+            {
+              "name": "recordDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录日期字符串"
+            },
+            {
+              "name": "recordDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "打卡记录日期"
+            },
+            {
+              "name": "cycleYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计周期年份"
+            },
+            {
+              "name": "cycleMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计周期月份"
+            },
+            {
+              "name": "selfHolidayDayTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "请假时段:上午|下午|全天"
+            },
+            {
+              "name": "absentDayTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "缺勤时段:上午|下午|全天"
+            },
+            {
+              "name": "abnormalDutyDayTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "异常打卡时段:上午|下午|全天"
+            },
+            {
+              "name": "getSelfHolidayDays",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假天数: 0|0.5|1"
+            },
+            {
+              "name": "onWorkTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "上班时间"
+            },
+            {
+              "name": "offWorkTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "下班时间"
+            },
+            {
+              "name": "onDutyTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "上班打卡时间"
+            },
+            {
+              "name": "offDutyTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "下班打卡时间"
+            },
+            {
+              "name": "lateTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到时长"
+            },
+            {
+              "name": "leaveEarlierTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退时长"
+            },
+            {
+              "name": "workOvertimeTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "加班时长"
+            },
+            {
+              "name": "workTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "出勤时长"
+            },
+            {
+              "name": "attendance",
+              "type": "Double",
+              "isCollection": false,
+              "description": "出勤天数(0|0.5|1)"
+            },
+            {
+              "name": "absence",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤天数(0|0.5|1)"
+            },
+            {
+              "name": "recordStatus",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "记录状态:0-未分析 1-已分析"
+            },
+            {
+              "name": "batchName",
+              "type": "String",
+              "isCollection": false,
+              "description": "导入批次号:导入文件的ID"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "说明备注"
+            },
+            {
+              "name": "appealStatus",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "申诉状态:0-未申诉,1-申诉中,-1-申诉未通过,9-申诉通过"
+            },
+            {
+              "name": "appealReason",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉原因"
+            },
+            {
+              "name": "appealProcessor",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉处理人"
+            },
+            {
+              "name": "appealDescription",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉具体说明"
+            },
+            {
+              "name": "archiveTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "归档时间"
+            },
+            {
+              "name": "isHoliday",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否法定节假日"
+            },
+            {
+              "name": "isWorkday",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否调休工作日"
+            },
+            {
+              "name": "isGetSelfHolidays",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否休假"
+            },
+            {
+              "name": "isAbsent",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否缺勤"
+            },
+            {
+              "name": "isAbnormalDuty",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否异常打卡"
+            },
+            {
+              "name": "isLackOfTime",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否工时不足"
+            },
+            {
+              "name": "isWorkOvertime",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否加班"
+            },
+            {
+              "name": "isLeaveEarlier",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否早退"
+            },
+            {
+              "name": "isLate",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否迟到"
+            },
+            {
+              "name": "isWeekend",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否周末"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listPrevWithFilter",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancedetail.ActionListPrevWithFilter",
+          "description": "列示符合过滤条件的打卡记录归档",
+          "type": "PUT",
+          "path": "jaxrs/attendancedetail/filter/list/{id}/prev/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": true,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "最后一条信息ID"
+            },
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "每页显示的条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "empNo",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工号"
+            },
+            {
+              "name": "empName",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工姓名"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "yearString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录年份"
+            },
+            {
+              "name": "monthString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录月份"
+            },
+            {
+              "name": "recordDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录日期字符串"
+            },
+            {
+              "name": "recordDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "打卡记录日期"
+            },
+            {
+              "name": "cycleYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计周期年份"
+            },
+            {
+              "name": "cycleMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计周期月份"
+            },
+            {
+              "name": "selfHolidayDayTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "请假时段:上午|下午|全天"
+            },
+            {
+              "name": "absentDayTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "缺勤时段:上午|下午|全天"
+            },
+            {
+              "name": "abnormalDutyDayTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "异常打卡时段:上午|下午|全天"
+            },
+            {
+              "name": "getSelfHolidayDays",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假天数: 0|0.5|1"
+            },
+            {
+              "name": "onWorkTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "上班时间"
+            },
+            {
+              "name": "offWorkTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "下班时间"
+            },
+            {
+              "name": "onDutyTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "上班打卡时间"
+            },
+            {
+              "name": "offDutyTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "下班打卡时间"
+            },
+            {
+              "name": "lateTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到时长"
+            },
+            {
+              "name": "leaveEarlierTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退时长"
+            },
+            {
+              "name": "workOvertimeTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "加班时长"
+            },
+            {
+              "name": "workTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "出勤时长"
+            },
+            {
+              "name": "attendance",
+              "type": "Double",
+              "isCollection": false,
+              "description": "出勤天数(0|0.5|1)"
+            },
+            {
+              "name": "absence",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤天数(0|0.5|1)"
+            },
+            {
+              "name": "recordStatus",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "记录状态:0-未分析 1-已分析"
+            },
+            {
+              "name": "batchName",
+              "type": "String",
+              "isCollection": false,
+              "description": "导入批次号:导入文件的ID"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "说明备注"
+            },
+            {
+              "name": "appealStatus",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "申诉状态:0-未申诉,1-申诉中,-1-申诉未通过,9-申诉通过"
+            },
+            {
+              "name": "appealReason",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉原因"
+            },
+            {
+              "name": "appealProcessor",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉处理人"
+            },
+            {
+              "name": "appealDescription",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉具体说明"
+            },
+            {
+              "name": "archiveTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "归档时间"
+            },
+            {
+              "name": "isHoliday",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否法定节假日"
+            },
+            {
+              "name": "isWorkday",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否调休工作日"
+            },
+            {
+              "name": "isGetSelfHolidays",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否休假"
+            },
+            {
+              "name": "isAbsent",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否缺勤"
+            },
+            {
+              "name": "isAbnormalDuty",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否异常打卡"
+            },
+            {
+              "name": "isLackOfTime",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否工时不足"
+            },
+            {
+              "name": "isWorkOvertime",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否加班"
+            },
+            {
+              "name": "isLeaveEarlier",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否早退"
+            },
+            {
+              "name": "isLate",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否迟到"
+            },
+            {
+              "name": "isWeekend",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否周末"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listTopUnitAttendanceDetail",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancedetail.ActionListWithTopUnit",
+          "description": "获取顶层组织指定年月的打卡数据列表",
+          "type": "PUT",
+          "path": "jaxrs/attendancedetail/filter/list/topUnit",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "empNo",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工号"
+            },
+            {
+              "name": "empName",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工姓名"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "yearString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录年份"
+            },
+            {
+              "name": "monthString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录月份"
+            },
+            {
+              "name": "recordDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录日期字符串"
+            },
+            {
+              "name": "recordDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "打卡记录日期"
+            },
+            {
+              "name": "cycleYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计周期年份"
+            },
+            {
+              "name": "cycleMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计周期月份"
+            },
+            {
+              "name": "selfHolidayDayTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "请假时段:上午|下午|全天"
+            },
+            {
+              "name": "absentDayTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "缺勤时段:上午|下午|全天"
+            },
+            {
+              "name": "abnormalDutyDayTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "异常打卡时段:上午|下午|全天"
+            },
+            {
+              "name": "getSelfHolidayDays",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假天数: 0|0.5|1"
+            },
+            {
+              "name": "onWorkTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "上班时间"
+            },
+            {
+              "name": "offWorkTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "下班时间"
+            },
+            {
+              "name": "onDutyTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "上班打卡时间"
+            },
+            {
+              "name": "offDutyTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "下班打卡时间"
+            },
+            {
+              "name": "lateTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到时长"
+            },
+            {
+              "name": "leaveEarlierTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退时长"
+            },
+            {
+              "name": "workOvertimeTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "加班时长"
+            },
+            {
+              "name": "workTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "出勤时长"
+            },
+            {
+              "name": "attendance",
+              "type": "Double",
+              "isCollection": false,
+              "description": "出勤天数(0|0.5|1)"
+            },
+            {
+              "name": "absence",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤天数(0|0.5|1)"
+            },
+            {
+              "name": "recordStatus",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "记录状态:0-未分析 1-已分析"
+            },
+            {
+              "name": "batchName",
+              "type": "String",
+              "isCollection": false,
+              "description": "导入批次号:导入文件的ID"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "说明备注"
+            },
+            {
+              "name": "appealStatus",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "申诉状态:0-未申诉,1-申诉中,-1-申诉未通过,9-申诉通过"
+            },
+            {
+              "name": "appealReason",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉原因"
+            },
+            {
+              "name": "appealProcessor",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉处理人"
+            },
+            {
+              "name": "appealDescription",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉具体说明"
+            },
+            {
+              "name": "archiveTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "归档时间"
+            },
+            {
+              "name": "isHoliday",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否法定节假日"
+            },
+            {
+              "name": "isWorkday",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否调休工作日"
+            },
+            {
+              "name": "isGetSelfHolidays",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否休假"
+            },
+            {
+              "name": "isAbsent",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否缺勤"
+            },
+            {
+              "name": "isAbnormalDuty",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否异常打卡"
+            },
+            {
+              "name": "isLackOfTime",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否工时不足"
+            },
+            {
+              "name": "isWorkOvertime",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否加班"
+            },
+            {
+              "name": "isLeaveEarlier",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否早退"
+            },
+            {
+              "name": "isLate",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否迟到"
+            },
+            {
+              "name": "isWeekend",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否周末"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listUnitAttendanceDetail",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancedetail.ActionListWithUnit",
+          "description": "获取组织指定年月的打卡数据列表",
+          "type": "PUT",
+          "path": "jaxrs/attendancedetail/filter/list/unit",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "empNo",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工号"
+            },
+            {
+              "name": "empName",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工姓名"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "yearString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录年份"
+            },
+            {
+              "name": "monthString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录月份"
+            },
+            {
+              "name": "recordDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录日期字符串"
+            },
+            {
+              "name": "recordDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "打卡记录日期"
+            },
+            {
+              "name": "cycleYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计周期年份"
+            },
+            {
+              "name": "cycleMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计周期月份"
+            },
+            {
+              "name": "selfHolidayDayTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "请假时段:上午|下午|全天"
+            },
+            {
+              "name": "absentDayTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "缺勤时段:上午|下午|全天"
+            },
+            {
+              "name": "abnormalDutyDayTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "异常打卡时段:上午|下午|全天"
+            },
+            {
+              "name": "getSelfHolidayDays",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假天数: 0|0.5|1"
+            },
+            {
+              "name": "onWorkTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "上班时间"
+            },
+            {
+              "name": "offWorkTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "下班时间"
+            },
+            {
+              "name": "onDutyTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "上班打卡时间"
+            },
+            {
+              "name": "offDutyTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "下班打卡时间"
+            },
+            {
+              "name": "lateTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到时长"
+            },
+            {
+              "name": "leaveEarlierTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退时长"
+            },
+            {
+              "name": "workOvertimeTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "加班时长"
+            },
+            {
+              "name": "workTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "出勤时长"
+            },
+            {
+              "name": "attendance",
+              "type": "Double",
+              "isCollection": false,
+              "description": "出勤天数(0|0.5|1)"
+            },
+            {
+              "name": "absence",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤天数(0|0.5|1)"
+            },
+            {
+              "name": "recordStatus",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "记录状态:0-未分析 1-已分析"
+            },
+            {
+              "name": "batchName",
+              "type": "String",
+              "isCollection": false,
+              "description": "导入批次号:导入文件的ID"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "说明备注"
+            },
+            {
+              "name": "appealStatus",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "申诉状态:0-未申诉,1-申诉中,-1-申诉未通过,9-申诉通过"
+            },
+            {
+              "name": "appealReason",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉原因"
+            },
+            {
+              "name": "appealProcessor",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉处理人"
+            },
+            {
+              "name": "appealDescription",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉具体说明"
+            },
+            {
+              "name": "archiveTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "归档时间"
+            },
+            {
+              "name": "isHoliday",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否法定节假日"
+            },
+            {
+              "name": "isWorkday",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否调休工作日"
+            },
+            {
+              "name": "isGetSelfHolidays",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否休假"
+            },
+            {
+              "name": "isAbsent",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否缺勤"
+            },
+            {
+              "name": "isAbnormalDuty",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否异常打卡"
+            },
+            {
+              "name": "isLackOfTime",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否工时不足"
+            },
+            {
+              "name": "isWorkOvertime",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否加班"
+            },
+            {
+              "name": "isLeaveEarlier",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否早退"
+            },
+            {
+              "name": "isLate",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否迟到"
+            },
+            {
+              "name": "isWeekend",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否周末"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listUserAttendanceDetail",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancedetail.ActionListWithEmployee",
+          "description": "获取用户指定年月的打卡数据列表",
+          "type": "PUT",
+          "path": "jaxrs/attendancedetail/filter/list/user",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "empNo",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工号"
+            },
+            {
+              "name": "empName",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工姓名"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "yearString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录年份"
+            },
+            {
+              "name": "monthString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录月份"
+            },
+            {
+              "name": "recordDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录日期字符串"
+            },
+            {
+              "name": "recordDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "打卡记录日期"
+            },
+            {
+              "name": "cycleYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计周期年份"
+            },
+            {
+              "name": "cycleMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计周期月份"
+            },
+            {
+              "name": "selfHolidayDayTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "请假时段:上午|下午|全天"
+            },
+            {
+              "name": "absentDayTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "缺勤时段:上午|下午|全天"
+            },
+            {
+              "name": "abnormalDutyDayTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "异常打卡时段:上午|下午|全天"
+            },
+            {
+              "name": "getSelfHolidayDays",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假天数: 0|0.5|1"
+            },
+            {
+              "name": "onWorkTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "上班时间"
+            },
+            {
+              "name": "offWorkTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "下班时间"
+            },
+            {
+              "name": "onDutyTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "上班打卡时间"
+            },
+            {
+              "name": "offDutyTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "下班打卡时间"
+            },
+            {
+              "name": "lateTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到时长"
+            },
+            {
+              "name": "leaveEarlierTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退时长"
+            },
+            {
+              "name": "workOvertimeTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "加班时长"
+            },
+            {
+              "name": "workTimeDuration",
+              "type": "Long",
+              "isCollection": false,
+              "description": "出勤时长"
+            },
+            {
+              "name": "attendance",
+              "type": "Double",
+              "isCollection": false,
+              "description": "出勤天数(0|0.5|1)"
+            },
+            {
+              "name": "absence",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤天数(0|0.5|1)"
+            },
+            {
+              "name": "recordStatus",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "记录状态:0-未分析 1-已分析"
+            },
+            {
+              "name": "batchName",
+              "type": "String",
+              "isCollection": false,
+              "description": "导入批次号:导入文件的ID"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "说明备注"
+            },
+            {
+              "name": "appealStatus",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "申诉状态:0-未申诉,1-申诉中,-1-申诉未通过,9-申诉通过"
+            },
+            {
+              "name": "appealReason",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉原因"
+            },
+            {
+              "name": "appealProcessor",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉处理人"
+            },
+            {
+              "name": "appealDescription",
+              "type": "String",
+              "isCollection": false,
+              "description": "申诉具体说明"
+            },
+            {
+              "name": "archiveTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "归档时间"
+            },
+            {
+              "name": "isHoliday",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否法定节假日"
+            },
+            {
+              "name": "isWorkday",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否调休工作日"
+            },
+            {
+              "name": "isGetSelfHolidays",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否休假"
+            },
+            {
+              "name": "isAbsent",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否缺勤"
+            },
+            {
+              "name": "isAbnormalDuty",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否异常打卡"
+            },
+            {
+              "name": "isLackOfTime",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否工时不足"
+            },
+            {
+              "name": "isWorkOvertime",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否加班"
+            },
+            {
+              "name": "isLeaveEarlier",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否早退"
+            },
+            {
+              "name": "isLate",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否迟到"
+            },
+            {
+              "name": "isWeekend",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否周末"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "recive",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancedetail.ActionReciveAttendance",
+          "description": "接入完成的上下班打卡信息记录,接入完成后直接分析",
+          "type": "POST",
+          "path": "jaxrs/attendancedetail/recive",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "AttendanceDetailFileImportAction",
+      "className": "com.x.attendance.assemble.control.jaxrs.fileimport.AttendanceDetailFileImportAction",
+      "description": "考勤数据导入服务",
+      "methods": [
+        {
+          "name": "getStatus",
+          "className": "com.x.attendance.assemble.control.jaxrs.fileimport.ActionGetFileOptStatusWithFile",
+          "description": "获取指定导入文件的操作状态",
+          "type": "GET",
+          "path": "jaxrs/fileimport/getStatus/{file_id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "file_id",
+              "type": "String",
+              "description": "导入文件信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": []
+        },
+        {
+          "name": "getStatusAll",
+          "className": "com.x.attendance.assemble.control.jaxrs.fileimport.ActionGetSystemImportOptStatus",
+          "description": "获取系统的导入文件操作状态",
+          "type": "GET",
+          "path": "jaxrs/fileimport/getStatus/all",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": []
+        },
+        {
+          "name": "getStatusDetail",
+          "className": "com.x.attendance.assemble.control.jaxrs.fileimport.ActionGetFileOptStatusWithFile",
+          "description": "获取指定导入文件的操作状态,包括检查数据列表",
+          "type": "GET",
+          "path": "jaxrs/fileimport/getStatus/{file_id}/detail",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "file_id",
+              "type": "String",
+              "description": "导入文件信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": []
+        }
+      ]
+    },
+    {
+      "name": "AttendanceDetailMobileAction",
+      "className": "com.x.attendance.assemble.control.jaxrs.attendancedetail.AttendanceDetailMobileAction",
+      "description": "移动考勤打卡信息管理服务",
+      "methods": [
+        {
+          "name": "delete",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancedetail.ActionDeleteMobile",
+          "description": "根据ID删除移动打卡信息",
+          "type": "DELETE",
+          "path": "jaxrs/attendancedetail/mobile/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "移动考勤打卡信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "get",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancedetail.ActionGetMobile",
+          "description": "根据ID获取移动打卡信息记录",
+          "type": "GET",
+          "path": "jaxrs/attendancedetail/mobile/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "移动考勤打卡信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "empNo",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工号"
+            },
+            {
+              "name": "empName",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工姓名"
+            },
+            {
+              "name": "recordDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录日期字符串"
+            },
+            {
+              "name": "recordDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "打卡记录日期"
+            },
+            {
+              "name": "signTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡时间"
+            },
+            {
+              "name": "signDescription",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡说明"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "其他说明备注"
+            },
+            {
+              "name": "recordAddress",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡地点描述"
+            },
+            {
+              "name": "longitude",
+              "type": "String",
+              "isCollection": false,
+              "description": "经度"
+            },
+            {
+              "name": "latitude",
+              "type": "String",
+              "isCollection": false,
+              "description": "纬度"
+            },
+            {
+              "name": "optMachineType",
+              "type": "String",
+              "isCollection": false,
+              "description": "操作设备类别:手机品牌|PAD|PC|其他"
+            },
+            {
+              "name": "optSystemName",
+              "type": "String",
+              "isCollection": false,
+              "description": "操作设备类别:Mac|Windows|IOS|Android|其他"
+            },
+            {
+              "name": "recordStatus",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "记录状态:0-未分析 1-已分析"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listDataForMobile",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancedetail.ActionListMobileWithFilter",
+          "description": "移动打卡信息记录明细查询",
+          "type": "PUT",
+          "path": "jaxrs/attendancedetail/mobile/filter/list/page/{page}/count/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "page",
+              "type": "Integer",
+              "description": "需要显示的页码"
+            },
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "每页需要显示的条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "empNo",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工号,根据员工号查询记录",
+              "isBaseType": true
+            },
+            {
+              "name": "empName",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工姓名,根据员工姓名查询记录.",
+              "isBaseType": true
+            },
+            {
+              "name": "startDate",
+              "type": "String",
+              "isCollection": false,
+              "description": "开始日期:yyyy-mm-dd.",
+              "isBaseType": true
+            },
+            {
+              "name": "endDate",
+              "type": "String",
+              "isCollection": false,
+              "description": "结束日期:yyyy-mm-dd,如果开始日期填写,结束日期不填写就是只查询开始日期那一天",
+              "isBaseType": true
+            },
+            {
+              "name": "signDescription",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡说明:上班打卡,下班打卡.",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "empNo",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工号"
+            },
+            {
+              "name": "empName",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工姓名"
+            },
+            {
+              "name": "recordDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录日期字符串"
+            },
+            {
+              "name": "recordDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "打卡记录日期"
+            },
+            {
+              "name": "signTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡时间"
+            },
+            {
+              "name": "signDescription",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡说明"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "其他说明备注"
+            },
+            {
+              "name": "recordAddress",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡地点描述"
+            },
+            {
+              "name": "longitude",
+              "type": "String",
+              "isCollection": false,
+              "description": "经度"
+            },
+            {
+              "name": "latitude",
+              "type": "String",
+              "isCollection": false,
+              "description": "纬度"
+            },
+            {
+              "name": "optMachineType",
+              "type": "String",
+              "isCollection": false,
+              "description": "操作设备类别:手机品牌|PAD|PC|其他"
+            },
+            {
+              "name": "optSystemName",
+              "type": "String",
+              "isCollection": false,
+              "description": "操作设备类别:Mac|Windows|IOS|Android|其他"
+            },
+            {
+              "name": "recordStatus",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "记录状态:0-未分析 1-已分析"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "reciveForMobile",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancedetail.ActionReciveAttendanceMobile",
+          "description": "移动打卡信息接入,移动端特点,会多次接入,部分接入,一次接入的信息不完整,接入完成后不直接进行分析",
+          "type": "POST",
+          "path": "jaxrs/attendancedetail/mobile/recive",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "Id, 可以为空.",
+              "isBaseType": true
+            },
+            {
+              "name": "empNo",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工号, 可以为空.",
+              "isBaseType": true
+            },
+            {
+              "name": "empName",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工姓名, 必须填写.",
+              "isBaseType": true
+            },
+            {
+              "name": "recordDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡记录日期字符串:yyyy-mm-dd, 必须填写.",
+              "isBaseType": true
+            },
+            {
+              "name": "signTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡时间: hh24:mi:ss, 必须填写.",
+              "isBaseType": true
+            },
+            {
+              "name": "signDescription",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡说明:上班打卡,下班打卡, 可以为空.",
+              "isBaseType": true
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "其他说明备注, 可以为空.",
+              "isBaseType": true
+            },
+            {
+              "name": "recordAddress",
+              "type": "String",
+              "isCollection": false,
+              "description": "打卡地点描述, 可以为空.",
+              "isBaseType": true
+            },
+            {
+              "name": "longitude",
+              "type": "String",
+              "isCollection": false,
+              "description": "经度, 可以为空.",
+              "isBaseType": true
+            },
+            {
+              "name": "latitude",
+              "type": "String",
+              "isCollection": false,
+              "description": "纬度, 可以为空.",
+              "isBaseType": true
+            },
+            {
+              "name": "optMachineType",
+              "type": "String",
+              "isCollection": false,
+              "description": "操作设备类别:手机品牌|PAD|PC|其他, 可以为空.",
+              "isBaseType": true
+            },
+            {
+              "name": "optSystemName",
+              "type": "String",
+              "isCollection": false,
+              "description": "操作设备类别:Mac|Windows|IOS|Android|其他, 可以为空.",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "AttendanceEmployeeConfigAction",
+      "className": "com.x.attendance.assemble.control.jaxrs.attendanceemployeeconfig.AttendanceEmployeeConfigAction",
+      "description": "考勤人员配置信息管理服务",
+      "methods": [
+        {
+          "name": "delete",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceemployeeconfig.ActionDelete",
+          "description": "根据ID删除考勤人员配置信息",
+          "type": "DELETE",
+          "path": "jaxrs/attendanceemployeeconfig/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "考勤人员配置信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "get",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceemployeeconfig.ActionGet",
+          "description": "根据ID获取考勤人员配置信息",
+          "type": "GET",
+          "path": "jaxrs/attendanceemployeeconfig/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "考勤人员配置信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "topUnitOu",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织编号"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "unitOu",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织编号"
+            },
+            {
+              "name": "employeeName",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工姓名"
+            },
+            {
+              "name": "employeeNumber",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工号"
+            },
+            {
+              "name": "empInTopUnitTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工入职时间"
+            },
+            {
+              "name": "configType",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置类型:REQUIRED(需要考勤)|NOTREQUIRED(不需要考勤)"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listAllAttendanceEmployeeConfig",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceemployeeconfig.ActionListAll",
+          "description": "获取所有考勤人员配置信息",
+          "type": "GET",
+          "path": "jaxrs/attendanceemployeeconfig/list/all",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "topUnitOu",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织编号"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "unitOu",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织编号"
+            },
+            {
+              "name": "employeeName",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工姓名"
+            },
+            {
+              "name": "employeeNumber",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工号"
+            },
+            {
+              "name": "empInTopUnitTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工入职时间"
+            },
+            {
+              "name": "configType",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置类型:REQUIRED(需要考勤)|NOTREQUIRED(不需要考勤)"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "post",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceemployeeconfig.ActionSave",
+          "description": "新建或者更新考勤人员配置信息",
+          "type": "POST",
+          "path": "jaxrs/attendanceemployeeconfig",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称",
+              "isBaseType": true
+            },
+            {
+              "name": "topUnitOu",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织编号",
+              "isBaseType": true
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称",
+              "isBaseType": true
+            },
+            {
+              "name": "unitOu",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织编号",
+              "isBaseType": true
+            },
+            {
+              "name": "employeeName",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工姓名",
+              "isBaseType": true
+            },
+            {
+              "name": "employeeNumber",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工号",
+              "isBaseType": true
+            },
+            {
+              "name": "empInTopUnitTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工入职时间",
+              "isBaseType": true
+            },
+            {
+              "name": "configType",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置类型:REQUIRED(需要考勤)|NOTREQUIRED(不需要考勤)",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "AttendanceImportFileInfoAction",
+      "className": "com.x.attendance.assemble.control.jaxrs.attendanceimportfileinfo.AttendanceImportFileInfoAction",
+      "description": "导入文件信息管理服务",
+      "methods": [
+        {
+          "name": "delete",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceimportfileinfo.ActionDelete",
+          "description": "根据ID删除已经上传成功的文件以及文件信息",
+          "type": "DELETE",
+          "path": "jaxrs/attendanceimportfileinfo/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "导入文件信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "get",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceimportfileinfo.ActionListAll",
+          "description": "根据ID获取已经上传成功的文件信息",
+          "type": "GET",
+          "path": "jaxrs/attendanceimportfileinfo/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "导入文件信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "lastUpdateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "最后更新时间"
+            },
+            {
+              "name": "fileName",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件真实名称"
+            },
+            {
+              "name": "name",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件真实名称"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件说明"
+            },
+            {
+              "name": "creatorUid",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建者UID"
+            },
+            {
+              "name": "extension",
+              "type": "String",
+              "isCollection": false,
+              "description": "扩展名"
+            },
+            {
+              "name": "length",
+              "type": "Long",
+              "isCollection": false,
+              "description": "文件大小."
+            },
+            {
+              "name": "rowCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "记录行数."
+            },
+            {
+              "name": "fileStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件状态:new|imported."
+            },
+            {
+              "name": "tempFilePath",
+              "type": "String",
+              "isCollection": false,
+              "description": "临时文件地址"
+            },
+            {
+              "name": "currentProcessName",
+              "type": "String",
+              "isCollection": false,
+              "description": "当前数据处理操作步骤:GETDATA|CHECKDATA|SAVEDATA|SUPPLEMENT|ANALYSIS"
+            },
+            {
+              "name": "validateOk",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "数据校验结果"
+            },
+            {
+              "name": "processing",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "数据操作状态"
+            },
+            {
+              "name": "recordTotle",
+              "type": "Long",
+              "isCollection": false,
+              "description": "数据总量"
+            },
+            {
+              "name": "processCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "当前数据操作数量"
+            },
+            {
+              "name": "startDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "数据开始日期"
+            },
+            {
+              "name": "endDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "数据结束日期"
+            },
+            {
+              "name": "site",
+              "type": "String",
+              "isCollection": false,
+              "description": "附件框分类."
+            },
+            {
+              "name": "distributeFactor",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "分布式存储标识位."
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "sequence",
+              "type": "String",
+              "isCollection": false,
+              "description": "列表序号,由创建时间以及ID组成.在保存时自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listAllAttendanceImportFileInfo",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceimportfileinfo.ActionListAll",
+          "description": "获取所有已经上传成功的文件列表",
+          "type": "GET",
+          "path": "jaxrs/attendanceimportfileinfo/list/all",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "lastUpdateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "最后更新时间"
+            },
+            {
+              "name": "fileName",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件真实名称"
+            },
+            {
+              "name": "name",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件真实名称"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件说明"
+            },
+            {
+              "name": "creatorUid",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建者UID"
+            },
+            {
+              "name": "extension",
+              "type": "String",
+              "isCollection": false,
+              "description": "扩展名"
+            },
+            {
+              "name": "length",
+              "type": "Long",
+              "isCollection": false,
+              "description": "文件大小."
+            },
+            {
+              "name": "rowCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "记录行数."
+            },
+            {
+              "name": "fileStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件状态:new|imported."
+            },
+            {
+              "name": "tempFilePath",
+              "type": "String",
+              "isCollection": false,
+              "description": "临时文件地址"
+            },
+            {
+              "name": "currentProcessName",
+              "type": "String",
+              "isCollection": false,
+              "description": "当前数据处理操作步骤:GETDATA|CHECKDATA|SAVEDATA|SUPPLEMENT|ANALYSIS"
+            },
+            {
+              "name": "validateOk",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "数据校验结果"
+            },
+            {
+              "name": "processing",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "数据操作状态"
+            },
+            {
+              "name": "recordTotle",
+              "type": "Long",
+              "isCollection": false,
+              "description": "数据总量"
+            },
+            {
+              "name": "processCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "当前数据操作数量"
+            },
+            {
+              "name": "startDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "数据开始日期"
+            },
+            {
+              "name": "endDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "数据结束日期"
+            },
+            {
+              "name": "site",
+              "type": "String",
+              "isCollection": false,
+              "description": "附件框分类."
+            },
+            {
+              "name": "distributeFactor",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "分布式存储标识位."
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "sequence",
+              "type": "String",
+              "isCollection": false,
+              "description": "列表序号,由创建时间以及ID组成.在保存时自动生成,索引创建在约束中."
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "AttendanceScheduleSettingAction",
+      "className": "com.x.attendance.assemble.control.jaxrs.attendanceschedulesetting.AttendanceScheduleSettingAction",
+      "description": "考勤时间配置信息管理服务",
+      "methods": [
+        {
+          "name": "delete",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceschedulesetting.ActionDelete",
+          "description": "根据ID删除考勤时间配置信息",
+          "type": "DELETE",
+          "path": "jaxrs/attendanceschedulesetting/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "考勤时间配置信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "get",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceschedulesetting.ActionGet",
+          "description": "根据ID获取考勤时间配置信息",
+          "type": "GET",
+          "path": "jaxrs/attendanceschedulesetting/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "考勤时间配置信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "unitOu",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织编号"
+            },
+            {
+              "name": "onDutyTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "上班时间"
+            },
+            {
+              "name": "offDutyTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "下班时间"
+            },
+            {
+              "name": "lateStartTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "迟到起算时间"
+            },
+            {
+              "name": "absenceStartTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "缺勤起算时间"
+            },
+            {
+              "name": "leaveEarlyStartTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "早退起算时间"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listAllAttendanceScheduleSetting",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceschedulesetting.ActionListAll",
+          "description": "获取所有考勤时间配置信息列表",
+          "type": "GET",
+          "path": "jaxrs/attendanceschedulesetting/list/all",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "unitOu",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织编号"
+            },
+            {
+              "name": "onDutyTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "上班时间"
+            },
+            {
+              "name": "offDutyTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "下班时间"
+            },
+            {
+              "name": "lateStartTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "迟到起算时间"
+            },
+            {
+              "name": "absenceStartTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "缺勤起算时间"
+            },
+            {
+              "name": "leaveEarlyStartTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "早退起算时间"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listAttendanceScheduleSettingByTopUnit",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceschedulesetting.ActionListByTopUnit",
+          "description": "根据顶层组织名称获取所有考勤时间配置信息列表",
+          "type": "GET",
+          "path": "jaxrs/attendanceschedulesetting/list/topUnit/{name}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "name",
+              "type": "String",
+              "description": "顶层组织名称"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "unitOu",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织编号"
+            },
+            {
+              "name": "onDutyTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "上班时间"
+            },
+            {
+              "name": "offDutyTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "下班时间"
+            },
+            {
+              "name": "lateStartTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "迟到起算时间"
+            },
+            {
+              "name": "absenceStartTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "缺勤起算时间"
+            },
+            {
+              "name": "leaveEarlyStartTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "早退起算时间"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listAttendanceScheduleSettingByUnit",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceschedulesetting.ActionListByUnit",
+          "description": "根据组织名称获取所有考勤时间配置信息",
+          "type": "GET",
+          "path": "jaxrs/attendanceschedulesetting/list/unit/{name}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "name",
+              "type": "String",
+              "description": "组织名称"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "unitOu",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织编号"
+            },
+            {
+              "name": "onDutyTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "上班时间"
+            },
+            {
+              "name": "offDutyTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "下班时间"
+            },
+            {
+              "name": "lateStartTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "迟到起算时间"
+            },
+            {
+              "name": "absenceStartTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "缺勤起算时间"
+            },
+            {
+              "name": "leaveEarlyStartTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "早退起算时间"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "post",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceschedulesetting.ActionSave",
+          "description": "新建或者更新考勤时间配置信息",
+          "type": "POST",
+          "path": "jaxrs/attendanceschedulesetting",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称",
+              "isBaseType": true
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称",
+              "isBaseType": true
+            },
+            {
+              "name": "unitOu",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织编号",
+              "isBaseType": true
+            },
+            {
+              "name": "onDutyTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "上班时间",
+              "isBaseType": true
+            },
+            {
+              "name": "offDutyTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "下班时间",
+              "isBaseType": true
+            },
+            {
+              "name": "lateStartTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "迟到起算时间",
+              "isBaseType": true
+            },
+            {
+              "name": "absenceStartTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "缺勤起算时间",
+              "isBaseType": true
+            },
+            {
+              "name": "leaveEarlyStartTime",
+              "type": "String",
+              "isCollection": false,
+              "description": "早退起算时间",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "AttendanceSelfHolidayAction",
+      "className": "com.x.attendance.assemble.control.jaxrs.selfholiday.AttendanceSelfHolidayAction",
+      "description": "员工休假申请信息管理服务",
+      "methods": [
+        {
+          "name": "delete",
+          "className": "com.x.attendance.assemble.control.jaxrs.selfholiday.ActionDelete",
+          "description": "根据ID删除员工休假申请信息信息",
+          "type": "DELETE",
+          "path": "jaxrs/attendanceselfholiday/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "员工请假信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "listAllAttendanceSelfHoliday",
+          "className": "com.x.attendance.assemble.control.jaxrs.selfholiday.ActionListAll",
+          "description": "获取所有员工休假申请信息信息",
+          "type": "GET",
+          "path": "jaxrs/attendanceselfholiday/list/all",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "docId",
+              "type": "String",
+              "isCollection": false,
+              "description": "流程WorkId"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "topUnitOu",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织编号"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "unitOu",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织编号"
+            },
+            {
+              "name": "employeeName",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工姓名"
+            },
+            {
+              "name": "employeeNumber",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工号"
+            },
+            {
+              "name": "leaveType",
+              "type": "String",
+              "isCollection": false,
+              "description": "请假类型:带薪年休假|带薪病假|带薪福利假|扣薪事假|其他"
+            },
+            {
+              "name": "startTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "开始时间"
+            },
+            {
+              "name": "endTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "结束时间"
+            },
+            {
+              "name": "leaveDayNumber",
+              "type": "Double",
+              "isCollection": false,
+              "description": "请假天数"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "请假说明"
+            },
+            {
+              "name": "batchFlag",
+              "type": "String",
+              "isCollection": false,
+              "description": "录入批次标识:可以填写流程workId,jobId, CMS的文档ID,或者自定义信息,数据保存时会先根据batchFlag做删除,然后再保存新的数据"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listNextWithFilter",
+          "className": "com.x.attendance.assemble.control.jaxrs.selfholiday.ActionListNextWithFilter",
+          "description": "列示满足过滤条件员工休假申请信息信息,下一页",
+          "type": "PUT",
+          "path": "jaxrs/attendanceselfholiday/filter/list/{id}/next/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": true,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "上一页最后一条信息ID"
+            },
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "每页显示的条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "docId",
+              "type": "String",
+              "isCollection": false,
+              "description": "流程WorkId"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "topUnitOu",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织编号"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "unitOu",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织编号"
+            },
+            {
+              "name": "employeeName",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工姓名"
+            },
+            {
+              "name": "employeeNumber",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工号"
+            },
+            {
+              "name": "leaveType",
+              "type": "String",
+              "isCollection": false,
+              "description": "请假类型:带薪年休假|带薪病假|带薪福利假|扣薪事假|其他"
+            },
+            {
+              "name": "startTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "开始时间"
+            },
+            {
+              "name": "endTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "结束时间"
+            },
+            {
+              "name": "leaveDayNumber",
+              "type": "Double",
+              "isCollection": false,
+              "description": "请假天数"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "请假说明"
+            },
+            {
+              "name": "batchFlag",
+              "type": "String",
+              "isCollection": false,
+              "description": "录入批次标识:可以填写流程workId,jobId, CMS的文档ID,或者自定义信息,数据保存时会先根据batchFlag做删除,然后再保存新的数据"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listPrevWithFilter",
+          "className": "com.x.attendance.assemble.control.jaxrs.selfholiday.ActionListPrevWithFilter",
+          "description": "列示满足过滤条件员工休假申请信息信息,上一页",
+          "type": "PUT",
+          "path": "jaxrs/attendanceselfholiday/filter/list/{id}/prev/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": true,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "上一页最后一条信息ID"
+            },
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "每页显示的条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "docId",
+              "type": "String",
+              "isCollection": false,
+              "description": "流程WorkId"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "topUnitOu",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织编号"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "unitOu",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织编号"
+            },
+            {
+              "name": "employeeName",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工姓名"
+            },
+            {
+              "name": "employeeNumber",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工号"
+            },
+            {
+              "name": "leaveType",
+              "type": "String",
+              "isCollection": false,
+              "description": "请假类型:带薪年休假|带薪病假|带薪福利假|扣薪事假|其他"
+            },
+            {
+              "name": "startTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "开始时间"
+            },
+            {
+              "name": "endTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "结束时间"
+            },
+            {
+              "name": "leaveDayNumber",
+              "type": "Double",
+              "isCollection": false,
+              "description": "请假天数"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "请假说明"
+            },
+            {
+              "name": "batchFlag",
+              "type": "String",
+              "isCollection": false,
+              "description": "录入批次标识:可以填写流程workId,jobId, CMS的文档ID,或者自定义信息,数据保存时会先根据batchFlag做删除,然后再保存新的数据"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "post",
+          "className": "com.x.attendance.assemble.control.jaxrs.selfholiday.ActionSave",
+          "description": "新建或者更新员工休假申请信息",
+          "type": "POST",
+          "path": "jaxrs/attendanceselfholiday",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成.",
+              "isBaseType": true
+            },
+            {
+              "name": "docId",
+              "type": "String",
+              "isCollection": false,
+              "description": "流程WorkId",
+              "isBaseType": true
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称",
+              "isBaseType": true
+            },
+            {
+              "name": "topUnitOu",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织编号",
+              "isBaseType": true
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称",
+              "isBaseType": true
+            },
+            {
+              "name": "unitOu",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织编号",
+              "isBaseType": true
+            },
+            {
+              "name": "employeeName",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工姓名",
+              "isBaseType": true
+            },
+            {
+              "name": "employeeNumber",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工号",
+              "isBaseType": true
+            },
+            {
+              "name": "leaveType",
+              "type": "String",
+              "isCollection": false,
+              "description": "请假类型:带薪年休假|带薪病假|带薪福利假|扣薪事假|其他",
+              "isBaseType": true
+            },
+            {
+              "name": "startTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "开始时间",
+              "isBaseType": true
+            },
+            {
+              "name": "endTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "结束时间",
+              "isBaseType": true
+            },
+            {
+              "name": "leaveDayNumber",
+              "type": "Double",
+              "isCollection": false,
+              "description": "请假天数",
+              "isBaseType": true
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "请假说明",
+              "isBaseType": true
+            },
+            {
+              "name": "batchFlag",
+              "type": "String",
+              "isCollection": false,
+              "description": "录入批次标识:可以填写流程workId,jobId, CMS的文档ID,或者自定义信息,数据保存时会先根据batchFlag做删除,然后再保存新的数据",
+              "isBaseType": true
+            },
+            {
+              "name": "distributeFactor",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "分布式存储标识位.",
+              "isBaseType": true
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中.",
+              "isBaseType": true
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中.",
+              "isBaseType": true
+            },
+            {
+              "name": "sequence",
+              "type": "String",
+              "isCollection": false,
+              "description": "列表序号,由创建时间以及ID组成.在保存时自动生成,索引创建在约束中.",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "AttendanceSelfHolidaySimpleAction",
+      "className": "com.x.attendance.assemble.control.jaxrs.selfholiday.AttendanceSelfHolidaySimpleAction",
+      "description": "员工休假申请信息管理服务",
+      "methods": [
+        {
+          "name": "deleteByWfDocId",
+          "className": "com.x.attendance.assemble.control.jaxrs.selfholiday.ActionDeleteByWfDocId",
+          "description": "根据流程文档ID删除员工休假申请数据对象",
+          "type": "DELETE",
+          "path": "jaxrs/selfholidaysimple/docId/{docId}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "docId",
+              "type": "String",
+              "description": ""
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "post",
+          "className": "com.x.attendance.assemble.control.jaxrs.selfholiday.ActionSave",
+          "description": "新建或者更新员工休假申请信息",
+          "type": "POST",
+          "path": "jaxrs/selfholidaysimple",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成.",
+              "isBaseType": true
+            },
+            {
+              "name": "docId",
+              "type": "String",
+              "isCollection": false,
+              "description": "流程WorkId",
+              "isBaseType": true
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称",
+              "isBaseType": true
+            },
+            {
+              "name": "topUnitOu",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织编号",
+              "isBaseType": true
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称",
+              "isBaseType": true
+            },
+            {
+              "name": "unitOu",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织编号",
+              "isBaseType": true
+            },
+            {
+              "name": "employeeName",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工姓名",
+              "isBaseType": true
+            },
+            {
+              "name": "employeeNumber",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工号",
+              "isBaseType": true
+            },
+            {
+              "name": "leaveType",
+              "type": "String",
+              "isCollection": false,
+              "description": "请假类型:带薪年休假|带薪病假|带薪福利假|扣薪事假|其他",
+              "isBaseType": true
+            },
+            {
+              "name": "startTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "开始时间",
+              "isBaseType": true
+            },
+            {
+              "name": "endTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "结束时间",
+              "isBaseType": true
+            },
+            {
+              "name": "leaveDayNumber",
+              "type": "Double",
+              "isCollection": false,
+              "description": "请假天数",
+              "isBaseType": true
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "请假说明",
+              "isBaseType": true
+            },
+            {
+              "name": "batchFlag",
+              "type": "String",
+              "isCollection": false,
+              "description": "录入批次标识:可以填写流程workId,jobId, CMS的文档ID,或者自定义信息,数据保存时会先根据batchFlag做删除,然后再保存新的数据",
+              "isBaseType": true
+            },
+            {
+              "name": "distributeFactor",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "分布式存储标识位.",
+              "isBaseType": true
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中.",
+              "isBaseType": true
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中.",
+              "isBaseType": true
+            },
+            {
+              "name": "sequence",
+              "type": "String",
+              "isCollection": false,
+              "description": "列表序号,由创建时间以及ID组成.在保存时自动生成,索引创建在约束中.",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "AttendanceSettingAction",
+      "className": "com.x.attendance.assemble.control.jaxrs.attendancesetting.AttendanceSettingAction",
+      "description": "系统配置信息管理服务",
+      "methods": [
+        {
+          "name": "delete",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancesetting.ActionDelete",
+          "description": "根据ID删除系统配置信息",
+          "type": "DELETE",
+          "path": "jaxrs/attendancesetting/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "系统配置信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "get",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancesetting.ActionGet",
+          "description": "根据ID获取系统配置信息",
+          "type": "GET",
+          "path": "jaxrs/attendancesetting/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "系统配置信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "configCode",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置编码"
+            },
+            {
+              "name": "configName",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置名称"
+            },
+            {
+              "name": "configValue",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置内容"
+            },
+            {
+              "name": "valueType",
+              "type": "String",
+              "isCollection": false,
+              "description": "值类型: select | identity | number | date | text"
+            },
+            {
+              "name": "selectContent",
+              "type": "String",
+              "isCollection": false,
+              "description": "可选值,和select配合使用,以‘|’号分隔"
+            },
+            {
+              "name": "isMultiple",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否可以多值"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "备注说明"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "getWithCode",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancesetting.ActionGetWithCode",
+          "description": "根据Code获取系统配置信息",
+          "type": "GET",
+          "path": "jaxrs/attendancesetting/code/{code}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "code",
+              "type": "String",
+              "description": "系统配置信息编码"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "configCode",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置编码"
+            },
+            {
+              "name": "configName",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置名称"
+            },
+            {
+              "name": "configValue",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置内容"
+            },
+            {
+              "name": "valueType",
+              "type": "String",
+              "isCollection": false,
+              "description": "值类型: select | identity | number | date | text"
+            },
+            {
+              "name": "selectContent",
+              "type": "String",
+              "isCollection": false,
+              "description": "可选值,和select配合使用,以‘|’号分隔"
+            },
+            {
+              "name": "isMultiple",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否可以多值"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "备注说明"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listAllAttendanceSetting",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancesetting.ActionListAll",
+          "description": "获取所有系统配置信息列表",
+          "type": "GET",
+          "path": "jaxrs/attendancesetting/list/all",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "configCode",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置编码"
+            },
+            {
+              "name": "configName",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置名称"
+            },
+            {
+              "name": "configValue",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置内容"
+            },
+            {
+              "name": "valueType",
+              "type": "String",
+              "isCollection": false,
+              "description": "值类型: select | identity | number | date | text"
+            },
+            {
+              "name": "selectContent",
+              "type": "String",
+              "isCollection": false,
+              "description": "可选值,和select配合使用,以‘|’号分隔"
+            },
+            {
+              "name": "isMultiple",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否可以多值"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "备注说明"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "save",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancesetting.ActionSave",
+          "description": "新建或者更新系统配置信息",
+          "type": "POST",
+          "path": "jaxrs/attendancesetting",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "configCode",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置编码",
+              "isBaseType": true
+            },
+            {
+              "name": "configName",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置名称",
+              "isBaseType": true
+            },
+            {
+              "name": "configValue",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置内容",
+              "isBaseType": true
+            },
+            {
+              "name": "valueType",
+              "type": "String",
+              "isCollection": false,
+              "description": "值类型: select | identity | number | date | text",
+              "isBaseType": true
+            },
+            {
+              "name": "selectContent",
+              "type": "String",
+              "isCollection": false,
+              "description": "可选值,和select配合使用,以‘|’号分隔",
+              "isBaseType": true
+            },
+            {
+              "name": "isMultiple",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否可以多值",
+              "isBaseType": true
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号",
+              "isBaseType": true
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "备注说明",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "AttendanceStatisticAction",
+      "className": "com.x.attendance.assemble.control.jaxrs.attendancestatistic.AttendanceStatisticAction",
+      "description": "数据统计执行服务",
+      "methods": [
+        {
+          "name": "doStatistic",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatistic.ActionStatisticCaculate",
+          "description": "驱动系统主动进行一次数据统计",
+          "type": "GET",
+          "path": "jaxrs/statistic/do",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "AttendanceStatisticRequireLogAction",
+      "className": "com.x.attendance.assemble.control.jaxrs.attendancestatisticrequirelog.AttendanceStatisticRequireLogAction",
+      "description": "考勤统计需求信息管理服务",
+      "methods": [
+        {
+          "name": "delete",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatisticrequirelog.ActionDelete",
+          "description": "根据ID删除考勤统计需求信息",
+          "type": "DELETE",
+          "path": "jaxrs/attendancestatisticrequirelog/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "统计需求信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "get",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatisticrequirelog.ActionGet",
+          "description": "根据ID获取考勤统计需求信息",
+          "type": "GET",
+          "path": "jaxrs/attendancestatisticrequirelog/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "统计需求信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "statisticName",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计名称"
+            },
+            {
+              "name": "statisticType",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计类型:PERSON_PER_MONTH|UNIT_PER_MONTH|TOPUNIT_PER_MONTH|UNIT_PER_DAY|TOPUNIT_PER_DAY"
+            },
+            {
+              "name": "statisticKey",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计键值"
+            },
+            {
+              "name": "statisticYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计年月"
+            },
+            {
+              "name": "statisticMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计月份"
+            },
+            {
+              "name": "statisticDay",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计日期"
+            },
+            {
+              "name": "processTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "处理时间"
+            },
+            {
+              "name": "processStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "处理状态"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "说明备注"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listAllAttendanceStatisticRequireLog",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatisticrequirelog.ActionListAll",
+          "description": "获取所有考勤统计需求信息",
+          "type": "GET",
+          "path": "jaxrs/attendancestatisticrequirelog/list/all",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "statisticName",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计名称"
+            },
+            {
+              "name": "statisticType",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计类型:PERSON_PER_MONTH|UNIT_PER_MONTH|TOPUNIT_PER_MONTH|UNIT_PER_DAY|TOPUNIT_PER_DAY"
+            },
+            {
+              "name": "statisticKey",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计键值"
+            },
+            {
+              "name": "statisticYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计年月"
+            },
+            {
+              "name": "statisticMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计月份"
+            },
+            {
+              "name": "statisticDay",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计日期"
+            },
+            {
+              "name": "processTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "处理时间"
+            },
+            {
+              "name": "processStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "处理状态"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "说明备注"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "post",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatisticrequirelog.ActionSave",
+          "description": "新建或者更新考勤统计需求信息",
+          "type": "POST",
+          "path": "jaxrs/attendancestatisticrequirelog",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "statisticName",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计名称",
+              "isBaseType": true
+            },
+            {
+              "name": "statisticType",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计类型:PERSON_PER_MONTH|UNIT_PER_MONTH|TOPUNIT_PER_MONTH|UNIT_PER_DAY|TOPUNIT_PER_DAY",
+              "isBaseType": true
+            },
+            {
+              "name": "statisticKey",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计键值",
+              "isBaseType": true
+            },
+            {
+              "name": "statisticYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计年月",
+              "isBaseType": true
+            },
+            {
+              "name": "statisticMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计月份",
+              "isBaseType": true
+            },
+            {
+              "name": "statisticDay",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计日期",
+              "isBaseType": true
+            },
+            {
+              "name": "processTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "处理时间",
+              "isBaseType": true
+            },
+            {
+              "name": "processStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "处理状态",
+              "isBaseType": true
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "说明备注",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "AttendanceStatisticShowAction",
+      "className": "com.x.attendance.assemble.control.jaxrs.attendancestatistic.AttendanceStatisticShowAction",
+      "description": "考勤数据统计信息管理服务",
+      "methods": [
+        {
+          "name": "listStdForTopUnitNextWithFilter",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatistic.ActionListStdForTopUnitNextWithFilter",
+          "description": "列示根据过滤条件的顶层组织每日统计数据,下一页",
+          "type": "PUT",
+          "path": "jaxrs/statisticshow/filter/topUnitDay/list/{id}/next/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": true,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "上一页最后一条信息ID"
+            },
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "每页显示信息条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "statisticYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计年份"
+            },
+            {
+              "name": "statisticMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计月份"
+            },
+            {
+              "name": "statisticDate",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计日期"
+            },
+            {
+              "name": "employeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "应出勤人数"
+            },
+            {
+              "name": "onDutyEmployeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "实际出勤人数"
+            },
+            {
+              "name": "absenceDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤人数"
+            },
+            {
+              "name": "onSelfHolidayEmployeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假人数"
+            },
+            {
+              "name": "onDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签到人数"
+            },
+            {
+              "name": "offDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签退人数"
+            },
+            {
+              "name": "lateCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到人数"
+            },
+            {
+              "name": "leaveEarlyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退人数"
+            },
+            {
+              "name": "lackOfTimeCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "工时不足人数"
+            },
+            {
+              "name": "abNormalDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "异常打卡人数"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listStdForTopUnitPrevWithFilter",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatistic.ActionListStdForTopUnitPrevWithFilter",
+          "description": "列示根据过滤条件的顶层组织每日统计数据,上一页",
+          "type": "PUT",
+          "path": "jaxrs/statisticshow/filter/topUnitDay/list/{id}/prev/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": true,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "上一页最后一条信息ID"
+            },
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "每页显示信息条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "statisticYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计年份"
+            },
+            {
+              "name": "statisticMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计月份"
+            },
+            {
+              "name": "statisticDate",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计日期"
+            },
+            {
+              "name": "employeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "应出勤人数"
+            },
+            {
+              "name": "onDutyEmployeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "实际出勤人数"
+            },
+            {
+              "name": "absenceDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤人数"
+            },
+            {
+              "name": "onSelfHolidayEmployeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假人数"
+            },
+            {
+              "name": "onDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签到人数"
+            },
+            {
+              "name": "offDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签退人数"
+            },
+            {
+              "name": "lateCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到人数"
+            },
+            {
+              "name": "leaveEarlyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退人数"
+            },
+            {
+              "name": "lackOfTimeCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "工时不足人数"
+            },
+            {
+              "name": "abNormalDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "异常打卡人数"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listStdForUnitNextWithFilter",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatistic.ActionListStdForUnitNextWithFilter",
+          "description": "列示根据过滤条件的组织每日统计数据,下一页",
+          "type": "PUT",
+          "path": "jaxrs/statisticshow/filter/unitDay/list/{id}/next/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": true,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "上一页最后一条信息ID"
+            },
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "每页显示信息条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "statisticYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计年份"
+            },
+            {
+              "name": "statisticMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计月份"
+            },
+            {
+              "name": "statisticDate",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计日期"
+            },
+            {
+              "name": "employeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "应出勤人数"
+            },
+            {
+              "name": "onDutyEmployeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "实际出勤人数"
+            },
+            {
+              "name": "absenceDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤人数"
+            },
+            {
+              "name": "onSelfHolidayEmployeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假人数"
+            },
+            {
+              "name": "onDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签到人数"
+            },
+            {
+              "name": "offDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签退人数"
+            },
+            {
+              "name": "lateCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到人数"
+            },
+            {
+              "name": "leaveEarlyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退人数"
+            },
+            {
+              "name": "lackOfTimeCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "工时不足人数"
+            },
+            {
+              "name": "abNormalDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "异常打卡人数"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listStdForUnitPrevWithFilter",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatistic.ActionListStdForUnitPrevWithFilter",
+          "description": "列示根据过滤条件的组织每日统计数据,上一页",
+          "type": "PUT",
+          "path": "jaxrs/statisticshow/filter/unitDay/list/{id}/prev/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": true,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "上一页最后一条信息ID"
+            },
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "每页显示信息条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "statisticYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计年份"
+            },
+            {
+              "name": "statisticMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计月份"
+            },
+            {
+              "name": "statisticDate",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计日期"
+            },
+            {
+              "name": "employeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "应出勤人数"
+            },
+            {
+              "name": "onDutyEmployeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "实际出勤人数"
+            },
+            {
+              "name": "absenceDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤人数"
+            },
+            {
+              "name": "onSelfHolidayEmployeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假人数"
+            },
+            {
+              "name": "onDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签到人数"
+            },
+            {
+              "name": "offDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签退人数"
+            },
+            {
+              "name": "lateCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到人数"
+            },
+            {
+              "name": "leaveEarlyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退人数"
+            },
+            {
+              "name": "lackOfTimeCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "工时不足人数"
+            },
+            {
+              "name": "abNormalDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "异常打卡人数"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listStmForPersonNextWithFilter",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatistic.ActionListStmForPersonNextWithFilter",
+          "description": "列示根据过滤条件的个人月份统计数据,下一页",
+          "type": "PUT",
+          "path": "jaxrs/statisticshow/filter/personMonth/list/{id}/next/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": true,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "上一页最后一条信息ID"
+            },
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "每页显示信息条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "employeeName",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工姓名"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "statisticYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计年份"
+            },
+            {
+              "name": "statisticMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计月份"
+            },
+            {
+              "name": "workDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "应出勤天数"
+            },
+            {
+              "name": "onDutyDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "实际出勤天数"
+            },
+            {
+              "name": "absenceDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤天数"
+            },
+            {
+              "name": "onSelfHolidayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假天数"
+            },
+            {
+              "name": "onDutyTimes",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签到次数"
+            },
+            {
+              "name": "offDutyTimes",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签退次数"
+            },
+            {
+              "name": "lateTimes",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到次数"
+            },
+            {
+              "name": "leaveEarlyTimes",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退次数"
+            },
+            {
+              "name": "lackOfTimeCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "工时不足次数"
+            },
+            {
+              "name": "abNormalDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "异常打卡人数"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listStmForPersonPrevWithFilter",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatistic.ActionListStmForPersonPrevWithFilter",
+          "description": "列示根据过滤条件的个人月份统计数据,上一页",
+          "type": "PUT",
+          "path": "jaxrs/statisticshow/filter/personMonth/list/{id}/prev/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": true,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "上一页最后一条信息ID"
+            },
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "每页显示信息条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "employeeName",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工姓名"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "statisticYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计年份"
+            },
+            {
+              "name": "statisticMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计月份"
+            },
+            {
+              "name": "workDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "应出勤天数"
+            },
+            {
+              "name": "onDutyDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "实际出勤天数"
+            },
+            {
+              "name": "absenceDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤天数"
+            },
+            {
+              "name": "onSelfHolidayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假天数"
+            },
+            {
+              "name": "onDutyTimes",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签到次数"
+            },
+            {
+              "name": "offDutyTimes",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签退次数"
+            },
+            {
+              "name": "lateTimes",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到次数"
+            },
+            {
+              "name": "leaveEarlyTimes",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退次数"
+            },
+            {
+              "name": "lackOfTimeCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "工时不足次数"
+            },
+            {
+              "name": "abNormalDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "异常打卡人数"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listStmForTopUnitNextWithFilter",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatistic.ActionListStmForTopUnitNextWithFilter",
+          "description": "列示根据过滤条件的顶层组织月份统计数据,下一页",
+          "type": "PUT",
+          "path": "jaxrs/statisticshow/filter/topUnitMonth/list/{id}/next/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": true,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "上一页最后一条信息ID"
+            },
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "每页显示信息条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "statisticYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计年份"
+            },
+            {
+              "name": "statisticMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计月份"
+            },
+            {
+              "name": "employeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "应出勤人天数"
+            },
+            {
+              "name": "onDutyEmployeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "实际出勤人天数"
+            },
+            {
+              "name": "absenceDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤人天数"
+            },
+            {
+              "name": "onSelfHolidayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假人天数"
+            },
+            {
+              "name": "onDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签到人数"
+            },
+            {
+              "name": "offDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签退人数"
+            },
+            {
+              "name": "lateCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到人数"
+            },
+            {
+              "name": "leaveEarlyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退人数"
+            },
+            {
+              "name": "lackOfTimeCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "工时不足人次"
+            },
+            {
+              "name": "abNormalDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "异常打卡人次"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listStmForTopUnitPrevWithFilter",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatistic.ActionListStmForTopUnitPrevWithFilter",
+          "description": "列示根据过滤条件的顶层组织月份统计数据,上一页",
+          "type": "PUT",
+          "path": "jaxrs/statisticshow/filter/topUnitMonth/list/{id}/prev/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": true,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "上一页最后一条信息ID"
+            },
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "每页显示信息条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "statisticYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计年份"
+            },
+            {
+              "name": "statisticMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计月份"
+            },
+            {
+              "name": "employeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "应出勤人天数"
+            },
+            {
+              "name": "onDutyEmployeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "实际出勤人天数"
+            },
+            {
+              "name": "absenceDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤人天数"
+            },
+            {
+              "name": "onSelfHolidayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假人天数"
+            },
+            {
+              "name": "onDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签到人数"
+            },
+            {
+              "name": "offDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签退人数"
+            },
+            {
+              "name": "lateCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到人数"
+            },
+            {
+              "name": "leaveEarlyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退人数"
+            },
+            {
+              "name": "lackOfTimeCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "工时不足人次"
+            },
+            {
+              "name": "abNormalDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "异常打卡人次"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listStmForUnitNextWithFilter",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatistic.ActionListStmForUnitNextWithFilter",
+          "description": "列示根据过滤条件的组织月份统计数据,下一页",
+          "type": "PUT",
+          "path": "jaxrs/statisticshow/filter/unitMonth/list/{id}/next/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": true,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "上一页最后一条信息ID"
+            },
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "每页显示信息条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "statisticYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计年份"
+            },
+            {
+              "name": "statisticMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计月份"
+            },
+            {
+              "name": "employeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "应出勤人数"
+            },
+            {
+              "name": "onDutyEmployeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "实际出勤人数"
+            },
+            {
+              "name": "absenceDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤人天数"
+            },
+            {
+              "name": "onSelfHolidayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假人天数"
+            },
+            {
+              "name": "onDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签到人数"
+            },
+            {
+              "name": "offDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签退人数"
+            },
+            {
+              "name": "lateCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到人数"
+            },
+            {
+              "name": "leaveEarlyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退人数"
+            },
+            {
+              "name": "lackOfTimeCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "工时不足人次"
+            },
+            {
+              "name": "abNormalDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "异常打卡人数"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listStmForUnitPrevWithFilter",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatistic.ActionListStmForUnitPrevWithFilter",
+          "description": "列示根据过滤条件的组织月份统计数据,上一页",
+          "type": "PUT",
+          "path": "jaxrs/statisticshow/filter/unitMonth/list/{id}/prev/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": true,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "上一页最后一条信息ID"
+            },
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "每页显示信息条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "statisticYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计年份"
+            },
+            {
+              "name": "statisticMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计月份"
+            },
+            {
+              "name": "employeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "应出勤人数"
+            },
+            {
+              "name": "onDutyEmployeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "实际出勤人数"
+            },
+            {
+              "name": "absenceDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤人天数"
+            },
+            {
+              "name": "onSelfHolidayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假人天数"
+            },
+            {
+              "name": "onDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签到人数"
+            },
+            {
+              "name": "offDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签退人数"
+            },
+            {
+              "name": "lateCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到人数"
+            },
+            {
+              "name": "leaveEarlyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退人数"
+            },
+            {
+              "name": "lackOfTimeCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "工时不足人次"
+            },
+            {
+              "name": "abNormalDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "异常打卡人数"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "showStForPersonInUnit",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatistic.ActionShowStForPersonInUnit",
+          "description": "查询指定组织所有员工指定月份的统计数据",
+          "type": "GET",
+          "path": "jaxrs/statisticshow/persons/unit/{name}/{year}/{month}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "name",
+              "type": "String",
+              "description": "统计员工姓名"
+            },
+            {
+              "name": "year",
+              "type": "String",
+              "description": "统计周期年份"
+            },
+            {
+              "name": "month",
+              "type": "String",
+              "description": "统计周期月份"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "employeeName",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工姓名"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "statisticYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计年份"
+            },
+            {
+              "name": "statisticMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计月份"
+            },
+            {
+              "name": "workDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "应出勤天数"
+            },
+            {
+              "name": "onDutyDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "实际出勤天数"
+            },
+            {
+              "name": "absenceDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤天数"
+            },
+            {
+              "name": "onSelfHolidayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假天数"
+            },
+            {
+              "name": "onDutyTimes",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签到次数"
+            },
+            {
+              "name": "offDutyTimes",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签退次数"
+            },
+            {
+              "name": "lateTimes",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到次数"
+            },
+            {
+              "name": "leaveEarlyTimes",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退次数"
+            },
+            {
+              "name": "lackOfTimeCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "工时不足次数"
+            },
+            {
+              "name": "abNormalDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "异常打卡人数"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "showStForPersonInUnitSubNested",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatistic.ActionShowStForPersonInUnitSubNested",
+          "description": "查询指定组织所有员工指定月份的统计数据,包括下级组织",
+          "type": "GET",
+          "path": "jaxrs/statisticshow/persons/unit/subnested/{name}/{year}/{month}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "name",
+              "type": "String",
+              "description": "统计员工姓名"
+            },
+            {
+              "name": "year",
+              "type": "String",
+              "description": "统计周期年份"
+            },
+            {
+              "name": "month",
+              "type": "String",
+              "description": "统计周期月份"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "employeeName",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工姓名"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "statisticYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计年份"
+            },
+            {
+              "name": "statisticMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计月份"
+            },
+            {
+              "name": "workDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "应出勤天数"
+            },
+            {
+              "name": "onDutyDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "实际出勤天数"
+            },
+            {
+              "name": "absenceDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤天数"
+            },
+            {
+              "name": "onSelfHolidayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假天数"
+            },
+            {
+              "name": "onDutyTimes",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签到次数"
+            },
+            {
+              "name": "offDutyTimes",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签退次数"
+            },
+            {
+              "name": "lateTimes",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到次数"
+            },
+            {
+              "name": "leaveEarlyTimes",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退次数"
+            },
+            {
+              "name": "lackOfTimeCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "工时不足次数"
+            },
+            {
+              "name": "abNormalDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "异常打卡人数"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "showStForUnitInTopUnit",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatistic.ActionShowStForUnitInTopUnit",
+          "description": "查询顶层组织指定月份的统计数据",
+          "type": "GET",
+          "path": "jaxrs/statisticshow/unit/topUnit/{name}/{year}/{month}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "name",
+              "type": "String",
+              "description": "统计顶层组织名称"
+            },
+            {
+              "name": "year",
+              "type": "String",
+              "description": "统计周期年份"
+            },
+            {
+              "name": "month",
+              "type": "String",
+              "description": "统计周期月份"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "statisticYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计年份"
+            },
+            {
+              "name": "statisticMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计月份"
+            },
+            {
+              "name": "employeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "应出勤人数"
+            },
+            {
+              "name": "onDutyEmployeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "实际出勤人数"
+            },
+            {
+              "name": "absenceDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤人天数"
+            },
+            {
+              "name": "onSelfHolidayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假人天数"
+            },
+            {
+              "name": "onDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签到人数"
+            },
+            {
+              "name": "offDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签退人数"
+            },
+            {
+              "name": "lateCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到人数"
+            },
+            {
+              "name": "leaveEarlyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退人数"
+            },
+            {
+              "name": "lackOfTimeCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "工时不足人次"
+            },
+            {
+              "name": "abNormalDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "异常打卡人数"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "showStdForTopUnit",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatistic.ActionShowStdForTopUnit",
+          "description": "查询顶层组织指定月份每日的统计数据",
+          "type": "GET",
+          "path": "jaxrs/statisticshow/topUnit/day/{name}/{year}/{month}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "name",
+              "type": "String",
+              "description": "统计顶层组织名称"
+            },
+            {
+              "name": "year",
+              "type": "String",
+              "description": "统计周期年份"
+            },
+            {
+              "name": "month",
+              "type": "String",
+              "description": "统计周期月份"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "statisticYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计年份"
+            },
+            {
+              "name": "statisticMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计月份"
+            },
+            {
+              "name": "statisticDate",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计日期"
+            },
+            {
+              "name": "employeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "应出勤人数"
+            },
+            {
+              "name": "onDutyEmployeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "实际出勤人数"
+            },
+            {
+              "name": "absenceDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤人数"
+            },
+            {
+              "name": "onSelfHolidayEmployeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假人数"
+            },
+            {
+              "name": "onDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签到人数"
+            },
+            {
+              "name": "offDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签退人数"
+            },
+            {
+              "name": "lateCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到人数"
+            },
+            {
+              "name": "leaveEarlyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退人数"
+            },
+            {
+              "name": "lackOfTimeCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "工时不足人数"
+            },
+            {
+              "name": "abNormalDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "异常打卡人数"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "showStdForUnit",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatistic.ActionShowStmForTopUnit",
+          "description": "查询组织指定月份每日的统计数据",
+          "type": "GET",
+          "path": "jaxrs/statisticshow/unit/day/{name}/{year}/{month}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "name",
+              "type": "String",
+              "description": "统计组织名称"
+            },
+            {
+              "name": "year",
+              "type": "String",
+              "description": "统计周期年份"
+            },
+            {
+              "name": "month",
+              "type": "String",
+              "description": "统计周期月份"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "statisticYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计年份"
+            },
+            {
+              "name": "statisticMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计月份"
+            },
+            {
+              "name": "employeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "应出勤人天数"
+            },
+            {
+              "name": "onDutyEmployeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "实际出勤人天数"
+            },
+            {
+              "name": "absenceDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤人天数"
+            },
+            {
+              "name": "onSelfHolidayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假人天数"
+            },
+            {
+              "name": "onDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签到人数"
+            },
+            {
+              "name": "offDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签退人数"
+            },
+            {
+              "name": "lateCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到人数"
+            },
+            {
+              "name": "leaveEarlyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退人数"
+            },
+            {
+              "name": "lackOfTimeCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "工时不足人次"
+            },
+            {
+              "name": "abNormalDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "异常打卡人次"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "showStdForUnitInTopUnitWithDate",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatistic.ActionShowStdForUnitInTopUnitWithDate",
+          "description": "查询组织指定日期的统计数据",
+          "type": "GET",
+          "path": "jaxrs/statisticshow/unit/day/topUnit/{name}/{date}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "name",
+              "type": "String",
+              "description": "统计组织名称"
+            },
+            {
+              "name": "date",
+              "type": "String",
+              "description": "统计日期"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "statisticYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计年份"
+            },
+            {
+              "name": "statisticMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计月份"
+            },
+            {
+              "name": "statisticDate",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计日期"
+            },
+            {
+              "name": "employeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "应出勤人数"
+            },
+            {
+              "name": "onDutyEmployeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "实际出勤人数"
+            },
+            {
+              "name": "absenceDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤人数"
+            },
+            {
+              "name": "onSelfHolidayEmployeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假人数"
+            },
+            {
+              "name": "onDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签到人数"
+            },
+            {
+              "name": "offDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签退人数"
+            },
+            {
+              "name": "lateCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到人数"
+            },
+            {
+              "name": "leaveEarlyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退人数"
+            },
+            {
+              "name": "lackOfTimeCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "工时不足人数"
+            },
+            {
+              "name": "abNormalDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "异常打卡人数"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "showStdForUnitWithDate",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatistic.ActionShowStdForUnitWithDate",
+          "description": "查询组织指定日期的统计数据",
+          "type": "GET",
+          "path": "jaxrs/statisticshow/unit/day/{name}/{date}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "name",
+              "type": "String",
+              "description": "统计组织名称"
+            },
+            {
+              "name": "date",
+              "type": "String",
+              "description": "统计日期"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "statisticYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计年份"
+            },
+            {
+              "name": "statisticMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计月份"
+            },
+            {
+              "name": "statisticDate",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计日期"
+            },
+            {
+              "name": "employeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "应出勤人数"
+            },
+            {
+              "name": "onDutyEmployeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "实际出勤人数"
+            },
+            {
+              "name": "absenceDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤人数"
+            },
+            {
+              "name": "onSelfHolidayEmployeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假人数"
+            },
+            {
+              "name": "onDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签到人数"
+            },
+            {
+              "name": "offDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签退人数"
+            },
+            {
+              "name": "lateCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到人数"
+            },
+            {
+              "name": "leaveEarlyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退人数"
+            },
+            {
+              "name": "lackOfTimeCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "工时不足人数"
+            },
+            {
+              "name": "abNormalDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "异常打卡人数"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "showStmForPerson",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatistic.ActionShowStmForPerson",
+          "description": "查询员工指定月份的统计数据",
+          "type": "GET",
+          "path": "jaxrs/statisticshow/person/{name}/{year}/{month}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "name",
+              "type": "String",
+              "description": "统计员工姓名"
+            },
+            {
+              "name": "year",
+              "type": "String",
+              "description": "统计周期年份"
+            },
+            {
+              "name": "month",
+              "type": "String",
+              "description": "统计周期月份"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "employeeName",
+              "type": "String",
+              "isCollection": false,
+              "description": "员工姓名"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "statisticYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计年份"
+            },
+            {
+              "name": "statisticMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计月份"
+            },
+            {
+              "name": "workDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "应出勤天数"
+            },
+            {
+              "name": "onDutyDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "实际出勤天数"
+            },
+            {
+              "name": "absenceDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤天数"
+            },
+            {
+              "name": "onSelfHolidayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假天数"
+            },
+            {
+              "name": "onDutyTimes",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签到次数"
+            },
+            {
+              "name": "offDutyTimes",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签退次数"
+            },
+            {
+              "name": "lateTimes",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到次数"
+            },
+            {
+              "name": "leaveEarlyTimes",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退次数"
+            },
+            {
+              "name": "lackOfTimeCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "工时不足次数"
+            },
+            {
+              "name": "abNormalDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "异常打卡人数"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "showStmForTopUnit",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatistic.ActionShowStmForTopUnit",
+          "description": "查询顶层组织指定月份的统计数据",
+          "type": "GET",
+          "path": "jaxrs/statisticshow/topUnit/{name}/{year}/{month}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "name",
+              "type": "String",
+              "description": "统计顶层组织名称"
+            },
+            {
+              "name": "year",
+              "type": "String",
+              "description": "统计周期年份"
+            },
+            {
+              "name": "month",
+              "type": "String",
+              "description": "统计周期月份"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "statisticYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计年份"
+            },
+            {
+              "name": "statisticMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计月份"
+            },
+            {
+              "name": "employeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "应出勤人天数"
+            },
+            {
+              "name": "onDutyEmployeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "实际出勤人天数"
+            },
+            {
+              "name": "absenceDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤人天数"
+            },
+            {
+              "name": "onSelfHolidayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假人天数"
+            },
+            {
+              "name": "onDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签到人数"
+            },
+            {
+              "name": "offDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签退人数"
+            },
+            {
+              "name": "lateCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到人数"
+            },
+            {
+              "name": "leaveEarlyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退人数"
+            },
+            {
+              "name": "lackOfTimeCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "工时不足人次"
+            },
+            {
+              "name": "abNormalDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "异常打卡人次"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "showStmForUnit",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatistic.ActionShowStmForUnit",
+          "description": "查询组织指定月份的统计数据",
+          "type": "GET",
+          "path": "jaxrs/statisticshow/unit/{name}/{year}/{month}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "name",
+              "type": "String",
+              "description": "统计组织名称"
+            },
+            {
+              "name": "year",
+              "type": "String",
+              "description": "统计周期年份"
+            },
+            {
+              "name": "month",
+              "type": "String",
+              "description": "统计周期月份"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "statisticYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计年份"
+            },
+            {
+              "name": "statisticMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计月份"
+            },
+            {
+              "name": "employeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "应出勤人数"
+            },
+            {
+              "name": "onDutyEmployeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "实际出勤人数"
+            },
+            {
+              "name": "absenceDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤人天数"
+            },
+            {
+              "name": "onSelfHolidayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假人天数"
+            },
+            {
+              "name": "onDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签到人数"
+            },
+            {
+              "name": "offDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签退人数"
+            },
+            {
+              "name": "lateCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到人数"
+            },
+            {
+              "name": "leaveEarlyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退人数"
+            },
+            {
+              "name": "lackOfTimeCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "工时不足人次"
+            },
+            {
+              "name": "abNormalDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "异常打卡人数"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "showStmForUnitSubnested",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatistic.ActionShowStmForUnitSubnested",
+          "description": "查询组织指定月份的统计数据",
+          "type": "GET",
+          "path": "jaxrs/statisticshow/unit/subnested/{name}/{year}/{month}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "name",
+              "type": "String",
+              "description": "统计组织名称"
+            },
+            {
+              "name": "year",
+              "type": "String",
+              "description": "统计周期年份"
+            },
+            {
+              "name": "month",
+              "type": "String",
+              "description": "统计周期月份"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "statisticYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计年份"
+            },
+            {
+              "name": "statisticMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计月份"
+            },
+            {
+              "name": "employeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "应出勤人数"
+            },
+            {
+              "name": "onDutyEmployeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "实际出勤人数"
+            },
+            {
+              "name": "absenceDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤人天数"
+            },
+            {
+              "name": "onSelfHolidayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假人天数"
+            },
+            {
+              "name": "onDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签到人数"
+            },
+            {
+              "name": "offDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签退人数"
+            },
+            {
+              "name": "lateCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到人数"
+            },
+            {
+              "name": "leaveEarlyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退人数"
+            },
+            {
+              "name": "lackOfTimeCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "工时不足人次"
+            },
+            {
+              "name": "abNormalDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "异常打卡人数"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "sumUnitStatistic",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatistic.ActionSumStForUnit",
+          "description": "查询组织指定月份的统计数据",
+          "type": "GET",
+          "path": "jaxrs/statisticshow/unit/sum/{name}/{year}/{month}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "name",
+              "type": "String",
+              "description": "统计组织名称"
+            },
+            {
+              "name": "year",
+              "type": "String",
+              "description": "统计周期年份"
+            },
+            {
+              "name": "month",
+              "type": "String",
+              "description": "统计周期月份"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "statisticYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计年份"
+            },
+            {
+              "name": "statisticMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计月份"
+            },
+            {
+              "name": "employeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "应出勤人数"
+            },
+            {
+              "name": "onDutyEmployeeCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "实际出勤人数"
+            },
+            {
+              "name": "absenceDayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "缺勤人天数"
+            },
+            {
+              "name": "onSelfHolidayCount",
+              "type": "Double",
+              "isCollection": false,
+              "description": "休假人天数"
+            },
+            {
+              "name": "onDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签到人数"
+            },
+            {
+              "name": "offDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "签退人数"
+            },
+            {
+              "name": "lateCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "迟到人数"
+            },
+            {
+              "name": "leaveEarlyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "早退人数"
+            },
+            {
+              "name": "lackOfTimeCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "工时不足人次"
+            },
+            {
+              "name": "abNormalDutyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "异常打卡人数"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "AttendanceStatisticalCycleAction",
+      "className": "com.x.attendance.assemble.control.jaxrs.attendancestatisticalcycle.AttendanceStatisticalCycleAction",
+      "description": "考勤统计周期信息管理服务",
+      "methods": [
+        {
+          "name": "cycleDetail",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatisticalcycle.ActionCycleDetail",
+          "description": "根据登录的用户查询合适的考勤统计周期信息",
+          "type": "GET",
+          "path": "jaxrs/attendancestatisticalcycle/cycleDetail/{year}/{month}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "year",
+              "type": "String",
+              "description": "统计年份"
+            },
+            {
+              "name": "month",
+              "type": "String",
+              "description": "统计月份"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "cycleYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计周期年份"
+            },
+            {
+              "name": "cycleMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计周期月份"
+            },
+            {
+              "name": "cycleStartDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "月周期开始日期"
+            },
+            {
+              "name": "cycleEndDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "月周期结束日期"
+            },
+            {
+              "name": "cycleStartDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "月周期开始日期"
+            },
+            {
+              "name": "cycleEndDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "月周期结束日期"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "说明备注"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "delete",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatisticalcycle.ActionDelete",
+          "description": "根据ID删除考勤统计周期信息",
+          "type": "DELETE",
+          "path": "jaxrs/attendancestatisticalcycle/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "统计周期信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "get",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatisticalcycle.ActionGet",
+          "description": "根据ID获取考勤统计周期信息",
+          "type": "GET",
+          "path": "jaxrs/attendancestatisticalcycle/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "统计周期信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "cycleYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计周期年份"
+            },
+            {
+              "name": "cycleMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计周期月份"
+            },
+            {
+              "name": "cycleStartDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "月周期开始日期"
+            },
+            {
+              "name": "cycleEndDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "月周期结束日期"
+            },
+            {
+              "name": "cycleStartDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "月周期开始日期"
+            },
+            {
+              "name": "cycleEndDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "月周期结束日期"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "说明备注"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listAllAttendanceStatisticalCycle",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatisticalcycle.ActionListAll",
+          "description": "获取所有考勤统计周期信息",
+          "type": "GET",
+          "path": "jaxrs/attendancestatisticalcycle/list/all",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称"
+            },
+            {
+              "name": "cycleYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计周期年份"
+            },
+            {
+              "name": "cycleMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计周期月份"
+            },
+            {
+              "name": "cycleStartDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "月周期开始日期"
+            },
+            {
+              "name": "cycleEndDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "月周期结束日期"
+            },
+            {
+              "name": "cycleStartDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "月周期开始日期"
+            },
+            {
+              "name": "cycleEndDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "月周期结束日期"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "说明备注"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "post",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendancestatisticalcycle.ActionSave",
+          "description": "新建或者更新考勤统计周期信息",
+          "type": "POST",
+          "path": "jaxrs/attendancestatisticalcycle",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "顶层组织名称",
+              "isBaseType": true
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称",
+              "isBaseType": true
+            },
+            {
+              "name": "cycleYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计周期年份",
+              "isBaseType": true
+            },
+            {
+              "name": "cycleMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "统计周期月份",
+              "isBaseType": true
+            },
+            {
+              "name": "cycleStartDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "月周期开始日期",
+              "isBaseType": true
+            },
+            {
+              "name": "cycleEndDateString",
+              "type": "String",
+              "isCollection": false,
+              "description": "月周期结束日期",
+              "isBaseType": true
+            },
+            {
+              "name": "cycleStartDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "月周期开始日期",
+              "isBaseType": true
+            },
+            {
+              "name": "cycleEndDate",
+              "type": "Date",
+              "isCollection": false,
+              "description": "月周期结束日期",
+              "isBaseType": true
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "说明备注",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "AttendanceWorkDayConfigAction",
+      "className": "com.x.attendance.assemble.control.jaxrs.attendanceworkdayconfig.AttendanceWorkDayConfigAction",
+      "description": "节假日工作日配置信息管理服务",
+      "methods": [
+        {
+          "name": "delete",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceworkdayconfig.ActionDelete",
+          "description": "根据ID删除节假日配置信息",
+          "type": "DELETE",
+          "path": "jaxrs/attendanceworkdayconfig/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "节假日配置信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "get",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceworkdayconfig.ActionGet",
+          "description": "根据ID获取节假日配置信息",
+          "type": "GET",
+          "path": "jaxrs/attendanceworkdayconfig/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "节假日配置信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "configName",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置项名称"
+            },
+            {
+              "name": "configYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置年份"
+            },
+            {
+              "name": "configMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置月份"
+            },
+            {
+              "name": "configDate",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置日期"
+            },
+            {
+              "name": "configType",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置类型:Holiday|Workday"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置说明"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listAllAttendanceWorkDayConfig",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceworkdayconfig.ActionListAll",
+          "description": "获取所有节假日配置列表信息",
+          "type": "GET",
+          "path": "jaxrs/attendanceworkdayconfig/list/all",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "configName",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置项名称"
+            },
+            {
+              "name": "configYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置年份"
+            },
+            {
+              "name": "configMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置月份"
+            },
+            {
+              "name": "configDate",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置日期"
+            },
+            {
+              "name": "configType",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置类型:Holiday|Workday"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置说明"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listWithFilter",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceworkdayconfig.ActionListWithFilter",
+          "description": "根据条件获取节假日配置列表",
+          "type": "PUT",
+          "path": "jaxrs/attendanceworkdayconfig/filter",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "configName",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置项名称"
+            },
+            {
+              "name": "configYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置年份"
+            },
+            {
+              "name": "configMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置月份"
+            },
+            {
+              "name": "configDate",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置日期"
+            },
+            {
+              "name": "configType",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置类型:Holiday|Workday"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置说明"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "post",
+          "className": "com.x.attendance.assemble.control.jaxrs.attendanceworkdayconfig.ActionSave",
+          "description": "新建或者更新节假日配置信息",
+          "type": "POST",
+          "path": "jaxrs/attendanceworkdayconfig",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "configName",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置项名称",
+              "isBaseType": true
+            },
+            {
+              "name": "configYear",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置年份",
+              "isBaseType": true
+            },
+            {
+              "name": "configMonth",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置月份",
+              "isBaseType": true
+            },
+            {
+              "name": "configDate",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置日期",
+              "isBaseType": true
+            },
+            {
+              "name": "configType",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置类型:Holiday|Workday",
+              "isBaseType": true
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置说明",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "AttendanceWorkPlaceAction",
+      "className": "com.x.attendance.assemble.control.jaxrs.workplace.AttendanceWorkPlaceAction",
+      "description": "工作区域信息管理服务",
+      "methods": [
+        {
+          "name": "delete",
+          "className": "com.x.attendance.assemble.control.jaxrs.workplace.ActionDelete",
+          "description": "根据ID删除指定工作区域信息",
+          "type": "DELETE",
+          "path": "jaxrs/workplace/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "工作区域配置信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "get",
+          "className": "com.x.attendance.assemble.control.jaxrs.workplace.ActionGet",
+          "description": "根据ID获取指定工作区域信息",
+          "type": "GET",
+          "path": "jaxrs/workplace/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "工作区域配置信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "placeName",
+              "type": "String",
+              "isCollection": false,
+              "description": "场所名称"
+            },
+            {
+              "name": "placeAlias",
+              "type": "String",
+              "isCollection": false,
+              "description": "场所别名"
+            },
+            {
+              "name": "creator",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人"
+            },
+            {
+              "name": "longitude",
+              "type": "String",
+              "isCollection": false,
+              "description": "经度"
+            },
+            {
+              "name": "latitude",
+              "type": "String",
+              "isCollection": false,
+              "description": "纬度"
+            },
+            {
+              "name": "errorRange",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "误差范围"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "说明备注"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listAllAttendanceWorkPlace",
+          "className": "com.x.attendance.assemble.control.jaxrs.workplace.ActionListAll",
+          "description": "获取所有工作区域信息列表",
+          "type": "GET",
+          "path": "jaxrs/workplace/list/all",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "placeName",
+              "type": "String",
+              "isCollection": false,
+              "description": "场所名称"
+            },
+            {
+              "name": "placeAlias",
+              "type": "String",
+              "isCollection": false,
+              "description": "场所别名"
+            },
+            {
+              "name": "creator",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人"
+            },
+            {
+              "name": "longitude",
+              "type": "String",
+              "isCollection": false,
+              "description": "经度"
+            },
+            {
+              "name": "latitude",
+              "type": "String",
+              "isCollection": false,
+              "description": "纬度"
+            },
+            {
+              "name": "errorRange",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "误差范围"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "说明备注"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "post",
+          "className": "com.x.attendance.assemble.control.jaxrs.workplace.ActionSave",
+          "description": "新建或者更新工作区域信息",
+          "type": "POST",
+          "path": "jaxrs/workplace",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "placeName",
+              "type": "String",
+              "isCollection": false,
+              "description": "场所名称",
+              "isBaseType": true
+            },
+            {
+              "name": "placeAlias",
+              "type": "String",
+              "isCollection": false,
+              "description": "场所别名",
+              "isBaseType": true
+            },
+            {
+              "name": "creator",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人",
+              "isBaseType": true
+            },
+            {
+              "name": "longitude",
+              "type": "String",
+              "isCollection": false,
+              "description": "经度",
+              "isBaseType": true
+            },
+            {
+              "name": "latitude",
+              "type": "String",
+              "isCollection": false,
+              "description": "纬度",
+              "isBaseType": true
+            },
+            {
+              "name": "errorRange",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "误差范围",
+              "isBaseType": true
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "说明备注",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "CacheAction",
+      "className": "com.x.base.core.project.jaxrs.cache.CacheAction",
+      "description": "缓存操作",
+      "methods": [
+        {
+          "name": "configFlush",
+          "className": "com.x.base.core.project.jaxrs.cache.ActionConfigFlush",
+          "description": "接收config flush 信号.",
+          "type": "GET",
+          "path": "jaxrs/cache/config/flush",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "value",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "布尔值."
+            }
+          ]
+        },
+        {
+          "name": "receive",
+          "className": "com.x.base.core.project.jaxrs.cache.ActionReceive",
+          "description": "接收Cache刷新信息.",
+          "type": "PUT",
+          "path": "jaxrs/cache",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "nodeName",
+              "type": "String",
+              "isCollection": false,
+              "description": "节点名",
+              "isBaseType": true
+            },
+            {
+              "name": "className",
+              "type": "String",
+              "isCollection": false,
+              "description": "类名",
+              "isBaseType": true
+            },
+            {
+              "name": "keys",
+              "type": "List\u003cObject\u003e",
+              "isCollection": true,
+              "description": "关键字",
+              "isBaseType": false
+            }
+          ],
+          "outs": [
+            {
+              "name": "value",
+              "type": "String",
+              "isCollection": false,
+              "description": "字符串值"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "EchoAction",
+      "className": "com.x.base.core.project.jaxrs.echo.EchoAction",
+      "description": "响应",
+      "methods": [
+        {
+          "name": "get",
+          "className": "com.x.base.core.project.jaxrs.echo.ActionGet",
+          "description": "获取应答.",
+          "type": "GET",
+          "path": "jaxrs/echo",
+          "contentType": "application/json",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "servletContextName",
+              "type": "String",
+              "isCollection": false,
+              "description": "上下文根"
+            },
+            {
+              "name": "serverTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "服务器时间"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "FileImportExportAction",
+      "className": "com.x.attendance.assemble.control.jaxrs.attachment.FileImportExportAction",
+      "description": "附件操作",
+      "methods": [
+        {
+          "name": "abnormalDetailsExportStream",
+          "className": "com.x.attendance.assemble.control.jaxrs.attachment.ActionExportAbnormalDetail",
+          "description": "按指定月份导出非正常打卡数据,设定是否使用stream输出",
+          "type": "GET",
+          "path": "jaxrs/file/export/abnormaldetails/year/{year}/month/{month}/stream/{stream}",
+          "contentType": "application/json",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "year",
+              "type": "String",
+              "description": "年份"
+            },
+            {
+              "name": "month",
+              "type": "String",
+              "description": "月份"
+            },
+            {
+              "name": "stream",
+              "type": "Boolean",
+              "description": "用.APPLICATION_OCTET_STREAM头输出"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "contentDisposition",
+              "type": "String",
+              "isCollection": false,
+              "description": "说明"
+            },
+            {
+              "name": "contentType",
+              "type": "String",
+              "isCollection": false,
+              "description": "类型"
+            },
+            {
+              "name": "bytes",
+              "type": "byte[]",
+              "isCollection": false,
+              "description": "字节内容."
+            }
+          ]
+        },
+        {
+          "name": "fileDownloadStream",
+          "className": "com.x.attendance.assemble.control.jaxrs.attachment.ActionImportFileDownload",
+          "description": "根据文件ID下载附件,设定是否使用stream输出",
+          "type": "GET",
+          "path": "jaxrs/file/download/{id}/stream/{stream}",
+          "contentType": "application/json",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "文件标识"
+            },
+            {
+              "name": "stream",
+              "type": "Boolean",
+              "description": "用.APPLICATION_OCTET_STREAM头输出"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "contentDisposition",
+              "type": "String",
+              "isCollection": false,
+              "description": "说明"
+            },
+            {
+              "name": "contentType",
+              "type": "String",
+              "isCollection": false,
+              "description": "类型"
+            },
+            {
+              "name": "bytes",
+              "type": "byte[]",
+              "isCollection": false,
+              "description": "字节内容."
+            }
+          ]
+        },
+        {
+          "name": "selfHolidayExportStream",
+          "className": "com.x.attendance.assemble.control.jaxrs.attachment.ActionExportHolidayDetail",
+          "description": "按时间区间导出请假数据,设定是否使用stream输出",
+          "type": "GET",
+          "path": "jaxrs/file/export/selfholiday/{startdate}/{enddate}/stream/{stream}",
+          "contentType": "application/json",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "startdate",
+              "type": "String",
+              "description": "开始时间"
+            },
+            {
+              "name": "enddate",
+              "type": "String",
+              "description": "结束时间"
+            },
+            {
+              "name": "stream",
+              "type": "Boolean",
+              "description": "用.APPLICATION_OCTET_STREAM头输出"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "contentDisposition",
+              "type": "String",
+              "isCollection": false,
+              "description": "说明"
+            },
+            {
+              "name": "contentType",
+              "type": "String",
+              "isCollection": false,
+              "description": "类型"
+            },
+            {
+              "name": "bytes",
+              "type": "byte[]",
+              "isCollection": false,
+              "description": "字节内容."
+            }
+          ]
+        },
+        {
+          "name": "upload",
+          "className": "com.x.base.core.project.jaxrs.StandardJaxrsAction",
+          "description": "上传需要导入的数据文件XLS",
+          "type": "POST",
+          "path": "jaxrs/file/upload",
+          "contentType": "multipart/form-data",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": true,
+          "pathParameters": [],
+          "formParameters": [
+            {
+              "name": "file",
+              "type": "File",
+              "description": ""
+            }
+          ],
+          "queryParameters": [],
+          "ins": [],
+          "outs": []
+        }
+      ]
+    },
+    {
+      "name": "FireScheduleAction",
+      "className": "com.x.base.core.project.jaxrs.fireschedule.FireScheduleAction",
+      "description": "触发任务",
+      "methods": [
+        {
+          "name": "execute",
+          "className": "com.x.base.core.project.jaxrs.fireschedule.ActionExecute",
+          "description": "接受x_program_center发送过来的运行schedule.",
+          "type": "GET",
+          "path": "jaxrs/fireschedule/classname/{className}",
+          "contentType": "application/json",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "className",
+              "type": "String",
+              "description": "运行类"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "value",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "布尔值."
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "LoggerAction",
+      "className": "com.x.base.core.project.jaxrs.logger.LoggerAction",
+      "description": "日志操作",
+      "methods": [
+        {
+          "name": "debug",
+          "className": "com.x.base.core.project.jaxrs.logger.ActionDebug",
+          "description": "设置日志级别为DEBUG.",
+          "type": "GET",
+          "path": "jaxrs/logger/debug",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "value",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "布尔值."
+            }
+          ]
+        },
+        {
+          "name": "get",
+          "className": "com.x.base.core.project.jaxrs.logger.ActionGet",
+          "description": "获取当前日志级别.",
+          "type": "GET",
+          "path": "jaxrs/logger",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "value",
+              "type": "String",
+              "isCollection": false,
+              "description": "字符串值"
+            }
+          ]
+        },
+        {
+          "name": "info",
+          "className": "com.x.base.core.project.jaxrs.logger.ActionInfo",
+          "description": "设置日志级别为INFO",
+          "type": "GET",
+          "path": "jaxrs/logger/info",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "value",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "布尔值."
+            }
+          ]
+        },
+        {
+          "name": "trace",
+          "className": "com.x.base.core.project.jaxrs.logger.ActionTrace",
+          "description": "设置日志级别为TRACE.",
+          "type": "GET",
+          "path": "jaxrs/logger/trace",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "value",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "布尔值."
+            }
+          ]
+        },
+        {
+          "name": "warn",
+          "className": "com.x.base.core.project.jaxrs.logger.ActionWarn",
+          "description": "设置日志级别为WARN",
+          "type": "GET",
+          "path": "jaxrs/logger/warn",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "value",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "布尔值."
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "SysResourceAction",
+      "className": "com.x.base.core.project.jaxrs.sysresource.SysResourceAction",
+      "description": "系统资源",
+      "methods": [
+        {
+          "name": "listResource",
+          "className": "com.x.base.core.project.jaxrs.sysresource.ActionListResource",
+          "description": "获取静态资源信息.",
+          "type": "GET",
+          "path": "jaxrs/sysresource/filePath/{filePath}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "filePath",
+              "type": "String",
+              "description": "查找路径(根路径:(0))"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": []
+        },
+        {
+          "name": "uploadResource",
+          "className": "com.x.base.core.project.jaxrs.sysresource.ActionUploadResource",
+          "description": "上传静态资源(仅上传到当前服务器)",
+          "type": "POST",
+          "path": "jaxrs/sysresource/upload/resource/as/new/{asNew}",
+          "contentType": "multipart/form-data",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": true,
+          "pathParameters": [
+            {
+              "name": "asNew",
+              "type": "Boolean",
+              "description": "覆盖类型:true删除原文件然后上传,false覆盖原文件"
+            }
+          ],
+          "formParameters": [
+            {
+              "name": "file",
+              "type": "File",
+              "description": "上传文件"
+            },
+            {
+              "name": "fileName",
+              "type": "String",
+              "description": "附件名称"
+            },
+            {
+              "name": "filePath",
+              "type": "String",
+              "description": "附件存放目录(可以为空)"
+            }
+          ],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "value",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "布尔值."
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}

+ 776 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/common/date/DateOperation.java

@@ -0,0 +1,776 @@
+package com.x.attendance.assemble.common.date;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 
+ * @项目名 :SuperviseEfficientSystem
+ * @包  名 :com.land.util.date
+ * @文件名 :DateUtil.java
+ * @作  者 :李  义
+ * @单  位 :浙江兰德纵横网络技术有限公司
+ * @日  期 :2013-06-07
+ */
+public class DateOperation {
+	/**
+	 * 根据样式得到格式化对象SimpleDateFormat
+	 * @param date
+	 * @param style
+	 * @return
+	 */
+	public String getDate(Date date, String style) {
+		SimpleDateFormat format = new SimpleDateFormat(style);
+		return format.format(date);
+	}
+
+	/**
+	 * 得到某日期的日期部分
+	 * 
+	 * @param date
+	 * @return yyyy-MM-dd
+	 */
+	public String getDate(Date date) {
+		return format1.format(date);
+	}
+
+	/**
+	 * 得到某日期的时间部分
+	 * 
+	 * @param date
+	 * @return HH:mm:ss
+	 */
+	public  String getTime(Date date) {
+		return format2.format(date);
+	}
+
+	public  Date getDateFromString(String dateString, String style) throws Exception{
+		Date date = null;
+		if(style==null||"".equals(style.trim())){
+			date = format1.parse(dateString);
+		}else if("yyyy-MM-dd HH:mm:ss".equalsIgnoreCase(style.trim())){
+			date = format3.parse(dateString);
+		}else if("yyyy-MM-dd HH:mm".equalsIgnoreCase(style.trim())){
+			date = format3_2.parse(dateString);
+		}else if("yyyy/MM/dd HH:mm:ss".equalsIgnoreCase(style.trim())){
+			date = format3_1.parse(dateString);
+		}else if("yyyy/MM/dd".equalsIgnoreCase(style.trim())){
+			date = format4.parse(dateString);
+		}else if("yyyy-MM-dd".equalsIgnoreCase(style.trim())){
+			date = format1.parse(dateString);
+		}else if("yyyyMMdd".equalsIgnoreCase(style.trim())){
+			date = format5.parse(dateString);
+		}else if("yyyyMMddHHmmss".equalsIgnoreCase(style.trim())){
+			date = format7.parse(dateString);
+		}else if("HH:mm:ss".equalsIgnoreCase(style.trim())){
+			date = format2.parse(dateString);
+		}else if("HH:mm".equalsIgnoreCase(style.trim())){
+			date = format2_1.parse(dateString);
+		}else{
+			throw new Exception("对不起,您输入的日期style系统无法识别,请检查您的参数输入!");
+		}
+		return date;
+	}
+	
+	/**
+	 * 将字符串转换为日期格式
+	 * 会尝试多种格式转换,转换成功后返回结果
+	 * @param dateString
+	 * @return
+	 * @throws Exception
+	 */
+	public  Date getDateFromString( String dateString ) throws Exception{
+		Date date = null;
+		try{
+			date = getDateFromString( dateString, "yyyy-MM-dd HH:mm:ss" );
+			return date;
+		}catch(Exception e){}
+
+		try{
+			date = getDateFromString( dateString, "yyyy-MM-dd HH:mm" );
+			return date;
+		}catch(Exception e){}
+		
+		try{
+			date = getDateFromString( dateString, "yyyy/MM/dd HH:mm:ss" );
+			return date;
+		}catch(Exception e){}
+		
+		try{
+			date = getDateFromString( dateString, "yyyy-MM-dd" );
+			return date;
+		}catch(Exception e){}
+		
+		try{
+			date = getDateFromString( dateString, "yyyy/MM/dd" );
+			return date;
+		}catch(Exception e){}
+		
+		try{
+			date = getDateFromString( dateString, "yyyyMMdd" );
+			return date;
+		}catch(Exception e){}
+		
+		try{
+			date = getDateFromString( dateString, "yyyyMMddHHmmss" );
+			return date;
+		}catch(Exception e){}
+		
+		try{
+			date = getDateFromString( dateString, "HH:mm:ss" );
+			return date;
+		}catch(Exception e){}
+		
+		try{
+			date = getDateFromString( dateString, "HH:mm" );
+			return date;
+		}catch(Exception e){}
+		
+		return date;
+	}
+	
+	
+	public  String getDateStringFromDate(Date date, String style) throws Exception{
+		String dateString = null;
+		if(style==null||"".equals(style.trim())){
+			dateString = format1.format(date);
+		}else if("yyyy-MM-dd HH:mm:ss".equalsIgnoreCase(style.trim())){
+			dateString = format3.format(date);
+		}else if("yyyy/MM/dd HH:mm:ss".equalsIgnoreCase(style.trim())){
+			dateString = format3_1.format(date);
+		}else if("yyyy/MM/dd".equalsIgnoreCase(style.trim())){
+			dateString = format4.format(date);
+		}else if("yyyy-MM-dd".equalsIgnoreCase(style.trim())){
+			dateString = format1.format(date);
+		}else if("yyyyMMdd".equalsIgnoreCase(style.trim())){
+			dateString = format5.format(date);
+		}else if("yyyyMMddHHmmss".equalsIgnoreCase(style.trim())){
+			dateString = format7.format(date);
+		}else if("HH:mm:ss".equalsIgnoreCase(style.trim())){
+			dateString = format2.format(date);
+		}else{
+			throw new Exception("对不起,您输入的日期style系统无法识别,请检查您的参数输入!style=" + style);
+		}
+		return dateString;
+	}
+	
+	/**
+	 * 得到某日期加上或减去天数后的日期,day为负数时减去
+	 * 
+	 * @param date
+	 * @param month
+	 * @return "yyyy-MM-dd"
+	 * @throws Exception 
+	 */
+	public  String getDayAdd(String dateString, int day, String style) throws Exception {
+		Date date = getDateFromString(dateString, style);
+		return getDayAdd(date, day);
+	}
+	
+	/**
+	 * 得到某日期加上或减去天数后的日期,day为负数时减去
+	 * 
+	 * @param date
+	 * @param month
+	 * @return "yyyy-MM-dd"
+	 */
+	public  String getDayAdd(Date date, int day) {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(date);
+		calendar.add(Calendar.DATE, day);
+		return format1.format(calendar.getTime());
+	}
+
+	/**
+	 * 得到某日期加上或减去月份后的日期,month为负数时减去
+	 * 
+	 * @param date
+	 * @param month
+	 * @return "yyyy-MM-dd"
+	 */
+	public  String getMonthAdd(Date date, int month) {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(date);
+		calendar.add(Calendar.MONTH, month);
+		return format1.format(calendar.getTime());
+	}
+	
+	/**
+	 * 得到某日期加上或减去分钟后的日期,min为负数时减去
+	 * 
+	 * @param date
+	 * @param month
+	 * @return "yyyy-MM-dd HH:mi:ss"
+	 */
+	public  String getMinutesAdd(Date date, int min) {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(date);
+		calendar.add(Calendar.MINUTE, min);
+		return format3.format(calendar.getTime());
+	}
+	/**
+	 * 得到某日期的日
+	 * 
+	 * @param Date
+	 *            date
+	 * @return
+	 */
+	public  String getDay(Date date) {
+		try{
+			return format10.format(date);
+		}catch(Exception e){
+			return "0";
+		}
+	}
+	public int getDayNumber(Date date) {
+		String result = null;
+		try{
+			result = format10.format(date);
+		}catch(Exception e){
+			result = "0";
+		}
+		return Integer.parseInt(result);
+	}
+	/**
+	 * 得到某日期的月份
+	 * 
+	 * @param Date
+	 *            date
+	 * @return
+	 */
+	public  String getMonth(Date date) {
+		try{
+			return format9.format(date);
+		}catch(Exception e){
+			return "0";
+		}
+	}
+	public int getMonthNumber(Date date) {
+		String result = null;
+		try{
+			result = format9.format(date);
+		}catch(Exception e){
+			result = "0";
+		}
+		return Integer.parseInt(result);
+	}
+
+	/**
+	 * 得到某日期的年份
+	 * 
+	 * @param Date
+	 *            date
+	 * @return
+	 */
+	public  String getYear(Date date) {
+		try{
+			return format8.format(date);
+		}catch(Exception e){
+			return "0";
+		}
+	}
+	public int getYearNumber(Date date) {
+		String result = null;
+		try{
+			result = format8.format(date);
+		}catch(Exception e){
+			result = "0";
+		}
+		return Integer.parseInt(result);
+	}
+	/**
+	 * 得到某日期的小时
+	 * 
+	 * @param Date
+	 *            date
+	 * @return
+	 */
+	public  String getHour(Date date) {
+		try{
+			return format11.format(date);
+		}catch(Exception e){
+			return "0";
+		}
+	}
+	/**
+	 * 得到某日期的分钟
+	 * 
+	 * @param Date
+	 *            date
+	 * @return
+	 */
+	public  String getMinites(Date date) {
+		return format12.format(date);
+	}
+	/**
+	 * 得到某日期的秒
+	 * 
+	 * @param Date
+	 *            date
+	 * @return
+	 */
+	public  String getSeconds(Date date) {
+		return format13.format(date);
+	}
+	/**
+	 * 得到某年有多少天
+	 * 
+	 * @param String
+	 *            date "yyyy-MM-dd"
+	 * @return
+	 * @throws ParseException
+	 */
+	@SuppressWarnings("static-access")
+	public  int getDaysForYear(String date) throws ParseException {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(format1.parse(date));
+		return calendar.get(calendar.DAY_OF_YEAR);
+	}
+
+	/**
+	 * 得到某年有多少天
+	 * 
+	 * @param Date
+	 *            date
+	 * @return
+	 * @throws ParseException
+	 */
+	@SuppressWarnings("static-access")
+	public  int getDaysForYear(Date date) throws ParseException {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(date);
+		return calendar.get(calendar.DAY_OF_YEAR);
+	}
+
+	/**
+	 * 得到某年有多少天
+	 * 
+	 * @param String
+	 *            year "yyyy"
+	 * @return
+	 * @throws ParseException
+	 */
+	@SuppressWarnings("static-access")
+	public  int getDaysForYear_YYYY(String year) throws ParseException {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(format8.parse(year));
+		return calendar.get(calendar.DAY_OF_YEAR);
+	}
+
+	/**
+	 * 得到某月有多少天
+	 * 
+	 * @param String
+	 *            date "yyyy-MM-dd"
+	 * @return
+	 * @throws ParseException
+	 */
+	public  int getDaysForMonth(String date) throws ParseException {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(format1.parse(date));
+		return calendar.getActualMaximum( Calendar.DAY_OF_MONTH);
+	}
+
+	/**
+	 * 得到某月有多少天
+	 * 
+	 * @param String
+	 *            date "yyyy-MM"
+	 * @return
+	 * @throws ParseException
+	 */
+	@SuppressWarnings("static-access")
+	public  int getDaysForMonth_MM(String date) throws ParseException {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(format14.parse(date));
+		return calendar.get(calendar.DAY_OF_MONTH);
+	}
+
+	/**
+	 * 得到某月有多少天
+	 * 
+	 * @param Date
+	 *            date
+	 * @return
+	 * @throws ParseException
+	 */
+	public  int getDaysForMonth(Date date) throws ParseException {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(date);
+		return calendar.get(Calendar.DAY_OF_MONTH);
+	}
+
+	/**
+	 * 得到当前的日期
+	 * 
+	 * @return
+	 */
+	public  String getNowDate() {
+		return format1.format(new Date());
+	}
+
+	/**
+	 * 得到当前的时间
+	 * 
+	 * @return
+	 */
+	public  String getNowTime() {
+		return format2.format(new Date());
+	}
+	/**
+	 * 得到当前的时间
+	 * yyyyMMddHHmmss
+	 * @return
+	 */
+	public  String getNowTimeChar() {
+		return format7.format(new Date());
+	}
+	/**
+	 * 得到当前的时间
+	 * yyyy-MM-dd HH:mm:ss
+	 * @return
+	 */
+	public  String getNowDateTime() {
+		return format3.format(new Date());
+	}
+	/**
+	 * 得到两个时间之前的分差
+	 * @param date1 yyyy-MM-dd HH:mm:ss
+	 * @param date2 yyyy-MM-dd HH:mm:ss
+	 * @return
+	 * @throws ParseException 
+	 */
+	public  long getDeff(String date1,String date2) throws ParseException {
+		long dayNumber = 0;
+		// 1小时=60分钟=3600秒=3600000
+		long mins = 60L * 1000L;
+		// long day= 24L * 60L * 60L * 1000L;计算天数之差
+		SimpleDateFormat df = null;
+		if(date1.length() == 19){
+			df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		}else if(date1.length() == 10){
+			df = new SimpleDateFormat("yyyy-MM-dd");
+		}else if(date1.length() == 8){
+			df = new SimpleDateFormat("HH:mm:ss");
+		}else{
+			df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		}
+		java.util.Date d1 = df.parse(date1);
+		java.util.Date d2 = df.parse(date2);
+		dayNumber = (d2.getTime() - d1.getTime()) / mins;
+		return dayNumber;
+	}
+	/**
+	 * 得到两个时间之前的分差
+	 * @param date1 yyyy-MM-dd HH:mm:ss
+	 * @param date2 yyyy-MM-dd HH:mm:ss
+	 * @return
+	 */
+	public long getDeff(Date date1,Date date2) {
+		long dayNumber = 0;
+		long mins = 60L * 1000L;
+		dayNumber = (date2.getTime() - date1.getTime()) / mins;
+		return dayNumber;
+	}
+	/**
+	 * 
+	 * 日期格式转换
+	 * 从YYYY-MM-DD转换到YYYYMMDD
+	 * @param date
+	 * @throws ParseException 
+	 */
+	public  String changeDateFormat(String dateString) throws ParseException{
+		Date date;
+		String reslut = null;
+		try {
+			if("".equals(dateString)){
+				dateString="0000-00-00";
+			}
+			date = format1.parse(dateString);
+			reslut = format5.format(date);
+		} catch (ParseException e) {
+			date = format1.parse("0000-00-00");
+		}
+		return reslut;
+	}
+	
+	/** 格式 yyyy-MM-dd */
+	public  final SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
+	/** 格式 HH:mm:ss */
+	public  final SimpleDateFormat format2 = new SimpleDateFormat("HH:mm:ss");
+	public  final SimpleDateFormat format2_1 = new SimpleDateFormat("HH:mm");
+	/** 格式 yyyy-MM-dd HH:mm:ss */
+	public  final SimpleDateFormat format3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+	public  final SimpleDateFormat format3_2 = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+	public  final SimpleDateFormat format3_1 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
+	/** 格式 yyyy/MM/dd */
+	public  final SimpleDateFormat format4 = new SimpleDateFormat("yyyy/MM/dd");
+	/** 格式 yyyyMMdd */
+	public  final SimpleDateFormat format5 = new SimpleDateFormat("yyyyMMdd");
+	/** 格式 HHmmss */
+	public  final SimpleDateFormat format6 = new SimpleDateFormat("HHmmss");
+	/** 格式 yyyyMMddHHmmss */
+	public  final SimpleDateFormat format7 = new SimpleDateFormat("yyyyMMddHHmmss");
+	/** 格式 yyyy */
+	public  final SimpleDateFormat format8 = new SimpleDateFormat("yyyy");
+	/** 格式 MM */
+	public  final SimpleDateFormat format9 = new SimpleDateFormat("MM");
+	/** 格式 dd */
+	public  final SimpleDateFormat format10 = new SimpleDateFormat("dd");
+	/** 格式 HH */
+	public  final SimpleDateFormat format11 = new SimpleDateFormat("HH");
+	/** 格式 mm */
+	public  final SimpleDateFormat format12 = new SimpleDateFormat("mm");
+	/** 格式 ss */
+	public  final SimpleDateFormat format13 = new SimpleDateFormat("ss");
+	/** 格式 ss */
+	public  final SimpleDateFormat format14 = new SimpleDateFormat("yyyy-MM");
+	
+	
+	public  String getStartOfWeek(String dateString) throws Exception{
+		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+		Date date = format.parse(dateString);
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(date);
+		cal.setFirstDayOfWeek(Calendar.MONDAY);
+		int tmp = cal.get(Calendar.DAY_OF_WEEK) - 1;
+		if (0 == tmp) {
+			tmp = 7;
+		}
+		cal.add(Calendar.DATE, -(tmp-1));
+		return getDateStringFromDate(cal.getTime(), "yyyy-MM-dd") + " 00:00:00";
+	}
+	
+	public  String getEndOfWeek(String dateString) throws Exception{
+		Date date = getDateFromString(getStartOfWeek(dateString), "yyyy-MM-dd HH:mm:ss");
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(date);
+		cal.setFirstDayOfWeek(Calendar.MONDAY);
+		cal.add(Calendar.DATE, 6);
+		return getDateStringFromDate(cal.getTime(), "yyyy-MM-dd") + " 23:59:59";
+	}
+	
+	
+	
+	/**
+	 * 将时间格式转换为 **月**日**时**分的格式
+	 * @param dateString
+	 * @param style
+	 * @return
+	 * @throws Exception
+	 */
+	public String getDateCNString( String dateString, String style ) throws Exception{
+		StringBuffer ch_date_string = new StringBuffer();
+		Date _date = null;
+		_date = getDateFromString( dateString, style );
+		if(_date == null ){
+			_date = new Date();
+		}
+		String year = getYear( _date );
+		String month = getMonth( _date );
+		String day = getDay( _date );
+		String hour = getHour( _date );
+		String min = getMinites( _date );
+		ch_date_string.append( year );
+		ch_date_string.append( "年" );
+		ch_date_string.append( month );
+		ch_date_string.append( "月" );
+		ch_date_string.append( day );
+		ch_date_string.append( "日" );
+		ch_date_string.append( hour );
+		ch_date_string.append( "时" );
+		ch_date_string.append( min );
+		ch_date_string.append( "分" );		
+		return ch_date_string.toString();
+	}
+	
+	/**
+	 * 将时间格式转换为 **月**日**时**分**秒 的格式
+	 * @param dateString
+	 * @param style
+	 * @return
+	 * @throws Exception
+	 */
+	public String getDateCNString2( String dateString, String style ) throws Exception{
+		StringBuffer ch_date_string = new StringBuffer();
+		Date _date = null;
+		_date = getDateFromString( dateString, style );
+		if(_date == null ){
+			_date = new Date();
+		}
+		String year = getYear( _date );
+		String month = getMonth( _date );
+		String day = getDay( _date );
+		String hour = getHour( _date );
+		String min = getMinites( _date );
+		String sec = getSeconds( _date );
+		ch_date_string.append( year );
+		ch_date_string.append( "年" );
+		ch_date_string.append( month );
+		ch_date_string.append( "月" );
+		ch_date_string.append( day );
+		ch_date_string.append( "日" );
+		ch_date_string.append( hour );
+		ch_date_string.append( "时" );
+		ch_date_string.append( min );
+		ch_date_string.append( "分" );
+		ch_date_string.append( sec );
+		ch_date_string.append( "秒" );
+		return ch_date_string.toString();
+	}
+	
+	/**
+	 * 获取日期在一年中的周数
+	 * 结果从1开始
+	 * @param dateString yyyy-mm-dd
+	 * @return
+	 * @throws Exception 
+	 */
+	public  int getWeekNumOfYear( String dateString ) throws Exception{
+		Date date = getDateFromString( dateString , "yyyy-MM-dd");
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(date);
+		cal.setFirstDayOfWeek(2); //设置每周的第一天是星期一
+		return cal.get(Calendar.WEEK_OF_YEAR);
+	}
+	
+	/**
+	 * 判断是否周末
+	 * @param recordDate
+	 * @return
+	 */
+	public boolean isWeekend( Date recordDate ) {
+		Calendar cal = Calendar.getInstance();
+	    cal.setTime( recordDate );
+	    if(cal.get(Calendar.DAY_OF_WEEK)==Calendar.SATURDAY||cal.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY){
+	       return true;
+	    }
+		return false;
+	}
+	
+	public long getMinutes( Date date1, Date data2){
+		 long l=data2.getTime()-date1.getTime();
+		 long min=((l/(60*1000)));
+		 return min;
+	}
+
+	/**
+	 * 根据提供的年份月份,获取当月所有的日期字符串:yyyy-mm-dd
+	 * @param s_year
+	 * @param _month
+	 * @return
+	 */
+	public List<String> getDateStringFormMonth(String s_year, String _month) {
+		List<String> result = new ArrayList<String>();
+		Calendar cal = Calendar.getInstance();
+		int year = 0;
+		int month = 0;
+		int days = 0;
+		try{
+			year = Integer.parseInt( s_year );
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		try{
+			month = Integer.parseInt( _month );
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		cal.set(year, month-1, 1);
+		days = cal.getActualMaximum(Calendar.DATE);
+		for( int i =1; i<= days ; i++){
+			result.add( s_year + "-" + (month<10?"0"+month:month) + "-" + (i<10?"0"+i:i));
+		}
+		return result;
+	}
+	
+	/**
+	 * 根据提供的两个时间之间所有的日期字符串:yyyy-mm-dd
+	 * @param startDate
+	 * @param endDate
+	 * @return
+	 * @throws Exception 
+	 */
+	public List<String> listDateStringBetweenDate( Date startDate, Date endDate ) throws Exception {		
+		List<String> result = new ArrayList<String>();
+		Calendar cal = Calendar.getInstance();
+		startDate = getDateFromString( getDateStringFromDate( startDate, "yyyy-MM-dd") );
+		endDate = getDateFromString( getDateStringFromDate( endDate, "yyyy-MM-dd") + " 23:59:59");	
+		cal.setTime( startDate );
+		while( cal.getTime().before(endDate)){
+			result.add( getDateStringFromDate( cal.getTime(), "yyyy-MM-dd"));
+			cal.add(Calendar.DATE, 1);
+		}
+		return result;
+	}
+	
+	/**
+	 * 获取日期所在月份的第一天
+	 * @param recordDate
+	 * @return
+	 * @throws Exception 
+	 */
+	public Date getFirstDateInMonth(Date recordDate) throws Exception {
+		String year = format8.format(recordDate);
+		String month = format9.format(recordDate);
+		return getDateFromString( year + "-" + month + "-01" );
+	}
+	
+	/**
+	 * 获取日期所在月份的第一天
+	 * @param recordDate yyyy-MM-dd
+	 * @return
+	 * @throws Exception 
+	 */
+	public String getFirstDateStringInMonth(Date recordDate) throws Exception {
+		String year = format8.format(recordDate);
+		String month = format9.format(recordDate);
+		return year + "-" + month + "-01";
+	}
+	
+	/**
+	 * 获取当月的最后一日
+	 * @param date
+	 * @return
+	 */
+	public static Date getLastDayOfMonth(Date date) {  
+        Calendar calendar = convert(date);  
+        calendar.set(Calendar.DATE, calendar.getMaximum(Calendar.DATE));  
+        return calendar.getTime();  
+    }  
+	/** 
+     * 将日期转换为日历 
+     * @param date 日期 
+     * @return 日历 
+     */  
+    private static Calendar convert(Date date) {  
+        Calendar calendar = Calendar.getInstance();  
+        calendar.setTime(date);  
+        return calendar;  
+    }  
+	/**
+	 * 获取日期所在月份的第一天
+	 * @param recordDate
+	 * @return
+	 * @throws Exception 
+	 */
+	public Date getLastDateInMonth(Date recordDate) throws Exception {
+		Date lastDate = getLastDayOfMonth( recordDate );
+		return getDateFromString( getDateStringFromDate( lastDate, "yyyy-MM-dd") );
+	}
+	
+	/**
+	 * 获取日期所在月份的第一天
+	 * @param recordDate yyyy-MM-dd
+	 * @return
+	 * @throws Exception 
+	 */
+	public String getLastDateStringInMonth(Date recordDate) throws Exception {
+		Date lastDate = getLastDayOfMonth(recordDate);
+		return getDateStringFromDate( lastDate, "yyyy-MM-dd");
+	}
+}

+ 276 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/common/excel/reader/Excel2003Reader.java

@@ -0,0 +1,276 @@
+package com.x.attendance.assemble.common.excel.reader;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.poi.hssf.eventusermodel.EventWorkbookBuilder.SheetRecordCollectingListener;
+import org.apache.poi.hssf.eventusermodel.FormatTrackingHSSFListener;
+import org.apache.poi.hssf.eventusermodel.HSSFEventFactory;
+import org.apache.poi.hssf.eventusermodel.HSSFListener;
+import org.apache.poi.hssf.eventusermodel.HSSFRequest;
+import org.apache.poi.hssf.eventusermodel.MissingRecordAwareHSSFListener;
+import org.apache.poi.hssf.eventusermodel.dummyrecord.LastCellOfRowDummyRecord;
+import org.apache.poi.hssf.eventusermodel.dummyrecord.MissingCellDummyRecord;
+import org.apache.poi.hssf.model.HSSFFormulaParser;
+import org.apache.poi.hssf.record.BOFRecord;
+import org.apache.poi.hssf.record.BlankRecord;
+import org.apache.poi.hssf.record.BoolErrRecord;
+import org.apache.poi.hssf.record.BoundSheetRecord;
+import org.apache.poi.hssf.record.FormulaRecord;
+import org.apache.poi.hssf.record.LabelRecord;
+import org.apache.poi.hssf.record.LabelSSTRecord;
+import org.apache.poi.hssf.record.NumberRecord;
+import org.apache.poi.hssf.record.Record;
+import org.apache.poi.hssf.record.SSTRecord;
+import org.apache.poi.hssf.record.StringRecord;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+
+/**
+ * 抽象Excel2003读取器,通过实现HSSFListener监听器,采用事件驱动模式解析excel2003
+ * 中的内容,遇到特定事件才会触发,大大减少了内存的使用。
+ *
+ */
+public  class Excel2003Reader implements HSSFListener{
+	private int minColumns = -1;
+	private POIFSFileSystem fs;
+	private int lastRowNumber;
+	private int lastColumnNumber;
+
+	/** Should we output the formula, or the value it has? */
+	private boolean outputFormulaValues = true;
+
+	/** For parsing Formulas */
+	private SheetRecordCollectingListener workbookBuildingListener;
+	//excel2003工作薄
+	private HSSFWorkbook stubWorkbook;
+
+	// Records we pick up as we process
+	private SSTRecord sstRecord;
+	private FormatTrackingHSSFListener formatListener;
+
+	//表索引
+	private int sheetIndex = -1;
+	private BoundSheetRecord[] orderedBSRs;
+	@SuppressWarnings("rawtypes")
+	private ArrayList boundSheetRecords = new ArrayList();
+
+	// For handling formulas with string results
+	private int nextRow;
+	private int nextColumn;
+	private boolean outputNextStringRecord;
+	//当前行
+	private int curRow = 0;
+	//存储行记录的容器
+	private List<String> rowlist = new ArrayList<String>();;
+	@SuppressWarnings( "unused")
+	private String sheetName;
+	
+	private String fileKey;
+	private int startRow;
+	private IRowReader rowReader;
+
+	
+	public void setRowReader(IRowReader rowReader, String fileKey, int startRow ){
+		this.rowReader = rowReader;
+		this.fileKey = fileKey;
+		this.startRow = startRow;
+	}
+	
+	/**
+	 * 遍历excel下所有的sheet
+	 * @param fileKey 
+	 * @throws IOException
+	 */
+	public void process(String fileName ) throws IOException {
+		
+		this.fs = new POIFSFileSystem(new FileInputStream(fileName));
+		MissingRecordAwareHSSFListener listener = new MissingRecordAwareHSSFListener( this);
+		formatListener = new FormatTrackingHSSFListener(listener);
+		HSSFEventFactory factory = new HSSFEventFactory();
+		HSSFRequest request = new HSSFRequest();
+		if ( outputFormulaValues ) {
+			request.addListenerForAllRecords( formatListener );
+		} else {
+			workbookBuildingListener = new SheetRecordCollectingListener( formatListener);
+			request.addListenerForAllRecords(workbookBuildingListener);
+		}
+		factory.processWorkbookEvents(request, fs);
+		//数据读取完成
+	}
+	
+	/**
+	 * 遍历excel下所有的sheet
+	 * @param fileKey 
+	 * @throws IOException
+	 */
+	public void process( InputStream is ) throws IOException {
+		this.fs = new POIFSFileSystem( is );
+		MissingRecordAwareHSSFListener listener = new MissingRecordAwareHSSFListener( this);
+		formatListener = new FormatTrackingHSSFListener(listener);
+		HSSFEventFactory factory = new HSSFEventFactory();
+		HSSFRequest request = new HSSFRequest();
+		if ( outputFormulaValues ) {
+			request.addListenerForAllRecords( formatListener );
+		} else {
+			workbookBuildingListener = new SheetRecordCollectingListener( formatListener);
+			request.addListenerForAllRecords(workbookBuildingListener);
+		}
+		factory.processWorkbookEvents(request, fs);
+		//数据读取完成
+	}
+	
+	/**
+	 * HSSFListener 监听方法,处理 Record
+	 */
+	@SuppressWarnings("unchecked")
+	public void processRecord(Record record) {
+		int thisRow = -1;
+		int thisColumn = -1;
+		String thisStr = null;
+		String value = null;
+		switch (record.getSid()) {
+			case BoundSheetRecord.sid:
+				boundSheetRecords.add(record);
+				break;
+			case BOFRecord.sid:
+				BOFRecord br = (BOFRecord) record;
+				if (br.getType() == BOFRecord.TYPE_WORKSHEET) {
+					// 如果有需要,则建立子工作薄
+					if (workbookBuildingListener != null && stubWorkbook == null) {
+						stubWorkbook = workbookBuildingListener
+								.getStubHSSFWorkbook();
+					}
+					
+					sheetIndex++;
+					if (orderedBSRs == null) {
+						orderedBSRs = BoundSheetRecord
+								.orderByBofPosition(boundSheetRecords);
+					}
+					sheetName = orderedBSRs[sheetIndex].getSheetname();
+				}
+				break;
+	
+			case SSTRecord.sid:
+				sstRecord = (SSTRecord) record;
+				break;
+	
+			case BlankRecord.sid:
+				BlankRecord brec = (BlankRecord) record;
+				thisRow = brec.getRow();
+				thisColumn = brec.getColumn();
+				thisStr = "";
+				rowlist.add(thisColumn, thisStr);
+				break;
+			case BoolErrRecord.sid: //单元格为布尔类型
+				BoolErrRecord berec = (BoolErrRecord) record;
+				thisRow = berec.getRow();
+				thisColumn = berec.getColumn();
+				thisStr = berec.getBooleanValue()+"";
+				rowlist.add(thisColumn, thisStr);
+				break;
+	
+			case FormulaRecord.sid: //单元格为公式类型
+				FormulaRecord frec = (FormulaRecord) record;
+				thisRow = frec.getRow();
+				thisColumn = frec.getColumn();
+				if (outputFormulaValues) {
+					if (Double.isNaN(frec.getValue())) {
+						// Formula result is a string
+						// This is stored in the next record
+						outputNextStringRecord = true;
+						nextRow = frec.getRow();
+						nextColumn = frec.getColumn();
+					} else {
+						thisStr = formatListener.formatNumberDateCell(frec);
+					}
+				} else {
+					thisStr = '"' + HSSFFormulaParser.toFormulaString(stubWorkbook, frec.getParsedExpression()) + '"';
+				}
+				rowlist.add(thisColumn,thisStr);
+				break;
+			case StringRecord.sid://单元格中公式的字符串
+				if (outputNextStringRecord) {
+					// String for formula
+					StringRecord srec = (StringRecord) record;
+					thisStr = srec.getString();
+					thisRow = nextRow;
+					thisColumn = nextColumn;
+					outputNextStringRecord = false;
+				}
+				break;
+			case LabelRecord.sid:
+				LabelRecord lrec = (LabelRecord) record;
+				curRow = thisRow = lrec.getRow();
+				thisColumn = lrec.getColumn();
+				value = lrec.getValue().trim();
+				value = value.equals("")?" ":value;
+				this.rowlist.add(thisColumn, value);
+				break;
+			case LabelSSTRecord.sid:  //单元格为字符串类型
+				LabelSSTRecord lsrec = (LabelSSTRecord) record;
+				curRow = thisRow = lsrec.getRow();
+				thisColumn = lsrec.getColumn();
+				if (sstRecord == null) {
+					rowlist.add(thisColumn, " ");
+				} else {
+					value =  sstRecord
+					.getString(lsrec.getSSTIndex()).toString().trim();
+					value = value.equals("")?" ":value;
+					rowlist.add(thisColumn,value);
+				}
+				break;
+			case NumberRecord.sid:  //单元格为数字类型
+				NumberRecord numrec = (NumberRecord) record;
+				curRow = thisRow = numrec.getRow();
+				thisColumn = numrec.getColumn();
+				value = formatListener.formatNumberDateCell(numrec).trim();
+				value = value.equals("")?" ":value;
+				// 向容器加入列值
+				rowlist.add(thisColumn, value);
+				break;
+			default:
+				break;
+		}
+
+		// 遇到新行的操作
+		if (thisRow != -1 && thisRow != lastRowNumber) {
+			lastColumnNumber = -1;
+		}
+
+		// 空值的操作
+		if (record instanceof MissingCellDummyRecord) {
+			MissingCellDummyRecord mc = (MissingCellDummyRecord) record;
+			curRow = thisRow = mc.getRow();
+			thisColumn = mc.getColumn();
+			rowlist.add(thisColumn," ");
+		}
+
+		// 更新行和列的值
+		if (thisRow > -1)
+			lastRowNumber = thisRow;
+		if (thisColumn > -1)
+			lastColumnNumber = thisColumn;
+
+		// 行结束时的操作
+		if (record instanceof LastCellOfRowDummyRecord) {
+			if (minColumns > 0) {
+				// 列值重新置空
+				if (lastColumnNumber == -1) {
+					lastColumnNumber = 0;
+				}
+			}
+			lastColumnNumber = -1;
+			// 每行结束时, 调用getRows() 方法
+			
+			rowReader.getRows(sheetIndex,curRow, rowlist, this.fileKey, this.startRow );
+			
+			// 清空容器
+			rowlist.clear();
+		}
+	}
+	
+}

+ 233 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/common/excel/reader/Excel2007Reader.java

@@ -0,0 +1,233 @@
+package com.x.attendance.assemble.common.excel.reader;
+
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.poi.hssf.usermodel.HSSFDateUtil;
+import org.apache.poi.openxml4j.opc.OPCPackage;
+import org.apache.poi.xssf.eventusermodel.XSSFReader;
+import org.apache.poi.xssf.model.SharedStringsTable;
+import org.apache.poi.xssf.usermodel.XSSFRichTextString;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.DefaultHandler;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * 抽象Excel2007读取器,excel2007的底层数据结构是xml文件,采用SAX的事件驱动的方法解析
+ * xml,需要继承DefaultHandler,在遇到文件内容时,事件会触发,这种做法可以大大降低
+ * 内存的耗费,特别使用于大数据量的文件。
+ *
+ */
+public class Excel2007Reader extends DefaultHandler {
+	//共享字符串表
+	private SharedStringsTable sst;
+	//上一次的内容
+	private String lastContents;
+	
+	private boolean nextIsString;
+
+	private int sheetIndex = -1;
+	
+	private List<String> rowlist = new ArrayList<String>();
+	//当前行
+	private int curRow = 0;
+	//当前列
+	private int curCol = 0;
+	//日期标志
+	private boolean dateFlag;
+	//数字标志
+	private boolean numberFlag;
+	
+	private boolean isTElement;
+	
+	private String fileKey;
+	private int startRow;
+	private IRowReader rowReader;
+	
+	public void setRowReader( IRowReader rowReader, String fileKey, int startRow ){
+		this.rowReader = rowReader;
+		this.fileKey = fileKey;
+		this.startRow = startRow;
+	}
+	
+	/**只遍历一个电子表格,其中sheetId为要遍历的sheet索引,从1开始,1-3
+	 * @param filename
+	 * @param sheetId
+	 * @throws Exception
+	 */
+	public void processOneSheet(String filename,int sheetId) throws Exception {
+		OPCPackage pkg = OPCPackage.open(filename);
+		XSSFReader r = new XSSFReader(pkg);
+		SharedStringsTable sst = r.getSharedStringsTable();
+		XMLReader parser = fetchSheetParser(sst);
+		
+		// 根据 rId# 或 rSheet# 查找sheet
+		InputStream sheet2 = r.getSheet("rId"+sheetId);
+		sheetIndex++;
+		InputSource sheetSource = new InputSource(sheet2);
+		parser.parse(sheetSource);
+		sheet2.close();
+	}
+
+	/**
+	 * 遍历工作簿中所有的电子表格
+	 * @param filename
+	 * @param fileKey 
+	 * @throws Exception
+	 */
+	public void process( String filename ) throws Exception {
+		OPCPackage pkg = OPCPackage.open(filename);
+		XSSFReader r = new XSSFReader(pkg);
+		SharedStringsTable sst = r.getSharedStringsTable();
+		XMLReader parser = fetchSheetParser(sst);
+		Iterator<InputStream> sheets = r.getSheetsData();
+		while (sheets.hasNext()) {
+			curRow = 0;
+			sheetIndex++;
+			InputStream sheet = sheets.next();
+			InputSource sheetSource = new InputSource(sheet);
+			parser.parse( sheetSource );
+			sheet.close();
+		}
+		//数据读取完成
+	}
+	
+	/**
+	 * 遍历工作簿中所有的电子表格
+	 * @param filename
+	 * @param fileKey 
+	 * @throws Exception
+	 */
+	public void process( InputStream is ) throws Exception {
+		OPCPackage pkg = OPCPackage.open( is );
+		XSSFReader r = new XSSFReader(pkg);
+		SharedStringsTable sst = r.getSharedStringsTable();
+		XMLReader parser = fetchSheetParser(sst);
+		Iterator<InputStream> sheets = r.getSheetsData();
+		while (sheets.hasNext()) {
+			curRow = 0;
+			sheetIndex++;
+			InputStream sheet = sheets.next();
+			InputSource sheetSource = new InputSource(sheet);
+			parser.parse( sheetSource );
+			sheet.close();
+		}
+	}
+
+	public XMLReader fetchSheetParser(SharedStringsTable sst) throws SAXException {
+		XMLReader parser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
+		this.sst = sst;
+		parser.setContentHandler(this);
+		return parser;
+	}
+
+	public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
+		
+		// c => 单元格
+		if ("c".equals(name)) {
+			// 如果下一个元素是 SST 的索引,则将nextIsString标记为true
+			String cellType = attributes.getValue("t");
+			if ("s".equals(cellType)) {
+				nextIsString = true;
+			} else {
+				nextIsString = false;
+			}
+			//日期格式
+			String cellDateType = attributes.getValue("s");
+			if ("1".equals(cellDateType)){
+				dateFlag = true;
+			} else {
+				dateFlag = false;
+			}
+			String cellNumberType = attributes.getValue("s");
+			if("2".equals(cellNumberType)){
+				numberFlag = true;
+			} else {
+				numberFlag = false;
+			}
+			
+		}
+		//当元素为t时
+		if("t".equals(name)){
+			isTElement = true;
+		} else {
+			isTElement = false;
+		}
+		
+		// 置空
+		lastContents = "";
+	}
+
+	public void endElement(String uri, String localName, String name)
+			throws SAXException {
+		
+		// 根据SST的索引值的到单元格的真正要存储的字符串
+		// 这时characters()方法可能会被调用多次
+		if (nextIsString) {
+			try {
+				int idx = Integer.parseInt(lastContents);
+				lastContents = new XSSFRichTextString(sst.getEntryAt(idx))
+						.toString();
+			} catch (Exception e) {
+
+			}
+		} 
+		//t元素也包含字符串
+		if(isTElement){
+			String value = lastContents.trim();
+			rowlist.add(curCol, value);
+			curCol++;
+			isTElement = false;
+			// v => 单元格的值,如果单元格是字符串则v标签的值为该字符串在SST中的索引
+			// 将单元格内容加入rowlist中,在这之前先去掉字符串前后的空白符
+		} else if ("v".equals(name)) {
+			String value = lastContents.trim();
+			value = value.equals("")?" ":value;
+			//日期格式处理
+			if(dateFlag){
+				try{
+					Date date = HSSFDateUtil.getJavaDate(Double.valueOf(value));
+					SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
+					value = dateFormat.format(date);
+				}catch(Exception e){
+					
+				}
+			} 
+			//数字类型处理
+			if(numberFlag){
+				try{
+					BigDecimal bd = new BigDecimal(value);
+					value = bd.setScale(3,BigDecimal.ROUND_UP).toString();
+				}catch(Exception e){
+					
+				}
+			}
+			rowlist.add(curCol, value);
+			curCol++;
+		}else {
+			//如果标签名称为 row ,这说明已到行尾,调用 optRows() 方法
+			if (name.equals("row")) {
+				
+				rowReader.getRows(sheetIndex,curRow,rowlist, this.fileKey, this.startRow );
+				rowlist.clear();
+				curRow++;
+				curCol = 0;
+			}
+		}
+		
+	}
+
+	public void characters(char[] ch, int start, int length)
+			throws SAXException {
+		//得到单元格内容的值
+		lastContents += new String(ch, start, length);
+	}
+}

+ 58 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/common/excel/reader/ExcelReaderUtil.java

@@ -0,0 +1,58 @@
+package com.x.attendance.assemble.common.excel.reader;
+
+import java.io.InputStream;
+
+public class ExcelReaderUtil {
+	
+	//excel2003扩展名
+	public static final String EXCEL03_EXTENSION = ".xls";
+	//excel2007扩展名
+	public static final String EXCEL07_EXTENSION = ".xlsx";
+	
+	/**
+	 * 读取Excel文件,可能是03也可能是07版本
+	 * @param excel03
+	 * @param excel07
+	 * @param fileName
+	 * @throws Exception 
+	 */
+	public static void readExcel( IRowReader reader, String fileName, String fileKey, int startRow ) throws Exception{
+		// 处理excel2003文件
+		if (fileName.endsWith(EXCEL03_EXTENSION)){
+			Excel2003Reader excel03 = new Excel2003Reader();
+			excel03.setRowReader(reader, fileKey, startRow);
+			excel03.process(fileName);
+		// 处理excel2007文件
+		} else if (fileName.endsWith(EXCEL07_EXTENSION)){
+			Excel2007Reader excel07 = new Excel2007Reader();
+			excel07.setRowReader(reader, fileKey, startRow);
+			excel07.process(fileName);
+		} else {
+			throw new  Exception("文件格式错误,fileName的扩展名只能是xls或xlsx。");
+		}
+	}
+	
+	public static void readExcel( IRowReader reader, InputStream is, String fileName, String fileKey, int startRow ) throws Exception{
+		// 处理excel2003文件
+		if (fileName.endsWith(EXCEL03_EXTENSION)){
+			if ( is != null ){
+				Excel2003Reader excel03 = new Excel2003Reader();
+				excel03.setRowReader( reader, fileKey, startRow );
+				excel03.process( is );
+			} else {
+				throw new  Exception("there is no input stream.");
+			}
+		// 处理excel2007文件
+		} else if (fileName.endsWith(EXCEL07_EXTENSION)){
+			if ( is != null ){
+				Excel2007Reader excel07 = new Excel2007Reader();
+				excel07.setRowReader(reader, fileKey, startRow);
+				excel07.process( is );
+			} else {
+				throw new  Exception("there is no input stream.");
+			}
+		} else {
+			throw new  Exception("文件格式错误,fileName的扩展名只能是xls或xlsx。");
+		}
+	}
+}

+ 13 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/common/excel/reader/IRowReader.java

@@ -0,0 +1,13 @@
+package com.x.attendance.assemble.common.excel.reader;
+
+import java.util.List;
+
+public interface IRowReader {
+	
+	/**业务逻辑实现方法
+	 * @param sheetIndex
+	 * @param curRow
+	 * @param rowlist
+	 */
+	public  void getRows(int sheetIndex,int curRow, List<String> rowlist, String fileKey, int startRow);
+}

+ 23 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/common/excel/reader/ImportExcelReader.java

@@ -0,0 +1,23 @@
+package com.x.attendance.assemble.common.excel.reader;
+
+import java.util.List;
+
+import com.x.attendance.assemble.control.processor.sender.SenderForValidateData;
+
+public class ImportExcelReader implements IRowReader{
+	
+	/* 业务逻辑实现方法
+	 * @see com.eprosun.util.excel.IRowReader#getRows(int, int, java.util.List)
+	 */
+	public void getRows( int sheetIndex, int curRow, List<String> colmlist, String fileKey, int startRow ) {
+		if( curRow < startRow ){
+			return;
+		}
+
+		if( colmlist != null && !colmlist.isEmpty() ) {
+			if( !colmlist.get(0).isEmpty() && !colmlist.get(2).isEmpty()){
+				new SenderForValidateData().execute( sheetIndex, curRow, colmlist, fileKey );
+			}
+		}
+	}	
+}

+ 225 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/common/excel/reader/UserModelEventListener.java

@@ -0,0 +1,225 @@
+package com.x.attendance.assemble.common.excel.reader;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.poi.hssf.eventusermodel.EventWorkbookBuilder.SheetRecordCollectingListener;
+import org.apache.poi.hssf.eventusermodel.HSSFListener;
+import org.apache.poi.hssf.record.BOFRecord;
+import org.apache.poi.hssf.record.BlankRecord;
+import org.apache.poi.hssf.record.BoolErrRecord;
+import org.apache.poi.hssf.record.BoundSheetRecord;
+import org.apache.poi.hssf.record.FormulaRecord;
+import org.apache.poi.hssf.record.LabelSSTRecord;
+import org.apache.poi.hssf.record.NumberRecord;
+import org.apache.poi.hssf.record.Record;
+import org.apache.poi.hssf.record.RowRecord;
+import org.apache.poi.hssf.record.SSTRecord;
+
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+
+/**
+ * 基于POI HSSF的eventmodel 模型的时间解析方式
+ *   优点:解析数据相当快。
+ *   缺点:1.仅仅支持97~2003版本的excel,不支持2007版本的excel。
+ *         2.只能读Excel中一个Sheet页面。
+ * 
+ * @Title: 
+ * @Description: 实现TODO
+ * @Copyright:Copyright (c) 2011
+ * @Date:2012-6-14
+ * @author  O2LEE
+ * @version 1.0
+ */
+public class UserModelEventListener implements HSSFListener {
+	
+	private static Logger logger=LoggerFactory.getLogger( UserModelEventListener.class );
+	private SSTRecord sstrec;
+	/** Should we output the formula, or the value it has? */
+	private boolean outputFormulaValues = true;
+	/** For parsing Formulas */
+	private SheetRecordCollectingListener workbookBuildingListener;
+
+    //当前Sheet的内容
+    private List<Map<String,Object>> currentSheetDataMap=new ArrayList<Map<String,Object>>();
+    //列对应的字段
+	private static String[] trianListheadTitle=new String[]{"trainCode","firstStation","lastStation","startStation","arriveStation","startTime","arriveTime","fistLevelPrice","secondLevelPrice","km","useDate"};
+
+    //一行记录
+    private Map<String,Object> currentSheetRowDataMap=new HashMap<String,Object>();
+    private int curRowNum=0;
+    private int ignoreRowNum=1;
+    private int sheetNo=0;
+    
+    private Boolean debugger = false;
+
+	@Override
+	public void processRecord( Record record ) {
+		switch (record.getSid()) {
+		
+		case BOFRecord.sid:
+			BOFRecord bof = (BOFRecord) record;
+			//顺序进入新的Workbook  
+			if (bof.getType() == bof.TYPE_WORKBOOK) {
+				logger.debug( debugger, ">>>>>>>>>>开始解析excel 文档.....");
+			//顺序进入新的Worksheet,因为Event API不会把Excel文件里的所有数据结构都关联起来,
+			//所以这儿一定要记录现在进入第几个sheet了。
+			} else if (bof.getType() == bof.TYPE_WORKSHEET) {
+				//读取新的一个Sheet页
+				logger.debug( debugger, ">>>>>>>>>>开始解析sheet页面内容...");
+				sheetNo++;
+				currentSheetDataMap=new ArrayList<Map<String,Object>>();
+			}
+			break;
+	    //开始解析Sheet的信息,记录sheet,这儿会把所有的sheet都顺序打印出来,如果有多个sheet的话,可以顺序记入到一个List里   
+		case BoundSheetRecord.sid:
+			BoundSheetRecord bsr = (BoundSheetRecord) record;
+			logger.debug( debugger, ">>>>>>>>>>New sheet named: " + bsr.getSheetname());
+			break;
+		//执行行记录事件
+		case RowRecord.sid:
+			RowRecord rowrec = (RowRecord) record;
+			logger.debug( debugger, ">>>>>>>>>>记录开始, first column at "
+					+ rowrec.getFirstCol() + " last column at "
+					+ rowrec.getLastCol());
+			break;
+		// SSTRecords store a array of unique strings used in Excel.
+		case SSTRecord.sid:
+			sstrec = (SSTRecord) record;
+			for (int k = 0; k < sstrec.getNumUniqueStrings(); k++) {
+				logger.debug( debugger, ">>>>>>>>>>String table value " + k + " = "
+						+ sstrec.getString(k));
+			}
+			break;
+			
+		//发现数字类型的cell,因为数字和日期都是用这个格式,所以下面一定要判断是不是日期格式,另外默认的数字也会被视为日期格式,所以如果是数字的话,一定要明确指定格式!!!!!!!   
+		case NumberRecord.sid:
+				NumberRecord nr = (NumberRecord) record;
+				//HSSFDateUtil.isInternalDateFormat(nr.getXFIndex())  判断是否为时间列
+				int column=nr.getColumn();
+				if(column==5||column==6){
+					addDataAndrChangeRow(nr.getRow(),nr.getColumn(),getTime(nr.getValue()), debugger);
+				}else{
+					addDataAndrChangeRow(nr.getRow(),nr.getColumn(),(int)nr.getValue(), debugger);
+				}
+				break;
+		//发现字符串类型,这儿要取字符串的值的话,跟据其index去字符串表里读取   
+		case LabelSSTRecord.sid:
+			LabelSSTRecord lsr = (LabelSSTRecord)record; 
+			addDataAndrChangeRow(lsr.getRow(),lsr.getColumn(), sstrec.getString(lsr.getSSTIndex()), debugger);
+			logger.debug( debugger, ">>>>>>>>>>文字列:"+sstrec.getString(lsr.getSSTIndex())+", 行:"+lsr.getRow()+", 列:"+lsr.getColumn());   
+			break;
+	    case BoolErrRecord.sid: //解析boolean错误信息
+            BoolErrRecord ber = (BoolErrRecord)record;   
+            if(ber.isBoolean()){   
+            	addDataAndrChangeRow(ber.getRow(),ber.getColumn(), ber.getBooleanValue(), debugger);
+            	logger.debug( debugger, ">>>>>>>>>>Boolean:"+ber.getBooleanValue()+", 行:"+ber.getRow()+", 列:"+ber.getColumn());   
+            }   
+            if(ber.isError()){   
+            	logger.debug( debugger, ">>>>>>>>>>Error:"+ber.getErrorValue()+", 行:"+ber.getRow()+", 列:"+ber.getColumn());   
+            }   
+            break;   
+         //空白记录的信息
+        case BlankRecord.sid: 
+            BlankRecord br = (BlankRecord)record;   
+            addDataAndrChangeRow(br.getRow(),br.getColumn(), "", debugger);
+            logger.debug( debugger, ">>>>>>>>>>空。 行:"+br.getRow()+", 列:"+br.getColumn());   
+            break;   
+        case FormulaRecord.sid: //数式   
+            FormulaRecord fr = (FormulaRecord)record;  
+            addDataAndrChangeRow(fr.getRow(),fr.getColumn(), fr.getValue(), debugger);
+            logger.debug( debugger, ">>>>>>>>>>数字 。 行:"+fr.getRow()+", 列:"+fr.getColumn());  
+            break;  
+		}
+	}
+	/** 
+     * HH:MM格式时间的数字转换方法</li> 
+     * @param sNum 
+     * @return 
+     */ 
+    private static String getTime(double daynum) 
+    { 
+        double totalSeconds=daynum*86400.0D;
+        //总的分钟数
+        int seconds =(int)totalSeconds/60;
+        //实际小时数
+        int hours =seconds/60;
+        int minutes = seconds-hours*60;
+        //剩余的实际分钟数
+        StringBuffer sb=new StringBuffer();
+        if(String.valueOf(hours).length()==1){
+        	sb.append("0"+hours);
+        }else{
+        	sb.append(hours);
+        }
+        sb.append(":");
+        if(String.valueOf(minutes).length()==1){
+        	sb.append("0"+minutes);
+        }else{
+        	sb.append(minutes);
+        }
+        return sb.toString();
+    } 
+	/**
+	 *  添加数据记录并检查是否换行
+	 * @param row 实际当前行号
+	 * @param col 实际记录当前列
+	 * @param value  当前cell的值
+	 */
+	public void addDataAndrChangeRow( int row,int col,Object value, Boolean debugger ){
+		//当前行如果大于实际行表示改行忽略,不记录
+		if(curRowNum!=row){
+			if(CollectionUtils.isEmpty(currentSheetDataMap)){
+				 currentSheetDataMap=new ArrayList<Map<String,Object>>();
+			}
+			currentSheetDataMap.add(currentSheetRowDataMap);
+			logger.debug( debugger, ">>>>>>>>>>行号:"+curRowNum +" 行内容:"+currentSheetRowDataMap.toString());
+			logger.debug( debugger, ">>>>>>>>>>\n");
+			currentSheetRowDataMap=new HashMap<String,Object>();
+			currentSheetRowDataMap.put(trianListheadTitle[col], value);
+			logger.debug( debugger, ">>>>>>>>>>"+ row+":"+col+"  "+value+"\r");
+			curRowNum=row;
+		}else{
+			currentSheetRowDataMap.put(trianListheadTitle[col], value);
+			logger.debug(row+":"+col+"  "+value+"\r");
+		}
+	}
+	public List<Map<String, Object>> getCurrentSheetDataMap() {
+		return currentSheetDataMap;
+	}
+	public void setCurrentSheetDataMap(List<Map<String, Object>> currentSheetDataMap) {
+		this.currentSheetDataMap = currentSheetDataMap;
+	}
+	public Map<String, Object> getCurrentSheetRowDataMap() {
+		return currentSheetRowDataMap;
+	}
+	public void setCurrentSheetRowDataMap(Map<String, Object> currentSheetRowDataMap) {
+		this.currentSheetRowDataMap = currentSheetRowDataMap;
+	}
+	public int getCurRowNum() {
+		return curRowNum;
+	}
+	public void setCurRowNum(int curRowNum) {
+		this.curRowNum = curRowNum;
+	}
+	public int getIgnoreRowNum() {
+		return ignoreRowNum;
+	}
+	public void setIgnoreRowNum(int ignoreRowNum) {
+		this.ignoreRowNum = ignoreRowNum;
+	}
+	public Boolean getDebugger() {
+		return debugger;
+	}
+	/**
+	 * 是否开启调试日志
+	 * @param debugger
+	 */
+	public void setDebugger(Boolean debugger) {
+		this.debugger = debugger;
+	}
+}

+ 225 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/common/excel/writer/AbstractExcel2007Writer.java

@@ -0,0 +1,225 @@
+package com.x.attendance.assemble.common.excel.writer;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.Writer;
+import java.util.Calendar;
+import java.util.Enumeration;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipOutputStream;
+
+import org.apache.poi.hssf.util.CellReference;
+import org.apache.poi.ss.usermodel.DateUtil;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+/**
+ * 抽象excel2007读入器,先构建.xlsx一张模板,改写模板中的sheet.xml,使用这种方法
+ * 写入.xlsx文件,不需要太大的内存
+ *
+ */
+public abstract class AbstractExcel2007Writer {
+	
+	private SpreadsheetWriter sw;
+
+	/**
+	 * 写入电子表格的主要流程
+	 * @param fileName
+	 * @throws Exception
+	 */
+	public void process(String fileName) throws Exception{
+		// 建立工作簿和电子表格对象
+		XSSFWorkbook wb = new XSSFWorkbook();
+		XSSFSheet sheet = wb.createSheet("sheet1");
+		// 持有电子表格数据的xml文件名 例如 /xl/worksheets/sheet1.xml
+		String sheetRef = sheet.getPackagePart().getPartName().getName();
+
+		// 保存模板
+		FileOutputStream os = new FileOutputStream("template.xlsx");
+		wb.write(os);
+		os.close();
+		
+		// 生成xml文件
+		File tmp = File.createTempFile("sheet", ".xml");
+		Writer fw = new FileWriter(tmp);
+		sw = new SpreadsheetWriter(fw);
+		generate();
+		fw.close();
+		
+		// 使用产生的数据替换模板
+		File templateFile = new File("template.xlsx");
+		FileOutputStream out = new FileOutputStream(fileName);
+		substitute(templateFile, tmp, sheetRef.substring(1), out);
+		out.close();
+		//删除文件之前调用一下垃圾回收器,否则无法删除模板文件
+		System.gc();
+		// 删除临时模板文件
+		if (templateFile.isFile()&&templateFile.exists()){
+			templateFile.delete();
+		}
+	}
+
+	/**
+	 * 类使用者应该使用此方法进行写操作
+	 * @throws Exception
+	 */
+	public abstract void generate() throws Exception;
+
+	public void beginSheet() throws IOException {
+		sw.beginSheet();
+	}
+
+	public void insertRow(int rowNum) throws IOException {
+		sw.insertRow(rowNum);
+	}
+
+	public void createCell(int columnIndex, String value) throws IOException {
+		sw.createCell(columnIndex, value, -1);
+	}
+
+	public void createCell(int columnIndex, double value) throws IOException {
+		sw.createCell(columnIndex, value, -1);
+	}
+
+	public void endRow() throws IOException {
+		sw.endRow();
+	}
+
+	public void endSheet() throws IOException {
+		sw.endSheet();
+	}
+
+	/**
+	 *
+	 * @param zipfile the template file
+	 * @param tmpfile the XML file with the sheet data
+	 * @param entry the name of the sheet entry to substitute, e.g. xl/worksheets/sheet1.xml
+	 * @param out the stream to write the result to
+	 */
+	private static void substitute(File zipfile, File tmpfile, String entry,
+			OutputStream out) throws IOException {
+		ZipFile zip = new ZipFile(zipfile);
+		ZipOutputStream zos = new ZipOutputStream(out);
+
+		@SuppressWarnings("unchecked")
+		Enumeration<ZipEntry> en = (Enumeration<ZipEntry>) zip.entries();
+		while (en.hasMoreElements()) {
+			ZipEntry ze = en.nextElement();
+			if (!ze.getName().equals(entry)) {
+				zos.putNextEntry(new ZipEntry(ze.getName()));
+				InputStream is = zip.getInputStream(ze);
+				copyStream(is, zos);
+				is.close();
+			}
+		}
+		zos.putNextEntry(new ZipEntry(entry));
+		InputStream is = new FileInputStream(tmpfile);
+		copyStream(is, zos);
+		is.close();
+		zos.close();
+	}
+
+	private static void copyStream(InputStream in, OutputStream out)
+			throws IOException {
+		byte[] chunk = new byte[1024];
+		int count;
+		while ((count = in.read(chunk)) >= 0) {
+			out.write(chunk, 0, count);
+		}
+	}
+
+	/**
+	 * 在写入器中写入电子表格
+	 * 
+	 */
+	public static class SpreadsheetWriter {
+		private final Writer _out;
+		private int _rownum;
+		private static String LINE_SEPARATOR = System.getProperty("line.separator");
+
+		public SpreadsheetWriter(Writer out) {
+			_out = out;
+		}
+
+		public void beginSheet() throws IOException {
+			_out.write("<?xml version=\"1.0\" encoding=\"GB2312\"?>"
+							+ "<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">");
+			_out.write("<sheetData>"+LINE_SEPARATOR);
+		}
+
+		public void endSheet() throws IOException {
+			_out.write("</sheetData>");
+			_out.write("</worksheet>");
+		}
+
+		/**
+		 * 插入新行
+		 *
+		 * @param rownum 以0开始
+		 */
+		public void insertRow(int rownum) throws IOException {
+			_out.write("<row r=\"" + (rownum + 1) + "\">"+LINE_SEPARATOR);
+			this._rownum = rownum;
+		}
+
+		/**
+		 * 插入行结束标志
+		 */
+		public void endRow() throws IOException {
+			_out.write("</row>"+LINE_SEPARATOR);
+		}
+
+		/**
+		 * 插入新列
+		 * @param columnIndex
+		 * @param value
+		 * @param styleIndex
+		 * @throws IOException
+		 */
+		public void createCell(int columnIndex, String value, int styleIndex)
+				throws IOException {
+			String ref = new CellReference(_rownum, columnIndex)
+					.formatAsString();
+			_out.write("<c r=\"" + ref + "\" t=\"inlineStr\"");
+			if (styleIndex != -1)
+				_out.write(" s=\"" + styleIndex + "\"");
+			_out.write(">");
+			_out.write("<is><t>"+XMLEncoder.encode(value)+"</t></is>");
+			_out.write("</c>");
+		}
+
+		public void createCell(int columnIndex, String value)
+				throws IOException {
+			createCell(columnIndex, value, -1);
+		}
+
+		public void createCell(int columnIndex, double value, int styleIndex)
+				throws IOException {
+			String ref = new CellReference(_rownum, columnIndex)
+					.formatAsString();
+			_out.write("<c r=\"" + ref + "\" t=\"n\"");
+			if (styleIndex != -1)
+				_out.write(" s=\"" + styleIndex + "\"");
+			_out.write(">");
+			_out.write("<v>" + value + "</v>");
+			_out.write("</c>");
+		}
+
+		public void createCell(int columnIndex, double value)
+				throws IOException {
+			createCell(columnIndex, value, -1);
+		}
+
+		public void createCell(int columnIndex, Calendar value, int styleIndex)
+				throws IOException {
+			createCell(columnIndex, DateUtil.getExcelDate(value, false),
+					styleIndex);
+		}
+	}
+}

+ 60 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/common/excel/writer/Excel2003Writer.java

@@ -0,0 +1,60 @@
+package com.x.attendance.assemble.common.excel.writer;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+
+public class Excel2003Writer {
+
+	/**
+	 * @param args
+	 */
+	public static void main(String[] args) {
+		try{	
+			writeExcel("tes2003.xls");
+		} catch (IOException e) {
+		
+		}
+	}
+	
+	
+	/**
+	 * 写入excel并填充内容,一个sheet只能写65536行以下,超出会报异常,写入时建议使用AbstractExcel2007Writer
+	 * @param fileName
+	 * @throws IOException
+	 */
+	public static void writeExcel(String fileName) throws IOException{
+			
+			// 创建excel2003对象
+			Workbook wb = new HSSFWorkbook();
+			
+			// 设置文件放置路径和文件名
+		    FileOutputStream fileOut = new FileOutputStream(fileName);
+		    // 创建新的表单
+		    Sheet sheet = wb.createSheet("newsheet");
+		    // 创建新行
+		    for(int i=0;i<20000;i++){
+			    Row row = sheet.createRow(i);
+			    // 创建单元格
+			    Cell cell = row.createCell(0);
+			    // 设置单元格值
+			    cell.setCellValue(1);
+			    row.createCell(1).setCellValue(1+i);
+			    row.createCell(2).setCellValue(true);
+			    row.createCell(3).setCellValue(0.43d);
+			    row.createCell(4).setCellValue('d');
+			    row.createCell(5).setCellValue("");
+			    row.createCell(6).setCellValue("第七列"+i);
+			    row.createCell(7).setCellValue("第八列"+i);
+		    }
+		    wb.write(fileOut);
+		    fileOut.close();
+	}
+
+
+}

+ 44 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/common/excel/writer/Excel2007WriterImpl.java

@@ -0,0 +1,44 @@
+package com.x.attendance.assemble.common.excel.writer;
+public class Excel2007WriterImpl extends AbstractExcel2007Writer{
+
+	
+	/**
+	 * @param args
+	 * @throws Exception
+	 */
+	public static void main(String[] args) throws Exception {
+		//构建excel2007写入器
+		AbstractExcel2007Writer excel07Writer = new Excel2007WriterImpl();
+		//调用处理方法
+		excel07Writer.process("F://test07.xlsx");
+	}
+
+	
+	/* 
+	 * 可根据需求重写此方法,对于单元格的小数或者日期格式,会出现精度问题或者日期格式转化问题,建议使用字符串插入方法
+	 * @see com.excel.ver2.AbstractExcel2007Writer#generate()
+	 */
+	@Override
+	public void generate()throws Exception {
+        //电子表格开始
+        beginSheet();
+        for (int rownum = 0; rownum < 100; rownum++) {
+        	//插入新行
+            insertRow(rownum);
+            //建立新单元格,索引值从0开始,表示第一列
+            createCell(0, "中国<" + rownum + "!");
+            createCell(1, 34343.123456789);
+            createCell(2, "23.67%");
+            createCell(3, "12:12:23");
+            createCell(4, "2010-10-11 12:12:23");
+            createCell(5, "true");
+            createCell(6, "false");
+          
+            //结束行
+            endRow();
+        }
+        //电子表格结束
+        endSheet();
+	}
+
+}

+ 48 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/common/excel/writer/XMLEncoder.java

@@ -0,0 +1,48 @@
+package com.x.attendance.assemble.common.excel.writer;
+
+public class XMLEncoder {
+
+    private static final String[] xmlCode = new String[256];
+
+    static {
+        // Special characters
+        xmlCode['\''] = "'";
+        xmlCode['\"'] = "\""; // double quote
+        xmlCode['&'] = "&"; // ampersand
+        xmlCode['<'] = "<"; // lower than
+        xmlCode['>'] = ">"; // greater than
+    }
+
+    /**
+     * <p>
+     * Encode the given text into xml.
+     * </p>
+     * 
+     * @param string the text to encode
+     * @return the encoded string
+     */
+    public static String encode(String string) {
+        if (string == null) return "";
+        int n = string.length();
+        char character;
+        String xmlchar;
+        StringBuffer buffer = new StringBuffer();
+        // loop over all the characters of the String.
+        for (int i = 0; i < n; i++) {
+            character = string.charAt(i);
+            // the xmlcode of these characters are added to a StringBuffer one by one
+            try {
+                xmlchar = xmlCode[character];
+                if (xmlchar == null) {
+                    buffer.append(character);
+                } else {
+                    buffer.append(xmlCode[character]);
+                }
+            } catch (ArrayIndexOutOfBoundsException aioobe) {
+                buffer.append(character);
+            }
+        }
+        return buffer.toString();
+    }
+
+}

+ 24 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/AbstractFactory.java

@@ -0,0 +1,24 @@
+package com.x.attendance.assemble.control;
+
+import com.x.base.core.container.EntityManagerContainer;
+
+public abstract class AbstractFactory {
+
+	private Business business;
+
+	public AbstractFactory( Business business ) throws Exception {
+		try {
+			if ( null == business ) {
+				throw new Exception("business can not be null.");
+			}
+			this.business = business;
+		} catch ( Exception e ) {
+			throw new Exception("can not instantiating factory.");
+		}
+	}
+
+	public EntityManagerContainer entityManagerContainer() throws Exception {
+		return this.business.entityManagerContainer();
+	}
+
+}

+ 33 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/ApplicationServletContextListener.java

@@ -0,0 +1,33 @@
+package com.x.attendance.assemble.control;
+
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import javax.servlet.annotation.WebListener;
+
+import com.x.base.core.project.Context;
+
+@WebListener
+public class ApplicationServletContextListener implements ServletContextListener {
+
+	@Override
+	public void contextInitialized(ServletContextEvent servletContextEvent) {
+		try {
+			ThisApplication.context = Context.concrete(servletContextEvent);
+			ThisApplication.init();
+			ThisApplication.context().regist();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	@Override
+	public void contextDestroyed(ServletContextEvent servletContextEvent) {
+		try {
+			ThisApplication.destroy();
+			ThisApplication.context.destrory(servletContextEvent);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+}

+ 216 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/Business.java

@@ -0,0 +1,216 @@
+package com.x.attendance.assemble.control;
+
+import com.x.attendance.assemble.control.factory.AttendanceAdminFactory;
+import com.x.attendance.assemble.control.factory.AttendanceAppealInfoFactory;
+import com.x.attendance.assemble.control.factory.AttendanceDetailFactory;
+import com.x.attendance.assemble.control.factory.AttendanceDetailMobileFactory;
+import com.x.attendance.assemble.control.factory.AttendanceDetailStatisticFactory;
+import com.x.attendance.assemble.control.factory.AttendanceEmployeeConfigFactory;
+import com.x.attendance.assemble.control.factory.AttendanceImportFileInfoFactory;
+import com.x.attendance.assemble.control.factory.AttendanceScheduleSettingFactory;
+import com.x.attendance.assemble.control.factory.AttendanceSelfHolidayFactory;
+import com.x.attendance.assemble.control.factory.AttendanceSettingFactory;
+import com.x.attendance.assemble.control.factory.AttendanceStatisticRequireLogFactory;
+import com.x.attendance.assemble.control.factory.AttendanceStatisticalCycleFactory;
+import com.x.attendance.assemble.control.factory.AttendanceWorkDayConfigFactory;
+import com.x.attendance.assemble.control.factory.AttendanceWorkPlaceFactory;
+import com.x.attendance.assemble.control.factory.StatisticPersonForMonthFactory;
+import com.x.attendance.assemble.control.factory.StatisticTopUnitForDayFactory;
+import com.x.attendance.assemble.control.factory.StatisticTopUnitForMonthFactory;
+import com.x.attendance.assemble.control.factory.StatisticUnitForDayFactory;
+import com.x.attendance.assemble.control.factory.StatisticUnitForMonthFactory;
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.organization.core.express.Organization;
+
+public class Business {
+
+	private EntityManagerContainer emc;
+
+	public Business(EntityManagerContainer emc) throws Exception {
+		this.emc = emc;
+	}
+
+	public EntityManagerContainer entityManagerContainer() {
+		return this.emc;
+	}
+
+	// 人员组织业务处理类
+	private Organization organization;
+	// 系统配置业务处理类
+	private AttendanceSettingFactory attendanceSettingFactory;
+	// 工作场所配置业务处理类
+	private AttendanceWorkPlaceFactory attendanceWorkPlaceFactory;
+	// 节假日工作日配置业务处理类
+	private AttendanceWorkDayConfigFactory attendanceWorkDayConfigFactory;
+	// 人员考勤数据导入文件操作业务处理类
+	private AttendanceImportFileInfoFactory attendanceImportFileInfoFactory;
+	// 人员考勤数据业务处理类
+	private AttendanceDetailFactory attendanceDetailFactory;
+	private AttendanceDetailMobileFactory attendanceDetailMobileFactory;
+	// 考勤管理员业务处理类
+	private AttendanceAdminFactory attendanceAdminFactory;
+	// 排班管理业务处理类
+	private AttendanceScheduleSettingFactory attendanceScheduleSettingFactory;
+	// 休假申请数据业务处理类
+	private AttendanceSelfHolidayFactory attendanceSelfHolidayFactory;
+
+	private StatisticTopUnitForDayFactory statisticTopUnitForDayFactory;
+
+	private StatisticTopUnitForMonthFactory statisticTopUnitForMonthFactory;
+
+	private StatisticUnitForDayFactory statisticUnitForDayFactory;
+
+	private StatisticUnitForMonthFactory statisticUnitForMonthFactory;
+
+	private StatisticPersonForMonthFactory statisticPersonForMonthFactory;
+
+	private AttendanceAppealInfoFactory attendanceAppealInfoFactory;
+
+	private AttendanceStatisticalCycleFactory attendanceStatisticalCycleFactory;
+
+	private AttendanceEmployeeConfigFactory attendanceEmployeeConfigFactory;
+
+	private AttendanceStatisticRequireLogFactory attendanceStatisticRequireLogFactory;
+
+	private AttendanceDetailStatisticFactory attendanceDetailStatisticFactory;
+
+	public AttendanceWorkPlaceFactory attendanceWorkPlaceFactory() throws Exception {
+		if (null == this.attendanceWorkPlaceFactory) {
+			this.attendanceWorkPlaceFactory = new AttendanceWorkPlaceFactory(this);
+		}
+		return attendanceWorkPlaceFactory;
+	}
+
+	public AttendanceDetailMobileFactory getAttendanceDetailMobileFactory() throws Exception {
+		if (null == this.attendanceDetailMobileFactory) {
+			this.attendanceDetailMobileFactory = new AttendanceDetailMobileFactory(this);
+		}
+		return attendanceDetailMobileFactory;
+	}
+
+	public AttendanceDetailStatisticFactory getAttendanceDetailStatisticFactory() throws Exception {
+		if (null == this.attendanceDetailStatisticFactory) {
+			this.attendanceDetailStatisticFactory = new AttendanceDetailStatisticFactory(this);
+		}
+		return attendanceDetailStatisticFactory;
+	}
+
+	public AttendanceEmployeeConfigFactory getAttendanceEmployeeConfigFactory() throws Exception {
+		if (null == this.attendanceEmployeeConfigFactory) {
+			this.attendanceEmployeeConfigFactory = new AttendanceEmployeeConfigFactory(this);
+		}
+		return attendanceEmployeeConfigFactory;
+	}
+
+	public AttendanceStatisticRequireLogFactory getAttendanceStatisticRequireLogFactory() throws Exception {
+		if (null == this.attendanceStatisticRequireLogFactory) {
+			this.attendanceStatisticRequireLogFactory = new AttendanceStatisticRequireLogFactory(this);
+		}
+		return attendanceStatisticRequireLogFactory;
+	}
+
+	public AttendanceStatisticalCycleFactory getAttendanceStatisticalCycleFactory() throws Exception {
+		if (null == this.attendanceStatisticalCycleFactory) {
+			this.attendanceStatisticalCycleFactory = new AttendanceStatisticalCycleFactory(this);
+		}
+		return attendanceStatisticalCycleFactory;
+	}
+
+	public AttendanceAppealInfoFactory getAttendanceAppealInfoFactory() throws Exception {
+		if (null == this.attendanceAppealInfoFactory) {
+			this.attendanceAppealInfoFactory = new AttendanceAppealInfoFactory(this);
+		}
+		return attendanceAppealInfoFactory;
+	}
+
+	public StatisticTopUnitForDayFactory getStatisticTopUnitForDayFactory() throws Exception {
+		if (null == this.statisticTopUnitForDayFactory) {
+			this.statisticTopUnitForDayFactory = new StatisticTopUnitForDayFactory(this);
+		}
+		return statisticTopUnitForDayFactory;
+	}
+
+	public StatisticTopUnitForMonthFactory getStatisticTopUnitForMonthFactory() throws Exception {
+		if (null == this.statisticTopUnitForMonthFactory) {
+			this.statisticTopUnitForMonthFactory = new StatisticTopUnitForMonthFactory(this);
+		}
+		return statisticTopUnitForMonthFactory;
+	}
+
+	public StatisticUnitForDayFactory getStatisticUnitForDayFactory() throws Exception {
+		if (null == this.statisticUnitForDayFactory) {
+			this.statisticUnitForDayFactory = new StatisticUnitForDayFactory(this);
+		}
+		return statisticUnitForDayFactory;
+	}
+
+	public StatisticUnitForMonthFactory getStatisticUnitForMonthFactory() throws Exception {
+		if (null == this.statisticUnitForMonthFactory) {
+			this.statisticUnitForMonthFactory = new StatisticUnitForMonthFactory(this);
+		}
+		return statisticUnitForMonthFactory;
+	}
+
+	public StatisticPersonForMonthFactory getStatisticPersonForMonthFactory() throws Exception {
+		if (null == this.statisticPersonForMonthFactory) {
+			this.statisticPersonForMonthFactory = new StatisticPersonForMonthFactory(this);
+		}
+		return statisticPersonForMonthFactory;
+	}
+
+	public Organization organization() throws Exception {
+		if (null == this.organization) {
+			this.organization = new Organization(ThisApplication.context());
+		}
+		return organization;
+	}
+
+	public AttendanceSettingFactory getAttendanceSettingFactory() throws Exception {
+		if (null == this.attendanceSettingFactory) {
+			this.attendanceSettingFactory = new AttendanceSettingFactory(this);
+		}
+		return attendanceSettingFactory;
+	}
+
+	public AttendanceWorkDayConfigFactory getAttendanceWorkDayConfigFactory() throws Exception {
+		if (null == this.attendanceWorkDayConfigFactory) {
+			this.attendanceWorkDayConfigFactory = new AttendanceWorkDayConfigFactory(this);
+		}
+		return attendanceWorkDayConfigFactory;
+	}
+
+	public AttendanceImportFileInfoFactory getAttendanceImportFileInfoFactory() throws Exception {
+		if (null == this.attendanceImportFileInfoFactory) {
+			this.attendanceImportFileInfoFactory = new AttendanceImportFileInfoFactory(this);
+		}
+		return attendanceImportFileInfoFactory;
+	}
+
+	public AttendanceDetailFactory getAttendanceDetailFactory() throws Exception {
+		if (null == this.attendanceDetailFactory) {
+			this.attendanceDetailFactory = new AttendanceDetailFactory(this);
+		}
+		return attendanceDetailFactory;
+	}
+
+	public AttendanceAdminFactory getAttendanceAdminFactory() throws Exception {
+		if (null == this.attendanceAdminFactory) {
+			this.attendanceAdminFactory = new AttendanceAdminFactory(this);
+		}
+		return attendanceAdminFactory;
+	}
+
+	public AttendanceScheduleSettingFactory getAttendanceScheduleSettingFactory() throws Exception {
+		if (null == this.attendanceScheduleSettingFactory) {
+			this.attendanceScheduleSettingFactory = new AttendanceScheduleSettingFactory(this);
+		}
+		return attendanceScheduleSettingFactory;
+	}
+
+	public AttendanceSelfHolidayFactory getAttendanceSelfHolidayFactory() throws Exception {
+		if (null == this.attendanceSelfHolidayFactory) {
+			this.attendanceSelfHolidayFactory = new AttendanceSelfHolidayFactory(this);
+		}
+		return attendanceSelfHolidayFactory;
+	}
+}

+ 17 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/CacheUtil.java

@@ -0,0 +1,17 @@
+package com.x.attendance.assemble.control;
+
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.cache.ApplicationCache;
+
+/**
+ * 缓存管理帮助类
+ * @author liyi
+ *
+ */
+public class CacheUtil {
+	
+	public static <T extends JpaObject> void notify( Class<T> clz ) throws Exception {
+		ApplicationCache.notify( clz );
+	}
+	
+}

+ 107 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/DingdingAttendanceQueue.java

@@ -0,0 +1,107 @@
+package com.x.attendance.assemble.control;
+
+import com.x.attendance.entity.DingdingQywxSyncRecord;
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.project.Application;
+import com.x.base.core.project.config.Config;
+import com.x.base.core.project.connection.HttpConnection;
+import com.x.base.core.project.gson.GsonPropertyObject;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.organization.Person;
+import com.x.base.core.project.queue.AbstractQueue;
+import com.x.base.core.project.x_organization_assemble_control;
+
+import java.util.List;
+
+public class DingdingAttendanceQueue extends AbstractQueue<DingdingQywxSyncRecord> {
+
+    private static final Logger logger = LoggerFactory.getLogger(DingdingAttendanceQueue.class);
+
+    @Override
+    protected void execute(DingdingQywxSyncRecord record) throws Exception {
+        logger.info("开始执行钉钉打卡数据同步," + record.getWay());
+
+    }
+
+    private void dingdingSync() throws Exception {
+        try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+            Business business = new Business(emc);
+            Application app = ThisApplication.context().applications().randomWithWeight(x_organization_assemble_control.class.getName());
+            //开始分页查询人员
+            boolean hasNextPerson = true;
+            String uri = "person/list/(0)/next/50";
+            String dingdingUrl = "https://oapi.dingtalk.com/attendance/list?access_token="+ Config.dingding().corpAccessToken();
+
+            while (hasNextPerson) {
+                List<Person> list = ThisApplication.context().applications().getQuery(false, app, uri).getDataAsList(Person.class);
+                if (list != null && list.size() > 0) {
+                    DingdingAttendancePost post = new DingdingAttendancePost();
+
+                }else {
+                    //没有用户查询到结束
+                    logger.info("查询不到用户了,结束。。。。。。。。。。。。。。。");
+                    hasNextPerson = false;
+                }
+            }
+
+        }
+    }
+
+
+    public static class DingdingAttendancePost extends GsonPropertyObject {
+//        {
+//            "workDateFrom": "yyyy-MM-dd HH:mm:ss",
+//                "workDateTo": "yyyy-MM-dd HH:mm:ss",
+//                "userIdList":["员工UserId列表"],    // 必填,与offset和limit配合使用
+//            "offset":0,    // 必填,第一次传0,如果还有多余数据,下次传之前的offset加上limit的值
+//                "limit":1,     // 必填,表示数据条数,最大不能超过50条
+//        }
+        private String workDateFrom;
+        private String workDateTo;
+        private List<String> userIdList;
+        private Integer offset;
+        private Integer limit;
+
+        public String getWorkDateFrom() {
+            return workDateFrom;
+        }
+
+        public void setWorkDateFrom(String workDateFrom) {
+            this.workDateFrom = workDateFrom;
+        }
+
+        public String getWorkDateTo() {
+            return workDateTo;
+        }
+
+        public void setWorkDateTo(String workDateTo) {
+            this.workDateTo = workDateTo;
+        }
+
+        public List<String> getUserIdList() {
+            return userIdList;
+        }
+
+        public void setUserIdList(List<String> userIdList) {
+            this.userIdList = userIdList;
+        }
+
+        public Integer getOffset() {
+            return offset;
+        }
+
+        public void setOffset(Integer offset) {
+            this.offset = offset;
+        }
+
+        public Integer getLimit() {
+            return limit;
+        }
+
+        public void setLimit(Integer limit) {
+            this.limit = limit;
+        }
+    }
+}

+ 13 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/ExceptionWrapInConvert.java

@@ -0,0 +1,13 @@
+package com.x.attendance.assemble.control;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.project.exception.PromptException;
+
+public class ExceptionWrapInConvert extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	public ExceptionWrapInConvert( Throwable e, JsonElement jsonElement) {
+		super( "系统在将JSON信息转换为对象时发生异常。JSON:" + jsonElement.toString(), e);
+	}
+}

+ 7 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/MimeTypeDefinition.java

@@ -0,0 +1,7 @@
+package com.x.attendance.assemble.control;
+
+import javax.activation.MimetypesFileTypeMap;
+
+public class MimeTypeDefinition {
+	public static MimetypesFileTypeMap instance;
+}

+ 52 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/ThisApplication.java

@@ -0,0 +1,52 @@
+package com.x.attendance.assemble.control;
+
+import com.x.attendance.assemble.control.processor.monitor.MonitorFileDataOpt;
+import com.x.attendance.assemble.control.processor.thread.DataProcessThreadFactory;
+import com.x.attendance.assemble.control.schedule.AttendanceStatisticTask;
+import com.x.attendance.assemble.control.schedule.MobileRecordAnalyseTask;
+import com.x.attendance.assemble.control.service.AttendanceSettingService;
+import com.x.base.core.project.Context;
+import com.x.base.core.project.config.Config;
+import org.apache.commons.lang3.BooleanUtils;
+
+public class ThisApplication {
+
+	protected static Context context;
+
+	public static Context context() {
+		return context;
+	}
+
+	public static DingdingAttendanceQueue dingdingQueue = new DingdingAttendanceQueue();
+
+	public static void init() throws Exception {
+		try {
+			new AttendanceSettingService().initAllSystemConfig();
+			context.schedule(AttendanceStatisticTask.class, "0 0 0/4 * * ?");
+			context.schedule(MobileRecordAnalyseTask.class, "0 0/10 * * * ?");
+			if (BooleanUtils.isTrue(Config.dingding().getAttendanceSyncEnable())) {
+				dingdingQueue.start();
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	public static void destroy() {
+		try {
+			DataProcessThreadFactory.getInstance().showdown();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		try {
+			MonitorFileDataOpt.stop();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		try {
+			dingdingQueue.stop();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+}

+ 16 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/exception/PersonHasNoIdentityException.java

@@ -0,0 +1,16 @@
+package com.x.attendance.assemble.control.exception;
+
+import com.x.base.core.project.exception.PromptException;
+
+public class PersonHasNoIdentityException extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	public PersonHasNoIdentityException() {
+		super("用户未分配任何身份,请检查用户所在的组织信息。");
+	}
+	
+	public PersonHasNoIdentityException( String name ) {
+		super("用户'"+ name +"'未分配任何身份,请检查用户所在的组织信息。");
+	}
+}

+ 53 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceAdminFactory.java

@@ -0,0 +1,53 @@
+package com.x.attendance.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import com.x.attendance.assemble.control.AbstractFactory;
+import com.x.attendance.assemble.control.Business;
+import com.x.attendance.entity.AttendanceAdmin;
+import com.x.attendance.entity.AttendanceAdmin_;
+import com.x.base.core.project.exception.ExceptionWhen;
+/**
+ * 系统配置信息表基础功能服务类
+ */
+public class AttendanceAdminFactory extends AbstractFactory {
+	
+	public AttendanceAdminFactory(Business business) throws Exception {
+		super(business);
+	}
+
+	//@MethodDescribe("获取指定Id的AttendanceAdmin应用信息对象")
+	public AttendanceAdmin get( String id ) throws Exception {
+		return this.entityManagerContainer().find(id, AttendanceAdmin.class, ExceptionWhen.none);
+	}
+	
+	//@MethodDescribe("列示全部的AttendanceAdmin应用信息列表")
+	@SuppressWarnings("unused")
+	public List<AttendanceAdmin> listAll() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(AttendanceAdmin.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceAdmin> cq = cb.createQuery(AttendanceAdmin.class);
+		Root<AttendanceAdmin> root = cq.from( AttendanceAdmin.class);
+		return em.createQuery(cq).getResultList();
+	}
+	
+	//@MethodDescribe("列示指定Id的AttendanceAdmin应用信息列表")
+	public List<AttendanceAdmin> list(List<String> ids) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<AttendanceAdmin>();
+		}
+		EntityManager em = this.entityManagerContainer().get(AttendanceAdmin.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceAdmin> cq = cb.createQuery(AttendanceAdmin.class);
+		Root<AttendanceAdmin> root = cq.from(AttendanceAdmin.class);
+		Predicate p = root.get(AttendanceAdmin_.id).in(ids);
+		return em.createQuery(cq.where(p)).getResultList();
+	}	
+}

+ 508 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceAppealInfoFactory.java

@@ -0,0 +1,508 @@
+package com.x.attendance.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.x.attendance.assemble.control.AbstractFactory;
+import com.x.attendance.assemble.control.Business;
+import com.x.attendance.assemble.control.jaxrs.attendanceappealinfo.WrapInFilterAppeal;
+import com.x.attendance.entity.AttendanceAppealInfo;
+import com.x.attendance.entity.AttendanceAppealInfo_;
+import com.x.base.core.project.bean.NameValueCountPair;
+import com.x.base.core.project.exception.ExceptionWhen;
+/**
+ * 系统配置信息表基础功能服务类
+
+ */
+public class AttendanceAppealInfoFactory extends AbstractFactory {
+	
+	public AttendanceAppealInfoFactory(Business business) throws Exception {
+		super(business);
+	}
+
+	//@MethodDescribe("获取指定Id的AttendanceAppealInfo信息对象")
+	public AttendanceAppealInfo get( String id ) throws Exception {
+		return this.entityManagerContainer().find(id, AttendanceAppealInfo.class, ExceptionWhen.none);
+	}
+	
+	//@MethodDescribe("列示全部的AttendanceAppealInfo信息列表")
+	public List<String> listAll() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(AttendanceAppealInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceAppealInfo> root = cq.from( AttendanceAppealInfo.class);
+		cq.select(root.get(AttendanceAppealInfo_.id));
+		return em.createQuery(cq).getResultList();
+	}
+	
+	//@MethodDescribe("列示全部的AttendanceAppealInfo信息列表")
+	public String getMaxRecordDate() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(AttendanceAppealInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceAppealInfo> cq = cb.createQuery(AttendanceAppealInfo.class);
+		Root<AttendanceAppealInfo> root = cq.from( AttendanceAppealInfo.class);
+		cq.orderBy( cb.desc( root.get( AttendanceAppealInfo_.recordDateString) ) );	
+		List<AttendanceAppealInfo> resultList = em.createQuery(cq).setMaxResults(1).getResultList();
+		if( resultList == null || resultList.size() == 0 ){
+			return null;
+		}else{
+			return resultList.get(0).getRecordDateString();
+		}
+	}
+	
+	//@MethodDescribe("根据员工姓名和打卡日期列示AttendanceAppealInfo信息列表")
+	public List<String> listByEmployeeNameAndAppealDate( String employeeName, String appealDateString ) throws Exception {
+		
+		if( employeeName == null || appealDateString == null ){
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get(AttendanceAppealInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceAppealInfo> root = cq.from( AttendanceAppealInfo.class);
+		cq.select(root.get(AttendanceAppealInfo_.id));
+		Predicate p = cb.equal( root.get(AttendanceAppealInfo_.empName),  employeeName );
+		p = cb.and( p, cb.equal( root.get(AttendanceAppealInfo_.appealDateString ),  appealDateString ) );
+		return em.createQuery(cq.where( p )).getResultList();
+	}
+	
+	//@MethodDescribe("根据组织和打卡日期列示AttendanceAppealInfo信息列表")
+	public List<String> listByUnitNameAndAppealDate( String unitName, String appealDateString ) throws Exception {
+		
+		if( unitName == null || appealDateString == null ){
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get(AttendanceAppealInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceAppealInfo> root = cq.from( AttendanceAppealInfo.class);
+		cq.select(root.get(AttendanceAppealInfo_.id));
+		Predicate p = cb.equal( root.get(AttendanceAppealInfo_.unitName),  unitName );
+		p = cb.and( p, cb.equal( root.get(AttendanceAppealInfo_.appealDateString ),  appealDateString ) );
+		return em.createQuery(cq.where( p )).getResultList();
+	}
+	
+	//@MethodDescribe("根据顶层组织和打卡日期列示AttendanceAppealInfo信息列表")
+	public List<String> listByTopUnitNameAndAppealDate( String topUnitName, String appealDateString ) throws Exception {
+		
+		if( topUnitName == null || appealDateString == null ){
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get(AttendanceAppealInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceAppealInfo> root = cq.from( AttendanceAppealInfo.class);
+		cq.select(root.get(AttendanceAppealInfo_.id));
+		Predicate p = cb.equal( root.get(AttendanceAppealInfo_.topUnitName),  topUnitName );
+		p = cb.and( p, cb.equal( root.get(AttendanceAppealInfo_.appealDateString ),  appealDateString ) );
+		return em.createQuery(cq.where( p )).getResultList();
+	}
+	
+	//@MethodDescribe("列示指定Id的AttendanceAppealInfo信息列表")
+	public List<AttendanceAppealInfo> list(List<String> ids) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<AttendanceAppealInfo>();
+		}
+		EntityManager em = this.entityManagerContainer().get(AttendanceAppealInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceAppealInfo> cq = cb.createQuery(AttendanceAppealInfo.class);
+		Root<AttendanceAppealInfo> root = cq.from(AttendanceAppealInfo.class);
+		Predicate p = root.get(AttendanceAppealInfo_.id).in(ids);
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+
+	//@MethodDescribe("按年份月份查询某用户的申诉记录列表")
+	public List<String> listUserAttendanceAppealInfoByYearAndMonth(String user, String year, String month)  throws Exception {
+		if( user == null || user.isEmpty() ||year == null || month == null || year.isEmpty() || month.isEmpty()  ){
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get( AttendanceAppealInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceAppealInfo> root = cq.from( AttendanceAppealInfo.class);
+		cq.select( root.get(AttendanceAppealInfo_.id ));
+		//一般始终为true, id is not null
+		Predicate p = cb.equal( root.get(AttendanceAppealInfo_.empName), user );
+		if( StringUtils.isNotEmpty( year  ) ){
+			p = cb.and(p, cb.equal( root.get(AttendanceAppealInfo_.yearString), year ));
+		}
+		if( StringUtils.isNotEmpty( month ) ){
+			p = cb.and(p, cb.equal( root.get(AttendanceAppealInfo_.monthString), month ));
+		}
+		
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe("按年份月份查询某组织的申诉记录列表")
+	public List<String> listUnitAttendanceAppealInfoByYearAndMonth(String unitName, String year, String month)  throws Exception {
+		EntityManager em = this.entityManagerContainer().get( AttendanceAppealInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceAppealInfo> root = cq.from( AttendanceAppealInfo.class);
+		cq.select( root.get(AttendanceAppealInfo_.id ));
+		//一般始终为true, id is not null
+		Predicate p = cb.equal( root.get(AttendanceAppealInfo_.unitName), unitName );
+		if( StringUtils.isNotEmpty( year ) ){
+			p = cb.and(p, cb.equal( root.get(AttendanceAppealInfo_.yearString), year ));
+		}
+		if( StringUtils.isNotEmpty( month ) ){
+			p = cb.and(p, cb.equal( root.get(AttendanceAppealInfo_.monthString), month ));
+		}
+		
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+//	@MethodDescribe("按年份月份查询某顶层组织的申诉记录列表")
+	public List<String> listTopUnitAttendanceAppealInfoByYearAndMonth(String topUnitName, String year, String month)  throws Exception {
+		EntityManager em = this.entityManagerContainer().get( AttendanceAppealInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceAppealInfo> root = cq.from( AttendanceAppealInfo.class);
+		cq.select( root.get(AttendanceAppealInfo_.id ));
+		//一般始终为true, id is not null
+		Predicate p = cb.equal( root.get(AttendanceAppealInfo_.topUnitName), topUnitName );
+		if( StringUtils.isNotEmpty( year ) ){
+			p = cb.and(p, cb.equal( root.get(AttendanceAppealInfo_.yearString), year ));
+		}
+		if( StringUtils.isNotEmpty( month ) ){
+			p = cb.and(p, cb.equal( root.get(AttendanceAppealInfo_.monthString), month ));
+		}
+		
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe("查询未归档的申诉记录列表,最大2000条")
+	public List<String> listNonArchiveAppealInfoIds()  throws Exception {
+		EntityManager em = this.entityManagerContainer().get( AttendanceAppealInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceAppealInfo> root = cq.from( AttendanceAppealInfo.class);
+		cq.select( root.get(AttendanceAppealInfo_.id ));
+		//一般始终为true, id is not null
+		Predicate p = cb.isNotNull( root.get(AttendanceAppealInfo_.archiveTime) );
+		return em.createQuery(cq.where(p)).setMaxResults(2000).getResultList();
+	}
+	
+	/**
+	 * 查询下一页的信息数据
+	 * @param id
+	 * @param count
+	 * @param sequence
+	 * @param wrapIn
+	 * @return
+	 * @throws Exception
+	 */
+	@SuppressWarnings("unchecked")
+	public List<AttendanceAppealInfo> listIdsNextWithFilter( String id, Integer count, Object sequence, WrapInFilterAppeal wrapIn ) throws Exception {
+		//先获取上一页最后一条的sequence值,如果有值的话,以此sequence值作为依据取后续的count条数据
+		EntityManager em = this.entityManagerContainer().get( AttendanceAppealInfo.class );
+		String order = wrapIn.getOrder();//排序方式
+		List<Object> vs = new ArrayList<>();
+		StringBuffer sql_stringBuffer = new StringBuffer();
+		
+		if( order == null || order.isEmpty() ){
+			order = "DESC";
+		}
+		
+		Integer index = 1;
+		sql_stringBuffer.append( "SELECT o FROM "+AttendanceAppealInfo.class.getCanonicalName()+" o where 1=1" );
+
+		if ((null != sequence) ) {
+			sql_stringBuffer.append(" and o.sequence " + (StringUtils.equalsIgnoreCase(order, "DESC") ? "<" : ">") + (" ?" + (index)));
+			vs.add(sequence);
+			index++;
+		}
+		if ((null != wrapIn.getDetailId()) && (!wrapIn.getDetailId().isEmpty())) {
+			sql_stringBuffer.append(" and o.detailId = ?" + (index));
+			vs.add( wrapIn.getDetailId() );
+			index++;
+		}
+		if ((null != wrapIn.getEmpName()) && (!wrapIn.getEmpName().isEmpty())) {
+			sql_stringBuffer.append(" and o.empName = ?" + (index));
+			vs.add( wrapIn.getEmpName() );
+			index++;
+		}
+		if ((null != wrapIn.getUnitName()) && (!wrapIn.getUnitName().isEmpty())) {
+			sql_stringBuffer.append(" and o.unitName = ?" + (index));
+			vs.add( wrapIn.getUnitName() );
+			index++;
+		}
+		if ((null != wrapIn.getTopUnitName()) && (!wrapIn.getTopUnitName().isEmpty())) {
+			sql_stringBuffer.append(" and o.topUnitName = ?" + (index));
+			vs.add( wrapIn.getTopUnitName() );
+			index++;
+		}
+		if ((null != wrapIn.getYearString() ) && (!wrapIn.getYearString().isEmpty())) {
+			sql_stringBuffer.append(" and o.yearString = ?" + (index));
+			vs.add( wrapIn.getYearString() );
+			index++;
+		}
+		if ((null != wrapIn.getMonthString()) && (!wrapIn.getMonthString().isEmpty())) {
+			sql_stringBuffer.append(" and o.monthString = ?" + (index));
+			vs.add( wrapIn.getMonthString() );
+			index++;
+		}
+		if (wrapIn.getStatus()!=999) {
+			sql_stringBuffer.append(" and o.status = ?" + (index));
+			vs.add( wrapIn.getStatus() );
+			index++;
+		}
+		if ((null != wrapIn.getAppealReason()) && (!wrapIn.getAppealReason().isEmpty())) {
+			sql_stringBuffer.append(" and o.appealReason = ?" + (index));
+			vs.add( wrapIn.getAppealReason() );
+			index++;
+		}
+		if ((null != wrapIn.getProcessPerson1()) && (!wrapIn.getProcessPerson1().isEmpty())) {
+			sql_stringBuffer.append(" and o.processPerson1 = ?" + (index));
+			vs.add( wrapIn.getProcessPerson1() );
+			index++;
+		}
+		if ((null != wrapIn.getProcessPerson2()) && (!wrapIn.getProcessPerson2().isEmpty())) {
+			sql_stringBuffer.append(" and o.processPerson2 = ?" + (index));
+			vs.add( wrapIn.getProcessPerson2() );
+			index++;
+		}
+		
+		//添加OR条件
+		if (wrapIn.getOrAtrribute() != null && wrapIn.getOrAtrribute().size() > 0) {
+			sql_stringBuffer.append(" and (");
+			NameValueCountPair nameValueCountPair = null;
+			for (int p = 0; p < wrapIn.getOrAtrribute().size(); p++) {
+				nameValueCountPair = wrapIn.getOrAtrribute().get(p);
+				if (p == 0) {
+					sql_stringBuffer.append(" o." + nameValueCountPair.getName() + " = ?" + (index));
+
+				} else {
+					sql_stringBuffer.append(" or o." + nameValueCountPair.getName() + " = ?" + (index));
+				}
+				vs.add(nameValueCountPair.getValue());
+				index++;
+			}
+			sql_stringBuffer.append(" )");
+		}
+		
+		if( StringUtils.isNotEmpty( wrapIn.getKey() )){
+			sql_stringBuffer.append(" order by o."+wrapIn.getKey()+" " + order );
+		}else{
+			sql_stringBuffer.append(" order by o.sequence " + order );
+		}
+	
+		Query query = em.createQuery( sql_stringBuffer.toString(), AttendanceAppealInfo.class );
+		//为查询设置所有的参数值
+		for (int i = 0; i < vs.size(); i++) {
+			query.setParameter(i + 1, vs.get(i));
+		}
+		return query.setMaxResults(count).getResultList();
+	}	
+	
+	/**
+	 * 查询上一页的文档信息数据
+	 * @param id
+	 * @param count
+	 * @param sequence
+	 * @param wrapIn
+	 * @return
+	 * @throws Exception
+	 */
+	@SuppressWarnings("unchecked")
+	public List<AttendanceAppealInfo> listIdsPrevWithFilter( String id, Integer count, Object sequence, WrapInFilterAppeal wrapIn ) throws Exception {
+		//先获取上一页最后一条的sequence值,如果有值的话,以此sequence值作为依据取后续的count条数据
+		EntityManager em = this.entityManagerContainer().get( AttendanceAppealInfo.class );
+		String order = wrapIn.getOrder();//排序方式
+		List<Object> vs = new ArrayList<>();
+		StringBuffer sql_stringBuffer = new StringBuffer();
+		Integer index = 1;
+		
+		if( order == null || order.isEmpty() ){
+			order = "DESC";
+		}
+		
+		sql_stringBuffer.append( "SELECT o FROM "+AttendanceAppealInfo.class.getCanonicalName()+" o where 1=1" );
+		if ((null != sequence) ) {
+			sql_stringBuffer.append(" and o.sequence " + (StringUtils.equalsIgnoreCase(order, "DESC") ? ">" : "<") + (" ?" + (index)));
+			vs.add(sequence);
+			index++;
+		}
+		if ((null != wrapIn.getDetailId()) && (!wrapIn.getDetailId().isEmpty())) {
+			sql_stringBuffer.append(" and o.detailId = ?" + (index));
+			vs.add( wrapIn.getDetailId() );
+			index++;
+		}
+		if ((null != wrapIn.getEmpName()) && (!wrapIn.getEmpName().isEmpty())) {
+			sql_stringBuffer.append(" and o.empName = ?" + (index));
+			vs.add( wrapIn.getEmpName() );
+			index++;
+		}
+		if ((null != wrapIn.getUnitName()) && (!wrapIn.getUnitName().isEmpty())) {
+			sql_stringBuffer.append(" and o.unitName = ?" + (index));
+			vs.add( wrapIn.getUnitName() );
+			index++;
+		}
+		if ((null != wrapIn.getTopUnitName()) && (!wrapIn.getTopUnitName().isEmpty())) {
+			sql_stringBuffer.append(" and o.topUnitName = ?" + (index));
+			vs.add( wrapIn.getTopUnitName() );
+			index++;
+		}
+		if ((null != wrapIn.getYearString() ) && (!wrapIn.getYearString().isEmpty())) {
+			sql_stringBuffer.append(" and o.yearString = ?" + (index));
+			vs.add( wrapIn.getYearString() );
+			index++;
+		}
+		if ((null != wrapIn.getMonthString()) && (!wrapIn.getMonthString().isEmpty())) {
+			sql_stringBuffer.append(" and o.monthString = ?" + (index));
+			vs.add( wrapIn.getMonthString() );
+			index++;
+		}
+		if (wrapIn.getStatus()!=999) {
+			sql_stringBuffer.append(" and o.status = ?" + (index));
+			vs.add( wrapIn.getStatus() );
+			index++;
+		}
+		if ((null != wrapIn.getAppealReason()) && (!wrapIn.getAppealReason().isEmpty())) {
+			sql_stringBuffer.append(" and o.appealReason = ?" + (index));
+			vs.add( wrapIn.getAppealReason() );
+			index++;
+		}
+		if ((null != wrapIn.getProcessPerson1()) && (!wrapIn.getProcessPerson1().isEmpty())) {
+			sql_stringBuffer.append(" and o.processPerson1 = ?" + (index));
+			vs.add( wrapIn.getProcessPerson1() );
+			index++;
+		}
+		if ((null != wrapIn.getProcessPerson2()) && (!wrapIn.getProcessPerson2().isEmpty())) {
+			sql_stringBuffer.append(" and o.processPerson2 = ?" + (index));
+			vs.add( wrapIn.getProcessPerson2() );
+			index++;
+		}
+		//添加OR
+		if( wrapIn.getOrAtrribute() != null && wrapIn.getOrAtrribute().size() > 0){
+			sql_stringBuffer.append(" and (" );
+			NameValueCountPair nameValueCountPair = null;
+			for( int p = 0 ; p< wrapIn.getOrAtrribute().size(); p++ ){
+				nameValueCountPair = wrapIn.getOrAtrribute().get(p);
+				if( p == 0 ){
+					sql_stringBuffer.append(" o."+nameValueCountPair.getName()+" = ?" + (index));
+					
+				}else{
+					sql_stringBuffer.append(" or o."+nameValueCountPair.getName()+" = ?" + (index));					
+				}
+				vs.add( nameValueCountPair.getValue() );
+				index++;
+			}
+			sql_stringBuffer.append(" )" );
+		}
+		
+		if( StringUtils.isNotEmpty( wrapIn.getKey() )){
+			sql_stringBuffer.append(" order by o."+wrapIn.getKey()+" " + order );
+		}else{
+			sql_stringBuffer.append(" order by o.sequence " + order );
+		}
+		
+		Query query = em.createQuery( sql_stringBuffer.toString(), AttendanceAppealInfo.class );
+		//为查询设置所有的参数值
+		for (int i = 0; i < vs.size(); i++) {
+			query.setParameter(i + 1, vs.get(i));
+		}
+		
+		return query.setMaxResults(20).getResultList();
+	}
+
+	/**
+	 * 查询符合的文档信息总数
+	 * @param wrapIn
+	 * @return
+	 * @throws Exception
+	 */
+	public long getCountWithFilter( WrapInFilterAppeal wrapIn ) throws Exception {
+		//先获取上一页最后一条的sequence值,如果有值的话,以此sequence值作为依据取后续的count条数据
+		EntityManager em = this.entityManagerContainer().get( AttendanceAppealInfo.class );
+		List<Object> vs = new ArrayList<>();
+		StringBuffer sql_stringBuffer = new StringBuffer();
+		Integer index = 1;
+		
+		sql_stringBuffer.append( "SELECT count(o.id) FROM "+AttendanceAppealInfo.class.getCanonicalName()+" o where 1=1" );
+		
+		if ((null != wrapIn.getDetailId()) && (!wrapIn.getDetailId().isEmpty())) {
+			sql_stringBuffer.append(" and o.detailId = ?" + (index));
+			vs.add( wrapIn.getDetailId() );
+			index++;
+		}
+		if ((null != wrapIn.getEmpName()) && (!wrapIn.getEmpName().isEmpty())) {
+			sql_stringBuffer.append(" and o.empName = ?" + (index));
+			vs.add( wrapIn.getEmpName() );
+			index++;
+		}
+		if ((null != wrapIn.getUnitName()) && (!wrapIn.getUnitName().isEmpty())) {
+			sql_stringBuffer.append(" and o.unitName = ?" + (index));
+			vs.add( wrapIn.getUnitName() );
+			index++;
+		}
+		if ((null != wrapIn.getTopUnitName()) && (!wrapIn.getTopUnitName().isEmpty())) {
+			sql_stringBuffer.append(" and o.topUnitName = ?" + (index));
+			vs.add( wrapIn.getTopUnitName() );
+			index++;
+		}
+		if ((null != wrapIn.getYearString() ) && (!wrapIn.getYearString().isEmpty())) {
+			sql_stringBuffer.append(" and o.yearString = ?" + (index));
+			vs.add( wrapIn.getYearString() );
+			index++;
+		}
+		if ((null != wrapIn.getMonthString()) && (!wrapIn.getMonthString().isEmpty())) {
+			sql_stringBuffer.append(" and o.monthString = ?" + (index));
+			vs.add( wrapIn.getMonthString() );
+			index++;
+		}
+		if (wrapIn.getStatus()!=999) {
+			sql_stringBuffer.append(" and o.status = ?" + (index));
+			vs.add( wrapIn.getStatus() );
+			index++;
+		}
+		if ((null != wrapIn.getAppealReason()) && (!wrapIn.getAppealReason().isEmpty())) {
+			sql_stringBuffer.append(" and o.appealReason = ?" + (index));
+			vs.add( wrapIn.getAppealReason() );
+			index++;
+		}
+		if ((null != wrapIn.getProcessPerson1()) && (!wrapIn.getProcessPerson1().isEmpty())) {
+			sql_stringBuffer.append(" and o.processPerson1 = ?" + (index));
+			vs.add( wrapIn.getProcessPerson1() );
+			index++;
+		}
+		if ((null != wrapIn.getProcessPerson2()) && (!wrapIn.getProcessPerson2().isEmpty())) {
+			sql_stringBuffer.append(" and o.processPerson2 = ?" + (index));
+			vs.add( wrapIn.getProcessPerson2() );
+			index++;
+		}
+		//添加OR
+		if (wrapIn.getOrAtrribute() != null && wrapIn.getOrAtrribute().size() > 0) {
+			sql_stringBuffer.append(" and (");
+			NameValueCountPair nameValueCountPair = null;
+			for (int p = 0; p < wrapIn.getOrAtrribute().size(); p++) {
+				nameValueCountPair = wrapIn.getOrAtrribute().get(p);
+				if (p == 0) {
+					sql_stringBuffer.append(" o." + nameValueCountPair.getName() + " = ?" + (index));
+
+				} else {
+					sql_stringBuffer.append(" or o." + nameValueCountPair.getName() + " = ?" + (index));
+				}
+				vs.add(nameValueCountPair.getValue());
+				index++;
+			}
+			sql_stringBuffer.append(" )");
+		}
+
+		Query query = em.createQuery( sql_stringBuffer.toString(), AttendanceAppealInfo.class );
+		//为查询设置所有的参数值
+		for (int i = 0; i < vs.size(); i++) {
+			query.setParameter(i + 1, vs.get(i));
+		}		
+		return (Long) query.getSingleResult();
+	}
+}

+ 959 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceDetailFactory.java

@@ -0,0 +1,959 @@
+package com.x.attendance.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import javax.persistence.criteria.Selection;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.x.attendance.assemble.common.date.DateOperation;
+import com.x.attendance.assemble.control.AbstractFactory;
+import com.x.attendance.assemble.control.Business;
+import com.x.attendance.assemble.control.jaxrs.attendancedetail.AttendanceCycles;
+import com.x.attendance.assemble.control.jaxrs.attendancedetail.WrapInFilter;
+import com.x.attendance.entity.AttendanceDetail;
+import com.x.attendance.entity.AttendanceDetail_;
+import com.x.base.core.project.exception.ExceptionWhen;
+import com.x.base.core.project.tools.ListTools;
+/**
+ * 系统配置信息表基础功能服务类
+ * @author liyi
+ */
+public class AttendanceDetailFactory extends AbstractFactory {
+	
+	public AttendanceDetailFactory(Business business) throws Exception {
+		super(business);
+	}
+
+	//@MethodDescribe("获取指定Id的AttendanceDetail信息对象")
+	public AttendanceDetail get( String id ) throws Exception {
+		return this.entityManagerContainer().find(id, AttendanceDetail.class, ExceptionWhen.none);
+	}
+	
+	//@MethodDescribe("列示全部的AttendanceDetail信息列表")
+	public List<String> listAll() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		cq.select(root.get(AttendanceDetail_.id));
+		return em.createQuery(cq).getResultList();
+	}
+	
+	//@MethodDescribe("列示全部的AttendanceDetail信息列表")
+	public String getMaxRecordDate() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();		
+		CriteriaQuery<AttendanceDetail> cq = cb.createQuery( AttendanceDetail.class );
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);		
+		cq.orderBy( cb.desc( root.get( AttendanceDetail_.recordDateString) ) );	
+		List<AttendanceDetail> resultList = em.createQuery(cq).setMaxResults(1).getResultList();
+		if( resultList == null || resultList.size() == 0 ){
+			return null;
+		}else{
+			return resultList.get(0).getRecordDateString();
+		}
+	}
+	
+	//@MethodDescribe("根据员工姓名和打卡日期列示AttendanceDetail信息列表")
+	public List<String> listByEmployeeNameAndDate( String employeeName, String recordDateString ) throws Exception {
+		
+		if( employeeName == null || recordDateString == null ){
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get(AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		cq.select(root.get(AttendanceDetail_.id));
+		Predicate p = cb.equal( root.get(AttendanceDetail_.empName),  employeeName );
+		p = cb.and( p, cb.equal( root.get(AttendanceDetail_.recordDateString ),  recordDateString ) );
+		return em.createQuery(cq.where( p )).getResultList();
+	}
+	
+	//@MethodDescribe("根据员工姓名和打卡日期列示AttendanceDetail信息列表")
+	public List<AttendanceDetail> listDetailByEmployeeNameAndDate( String employeeName, String recordDateString ) throws Exception {
+		
+		if( employeeName == null || recordDateString == null ){
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get(AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceDetail> cq = cb.createQuery(AttendanceDetail.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		Predicate p = cb.equal( root.get(AttendanceDetail_.empName),  employeeName );
+		p = cb.and( p, cb.equal( root.get(AttendanceDetail_.recordDateString ),  recordDateString ) );
+		return em.createQuery(cq.where( p )).getResultList();
+	}
+	
+	//@MethodDescribe("列示指定Id的AttendanceDetail信息列表")
+	public List<AttendanceDetail> list(List<String> ids) throws Exception {
+		List<AttendanceDetail> resultList = null;
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<AttendanceDetail>();
+		}
+		EntityManager em = this.entityManagerContainer().get(AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceDetail> cq = cb.createQuery(AttendanceDetail.class);
+		Root<AttendanceDetail> root = cq.from(AttendanceDetail.class);
+		Predicate p = root.get(AttendanceDetail_.id).in(ids);
+		resultList = em.createQuery( cq.where(p) ).getResultList();
+		if( resultList == null ){
+			resultList = new ArrayList<AttendanceDetail>();
+		}
+		return resultList;
+	}
+
+	/**
+	 * 分析时间范围内的所有打卡记录
+	 * 1、如果未传入时间,或者时间有错,那么分析所有未分析过的打卡记录
+	 * 2、只分析未归档的,已经归档的将不再分析了
+	 * @param startDateString
+	 * @param endDateString
+	 * @return
+	 * @throws Exception
+	 */
+	//@MethodDescribe("按指定的开始时间,结束时间列示未被分析的AttendanceDetail信息列表")
+	public List<String> getAllAnalysenessDetails(String startDateString, String endDateString, String personName ) throws Exception {
+		DateOperation dateOperation = new DateOperation();
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		
+		//一般始终为true, id is not null
+		Predicate p = root.get( AttendanceDetail_.id ).isNotNull();
+		p = cb.and( p, root.get( AttendanceDetail_.archiveTime ).isNull()); //要未归档的,才再次进行分析
+		if( StringUtils.isNotEmpty( personName ) ) {
+			p = cb.and( p, cb.equal( root.get(AttendanceDetail_.empName ), personName)); //匹配员工姓名
+		}
+		Date startDate = null;
+		Date endDate = null;
+		try{
+			startDate = dateOperation.getDateFromString( startDateString );
+		}catch(Exception e){
+			startDate = null;
+		}
+		try{
+			endDate = dateOperation.getDateFromString( endDateString );
+		}catch(Exception e){
+			endDate = null;
+		}
+		//如果开始时间和结束时间有值,那么分析一个时间区间内的所有打卡记录,已经分析过了的,也需要重新分析一次
+		if( startDate != null  && endDate != null ){
+			p = cb.and( p, cb.between( root.get( AttendanceDetail_.recordDate), startDate, endDate));
+		}else{
+			if( startDate != null ){
+				p = cb.and( p, cb.between( root.get( AttendanceDetail_.recordDate), startDate, new Date()));
+			}
+			if( endDate != null ){
+				p = cb.and( p, cb.between( root.get( AttendanceDetail_.recordDate), new Date(), endDate));
+			}
+			if( startDate == null && endDate == null ){
+				//startDateString和endDateString都为空,只分析所有未分析过的
+				List<Integer> statusArray = new ArrayList<Integer>();
+				statusArray.add( 0 ); //未分析的
+				statusArray.add( -1 ); //有错误的
+				p = cb.and( p, root.get( AttendanceDetail_.recordStatus).in( statusArray ));
+			}
+		}
+		
+		cq.select( root.get( AttendanceDetail_.id ) );
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+	}
+	
+	/**
+	 * 分析时间范围内的所有打卡记录
+	 * 1、如果未传入时间,或者时间有错,那么分析所有未分析过的打卡记录
+	 * 2、只分析未归档的,已经归档的将不再分析了
+	 * @param startDateString
+	 * @param endDateString
+	 * @return
+	 * @throws Exception
+	 */
+	//@MethodDescribe("按指定的开始时间,结束时间列示未被分析的员工姓名列表")
+	public List<String> getAllAnalysenessPersonNames(String startDateString, String endDateString ) throws Exception {
+		DateOperation dateOperation = new DateOperation();
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		
+		//一般始终为true, id is not null
+		Predicate p = root.get( AttendanceDetail_.id ).isNotNull();
+		p = cb.and( p, root.get( AttendanceDetail_.archiveTime ).isNull()); //要未归档的,才再次进行分析
+		Date startDate = null;
+		Date endDate = null;
+		try{
+			startDate = dateOperation.getDateFromString( startDateString );
+		}catch(Exception e){
+			startDate = null;
+		}
+		try{
+			endDate = dateOperation.getDateFromString( endDateString );
+		}catch(Exception e){
+			endDate = null;
+		}
+		//如果开始时间和结束时间有值,那么分析一个时间区间内的所有打卡记录,已经分析过了的,也需要重新分析一次
+		if( startDate != null  && endDate != null ){
+			p = cb.and( p, cb.between( root.get( AttendanceDetail_.recordDate), startDate, endDate));
+		}else{
+			if( startDate != null ){
+				p = cb.and( p, cb.between( root.get( AttendanceDetail_.recordDate), startDate, new Date()));
+			}
+			if( endDate != null ){
+				p = cb.and( p, cb.between( root.get( AttendanceDetail_.recordDate), new Date(), endDate));
+			}
+			if( startDate == null && endDate == null ){
+				//startDateString和endDateString都为空,只分析所有未分析过的
+				List<Integer> statusArray = new ArrayList<Integer>();
+				statusArray.add( 0 ); //未分析的
+				statusArray.add( -1 ); //有错误的
+				p = cb.and( p, root.get( AttendanceDetail_.recordStatus).in( statusArray ));
+			}
+		}
+		
+		cq.distinct(true).select( root.get( AttendanceDetail_.empName ) );
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+	}
+	
+	//@MethodDescribe("按指定的开始时间,结束时间列示未被分析的AttendanceDetail信息列表")
+	public List<String> getUserAnalysenessDetails(String empName, String startDateString, String endDateString) throws Exception {
+		DateOperation dateOperation = new DateOperation();
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		cq.select(root.get(AttendanceDetail_.id));
+
+		Predicate p = cb.equal( root.get(AttendanceDetail_.empName),  empName );
+		
+		Date startDate = null;
+		Date endDate = null;
+		try{
+			startDate = dateOperation.getDateFromString( startDateString );
+		}catch(Exception e){
+			startDate = null;
+		}
+		try{
+			endDate = dateOperation.getDateFromString( endDateString );
+		}catch(Exception e){
+			endDate = null;
+		}
+		//如果开始时间和结束时间有值,那么分析一个时间区间内的所有打卡记录,已经分析过了的,也需要重新分析一次
+		if( startDate != null  && endDate != null ){
+			p = cb.and( p, cb.between( root.get( AttendanceDetail_.recordDate), startDate, endDate));
+		}else{
+			if( startDate != null ){
+				p = cb.and( p, cb.between( root.get( AttendanceDetail_.recordDate), startDate, new Date()));
+			}
+			if( endDate != null ){
+				p = cb.and( p, cb.between( root.get( AttendanceDetail_.recordDate), new Date(), endDate));
+			}
+			if( startDate == null && endDate == null ){
+				//startDateString和endDateString都为空,只分析所有未分析过的
+				List<Integer> statusArray = new ArrayList<Integer>();
+				statusArray.add( 0 ); //未分析的
+				statusArray.add( -1 ); //有错误的
+				p = cb.and( p, root.get( AttendanceDetail_.recordStatus).in( statusArray ));
+			}
+		}
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+	}
+	
+	//@MethodDescribe("按指定的年份,月份列示AttendanceDetail信息列表")
+	public List<AttendanceDetail> getDetailsByYearAndMonth(String year, String month) throws Exception {
+		if( year == null || month == null ){
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceDetail> cq = cb.createQuery(AttendanceDetail.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		//一般始终为true, id is not null
+		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
+		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.yearString), year ));
+		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.monthString), month ));
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+	}
+	
+	//@MethodDescribe("按指定的统计周期年份,月份列示AttendanceDetail信息列表")
+	public List<AttendanceDetail> getDetailsByCycleYearAndMonth(String cycleYear, String cycleMonth) throws Exception {
+		if( cycleYear == null || cycleMonth == null ){
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceDetail> cq = cb.createQuery(AttendanceDetail.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		//一般始终为true, id is not null
+		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
+		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleYear), cycleYear ));
+		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleMonth), cycleMonth ));
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+	}
+	
+	//@MethodDescribe("按指定的年份,月份列示已分析的AttendanceDetail信息中涉及的组织列表")
+	public List<String> getDetailsUnitsByYearAndMonth(String year, String month) throws Exception {
+		if( year == null || month == null ){
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		cq.distinct(true).select( root.get(AttendanceDetail_.unitName ));
+		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
+		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.yearString), year ));
+		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.monthString), month ));
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+	}
+	
+	/**
+	 * 迟到、缺勤、早退、工时不足、异常打卡,但未申诉通过的
+	 * @param year
+	 * @param month
+	 * @return
+	 * @throws Exception
+	 */
+	//@MethodDescribe("获取所有需要导出所有异常数据(未申诉的、申诉未通过的)")
+	public List<String> getDetailsWithAllAbnormalCase( String year, String month ) throws Exception {
+		if( year == null || month == null ){
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		cq.select( root.get(AttendanceDetail_.id ));
+		
+		Predicate p = cb.lessThan( root.get(AttendanceDetail_.appealStatus), 9); //如果等于9就是申诉通过
+		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleYear), year ));
+		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleMonth), month ));
+		
+		Predicate orCase = cb.isTrue(root.get(AttendanceDetail_.isLate)); //迟到
+		orCase = cb.or( orCase, cb.isTrue( root.get(AttendanceDetail_.isLeaveEarlier)) ); //或者早退
+		orCase = cb.or( orCase, cb.isTrue( root.get(AttendanceDetail_.isAbnormalDuty) )); //或者异常打卡
+		orCase = cb.or( orCase, cb.isTrue( root.get(AttendanceDetail_.isAbsent) )); //或者缺勤
+		orCase = cb.or( orCase, cb.isTrue( root.get(AttendanceDetail_.isLackOfTime) )); //或者工时不足
+		
+		Predicate where = cb.and( p, orCase );
+		
+		return em.createQuery(cq.where(where)).setMaxResults(20000).getResultList();
+	}
+	
+	//@MethodDescribe("按指定的统计周期年份,月份列示AttendanceDetail信息中涉及的组织列表")
+	public List<String> getDetailsUnitsByCycleYearAndMonth(String cycleYear, String cycleMonth) throws Exception {
+		if( cycleYear == null || cycleMonth == null ){
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		cq.distinct(true).select( root.get(AttendanceDetail_.unitName ));
+		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
+		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleYear), cycleYear ));
+		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleMonth), cycleMonth ));
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+	}
+	
+	//@MethodDescribe("按指定的统计周期年份,月份列示AttendanceDetail信息中涉及的顶层组织名称列表")
+	public List<String> distinctDetailsTopUnitNamesByYearAndMonth(String year, String month) throws Exception {
+		if( year == null || month == null ){
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		cq.distinct(true).select( root.get(AttendanceDetail_.topUnitName ));
+		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
+		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.yearString), year ));
+		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.monthString), month ));
+		return em.createQuery(cq.where(p)).setMaxResults(1000).getResultList();
+	}
+	
+	//@MethodDescribe("按指定的统计周期年份,月份列示AttendanceDetail信息中涉及的员工姓名列表")
+	public List<String> distinctDetailsEmployeeNamesByCycleYearAndMonth(String cycleYear, String cycleMonth) throws Exception {
+		if( cycleYear == null || cycleMonth == null ){
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		cq.distinct(true).select( root.get(AttendanceDetail_.empName ));
+		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
+		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleYear), cycleYear ));
+		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleMonth), cycleMonth ));
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+	}
+	
+	//@MethodDescribe("按指定的统计周期年份,月份列示AttendanceDetail信息中涉及的顶层组织名称列表")
+	public List<String> distinctDetailsTopUnitNamesByCycleYearAndMonth(String cycleYear, String cycleMonth) throws Exception {
+		if( cycleYear == null || cycleMonth == null ){
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		cq.distinct(true).select( root.get(AttendanceDetail_.topUnitName ));
+		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
+		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleYear), cycleYear ));
+		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleMonth), cycleMonth ));
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+	}
+	
+	//@MethodDescribe("按指定的统计周期年份,月份列示AttendanceDetail信息中涉及的组织名称列表")
+	public List<String> distinctDetailsUnitNamesByCycleYearAndMonth( String cycleYear, String cycleMonth ) throws Exception {
+		if( cycleYear == null || cycleMonth == null ){
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		cq.distinct(true).select( root.get(AttendanceDetail_.unitName ));
+		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
+		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleYear), cycleYear ));
+		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleMonth), cycleMonth ));
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+	}
+	
+	//@MethodDescribe("按指定的统计周期年份,月份列示AttendanceDetail信息中涉及的组织名称列表")
+	public List<String> distinctDetailsUnitNamesByCycleYearAndMonth( String cycleYear, String cycleMonth, String employeeName ) throws Exception {
+		if( cycleYear == null || cycleMonth == null || employeeName == null ){
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		cq.distinct(true).select( root.get(AttendanceDetail_.unitName ));
+		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
+		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleYear), cycleYear ));
+		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleMonth), cycleMonth ));
+		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.empName), employeeName ));
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+	}
+
+
+	//@MethodDescribe("按batchName查询一次导入的所有数据记录列表")
+	public List<String> listByBatchName( String file_id ) throws Exception{
+		if( file_id == null ){
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		cq.distinct(true).select( root.get(AttendanceDetail_.id ));
+		//一般始终为true, id is not null
+		Predicate p = cb.equal( root.get(AttendanceDetail_.batchName), file_id );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+
+	//@MethodDescribe("按年份月份查询某用户的打卡数据记录列表")
+	public List<String> listUserAttendanceDetailByYearAndMonth(String user, String year, String month)  throws Exception {
+		if( user == null || user.isEmpty() ||year == null || month == null || year.isEmpty() || month.isEmpty()  ){
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		cq.select( root.get(AttendanceDetail_.id ));
+		//一般始终为true, id is not null
+		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
+		if( StringUtils.isNotEmpty( user ) ){
+			p = cb.and(p, cb.equal( root.get(AttendanceDetail_.empName), user ));
+		}
+		if( StringUtils.isNotEmpty( year ) ){
+			p = cb.and(p, cb.equal( root.get(AttendanceDetail_.yearString), year ));
+		}
+		if( StringUtils.isNotEmpty( month ) ){
+			p = cb.and(p, cb.equal( root.get(AttendanceDetail_.monthString), month ));
+		}
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe("按周期年份月份查询某用户的打卡数据记录列表")
+	public List<String> listUserAttendanceDetailByCycleYearAndMonth(String user, String year, String month)  throws Exception {
+		if( user == null || user.isEmpty() ||year == null || month == null || year.isEmpty() || month.isEmpty()  ){
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		cq.select( root.get(AttendanceDetail_.id ));
+		//一般始终为true, id is not null
+		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
+		if( StringUtils.isNotEmpty( user ) ){
+			p = cb.and(p, cb.equal( root.get(AttendanceDetail_.empName), user ));
+		}
+		if( StringUtils.isNotEmpty( year ) ){
+			p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleYear), year ));
+		}
+		if( StringUtils.isNotEmpty( month ) ){
+			p = cb.and(p, cb.equal( root.get(AttendanceDetail_.cycleMonth), month ));
+		}
+		
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe("按年份月份查询某组织的打卡数据记录列表")
+	public List<String> listUnitAttendanceDetailByYearAndMonth( List<String> unitNames, String year, String month)  throws Exception {
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		cq.select( root.get(AttendanceDetail_.id ));
+		//一般始终为true, id is not null
+		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
+		if( unitNames != null && unitNames.size() > 0 ){
+			p = cb.and(p, root.get(AttendanceDetail_.unitName).in(unitNames));
+		}
+		if( StringUtils.isNotEmpty( year ) ){
+			p = cb.and(p, cb.equal( root.get(AttendanceDetail_.yearString), year ));
+		}
+		if( StringUtils.isNotEmpty( month ) ){
+			p = cb.and(p, cb.equal( root.get(AttendanceDetail_.monthString), month ));
+		}
+		
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe("按年份月份查询某顶层组织的打卡数据记录列表")
+	public List<String> listTopUnitAttendanceDetailByYearAndMonth(List<String> topUnitNames, String year, String month)  throws Exception {
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		cq.select( root.get(AttendanceDetail_.id ));
+		//一般始终为true, id is not null
+		Predicate p = cb.equal( root.get(AttendanceDetail_.recordStatus), 1 );
+		if( ListTools.isNotEmpty(  topUnitNames ) ){
+			p = cb.and(p, root.get(AttendanceDetail_.topUnitName).in( topUnitNames ));
+		}
+		if( StringUtils.isNotEmpty( year ) ){
+			p = cb.and(p, cb.equal( root.get(AttendanceDetail_.yearString), year ));
+		}
+		if( StringUtils.isNotEmpty( month ) ){
+			p = cb.and(p, cb.equal( root.get(AttendanceDetail_.monthString), month ));
+		}
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	
+	/**
+	 * 查询下一页的信息数据
+	 * @param id
+	 * @param count
+	 * @param sequence
+	 * @param wrapIn
+	 * @return
+	 * @throws Exception
+	 */
+	@SuppressWarnings("unchecked")
+	public List<AttendanceDetail> listIdsNextWithFilter( String id, Integer count, Object sequence, WrapInFilter wrapIn ) throws Exception {
+		//先获取上一页最后一条的sequence值,如果有值的话,以此sequence值作为依据取后续的count条数据
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		String order = wrapIn.getOrder();//排序方式
+		List<Object> vs = new ArrayList<>();
+		StringBuffer sql_stringBuffer = new StringBuffer();
+		
+		if( order == null || order.isEmpty() ){
+			order = "DESC";
+		}
+		
+		Integer index = 1;
+		sql_stringBuffer.append( "SELECT o FROM "+AttendanceDetail.class.getCanonicalName()+" o where 1=1" );
+
+		if ((null != sequence) ) {
+			sql_stringBuffer.append(" and o.sequence " + (StringUtils.equalsIgnoreCase(order, "DESC") ? "<" : ">") + (" ?" + (index)));
+			vs.add(sequence);
+			index++;
+		}
+		if ((null != wrapIn.getQ_empName()) && (!wrapIn.getQ_empName().isEmpty())) {
+			sql_stringBuffer.append(" and o.empName = ?" + (index));
+			vs.add( wrapIn.getQ_empName() );
+			index++;
+		}
+		if (null != wrapIn.getUnitNames() && wrapIn.getUnitNames().size()>0) {
+			sql_stringBuffer.append(" and o.unitName in ( ?" + (index) + ")");
+			vs.add( wrapIn.getUnitNames() );
+			index++;
+		}
+		if (null != wrapIn.getTopUnitNames() && wrapIn.getTopUnitNames().size() > 0 ) {
+			sql_stringBuffer.append(" and o.topUnitName in ( ?" + (index) + ")");
+			vs.add( wrapIn.getTopUnitNames() );
+			index++;
+		}
+		if ((null != wrapIn.getCycleYear() ) && (!wrapIn.getCycleYear().isEmpty())) {
+			sql_stringBuffer.append(" and o.cycleYear = ?" + (index));
+			vs.add( wrapIn.getCycleYear() );
+			index++;
+		}
+		if ((null != wrapIn.getCycleMonth()) && (!wrapIn.getCycleMonth().isEmpty())) {
+			sql_stringBuffer.append(" and o.cycleMonth = ?" + (index));
+			vs.add( wrapIn.getCycleMonth() );
+			index++;
+		}
+		if ((null != wrapIn.getQ_year() ) && (!wrapIn.getQ_year().isEmpty())) {
+			sql_stringBuffer.append(" and o.yearString = ?" + (index));
+			vs.add( wrapIn.getQ_year() );
+			index++;
+		}
+		if ((null != wrapIn.getQ_month()) && (!wrapIn.getQ_month().isEmpty())) {
+			sql_stringBuffer.append(" and o.monthString = ?" + (index));
+			vs.add( wrapIn.getQ_month() );
+			index++;
+		}
+		if ((null != wrapIn.getQ_date()) && (!wrapIn.getQ_date().isEmpty())) {
+			sql_stringBuffer.append(" and o.recordDateString = ?" + (index));
+			vs.add( wrapIn.getQ_date() );
+			index++;
+		}
+		
+		if ( wrapIn.getRecordStatus() != 999 ) {
+			sql_stringBuffer.append(" and o.recordStatus = ?" + (index));
+			vs.add( wrapIn.getRecordStatus() );
+			index++;
+		}
+		
+		if (wrapIn.getIsAbsent() != null ) {
+			sql_stringBuffer.append(" and o.isAbsent = ?" + (index));
+			vs.add( wrapIn.getIsAbsent() );
+			index++;
+		}
+		
+		if (wrapIn.getIsLate() != null ) {
+			sql_stringBuffer.append(" and o.isLate = ?" + (index));
+			vs.add( wrapIn.getIsLate() );
+			index++;
+		}
+		
+		if (wrapIn.getIsLackOfTime() != null ) {
+			sql_stringBuffer.append(" and o.isLackOfTime = ?" + (index));
+			vs.add( wrapIn.getIsLackOfTime() );
+			index++;
+		}
+		
+		if (wrapIn.getIsLeaveEarlier() != null ) {
+			sql_stringBuffer.append(" and o.isLeaveEarlier = ?" + (index));
+			vs.add( wrapIn.getIsLeaveEarlier() );
+			index++;
+		}
+		
+		if( StringUtils.isNotEmpty( wrapIn.getKey() )){
+			sql_stringBuffer.append(" order by o."+wrapIn.getKey()+" " + order );
+		}else{
+			sql_stringBuffer.append(" order by o.sequence " + order );
+		}
+		
+		Query query = em.createQuery( sql_stringBuffer.toString(), AttendanceDetail.class );
+		//为查询设置所有的参数值
+		for (int i = 0; i < vs.size(); i++) {
+			query.setParameter(i + 1, vs.get(i));
+		}
+		return query.setMaxResults(count).getResultList();
+	}	
+	
+	/**
+	 * 查询上一页的文档信息数据
+	 * @param id
+	 * @param count
+	 * @param sequence
+	 * @param wrapIn
+	 * @return
+	 * @throws Exception
+	 */
+	@SuppressWarnings("unchecked")
+	public List<AttendanceDetail> listIdsPrevWithFilter( String id, Integer count, Object sequence, WrapInFilter wrapIn ) throws Exception {
+		//先获取上一页最后一条的sequence值,如果有值的话,以此sequence值作为依据取后续的count条数据
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		String order = wrapIn.getOrder();//排序方式
+		List<Object> vs = new ArrayList<>();
+		StringBuffer sql_stringBuffer = new StringBuffer();
+		Integer index = 1;
+		
+		if( order == null || order.isEmpty() ){
+			order = "DESC";
+		}
+		
+		sql_stringBuffer.append( "SELECT o FROM "+AttendanceDetail.class.getCanonicalName()+" o where 1=1" );
+		if ((null != sequence) ) {
+			sql_stringBuffer.append(" and o.sequence " + (StringUtils.equalsIgnoreCase(order, "DESC") ? ">" : "<") + (" ?" + (index)));
+			vs.add(sequence);
+			index++;
+		}
+		if ((null != wrapIn.getQ_empName()) && (!wrapIn.getQ_empName().isEmpty())) {
+			sql_stringBuffer.append(" and o.empName = ?" + (index));
+			vs.add( wrapIn.getQ_empName() );
+			index++;
+		}
+		if (null != wrapIn.getUnitNames() && wrapIn.getUnitNames().size()>0) {
+			sql_stringBuffer.append(" and o.unitName in ( ?" + (index) + ")");
+			vs.add( wrapIn.getUnitNames() );
+			index++;
+		}
+		if (null != wrapIn.getTopUnitNames() && wrapIn.getTopUnitNames().size() > 0 ) {
+			sql_stringBuffer.append(" and o.topUnitName in ( ?" + (index) + ")");
+			vs.add( wrapIn.getTopUnitNames() );
+			index++;
+		}
+		if ((null != wrapIn.getCycleYear() ) && (!wrapIn.getCycleYear().isEmpty())) {
+			sql_stringBuffer.append(" and o.cycleYear = ?" + (index));
+			vs.add( wrapIn.getCycleYear() );
+			index++;
+		}
+		if ((null != wrapIn.getCycleMonth()) && (!wrapIn.getCycleMonth().isEmpty())) {
+			sql_stringBuffer.append(" and o.cycleMonth = ?" + (index));
+			vs.add( wrapIn.getCycleMonth() );
+			index++;
+		}
+		if ((null != wrapIn.getQ_year() ) && (!wrapIn.getQ_year().isEmpty())) {
+			sql_stringBuffer.append(" and o.yearString = ?" + (index));
+			vs.add( wrapIn.getQ_year() );
+			index++;
+		}
+		if ((null != wrapIn.getQ_month()) && (!wrapIn.getQ_month().isEmpty())) {
+			sql_stringBuffer.append(" and o.monthString = ?" + (index));
+			vs.add( wrapIn.getQ_month() );
+			index++;
+		}
+		if ((null != wrapIn.getQ_date()) && (!wrapIn.getQ_date().isEmpty())) {
+			sql_stringBuffer.append(" and o.recordDateString = ?" + (index));
+			vs.add( wrapIn.getQ_date() );
+			index++;
+		}
+		
+		if ( wrapIn.getRecordStatus() != 999 ) {
+			sql_stringBuffer.append(" and o.recordStatus = ?" + (index));
+			vs.add( wrapIn.getIsAbsent() );
+			index++;
+		}
+		
+		if (wrapIn.getIsAbsent() != null ) {
+			sql_stringBuffer.append(" and o.isAbsent = ?" + (index));
+			vs.add( wrapIn.getIsAbsent() );
+			index++;
+		}
+		
+		if (wrapIn.getIsLate() != null ) {
+			sql_stringBuffer.append(" and o.isLate = ?" + (index));
+			vs.add( wrapIn.getIsLate() );
+			index++;
+		}
+		
+		if (wrapIn.getIsLackOfTime() != null ) {
+			sql_stringBuffer.append(" and o.isLackOfTime = ?" + (index));
+			vs.add( wrapIn.getIsLackOfTime() );
+			index++;
+		}
+		
+		if (wrapIn.getIsLeaveEarlier() != null ) {
+			sql_stringBuffer.append(" and o.isLeaveEarlier = ?" + (index));
+			vs.add( wrapIn.getIsLeaveEarlier() );
+			index++;
+		}
+		
+		if( StringUtils.isNotEmpty( wrapIn.getKey() )){
+			sql_stringBuffer.append(" order by o."+wrapIn.getKey()+" " + order );
+		}else{
+			sql_stringBuffer.append(" order by o.sequence " + order );
+		}
+		
+		Query query = em.createQuery( sql_stringBuffer.toString(), AttendanceDetail.class );
+		//为查询设置所有的参数值
+		for (int i = 0; i < vs.size(); i++) {
+			query.setParameter(i + 1, vs.get(i));
+		}
+		
+		return query.setMaxResults(count).getResultList();
+	}
+	
+	/**
+	 * 查询符合的文档信息总数
+	 * @param id
+	 * @param count
+	 * @param sequence
+	 * @param wrapIn
+	 * @return
+	 * @throws Exception
+	 */
+	public long getCountWithFilter( WrapInFilter wrapIn ) throws Exception {
+		//先获取上一页最后一条的sequence值,如果有值的话,以此sequence值作为依据取后续的count条数据
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		List<Object> vs = new ArrayList<>();
+		StringBuffer sql_stringBuffer = new StringBuffer();
+		Integer index = 1;
+		
+		sql_stringBuffer.append( "SELECT count(o.id) FROM "+AttendanceDetail.class.getCanonicalName()+" o where 1=1" );
+		
+		if ((null != wrapIn.getQ_empName()) && (!wrapIn.getQ_empName().isEmpty())) {
+			sql_stringBuffer.append(" and o.empName = ?" + (index));
+			vs.add( wrapIn.getQ_empName() );
+			index++;
+		}
+		if (null != wrapIn.getUnitNames() && wrapIn.getUnitNames().size()>0) {
+			sql_stringBuffer.append(" and o.unitName in ( ?" + (index) + ")");
+			vs.add( wrapIn.getUnitNames() );
+			index++;
+		}
+		if (null != wrapIn.getTopUnitNames() && wrapIn.getTopUnitNames().size() > 0 ) {
+			sql_stringBuffer.append(" and o.topUnitName in ( ?" + (index) + ")");
+			vs.add( wrapIn.getTopUnitNames() );
+			index++;
+		}
+		if ((null != wrapIn.getCycleYear() ) && (!wrapIn.getCycleYear().isEmpty())) {
+			sql_stringBuffer.append(" and o.cycleYear = ?" + (index));
+			vs.add( wrapIn.getCycleYear() );
+			index++;
+		}
+		if ((null != wrapIn.getCycleMonth()) && (!wrapIn.getCycleMonth().isEmpty())) {
+			sql_stringBuffer.append(" and o.cycleMonth = ?" + (index));
+			vs.add( wrapIn.getCycleMonth() );
+			index++;
+		}
+		if ((null != wrapIn.getQ_year() ) && (!wrapIn.getQ_year().isEmpty())) {
+			sql_stringBuffer.append(" and o.yearString = ?" + (index));
+			vs.add( wrapIn.getQ_year() );
+			index++;
+		}
+		if ((null != wrapIn.getQ_month()) && (!wrapIn.getQ_month().isEmpty())) {
+			sql_stringBuffer.append(" and o.monthString = ?" + (index));
+			vs.add( wrapIn.getQ_month() );
+			index++;
+		}
+		if ((null != wrapIn.getQ_date()) && (!wrapIn.getQ_date().isEmpty())) {
+			sql_stringBuffer.append(" and o.recordDateString = ?" + (index));
+			vs.add( wrapIn.getQ_date() );
+			index++;
+		}
+		if ( wrapIn.getRecordStatus() != 999 ) {
+			sql_stringBuffer.append(" and o.recordStatus = ?" + (index));
+			vs.add( wrapIn.getIsAbsent() );
+			index++;
+		}
+		
+		if (wrapIn.getIsAbsent() != null ) {
+			sql_stringBuffer.append(" and o.isAbsent = ?" + (index));
+			vs.add( wrapIn.getIsAbsent() );
+			index++;
+		}
+		
+		if (wrapIn.getIsLate() != null ) {
+			sql_stringBuffer.append(" and o.isLate = ?" + (index));
+			vs.add( wrapIn.getIsLate() );
+			index++;
+		}
+		
+		if (wrapIn.getIsLackOfTime() != null ) {
+			sql_stringBuffer.append(" and o.isLackOfTime = ?" + (index));
+			vs.add( wrapIn.getIsLackOfTime() );
+			index++;
+		}
+		
+		if (wrapIn.getIsLeaveEarlier() != null ) {
+			sql_stringBuffer.append(" and o.isLeaveEarlier = ?" + (index));
+			vs.add( wrapIn.getIsLeaveEarlier() );
+			index++;
+		}
+		
+		Query query = em.createQuery( sql_stringBuffer.toString(), AttendanceDetail.class );
+		//为查询设置所有的参数值
+		for (int i = 0; i < vs.size(); i++) {
+			query.setParameter(i + 1, vs.get(i));
+		}		
+		return (Long) query.getSingleResult();
+	}
+
+	public List<String> getByUserAndRecordDate(String employeeName, String recordDateStringFormated)  throws Exception{		
+		if( employeeName == null || employeeName.isEmpty() || recordDateStringFormated == null || recordDateStringFormated.isEmpty() ){
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		Predicate p = cb.equal( root.get(AttendanceDetail_.empName), employeeName );
+		p = cb.and(p, cb.equal( root.get(AttendanceDetail_.recordDateString), recordDateStringFormated ));	
+		cq.select( root.get(AttendanceDetail_.id ));
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	
+	public List<AttendanceCycles> getCyclesFromDetailWithDateSplit( Date startDate, Date endDate )  throws Exception{
+		if( startDate == null || startDate == null ){
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceCycles> cq = cb.createQuery(AttendanceCycles.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		Predicate p = cb.between( root.get(AttendanceDetail_.recordDate), startDate, endDate);
+		
+		List<Selection<?>> selectionList = new ArrayList<Selection<?>>();
+		selectionList.add(root.get(AttendanceDetail_.cycleYear ));
+		selectionList.add(root.get(AttendanceDetail_.cycleMonth ));
+		cq.distinct(true).multiselect(selectionList);
+		
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	public List<AttendanceCycles> getCyclesFromDetailWithDateSplit( String empName, Date startDate, Date endDate )  throws Exception{
+		if( startDate == null || startDate == null ){
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceCycles> cq = cb.createQuery(AttendanceCycles.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		Predicate p = cb.between( root.get(AttendanceDetail_.recordDate), startDate, endDate);
+		p = cb.and( p, cb.equal( root.get(AttendanceDetail_.empName), empName));
+		List<Selection<?>> selectionList = new ArrayList<Selection<?>>();
+		selectionList.add(root.get(AttendanceDetail_.cycleYear ));
+		selectionList.add(root.get(AttendanceDetail_.cycleMonth ));
+		cq.distinct(true).multiselect(selectionList);
+		
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe("查询未归档的条卡记录列表,最大2000条")
+	public List<String> listNonArchiveDetailInfoIds()  throws Exception {
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		cq.select( root.get(AttendanceDetail_.id ));
+		//一般始终为true, id is not null
+		Predicate p = cb.isNotNull( root.get(AttendanceDetail_.archiveTime) );
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+	}
+
+	public List<String> listAnalysenessDetailsByEmployee( String empName ) throws Exception {
+		List<Integer> statusArray = new ArrayList<Integer>();
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		cq.select(root.get(AttendanceDetail_.id));
+		Predicate p = cb.equal( root.get( AttendanceDetail_.empName ), empName );
+		statusArray.add( 0 ); //未分析的
+		statusArray.add( -1 ); //有错误的
+		p = cb.and( p, root.get( AttendanceDetail_.recordStatus).in( statusArray ));
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+	}
+}

+ 160 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceDetailMobileFactory.java

@@ -0,0 +1,160 @@
+package com.x.attendance.assemble.control.factory;
+
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.x.attendance.assemble.control.AbstractFactory;
+import com.x.attendance.assemble.control.Business;
+import com.x.attendance.entity.AttendanceDetailMobile;
+import com.x.attendance.entity.AttendanceDetailMobile_;
+/**
+ * 系统配置信息表基础功能服务类
+ * @author liyi
+ */
+public class AttendanceDetailMobileFactory extends AbstractFactory {
+	
+	public AttendanceDetailMobileFactory( Business business ) throws Exception {
+		super(business);
+	}
+
+	public List<String> listByEmployeeNameDateAndTime( String empName, String recordDateString, String signTime ) throws Exception {
+		if( empName == null || empName.isEmpty() ){
+			throw new Exception("empName is null!");
+		}
+		if( recordDateString == null || recordDateString.isEmpty() ){
+			throw new Exception("recordDateString is null!");
+		}
+		if( signTime == null || signTime.isEmpty() ){
+			throw new Exception("signTime is null!");
+		}
+		EntityManager em = this.entityManagerContainer().get(AttendanceDetailMobile.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceDetailMobile> root = cq.from( AttendanceDetailMobile.class);
+		cq.select(root.get(AttendanceDetailMobile_.id));
+		Predicate p = cb.equal( root.get(AttendanceDetailMobile_.empName),  empName );
+		p = cb.and( p, cb.equal( root.get(AttendanceDetailMobile_.recordDateString ),  recordDateString ) );
+		p = cb.and( p, cb.equal( root.get(AttendanceDetailMobile_.signTime ),  signTime ) );
+		return em.createQuery(cq.where( p )).getResultList();
+	}
+	
+	/**
+	 * 列示指定人员指定日期的所有移动打卡信息
+	 * @param empName
+	 * @param recordDateString
+	 * @return
+	 * @throws Exception
+	 */
+	public List<AttendanceDetailMobile> listAttendanceDetailMobileWithEmployee( String empName, String recordDateString) throws Exception {
+		if( empName == null || empName.isEmpty() ){
+			throw new Exception("empName is null!");
+		}
+		if( recordDateString == null || recordDateString.isEmpty() ){
+			throw new Exception("recordDateString is null!");
+		}
+		EntityManager em = this.entityManagerContainer().get(AttendanceDetailMobile.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceDetailMobile> cq = cb.createQuery(AttendanceDetailMobile.class);
+		Root<AttendanceDetailMobile> root = cq.from( AttendanceDetailMobile.class);
+		Predicate p = cb.equal( root.get(AttendanceDetailMobile_.empName),  empName );
+		p = cb.and( p, cb.equal( root.get(AttendanceDetailMobile_.recordDateString ),  recordDateString ) );
+		return em.createQuery(cq.where( p )).getResultList();
+	}
+	
+	//@MethodDescribe("列示指定Id的AttendanceDetailMobile信息列表")
+	public List<AttendanceDetailMobile> list(List<String> ids) throws Exception {
+		List<AttendanceDetailMobile> resultList = null;
+		if( ids == null || ids.size() == 0 ){
+			throw new Exception("ids is null!");
+		}
+		EntityManager em = this.entityManagerContainer().get(AttendanceDetailMobile.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceDetailMobile> cq = cb.createQuery(AttendanceDetailMobile.class);
+		Root<AttendanceDetailMobile> root = cq.from(AttendanceDetailMobile.class);
+		Predicate p = root.get( AttendanceDetailMobile_.id).in( ids );
+		resultList = em.createQuery( cq.where(p) ).getResultList();
+		return resultList;
+	}
+
+	public Long countAttendanceDetailMobileForPage( String empNo, String empName, String signDescription,
+			String startDate, String endDate) throws Exception {
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetailMobile.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<AttendanceDetailMobile> root = cq.from(AttendanceDetailMobile.class);
+		Predicate p = cb.isNotNull( root.get( AttendanceDetailMobile_.id ) );
+		if( StringUtils.isNotEmpty( empNo ) ){
+			p = cb.and( p, cb.equal( root.get( AttendanceDetailMobile_.empNo ), empNo ) );
+		}
+		if( StringUtils.isNotEmpty( empName ) ){
+			p = cb.and( p, cb.equal( root.get( AttendanceDetailMobile_.empName ), empName ) );
+		}
+		if( StringUtils.isNotEmpty( signDescription ) ){
+			p = cb.and( p, cb.equal( root.get( AttendanceDetailMobile_.signDescription ), signDescription ) );
+		}
+		if( StringUtils.isNotEmpty( startDate ) ){
+			if( StringUtils.isNotEmpty( endDate ) && !endDate.equals( startDate ) ){//查询日期区间
+				p = cb.between( root.get( AttendanceDetailMobile_.recordDateString ), startDate, endDate );
+			}else{
+				//查询startDate当天
+				p = cb.and( p, cb.equal( root.get( AttendanceDetailMobile_.recordDateString ), startDate ) );
+			}
+		}
+		cq.select( cb.count( root ) );		
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	public List<AttendanceDetailMobile> listAttendanceDetailMobileForPage( String empNo, String empName, String signDescription,
+			String startDate, String endDate, Integer selectTotal ) throws Exception {
+		if( selectTotal == null ){
+			selectTotal = 100;
+		}
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetailMobile.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceDetailMobile> cq = cb.createQuery(AttendanceDetailMobile.class);
+		Root<AttendanceDetailMobile> root = cq.from(AttendanceDetailMobile.class);
+		Predicate p = cb.isNotNull( root.get( AttendanceDetailMobile_.id ) );
+		if( StringUtils.isNotEmpty( empNo ) ){
+			p = cb.and( p, cb.equal( root.get( AttendanceDetailMobile_.empNo ), empNo ) );
+		}
+		if( StringUtils.isNotEmpty( empName ) ){
+			p = cb.and( p, cb.equal( root.get( AttendanceDetailMobile_.empName ), empName ) );
+		}
+		if( StringUtils.isNotEmpty( signDescription ) ){
+			p = cb.and( p, cb.equal( root.get( AttendanceDetailMobile_.signDescription ), signDescription ) );
+		}
+		if( StringUtils.isNotEmpty( startDate ) ){
+			if( StringUtils.isNotEmpty( endDate ) && !endDate.equals( startDate ) ){//查询日期区间
+				p = cb.between( root.get( AttendanceDetailMobile_.recordDateString ), startDate, endDate );
+			}else{
+				//查询startDate当天
+				p = cb.and( p, cb.equal( root.get( AttendanceDetailMobile_.recordDateString ), startDate ) );
+			}
+		}
+		return em.createQuery(cq.where(p)).setMaxResults( selectTotal ).getResultList();
+	}
+
+	public AttendanceDetailMobile get(String id) throws Exception {
+		return this.entityManagerContainer().find(id, AttendanceDetailMobile.class );
+	}
+
+	public List<String> listAllAnalyseWithStatus(int status) throws Exception {
+		EntityManager em = this.entityManagerContainer().get(AttendanceDetailMobile.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceDetailMobile> root = cq.from( AttendanceDetailMobile.class);
+		cq.select(root.get(AttendanceDetailMobile_.id));
+		Predicate p = cb.equal( root.get(AttendanceDetailMobile_.recordStatus), status );
+		return em.createQuery(cq.where( p )).getResultList();
+	}
+
+	
+
+}

+ 926 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceDetailStatisticFactory.java

@@ -0,0 +1,926 @@
+package com.x.attendance.assemble.control.factory;
+
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import com.x.attendance.assemble.control.AbstractFactory;
+import com.x.attendance.assemble.control.Business;
+import com.x.attendance.entity.AttendanceDetail;
+import com.x.attendance.entity.AttendanceDetail_;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+
+/**
+ * 打卡信息统计服务类,以打卡信息表为基础进行统计
+ * @author liyi
+ */
+public class AttendanceDetailStatisticFactory extends AbstractFactory {
+
+	private static  Logger logger = LoggerFactory.getLogger( AttendanceDetailStatisticFactory.class );
+	
+	public AttendanceDetailStatisticFactory(Business business) throws Exception {
+		super(business);
+	}
+
+	/**
+	 * 根据员工,年月,统计异常打卡次数
+	 * @param employeeNames
+	 * @param cycleYear
+	 * @param cycleMonth
+	 * @return
+	 * @throws Exception
+	 */
+	public Long countAbNormalDutyByEmployeeCycleYearAndMonth(List<String> employeeNames, String cycleYear, String cycleMonth) throws Exception{
+		if( employeeNames == null || employeeNames.size() == 0 ){
+			logger.error( new EmployeeNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		Predicate p = root.get( AttendanceDetail_.empName).in( employeeNames );
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		p = cb.and( p, cb.isTrue( root.get( AttendanceDetail_.isAbnormalDuty) ));
+		if( cycleYear == null || cycleYear.isEmpty() ){
+			logger.error( new CycleYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.cycleYear), cycleYear));
+		}
+		if( cycleMonth == null || cycleMonth.isEmpty() ){
+			logger.error( new CycleMonthEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.cycleMonth), cycleMonth));
+		}
+		//查询总数
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据员工,年月,统计工时不足次数
+	 * @param employeeNames
+	 * @param cycleYear
+	 * @param cycleMonth
+	 * @return
+	 * @throws Exception
+	 */
+	public Long countLackOfTimeByEmployeeCycleYearAndMonth( List<String> employeeNames, String cycleYear, String cycleMonth) throws Exception{
+		if( employeeNames == null || employeeNames.size() == 0 ){
+			logger.error( new EmployeeNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		Predicate p = root.get( AttendanceDetail_.empName).in( employeeNames );
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		p = cb.and( p, cb.isTrue( root.get( AttendanceDetail_.isLackOfTime) ));
+		if( cycleYear == null || cycleYear.isEmpty() ){
+			logger.error( new CycleYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.cycleYear), cycleYear));
+		}
+		if( cycleMonth == null || cycleMonth.isEmpty() ){
+			logger.error( new CycleMonthEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.cycleMonth), cycleMonth));
+		}
+		//查询总数
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据员工,年月,统计早退次数
+	 * @param employeeNames
+	 * @param cycleYear
+	 * @param cycleMonth
+	 * @return
+	 * @throws Exception
+	 */
+	public Long countLeaveEarlierByEmployeeCycleYearAndMonth( List<String> employeeNames, String cycleYear, String cycleMonth) throws Exception{
+		if( employeeNames == null || employeeNames.size() == 0 ){
+			logger.error( new EmployeeNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		Predicate p = root.get( AttendanceDetail_.empName).in( employeeNames );
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		p = cb.and( p, cb.isTrue( root.get( AttendanceDetail_.isLeaveEarlier ) ));
+		if( cycleYear == null || cycleYear.isEmpty() ){
+			logger.error( new CycleYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.cycleYear), cycleYear));
+		}
+		if( cycleMonth == null || cycleMonth.isEmpty() ){
+			logger.error( new CycleMonthEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.cycleMonth), cycleMonth));
+		}
+		//查询总数
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据员工,年月,统计迟到次数
+	 * @param employeeNames
+	 * @param cycleYear
+	 * @param cycleMonth
+	 * @return
+	 * @throws Exception
+	 */
+	public Long countLateByEmployeeCycleYearAndMonth( List<String> employeeNames, String cycleYear, String cycleMonth) throws Exception{
+		if( employeeNames == null || employeeNames.size() == 0 ){
+			logger.error( new EmployeeNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		Predicate p = root.get( AttendanceDetail_.empName).in( employeeNames );
+		p = cb.and( p, cb.isTrue( root.get( AttendanceDetail_.isLate ) ));
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		if( cycleYear == null || cycleYear.isEmpty() ){
+			logger.error( new CycleYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.cycleYear), cycleYear));
+		}
+		if( cycleMonth == null || cycleMonth.isEmpty() ){
+			logger.error( new CycleMonthEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.cycleMonth), cycleMonth));
+		}
+		//查询总数
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据员工,年月,统计签退次数
+	 * @param employeeNames
+	 * @param cycleYear
+	 * @param cycleMonth
+	 * @return
+	 * @throws Exception
+	 */
+	public Long countOffDutyByEmployeeCycleYearAndMonth( List<String> employeeNames, String cycleYear, String cycleMonth) throws Exception{
+		if( employeeNames == null || employeeNames.size() == 0 ){
+			logger.error( new EmployeeNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		Predicate p = cb.isNotNull(root.get( AttendanceDetail_.offDutyTime ));
+		p = cb.and( p, cb.notEqual( root.get( AttendanceDetail_.offDutyTime), ""));
+		p = cb.and( p, root.get( AttendanceDetail_.empName).in( employeeNames ));
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		if( cycleYear == null || cycleYear.isEmpty() ){
+			logger.error( new CycleYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.cycleYear), cycleYear));
+		}
+		if( cycleMonth == null || cycleMonth.isEmpty() ){
+			logger.error( new CycleMonthEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.cycleMonth), cycleMonth));
+		}
+		//查询总数
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据员工,年月,统计签退次数
+	 * @param employeeNames
+	 * @param cycleYear
+	 * @param cycleMonth
+	 * @return
+	 * @throws Exception
+	 */
+	public Long countOnDutyByEmployeeCycleYearAndMonth( List<String> employeeNames, String cycleYear, String cycleMonth) throws Exception{
+		if( employeeNames == null || employeeNames.size() == 0 ){
+			logger.error( new EmployeeNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		Predicate p = cb.isNotNull(root.get( AttendanceDetail_.onDutyTime ));
+		p = cb.and( p, cb.notEqual( root.get( AttendanceDetail_.onDutyTime), ""));
+		p = cb.and( p, root.get( AttendanceDetail_.empName).in( employeeNames ));
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		if( cycleYear == null || cycleYear.isEmpty() ){
+			logger.error( new CycleYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.cycleYear), cycleYear));
+		}
+		if( cycleMonth == null || cycleMonth.isEmpty() ){
+			logger.error( new CycleMonthEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.cycleMonth), cycleMonth));
+		}
+		//查询总数
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据员工,年月,统计请假天数
+	 * @param employeeNames
+	 * @param cycleYear
+	 * @param cycleMonth
+	 * @return
+	 * @throws Exception
+	 */
+	public Double sumOnSelfHolidayDaysByEmployeeYearAndMonth( List<String> employeeNames, String cycleYear, String cycleMonth) throws Exception{
+		if( employeeNames == null || employeeNames.size() == 0 ){
+			logger.error( new EmployeeNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Double> cq = cb.createQuery(Double.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		// 不是周末,或者是周末但是调工作日了
+		Predicate p1 = cb.isFalse(root.get( AttendanceDetail_.isWeekend ));
+		p1 = cb.or( p1, cb.and(cb.isTrue(root.get( AttendanceDetail_.isWeekend )), cb.isTrue(root.get( AttendanceDetail_.isWorkday )) ));
+								
+		Predicate p = root.get( AttendanceDetail_.empName).in( employeeNames );
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		p = cb.and( p, cb.isFalse(root.get( AttendanceDetail_.isHoliday ))); //不是节假日
+		p = cb.and( p, p1 ); //不是周末并且未调休工作晶
+		if( cycleYear == null || cycleYear.isEmpty() ){
+			logger.error( new CycleYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.cycleYear), cycleYear ));
+		}
+		if( cycleMonth == null || cycleMonth.isEmpty() ){
+			logger.error( new CycleMonthEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get(AttendanceDetail_.cycleMonth), cycleMonth ));
+		}
+		
+		//查询总数
+		cq.select( cb.sum( root.get( AttendanceDetail_.getSelfHolidayDays ) ) );	
+				
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	
+	
+	/**
+	 * 根据员工,年月,统计缺勤天数
+	 * @param employeeNames
+	 * @param cycleYear
+	 * @param cycleMonth
+	 * @return
+	 * @throws Exception
+	 */
+	public Double sumAbsenceDaysByEmployeeYearAndMonth( List<String> employeeNames, String cycleYear, String cycleMonth) throws Exception{
+		if( employeeNames == null || employeeNames.size() == 0 ){
+			logger.error( new EmployeeNamesEmptyException() );
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Double> cq = cb.createQuery(Double.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);	
+		Predicate p = root.get(AttendanceDetail_.empName).in( employeeNames );		
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		if( cycleYear == null || cycleYear.isEmpty() ){
+			logger.error( new CycleYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get(AttendanceDetail_.cycleYear), cycleYear));
+		}
+		
+		if( cycleMonth == null || cycleMonth.isEmpty() ){
+			logger.error( new CycleMonthEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get(AttendanceDetail_.cycleMonth), cycleMonth));
+		}
+		//查询总数
+		cq.select( cb.sum( root.get(AttendanceDetail_.absence ) ) );	
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据组织,年月,统计异常打卡次数
+	 * @param unitNames
+	 * @param cycleYear
+	 * @param cycleMonth
+	 * @return
+	 * @throws Exception
+	 */
+	public Long countAbNormalDutyByUnitCycleYearAndMonth(List<String> unitNames, String cycleYear, String cycleMonth) throws Exception{
+		if( unitNames == null || unitNames.size() == 0 ){
+			logger.error( new UnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		Predicate p = root.get( AttendanceDetail_.unitName ).in( unitNames );
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		p = cb.and( p, cb.isTrue( root.get( AttendanceDetail_.isAbnormalDuty) ));
+		if( cycleYear == null || cycleYear.isEmpty() ){
+			logger.error( new CycleYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.cycleYear), cycleYear));
+		}
+		if( cycleMonth == null || cycleMonth.isEmpty() ){
+			logger.error( new CycleMonthEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.cycleMonth), cycleMonth));
+		}
+		//查询总数
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据组织,年月,统计工时不足次数
+	 * @param unitNames
+	 * @param cycleYear
+	 * @param cycleMonth
+	 * @return
+	 * @throws Exception
+	 */
+	public Long countLackOfTimeByUnitCycleYearAndMonth( List<String> unitNames, String cycleYear, String cycleMonth) throws Exception{
+		if( unitNames == null || unitNames.size() == 0 ){
+			logger.error( new UnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		Predicate p = root.get( AttendanceDetail_.unitName ).in( unitNames );
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		p = cb.and( p, cb.isTrue( root.get( AttendanceDetail_.isLackOfTime) ));
+		if( cycleYear == null || cycleYear.isEmpty() ){
+			logger.error( new CycleYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.cycleYear), cycleYear));
+		}
+		if( cycleMonth == null || cycleMonth.isEmpty() ){
+			logger.error( new CycleMonthEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.cycleMonth), cycleMonth));
+		}
+		//查询总数
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据组织,年月,统计早退次数
+	 * @param unitNames
+	 * @param cycleYear
+	 * @param cycleMonth
+	 * @return
+	 * @throws Exception
+	 */
+	public Long countLeaveEarlierByUnitCycleYearAndMonth( List<String> unitNames, String cycleYear, String cycleMonth) throws Exception{
+		if( unitNames == null || unitNames.size() == 0 ){
+			logger.error( new UnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		Predicate p = root.get( AttendanceDetail_.unitName ).in( unitNames );
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		p = cb.and( p, cb.isTrue( root.get( AttendanceDetail_.isLeaveEarlier ) ));
+		if( cycleYear == null || cycleYear.isEmpty() ){
+			logger.error( new CycleYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.cycleYear), cycleYear));
+		}
+		if( cycleMonth == null || cycleMonth.isEmpty() ){
+			logger.error( new CycleMonthEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.cycleMonth), cycleMonth));
+		}
+		//查询总数
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据组织,年月,统计迟到次数
+	 * @param unitNames
+	 * @param cycleYear
+	 * @param cycleMonth
+	 * @return
+	 * @throws Exception
+	 */
+	public Long countLateByUnitCycleYearAndMonth( List<String> unitNames, String cycleYear, String cycleMonth) throws Exception{
+		if( unitNames == null || unitNames.size() == 0 ){
+			logger.error( new UnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		Predicate p = root.get( AttendanceDetail_.unitName ).in( unitNames );
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		p = cb.and( p, cb.isTrue( root.get( AttendanceDetail_.isLate ) ));
+		if( cycleYear == null || cycleYear.isEmpty() ){
+			logger.error( new CycleYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.cycleYear), cycleYear));
+		}
+		if( cycleMonth == null || cycleMonth.isEmpty() ){
+			logger.error( new CycleMonthEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.cycleMonth), cycleMonth));
+		}
+		//查询总数
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据组织,打卡日期,统计异常打卡次数
+	 * @param unitNames
+	 * @param recordDate
+	 * @return
+	 * @throws Exception
+	 */
+	public Long countAbNormalDutyByUnitAndDate(List<String> unitNames, String recordDate ) throws Exception{
+		if( unitNames == null || unitNames.size() == 0 ){
+			logger.error( new UnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		Predicate p = root.get( AttendanceDetail_.unitName ).in( unitNames );
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		p = cb.and( p, cb.isTrue( root.get( AttendanceDetail_.isAbnormalDuty) ));
+		if( recordDate == null || recordDate.isEmpty() ){
+			logger.error( new RecordDateEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordDateString ), recordDate));
+		}
+		//查询总数
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据组织,打卡日期,统计工时不足次数
+	 * @param unitNames
+	 * @param recordDate
+	 * @return
+	 * @throws Exception
+	 */
+	public Long countLackOfTimeByUnitAndDate( List<String> unitNames, String recordDate ) throws Exception{
+		if( unitNames == null || unitNames.size() == 0 ){
+			logger.error( new UnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		Predicate p = root.get( AttendanceDetail_.unitName ).in( unitNames );
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		p = cb.and( p, cb.isTrue( root.get( AttendanceDetail_.isLackOfTime) ));
+		if( recordDate == null || recordDate.isEmpty() ){
+			logger.error( new RecordDateEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordDateString ), recordDate));
+		}
+		//查询总数
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据组织,打卡日期,统计早退次数
+	 * @param unitNames
+	 * @param recordDate
+	 * @return
+	 * @throws Exception
+	 */
+	public Long countLeaveEarlierByUnitAndDate( List<String> unitNames, String recordDate ) throws Exception{
+		if( unitNames == null || unitNames.size() == 0 ){
+			logger.error( new UnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		Predicate p = root.get( AttendanceDetail_.unitName ).in( unitNames );
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		p = cb.and( p, cb.isTrue( root.get( AttendanceDetail_.isLeaveEarlier ) ));
+		if( recordDate == null || recordDate.isEmpty() ){
+			logger.error( new RecordDateEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordDateString ), recordDate));
+		}
+		//查询总数
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据组织,打卡日期,统计迟到次数
+	 * @param unitNames
+	 * @param recordDate
+	 * @return
+	 * @throws Exception
+	 */
+	public Long countLateByUnitAndDate( List<String> unitNames, String recordDate ) throws Exception{
+		if( unitNames == null || unitNames.size() == 0 ){
+			logger.error( new UnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		Predicate p = root.get( AttendanceDetail_.unitName ).in( unitNames );
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		p = cb.and( p, cb.isTrue( root.get( AttendanceDetail_.isLate ) ));
+		if( recordDate == null || recordDate.isEmpty() ){
+			logger.error( new RecordDateEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordDateString ), recordDate));
+		}
+		//查询总数
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据员工,打卡日期,统计缺勤天数
+	 * @param unitNames
+	 * @param recordDate
+	 * @return
+	 * @throws Exception
+	 */
+	public Double sumAbsenceDaysByUnitAndDate( List<String> unitNames, String recordDate ) throws Exception{
+		if( unitNames == null || unitNames.size() == 0 ){
+			logger.error( new UnitNamesEmptyException() );
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Double> cq = cb.createQuery(Double.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);	
+		Predicate p = root.get( AttendanceDetail_.unitName ).in( unitNames );
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		if( recordDate == null || recordDate.isEmpty() ){
+			logger.error( new RecordDateEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordDateString ), recordDate));
+		}
+		//查询总数
+		cq.select( cb.sum( root.get(AttendanceDetail_.absence ) ) );	
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据员工,打卡日期月,统计请假天数
+	 * @param unitNames
+	 * @param recordDate
+	 * @return
+	 * @throws Exception
+	 */
+	public Double sumOnSelfHolidayDaysByUnitAndDate( List<String> unitNames, String recordDate ) throws Exception{
+		if( unitNames == null || unitNames.size() == 0 ){
+			logger.error( new UnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Double> cq = cb.createQuery(Double.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);			
+		Predicate p = root.get( AttendanceDetail_.unitName ).in( unitNames );
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		if( recordDate == null || recordDate.isEmpty() ){
+			logger.error( new RecordDateEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordDateString ), recordDate));
+		}		
+		//查询总数
+		cq.select( cb.sum( root.get( AttendanceDetail_.getSelfHolidayDays ) ) );	
+				
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据组织,打卡日期,统计签退人数
+	 * @param unitNames
+	 * @param recordDate
+	 * @return
+	 * @throws Exception
+	 */
+	public Long countOffDutyByUnitAndDate( List<String> unitNames, String recordDate ) throws Exception{
+		if( unitNames == null || unitNames.size() == 0 ){
+			logger.error( new UnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		Predicate p = cb.isNotNull(root.get( AttendanceDetail_.offDutyTime ));
+		p = cb.and( p, cb.notEqual( root.get( AttendanceDetail_.offDutyTime), ""));
+		p = cb.and( p, root.get( AttendanceDetail_.unitName).in( unitNames ));
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		if( recordDate == null || recordDate.isEmpty() ){
+			logger.error( new CycleYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.unitName), recordDate));
+		}
+		//查询总数
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据组织,打卡日期,统计签到人数
+	 * @param unitNames
+	 * @param recordDate
+	 * @return
+	 * @throws Exception
+	 */
+	public Long countOnDutyByUnitAndDate( List<String> unitNames, String recordDate) throws Exception{
+		if( unitNames == null || unitNames.size() == 0 ){
+			logger.error( new UnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		Predicate p = cb.isNotNull(root.get( AttendanceDetail_.onDutyTime ));
+		p = cb.and( p, cb.notEqual( root.get( AttendanceDetail_.onDutyTime), ""));
+		p = cb.and( p, root.get( AttendanceDetail_.unitName ).in( unitNames ));
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		if( recordDate == null || recordDate.isEmpty() ){
+			logger.error( new CycleYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.unitName), recordDate));
+		}
+		//查询总数
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据顶层组织,打卡日期,统计异常打卡次数
+	 * @param topUnitNames
+	 * @param recordDate
+	 * @return
+	 * @throws Exception
+	 */
+	public Long countAbNormalDutyByTopUnitAndDate(List<String> topUnitNames, String recordDate ) throws Exception{
+		if( topUnitNames == null || topUnitNames.size() == 0 ){
+			logger.error( new TopUnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		Predicate p = root.get( AttendanceDetail_.topUnitName ).in( topUnitNames );
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		p = cb.and( p, cb.isTrue( root.get( AttendanceDetail_.isAbnormalDuty) ));
+		if( recordDate == null || recordDate.isEmpty() ){
+			logger.error( new RecordDateEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordDateString ), recordDate));
+		}
+		//查询总数
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据顶层组织,打卡日期,统计工时不足次数
+	 * @param topUnitNames
+	 * @param recordDate
+	 * @return
+	 * @throws Exception
+	 */
+	public Long countLackOfTimeByTopUnitAndDate( List<String> topUnitNames, String recordDate ) throws Exception{
+		if( topUnitNames == null || topUnitNames.size() == 0 ){
+			logger.error( new TopUnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		Predicate p = root.get( AttendanceDetail_.topUnitName ).in( topUnitNames );
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		p = cb.and( p, cb.isTrue( root.get( AttendanceDetail_.isLackOfTime) ));
+		if( recordDate == null || recordDate.isEmpty() ){
+			logger.error( new RecordDateEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordDateString ), recordDate));
+		}
+		//查询总数
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据顶层组织,打卡日期,统计早退次数
+	 * @param topUnitNames
+	 * @param recordDate
+	 * @return
+	 * @throws Exception
+	 */
+	public Long countLeaveEarlierByTopUnitAndDate( List<String> topUnitNames, String recordDate ) throws Exception{
+		if( topUnitNames == null || topUnitNames.size() == 0 ){
+			logger.error( new TopUnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		Predicate p = root.get( AttendanceDetail_.topUnitName ).in( topUnitNames );
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		p = cb.and( p, cb.isTrue( root.get( AttendanceDetail_.isLeaveEarlier ) ));
+		if( recordDate == null || recordDate.isEmpty() ){
+			logger.error( new RecordDateEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordDateString ), recordDate));
+		}
+		//查询总数
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据顶层组织,打卡日期,统计迟到次数
+	 * @param topUnitNames
+	 * @param recordDate
+	 * @return
+	 * @throws Exception
+	 */
+	public Long countLateByTopUnitAndDate( List<String> topUnitNames, String recordDate ) throws Exception{
+		if( topUnitNames == null || topUnitNames.size() == 0 ){
+			logger.error( new TopUnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		Predicate p = root.get( AttendanceDetail_.topUnitName ).in( topUnitNames );
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		p = cb.and( p, cb.isTrue( root.get( AttendanceDetail_.isLate ) ));
+		if( recordDate == null || recordDate.isEmpty() ){
+			logger.error( new RecordDateEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordDateString ), recordDate));
+		}
+		//查询总数
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据顶层组织,打卡日期,统计缺勤天数
+	 * @param topUnitNames
+	 * @param recordDate
+	 * @return
+	 * @throws Exception
+	 */
+	public Double sumAbsenceDaysByTopUnitAndDate( List<String> topUnitNames, String recordDate ) throws Exception{
+		if( topUnitNames == null || topUnitNames.size() == 0 ){
+			logger.error( new TopUnitNamesEmptyException() );
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Double> cq = cb.createQuery(Double.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);	
+		Predicate p = root.get( AttendanceDetail_.topUnitName ).in( topUnitNames );
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		if( recordDate == null || recordDate.isEmpty() ){
+			logger.error( new RecordDateEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordDateString ), recordDate));
+		}
+		//查询总数
+		cq.select( cb.sum( root.get(AttendanceDetail_.absence ) ) );	
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据顶层组织,打卡日期月,统计请假天数
+	 * @param topUnitNames
+	 * @param recordDate
+	 * @return
+	 * @throws Exception
+	 */
+	public Double sumOnSelfHolidayDaysByTopUnitAndDate( List<String> topUnitNames, String recordDate ) throws Exception{
+		if( topUnitNames == null || topUnitNames.size() == 0 ){
+			logger.error( new TopUnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Double> cq = cb.createQuery(Double.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);			
+		Predicate p = root.get( AttendanceDetail_.topUnitName ).in( topUnitNames );
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		if( recordDate == null || recordDate.isEmpty() ){
+			logger.error( new RecordDateEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordDateString ), recordDate));
+		}		
+		//查询总数
+		cq.select( cb.sum( root.get( AttendanceDetail_.getSelfHolidayDays ) ) );	
+				
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据顶层组织,打卡日期,统计签到人数
+	 * @param topUnitNames
+	 * @param recordDate
+	 * @return
+	 * @throws Exception
+	 */
+	public Long countOffDutyByTopUnitAndDate( List<String> topUnitNames, String recordDate ) throws Exception{
+		if( topUnitNames == null || topUnitNames.size() == 0 ){
+			logger.error( new TopUnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		Predicate p = cb.isNotNull(root.get( AttendanceDetail_.offDutyTime ));
+		p = cb.and( p, cb.notEqual( root.get( AttendanceDetail_.offDutyTime), ""));
+		p = cb.and( p, root.get( AttendanceDetail_.topUnitName ).in( topUnitNames ));
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		if( recordDate == null || recordDate.isEmpty() ){
+			logger.error( new RecordDateEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordDateString), recordDate));
+		}
+		//查询总数
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据顶层组织,打卡日期,统计签到人数
+	 * @param topUnitNames
+	 * @param recordDate
+	 * @return
+	 * @throws Exception
+	 */
+	public Long countOnDutyByTopUnitAndDate( List<String> topUnitNames, String recordDate ) throws Exception{
+		if( topUnitNames == null || topUnitNames.size() == 0 ){
+			logger.error( new TopUnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+		Predicate p = cb.isNotNull(root.get( AttendanceDetail_.onDutyTime ));
+		p = cb.and( p, cb.notEqual( root.get( AttendanceDetail_.onDutyTime), ""));
+		p = cb.and( p, root.get( AttendanceDetail_.topUnitName).in( topUnitNames ));
+		p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordStatus ), 1));
+		if( recordDate == null || recordDate.isEmpty() ){
+			logger.error( new RecordDateEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( AttendanceDetail_.recordDateString), recordDate));
+		}
+		//查询总数
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+}

+ 68 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceEmployeeConfigFactory.java

@@ -0,0 +1,68 @@
+package com.x.attendance.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import com.x.attendance.assemble.control.AbstractFactory;
+import com.x.attendance.assemble.control.Business;
+import com.x.attendance.entity.AttendanceEmployeeConfig;
+import com.x.attendance.entity.AttendanceEmployeeConfig_;
+import com.x.base.core.project.exception.ExceptionWhen;
+/**
+ * 员工考勤需求配置服务器
+ * @author liyi
+ */
+public class AttendanceEmployeeConfigFactory extends AbstractFactory {
+	
+	public AttendanceEmployeeConfigFactory(Business business) throws Exception {
+		super(business);
+	}
+
+//	@MethodDescribe("获取指定Id的AttendanceEmployeeConfig信息对象")
+	public AttendanceEmployeeConfig get( String id ) throws Exception {
+		return this.entityManagerContainer().find(id, AttendanceEmployeeConfig.class, ExceptionWhen.none);
+	}
+	
+	//@MethodDescribe("列示全部的AttendanceEmployeeConfig信息列表")
+	@SuppressWarnings("unused")
+	public List<AttendanceEmployeeConfig> listAll() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(AttendanceEmployeeConfig.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceEmployeeConfig> cq = cb.createQuery(AttendanceEmployeeConfig.class);
+		Root<AttendanceEmployeeConfig> root = cq.from( AttendanceEmployeeConfig.class);
+		return em.createQuery(cq).getResultList();
+	}
+	
+	//@MethodDescribe("列示指定Id的AttendanceEmployeeConfig信息列表")
+	public List<AttendanceEmployeeConfig> list(List<String> ids) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<AttendanceEmployeeConfig>();
+		}
+		EntityManager em = this.entityManagerContainer().get(AttendanceEmployeeConfig.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceEmployeeConfig> cq = cb.createQuery(AttendanceEmployeeConfig.class);
+		Root<AttendanceEmployeeConfig> root = cq.from(AttendanceEmployeeConfig.class);
+		Predicate p = root.get(AttendanceEmployeeConfig_.id).in(ids);
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe("根据配置类别列示AttendanceEmployeeConfig信息列表")
+	public List<String> listByConfigType( String configType ) throws Exception {
+		if( configType == null || configType.isEmpty()){
+			return new ArrayList<String>();
+		}
+		EntityManager em = this.entityManagerContainer().get(AttendanceEmployeeConfig.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceEmployeeConfig> root = cq.from(AttendanceEmployeeConfig.class);
+		Predicate p = cb.equal(root.get(AttendanceEmployeeConfig_.configType), configType);	
+		cq.select(root.get(AttendanceEmployeeConfig_.id));
+		return em.createQuery(cq.where(p)).getResultList();
+	}	
+}

+ 54 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceImportFileInfoFactory.java

@@ -0,0 +1,54 @@
+package com.x.attendance.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import com.x.attendance.assemble.control.AbstractFactory;
+import com.x.attendance.assemble.control.Business;
+import com.x.attendance.entity.AttendanceImportFileInfo;
+import com.x.attendance.entity.AttendanceImportFileInfo_;
+import com.x.base.core.project.exception.ExceptionWhen;
+/**
+ * 系统配置信息表基础功能服务类
+ * @author liyi
+ */
+public class AttendanceImportFileInfoFactory extends AbstractFactory {
+	
+	public AttendanceImportFileInfoFactory(Business business) throws Exception {
+		super(business);
+	}
+
+	//@MethodDescribe("获取指定Id的AttendanceImportFileInfo应用信息对象")
+	public AttendanceImportFileInfo get( String id ) throws Exception {
+		return this.entityManagerContainer().find(id, AttendanceImportFileInfo.class, ExceptionWhen.none);
+	}
+	
+	//@MethodDescribe("列示全部的AttendanceImportFileInfo应用信息列表")
+	@SuppressWarnings("unused")
+	public List<AttendanceImportFileInfo> listAll() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(AttendanceImportFileInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceImportFileInfo> cq = cb.createQuery(AttendanceImportFileInfo.class);
+		Root<AttendanceImportFileInfo> root = cq.from( AttendanceImportFileInfo.class);
+		return em.createQuery(cq).getResultList();
+	}
+	
+//	@MethodDescribe("列示指定Id的AttendanceImportFileInfo应用信息列表")
+	public List<AttendanceImportFileInfo> list(List<String> ids) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<AttendanceImportFileInfo>();
+		}
+		EntityManager em = this.entityManagerContainer().get(AttendanceImportFileInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceImportFileInfo> cq = cb.createQuery(AttendanceImportFileInfo.class);
+		Root<AttendanceImportFileInfo> root = cq.from(AttendanceImportFileInfo.class);
+		Predicate p = root.get(AttendanceImportFileInfo_.id).in(ids);
+		return em.createQuery(cq.where(p)).getResultList();
+	}	
+}

+ 98 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceScheduleSettingFactory.java

@@ -0,0 +1,98 @@
+package com.x.attendance.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import com.x.attendance.assemble.control.AbstractFactory;
+import com.x.attendance.assemble.control.Business;
+import com.x.attendance.entity.AttendanceScheduleSetting;
+import com.x.attendance.entity.AttendanceScheduleSetting_;
+import com.x.base.core.project.exception.ExceptionWhen;
+/**
+ * 系统配置信息表基础功能服务类
+ * @author liyi
+ */
+public class AttendanceScheduleSettingFactory extends AbstractFactory {
+	
+	public AttendanceScheduleSettingFactory(Business business) throws Exception {
+		super(business);
+	}
+
+	//@MethodDescribe("获取指定Id的AttendanceScheduleSetting应用信息对象")
+	public AttendanceScheduleSetting get( String id ) throws Exception {
+		return this.entityManagerContainer().find(id, AttendanceScheduleSetting.class, ExceptionWhen.none);
+	}
+	
+//	@MethodDescribe("列示全部的AttendanceScheduleSetting应用信息列表")
+	@SuppressWarnings("unused")
+	public List<AttendanceScheduleSetting> listAll() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(AttendanceScheduleSetting.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceScheduleSetting> cq = cb.createQuery(AttendanceScheduleSetting.class);
+		Root<AttendanceScheduleSetting> root = cq.from( AttendanceScheduleSetting.class);
+		return em.createQuery(cq).getResultList();
+	}
+	
+	//@MethodDescribe("列示指定Id的AttendanceScheduleSetting应用信息列表")
+	public List<AttendanceScheduleSetting> list(List<String> ids) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<AttendanceScheduleSetting>();
+		}
+		EntityManager em = this.entityManagerContainer().get(AttendanceScheduleSetting.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceScheduleSetting> cq = cb.createQuery(AttendanceScheduleSetting.class);
+		Root<AttendanceScheduleSetting> root = cq.from(AttendanceScheduleSetting.class);
+		Predicate p = root.get(AttendanceScheduleSetting_.id).in(ids);
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe("根据组织名称,查询组织排班信息对象")
+	public List<String> listByUnitName( String unitName ) throws Exception{		
+		EntityManager em = this.entityManagerContainer().get(AttendanceScheduleSetting.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceScheduleSetting> root = cq.from(AttendanceScheduleSetting.class);
+		Predicate p = cb.equal(root.get(AttendanceScheduleSetting_.unitName), unitName );
+		cq.select(root.get(AttendanceScheduleSetting_.id));
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe("根据组织名称,查询组织排班信息对象")
+	public List<String> listByUnitNames( List<String> unitNameList ) throws Exception{		
+		EntityManager em = this.entityManagerContainer().get(AttendanceScheduleSetting.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceScheduleSetting> root = cq.from(AttendanceScheduleSetting.class);
+		Predicate p = root.get(AttendanceScheduleSetting_.unitName).in(unitNameList);
+		cq.select(root.get(AttendanceScheduleSetting_.id));
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe("根据顶层组织名称,查询顶层组织排班信息对象")
+	public List<String> listByTopUnitName( String topUnitName ) throws Exception{		
+		EntityManager em = this.entityManagerContainer().get(AttendanceScheduleSetting.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceScheduleSetting> root = cq.from(AttendanceScheduleSetting.class);
+		Predicate p = cb.equal(root.get(AttendanceScheduleSetting_.topUnitName), topUnitName );
+		cq.select(root.get(AttendanceScheduleSetting_.id));
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+
+	public List<String> listByUnitName( String unitName, String topUnitName ) throws Exception {
+		EntityManager em = this.entityManagerContainer().get(AttendanceScheduleSetting.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceScheduleSetting> root = cq.from(AttendanceScheduleSetting.class);
+		Predicate p = cb.equal(root.get(AttendanceScheduleSetting_.topUnitName), topUnitName );
+		p = cb.and( p, cb.equal(root.get(AttendanceScheduleSetting_.unitName), unitName ) );
+		cq.select(root.get(AttendanceScheduleSetting_.id));
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+}

+ 275 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceSelfHolidayFactory.java

@@ -0,0 +1,275 @@
+package com.x.attendance.assemble.control.factory;
+
+import com.x.attendance.assemble.control.AbstractFactory;
+import com.x.attendance.assemble.control.Business;
+import com.x.attendance.assemble.control.jaxrs.selfholiday.WrapInFilter;
+import com.x.attendance.entity.AttendanceSelfHoliday;
+import com.x.attendance.entity.AttendanceSelfHoliday_;
+import com.x.base.core.project.exception.ExceptionWhen;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+/**
+ * 系统配置信息表基础功能服务类
+ * @author liyi
+ */
+public class AttendanceSelfHolidayFactory extends AbstractFactory {
+	
+	public AttendanceSelfHolidayFactory(Business business) throws Exception {
+		super(business);
+	}
+
+	//@MethodDescribe("获取指定Id的AttendanceSelfHoliday信息对象")
+	public AttendanceSelfHoliday get( String id ) throws Exception {
+		return this.entityManagerContainer().find(id, AttendanceSelfHoliday.class, ExceptionWhen.none);
+	}
+	
+//@MethodDescribe("列示全部的AttendanceSelfHoliday信息列表")
+	public List<String> listAll() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(AttendanceSelfHoliday.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceSelfHoliday> root = cq.from( AttendanceSelfHoliday.class);
+		cq.select(root.get(AttendanceSelfHoliday_.id));
+		return em.createQuery(cq).getResultList();
+	}
+	
+//	@MethodDescribe("列示指定Id的AttendanceSelfHoliday信息列表")
+	public List<AttendanceSelfHoliday> list(List<String> ids) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<AttendanceSelfHoliday>();
+		}
+		EntityManager em = this.entityManagerContainer().get(AttendanceSelfHoliday.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceSelfHoliday> cq = cb.createQuery(AttendanceSelfHoliday.class);
+		Root<AttendanceSelfHoliday> root = cq.from(AttendanceSelfHoliday.class);
+		Predicate p = root.get(AttendanceSelfHoliday_.id).in(ids);
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+
+	public List<AttendanceSelfHoliday> listWithBatchFlag( String batchFlag ) throws Exception {
+		if( StringUtils.isEmpty( batchFlag )){
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get(AttendanceSelfHoliday.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceSelfHoliday> cq = cb.createQuery(AttendanceSelfHoliday.class);
+		Root<AttendanceSelfHoliday> root = cq.from(AttendanceSelfHoliday.class);
+		Predicate p = cb.equal( root.get(AttendanceSelfHoliday_.batchFlag), batchFlag );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+
+	//@MethodDescribe("列示单个员工的AttendanceSelfHoliday信息列表")
+	public List<String> getByEmployeeName(String empName) throws Exception {
+		EntityManager em = this.entityManagerContainer().get(AttendanceSelfHoliday.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceSelfHoliday> root = cq.from( AttendanceSelfHoliday.class);
+		Predicate p = root.get(AttendanceSelfHoliday_.employeeName).in( empName );
+		cq.select(root.get(AttendanceSelfHoliday_.id));
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe("根据流程的文档ID列示员工的AttendanceSelfHoliday信息列表")
+	public List<String> getByWorkFlowDocId(String docId) throws Exception {
+		EntityManager em = this.entityManagerContainer().get(AttendanceSelfHoliday.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceSelfHoliday> root = cq.from( AttendanceSelfHoliday.class);
+		Predicate p = cb.equal(root.get(AttendanceSelfHoliday_.docId), docId);
+		cq.select(root.get(AttendanceSelfHoliday_.id));
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+
+	public List<String> listByStartDateAndEndDate(Date startDate, Date endDate) throws Exception {
+		EntityManager em = this.entityManagerContainer().get(AttendanceSelfHoliday.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceSelfHoliday> root = cq.from( AttendanceSelfHoliday.class);
+		Predicate p = cb.between(root.get(AttendanceSelfHoliday_.startTime), startDate, endDate);
+		p = cb.and( p, cb.between(root.get(AttendanceSelfHoliday_.endTime), startDate, endDate));
+		cq.select(root.get(AttendanceSelfHoliday_.id));
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	/**
+	 * 查询下一页的信息数据
+	 * @param id
+	 * @param count
+	 * @param sequence
+	 * @param wrapIn
+	 * @return
+	 * @throws Exception
+	 */
+	@SuppressWarnings("unchecked")
+	public List<AttendanceSelfHoliday> listIdsNextWithFilter( String id, Integer count, Object sequence, WrapInFilter wrapIn ) throws Exception {
+		//先获取上一页最后一条的sequence值,如果有值的话,以此sequence值作为依据取后续的count条数据
+		EntityManager em = this.entityManagerContainer().get( AttendanceSelfHoliday.class );
+		String order = wrapIn.getOrder();//排序方式
+		List<Object> vs = new ArrayList<>();
+		StringBuffer sql_stringBuffer = new StringBuffer();
+		
+		if( order == null || order.isEmpty() ){
+			order = "DESC";
+		}
+		
+		Integer index = 1;
+		sql_stringBuffer.append( "SELECT o FROM "+AttendanceSelfHoliday.class.getCanonicalName()+" o where 1=1" );
+
+		if ((null != sequence) ) {
+			sql_stringBuffer.append(" and o.sequence " + (StringUtils.equalsIgnoreCase(order, "DESC") ? "<" : ">") + (" ?" + (index)));
+			vs.add(sequence);
+			index++;
+		}
+		if ((null != wrapIn.getQ_empName()) && (!wrapIn.getQ_empName().isEmpty())) {
+			sql_stringBuffer.append(" and o.employeeName = ?" + (index));
+			vs.add( wrapIn.getQ_empName() );
+			index++;
+		}
+		if (null != wrapIn.getUnitNames() && wrapIn.getUnitNames().size()>0) {
+			sql_stringBuffer.append(" and o.unitName in ( ?" + (index) + ")");
+			vs.add( wrapIn.getUnitNames() );
+			index++;
+		}
+		if (null != wrapIn.getTopUnitNames() && wrapIn.getTopUnitNames().size() > 0 ) {
+			sql_stringBuffer.append(" and o.topUnitName in ( ?" + (index) + ")");
+			vs.add( wrapIn.getTopUnitNames() );
+			index++;
+		}
+		
+		if( StringUtils.isNotEmpty( wrapIn.getKey() )){
+			sql_stringBuffer.append(" order by o."+wrapIn.getKey()+" " + order );
+		}else{
+			sql_stringBuffer.append(" order by o.sequence " + order );
+		}
+		
+		Query query = em.createQuery( sql_stringBuffer.toString(), AttendanceSelfHoliday.class );
+		//为查询设置所有的参数值
+		for (int i = 0; i < vs.size(); i++) {
+			query.setParameter(i + 1, vs.get(i));
+		}
+		return query.setMaxResults(count).getResultList();
+	}	
+	
+	/**
+	 * 查询上一页的文档信息数据
+	 * @param id
+	 * @param count
+	 * @param sequence
+	 * @param wrapIn
+	 * @return
+	 * @throws Exception
+	 */
+	@SuppressWarnings("unchecked")
+	public List<AttendanceSelfHoliday> listIdsPrevWithFilter( String id, Integer count, Object sequence, WrapInFilter wrapIn ) throws Exception {
+		//先获取上一页最后一条的sequence值,如果有值的话,以此sequence值作为依据取后续的count条数据
+		EntityManager em = this.entityManagerContainer().get( AttendanceSelfHoliday.class );
+		String order = wrapIn.getOrder();//排序方式
+		List<Object> vs = new ArrayList<>();
+		StringBuffer sql_stringBuffer = new StringBuffer();
+		Integer index = 1;
+		
+		if( order == null || order.isEmpty() ){
+			order = "DESC";
+		}
+		
+		sql_stringBuffer.append( "SELECT o FROM "+AttendanceSelfHoliday.class.getCanonicalName()+" o where 1=1" );
+		if ((null != sequence) ) {
+			sql_stringBuffer.append(" and o.sequence " + (StringUtils.equalsIgnoreCase(order, "DESC") ? ">" : "<") + (" ?" + (index)));
+			vs.add(sequence);
+			index++;
+		}
+		if ((null != wrapIn.getQ_empName()) && (!wrapIn.getQ_empName().isEmpty())) {
+			sql_stringBuffer.append(" and o.employeeName = ?" + (index));
+			vs.add( wrapIn.getQ_empName() );
+			index++;
+		}
+		if (null != wrapIn.getUnitNames() && wrapIn.getUnitNames().size()>0) {
+			sql_stringBuffer.append(" and o.unitName in ( ?" + (index) + ")");
+			vs.add( wrapIn.getUnitNames() );
+			index++;
+		}
+		if (null != wrapIn.getTopUnitNames() && wrapIn.getTopUnitNames().size() > 0 ) {
+			sql_stringBuffer.append(" and o.topUnitName in ( ?" + (index) + ")");
+			vs.add( wrapIn.getTopUnitNames() );
+			index++;
+		}
+		
+		if( StringUtils.isNotEmpty( wrapIn.getKey() )){
+			sql_stringBuffer.append(" order by o."+wrapIn.getKey()+" " + order );
+		}else{
+			sql_stringBuffer.append(" order by o.sequence " + order );
+		}
+		
+		Query query = em.createQuery( sql_stringBuffer.toString(), AttendanceSelfHoliday.class );
+		//为查询设置所有的参数值
+		for (int i = 0; i < vs.size(); i++) {
+			query.setParameter(i + 1, vs.get(i));
+		}
+		
+		return query.setMaxResults(20).getResultList();
+	}
+	
+	/**
+	 * 查询符合的文档信息总数
+	 * @param id
+	 * @param count
+	 * @param sequence
+	 * @param wrapIn
+	 * @return
+	 * @throws Exception
+	 */
+	public long getCountWithFilter( WrapInFilter wrapIn ) throws Exception {
+		//先获取上一页最后一条的sequence值,如果有值的话,以此sequence值作为依据取后续的count条数据
+		EntityManager em = this.entityManagerContainer().get( AttendanceSelfHoliday.class );
+		List<Object> vs = new ArrayList<>();
+		StringBuffer sql_stringBuffer = new StringBuffer();
+		Integer index = 1;
+		
+		sql_stringBuffer.append( "SELECT count(o.id) FROM "+AttendanceSelfHoliday.class.getCanonicalName()+" o where 1=1" );
+		
+		if ((null != wrapIn.getQ_empName()) && (!wrapIn.getQ_empName().isEmpty())) {
+			sql_stringBuffer.append(" and o.employeeName = ?" + (index));
+			vs.add( wrapIn.getQ_empName() );
+			index++;
+		}
+		if (null != wrapIn.getUnitNames() && wrapIn.getUnitNames().size()>0) {
+			sql_stringBuffer.append(" and o.unitName in ( ?" + (index) + ")");
+			vs.add( wrapIn.getUnitNames() );
+			index++;
+		}
+		if (null != wrapIn.getTopUnitNames() && wrapIn.getTopUnitNames().size() > 0 ) {
+			sql_stringBuffer.append(" and o.topUnitName in ( ?" + (index) + ")");
+			vs.add( wrapIn.getTopUnitNames() );
+			index++;
+		}
+		
+		Query query = em.createQuery( sql_stringBuffer.toString(), AttendanceSelfHoliday.class );
+		//为查询设置所有的参数值
+		for (int i = 0; i < vs.size(); i++) {
+			query.setParameter(i + 1, vs.get(i));
+		}		
+		return (Long) query.getSingleResult();
+	}
+
+	public List<String> getByPersonName(String personName) throws Exception {
+		if( personName == null || personName.isEmpty() ) {
+			throw new Exception("personName is null.");
+		}
+		EntityManager em = this.entityManagerContainer().get(AttendanceSelfHoliday.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceSelfHoliday> root = cq.from( AttendanceSelfHoliday.class);
+		Predicate p = cb.equal(root.get(AttendanceSelfHoliday_.employeeName ), personName );
+		cq.select(root.get(AttendanceSelfHoliday_.id));
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+}

+ 86 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceSettingFactory.java

@@ -0,0 +1,86 @@
+package com.x.attendance.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import com.x.attendance.assemble.control.AbstractFactory;
+import com.x.attendance.assemble.control.Business;
+import com.x.attendance.entity.AttendanceSetting;
+import com.x.attendance.entity.AttendanceSetting_;
+import com.x.base.core.project.exception.ExceptionWhen;
+/**
+ * 系统配置信息表基础功能服务类
+ * @author liyi
+ */
+public class AttendanceSettingFactory extends AbstractFactory {
+	
+	public AttendanceSettingFactory(Business business) throws Exception {
+		super(business);
+	}
+
+	//@MethodDescribe("获取指定Id的AttendanceSetting应用信息对象")
+	public AttendanceSetting get( String id ) throws Exception {
+		return this.entityManagerContainer().find(id, AttendanceSetting.class, ExceptionWhen.none);
+	}
+	
+	//@MethodDescribe("列示全部的AttendanceSetting应用信息列表")
+	@SuppressWarnings("unused")
+	public List<AttendanceSetting> listAll() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(AttendanceSetting.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceSetting> cq = cb.createQuery(AttendanceSetting.class);
+		Root<AttendanceSetting> root = cq.from( AttendanceSetting.class);
+		return em.createQuery(cq).getResultList();
+	}
+	
+	//@MethodDescribe("列示指定Id的AttendanceSetting应用信息列表")
+	public List<AttendanceSetting> list(List<String> ids) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<AttendanceSetting>();
+		}
+		EntityManager em = this.entityManagerContainer().get(AttendanceSetting.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceSetting> cq = cb.createQuery(AttendanceSetting.class);
+		Root<AttendanceSetting> root = cq.from(AttendanceSetting.class);
+		Predicate p = root.get(AttendanceSetting_.id).in(ids);
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe("根据CODE列示指定Id的AttendanceSetting应用信息列表")
+	public List<String> listIdsByCode(String code) throws Exception {
+		if( code == null || code.isEmpty() ){
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get(AttendanceSetting.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceSetting> root = cq.from(AttendanceSetting.class);
+		Predicate p = cb.equal(root.get(AttendanceSetting_.configCode),  code);
+		cq.select(root.get(AttendanceSetting_.id));
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+
+	public AttendanceSetting getWithConfigCode(String configCode) throws Exception {
+		if( configCode == null || configCode.isEmpty() ){
+			return null;
+		}
+		AttendanceSetting attendanceSetting = null;
+		List<AttendanceSetting> settingList = null;
+		EntityManager em = this.entityManagerContainer().get(AttendanceSetting.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceSetting> cq = cb.createQuery(AttendanceSetting.class);
+		Root<AttendanceSetting> root = cq.from(AttendanceSetting.class);
+		Predicate p = cb.equal(root.get( AttendanceSetting_.configCode ),  configCode );
+		settingList = em.createQuery(cq.where(p)).getResultList();
+		if( settingList != null && settingList.size() > 0 ){
+			attendanceSetting = settingList.get(0);
+		}
+		return attendanceSetting;
+	}
+}

+ 125 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceStatisticRequireLogFactory.java

@@ -0,0 +1,125 @@
+package com.x.attendance.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.x.attendance.assemble.control.AbstractFactory;
+import com.x.attendance.assemble.control.Business;
+import com.x.attendance.entity.AttendanceStatisticRequireLog;
+import com.x.attendance.entity.AttendanceStatisticRequireLog_;
+import com.x.base.core.project.exception.ExceptionWhen;
+/**
+ * 员工考勤需求配置服务器
+ * @author liyi
+ */
+public class AttendanceStatisticRequireLogFactory extends AbstractFactory {
+	
+	public AttendanceStatisticRequireLogFactory(Business business) throws Exception {
+		super(business);
+	}
+
+	//@MethodDescribe("获取指定Id的AttendanceStatisticRequireLog信息对象")
+	public AttendanceStatisticRequireLog get( String id ) throws Exception {
+		return this.entityManagerContainer().find(id, AttendanceStatisticRequireLog.class, ExceptionWhen.none);
+	}
+	
+//	@MethodDescribe("列示全部的AttendanceStatisticRequireLog信息列表")
+	@SuppressWarnings("unused")
+	public List<AttendanceStatisticRequireLog> listAll() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(AttendanceStatisticRequireLog.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceStatisticRequireLog> cq = cb.createQuery(AttendanceStatisticRequireLog.class);
+		Root<AttendanceStatisticRequireLog> root = cq.from( AttendanceStatisticRequireLog.class);
+		return em.createQuery(cq).getResultList();
+	}
+	
+	//@MethodDescribe("列示指定Id的AttendanceStatisticRequireLog信息列表")
+	public List<AttendanceStatisticRequireLog> list(List<String> ids) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<AttendanceStatisticRequireLog>();
+		}
+		EntityManager em = this.entityManagerContainer().get(AttendanceStatisticRequireLog.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceStatisticRequireLog> cq = cb.createQuery(AttendanceStatisticRequireLog.class);
+		Root<AttendanceStatisticRequireLog> root = cq.from(AttendanceStatisticRequireLog.class);
+		Predicate p = root.get(AttendanceStatisticRequireLog_.id).in(ids);
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe("根据统计名称,统计Key,处理状态,列示AttendanceStatisticRequireLog信息列表")
+	public List<AttendanceStatisticRequireLog> getByNameKeyAndStatus( String name, String key, String stauts ) throws Exception {
+		EntityManager em = this.entityManagerContainer().get(AttendanceStatisticRequireLog.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceStatisticRequireLog> cq = cb.createQuery(AttendanceStatisticRequireLog.class);
+		Root<AttendanceStatisticRequireLog> root = cq.from(AttendanceStatisticRequireLog.class);
+		Predicate p = root.get(AttendanceStatisticRequireLog_.id).isNotNull();
+		if( StringUtils.isNotEmpty( name ) ){
+			p = cb.and(p, cb.equal(root.get(AttendanceStatisticRequireLog_.statisticName), name));
+		}
+		if( StringUtils.isNotEmpty( key ) ){
+			p = cb.and(p,  cb.equal(root.get(AttendanceStatisticRequireLog_.statisticKey), key));
+		}
+		if( StringUtils.isNotEmpty( stauts ) ){
+			p = cb.and(p, cb.equal(root.get(AttendanceStatisticRequireLog_.processStatus), stauts));
+		}
+		return em.createQuery( cq.where(p) ).getResultList();
+	}
+
+	public List<AttendanceStatisticRequireLog> getByNameKeyAndStatus(String statisticType, String key, String statisticYear, String statisticMonth, String statisticDate, String status) throws Exception {
+		EntityManager em = this.entityManagerContainer().get(AttendanceStatisticRequireLog.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceStatisticRequireLog> cq = cb.createQuery(AttendanceStatisticRequireLog.class);
+		Root<AttendanceStatisticRequireLog> root = cq.from(AttendanceStatisticRequireLog.class);
+		Predicate p = root.get(AttendanceStatisticRequireLog_.id).isNotNull();
+		if( StringUtils.isNotEmpty( statisticType ) ){
+			p = cb.and(p, cb.equal(root.get(AttendanceStatisticRequireLog_.statisticType), statisticType));
+		}
+		if( StringUtils.isNotEmpty( key ) ){
+			p = cb.and(p, cb.equal(root.get(AttendanceStatisticRequireLog_.statisticKey), key));
+		}
+		if( StringUtils.isNotEmpty( statisticYear ) ){
+			p = cb.and(p, cb.equal(root.get(AttendanceStatisticRequireLog_.statisticYear), statisticYear));
+		}
+		if( StringUtils.isNotEmpty( statisticMonth ) ){
+			p = cb.and(p, cb.equal(root.get(AttendanceStatisticRequireLog_.statisticMonth), statisticMonth));
+		}
+		if( StringUtils.isNotEmpty( statisticDate ) ){
+			p = cb.and(p, cb.equal(root.get(AttendanceStatisticRequireLog_.statisticDay), statisticDate));
+		}
+		if( StringUtils.isNotEmpty( status ) ){
+			p = cb.and(p, cb.equal(root.get(AttendanceStatisticRequireLog_.processStatus), status));
+		}
+		return em.createQuery( cq.where(p) ).getResultList();
+	}
+
+	/**
+	 * 根据统计的类型以及处理状态获取所有符合条件的统计需求对象列表
+	 * 
+	 * @param statisticType:PERSON_PER_MONTH|UNIT_PER_MONTH|TOPUNIT_PER_MONTH|UNIT_PER_DAY|TOPUNIT_PER_DAY
+	 * @param processStatus:WAITING|PROCESSING|COMPLETE|ERROR
+	 * @return
+	 * @throws Exception
+	 */
+	public List<AttendanceStatisticRequireLog> listByStatisticTypeAndStatus( String statisticType, String processStatus) throws Exception {
+		EntityManager em = this.entityManagerContainer().get(AttendanceStatisticRequireLog.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceStatisticRequireLog> cq = cb.createQuery(AttendanceStatisticRequireLog.class);
+		Root<AttendanceStatisticRequireLog> root = cq.from(AttendanceStatisticRequireLog.class);
+		Predicate p = root.get(AttendanceStatisticRequireLog_.id).isNotNull();
+		if( StringUtils.isNotEmpty( statisticType ) ){
+			p = cb.and(p, cb.equal(root.get(AttendanceStatisticRequireLog_.statisticType), statisticType));
+		}
+		if( StringUtils.isNotEmpty( processStatus ) ){
+			p = cb.and(p, cb.equal(root.get(AttendanceStatisticRequireLog_.processStatus), processStatus));
+		}
+		return em.createQuery( cq.where(p) ).getResultList();
+	}
+}

+ 74 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceStatisticalCycleFactory.java

@@ -0,0 +1,74 @@
+package com.x.attendance.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import com.x.attendance.assemble.control.AbstractFactory;
+import com.x.attendance.assemble.control.Business;
+import com.x.attendance.entity.AttendanceStatisticalCycle;
+import com.x.attendance.entity.AttendanceStatisticalCycle_;
+import com.x.base.core.project.exception.ExceptionWhen;
+/**
+ * 系统配置信息表基础功能服务类
+ * @author liyi
+ */
+public class AttendanceStatisticalCycleFactory extends AbstractFactory {
+	
+	public AttendanceStatisticalCycleFactory(Business business) throws Exception {
+		super(business);
+	}
+
+	//@MethodDescribe("获取指定Id的AttendanceStatisticalCycle信息对象")
+	public AttendanceStatisticalCycle get( String id ) throws Exception {
+		return this.entityManagerContainer().find(id, AttendanceStatisticalCycle.class, ExceptionWhen.none);
+	}
+	
+	//@MethodDescribe("列示全部的AttendanceStatisticalCycle信息列表")
+	@SuppressWarnings("unused")
+	public List<AttendanceStatisticalCycle> listAll() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(AttendanceStatisticalCycle.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceStatisticalCycle> cq = cb.createQuery( AttendanceStatisticalCycle.class );
+		Root<AttendanceStatisticalCycle> root = cq.from( AttendanceStatisticalCycle.class);
+		return em.createQuery(cq).getResultList();
+	}
+	
+	//@MethodDescribe("列示指定Id的AttendanceStatisticalCycle信息列表")
+	public List<AttendanceStatisticalCycle> list(List<String> ids) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<AttendanceStatisticalCycle>();
+		}
+		EntityManager em = this.entityManagerContainer().get(AttendanceStatisticalCycle.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceStatisticalCycle> cq = cb.createQuery(AttendanceStatisticalCycle.class);
+		Root<AttendanceStatisticalCycle> root = cq.from(AttendanceStatisticalCycle.class);
+		Predicate p = root.get(AttendanceStatisticalCycle_.id).in(ids);
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe("根据参数列示AttendanceStatisticalCycle信息列表")
+	public List<String> listByParameter( String topUnitName, String organizatinName, String cycleYear, String cycleMonth ) throws Exception{
+		EntityManager em = this.entityManagerContainer().get(AttendanceStatisticalCycle.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceStatisticalCycle> root = cq.from(AttendanceStatisticalCycle.class);
+		Predicate p = cb.equal( root.get( AttendanceStatisticalCycle_.cycleYear), cycleYear);		
+		if( topUnitName != null ){ 
+			 p = cb.and( p, cb.equal( root.get( AttendanceStatisticalCycle_.topUnitName), topUnitName));
+		}
+		if( organizatinName != null ){ 
+			 p = cb.and( p, cb.equal( root.get( AttendanceStatisticalCycle_.unitName), organizatinName));
+		}
+		if( cycleMonth != null ){ 
+			 p = cb.and( p, cb.equal( root.get( AttendanceStatisticalCycle_.cycleMonth), cycleMonth));
+		}
+		cq.select(root.get(AttendanceStatisticalCycle_.id));
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+}

+ 218 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceWorkDayConfigFactory.java

@@ -0,0 +1,218 @@
+package com.x.attendance.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import com.x.attendance.assemble.common.date.DateOperation;
+import com.x.attendance.assemble.control.AbstractFactory;
+import com.x.attendance.assemble.control.Business;
+import com.x.attendance.entity.AttendanceWorkDayConfig;
+import com.x.attendance.entity.AttendanceWorkDayConfig_;
+import com.x.base.core.project.exception.ExceptionWhen;
+
+/**
+ * 系统配置信息表基础功能服务类
+ * @author liyi
+ */
+public class AttendanceWorkDayConfigFactory extends AbstractFactory {
+
+	private DateOperation dateOperation = new DateOperation();
+	
+	public AttendanceWorkDayConfigFactory(Business business) throws Exception {
+		super(business);
+	}
+
+	//@MethodDescribe("获取指定Id的AttendanceWorkDayConfig信息对象")
+	public AttendanceWorkDayConfig get( String id ) throws Exception {
+		return this.entityManagerContainer().find(id, AttendanceWorkDayConfig.class, ExceptionWhen.none);
+	}
+	
+//	@MethodDescribe("列示全部的AttendanceWorkDayConfig信息列表")
+	@SuppressWarnings("unused")
+	public List<AttendanceWorkDayConfig> listAll() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(AttendanceWorkDayConfig.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceWorkDayConfig> cq = cb.createQuery(AttendanceWorkDayConfig.class);
+		Root<AttendanceWorkDayConfig> root = cq.from( AttendanceWorkDayConfig.class);
+		return em.createQuery(cq).getResultList();
+	}
+	
+	//@MethodDescribe("列示指定Id的AttendanceWorkDayConfig信息列表")
+	public List<AttendanceWorkDayConfig> list(List<String> ids) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<AttendanceWorkDayConfig>();
+		}
+		EntityManager em = this.entityManagerContainer().get(AttendanceWorkDayConfig.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceWorkDayConfig> cq = cb.createQuery(AttendanceWorkDayConfig.class);
+		Root<AttendanceWorkDayConfig> root = cq.from(AttendanceWorkDayConfig.class);
+		Predicate p = root.get(AttendanceWorkDayConfig_.id).in(ids);
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe("根据年份月份列示全部的AttendanceWorkDayConfig信息列表")
+	public List<String> listByYearAndMonth( String year, String month ) throws Exception {
+		if( year == null ){
+			return null;
+		}
+		if( "0".equals(month) || "00".equals(month) || "(0)".equals(month)){
+			month = null;
+		}
+		
+		EntityManager em = this.entityManagerContainer().get(AttendanceWorkDayConfig.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceWorkDayConfig> root = cq.from( AttendanceWorkDayConfig.class);
+		cq.select(root.get(AttendanceWorkDayConfig_.id));
+		
+		Predicate p = cb.equal( root.get(AttendanceWorkDayConfig_.configYear), year);
+		if( month != null ){
+			p = cb.and( p, cb.equal( root.get(AttendanceWorkDayConfig_.configMonth), month));
+		}
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe("根据年份和节假日名称列示全部的AttendanceWorkDayConfig信息列表")
+	public List<String> listByYearAndName( String year, String configName ) throws Exception {
+		if( year == null ){
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get(AttendanceWorkDayConfig.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceWorkDayConfig> root = cq.from( AttendanceWorkDayConfig.class);
+		cq.select(root.get(AttendanceWorkDayConfig_.id));
+		
+		Predicate p = cb.equal( root.get(AttendanceWorkDayConfig_.configYear), year);
+		if( configName != null ){
+			p = cb.and( p, cb.equal( root.get(AttendanceWorkDayConfig_.configName), configName));
+		}
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe("根据节假日名称列示全部的AttendanceWorkDayConfig信息列表")
+	public List<String> listByName( String configName ) throws Exception {
+		EntityManager em = this.entityManagerContainer().get(AttendanceWorkDayConfig.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<AttendanceWorkDayConfig> root = cq.from( AttendanceWorkDayConfig.class);
+		cq.select(root.get(AttendanceWorkDayConfig_.id));
+		
+		Predicate p = cb.equal( root.get(AttendanceWorkDayConfig_.configName), configName);
+		
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+
+	//@MethodDescribe("根据节假日配置计算一个月的应出勤天数")
+	public int getWorkDaysCountForMonth( String s_year, String _month, List<AttendanceWorkDayConfig> workDayConfigList ) throws Exception {
+		/**
+		 * 1、计算当月的总天数
+		 * 2、遍历每天的日期
+		 *    1)判断是否周末
+		 *    2)判断是否调工作日
+		 *    3)判断是否节日
+		 */
+		int workDaysCountForMonth = 0;
+		//1、计算当月的总天数
+		int daysCountForMonth = dateOperation.getDaysForMonth( s_year + "-" + _month + "-01" );
+		workDaysCountForMonth = daysCountForMonth; //先假设每天都是工作日
+		//2、遍历每天的日期
+		String dateString = null;
+		boolean isHoliday = true;
+		for( int i = 1; i<= daysCountForMonth ; i++ ){
+			isHoliday = true;
+			dateString = s_year + "-" + _month + "-" + (i<10?"0"+i:i);
+			//判断当天是否周末
+			if( !dateOperation.isWeekend( dateOperation.getDateFromString( dateString )) ){
+				//如果不是周末
+				if( workDayConfigList != null && workDayConfigList.size() > 0 ){
+					//遍历所有的节假日配置进行判断,是否法定节假日
+					for( AttendanceWorkDayConfig workDayConfig : workDayConfigList ){
+						if( workDayConfig.getConfigDate().trim().equals( dateString ) && "Holiday".equalsIgnoreCase( workDayConfig.getConfigType() )
+						){
+							workDaysCountForMonth--;//当天不是工作日,当月出勤日减一天。
+							break;
+						}
+					}
+				}
+			}else{
+				//如果是周末
+				if( workDayConfigList != null && workDayConfigList.size() > 0 ){
+					//遍历所有的节假日配置进行判断,是否调休工作日
+					for( AttendanceWorkDayConfig workDayConfig : workDayConfigList ){
+						if( workDayConfig.getConfigDate().trim().equals( dateString ) && "Workday".equalsIgnoreCase( workDayConfig.getConfigType() )
+						){
+							isHoliday = false; //是配置的调休工作日
+							break;
+						}
+					}
+				}
+				if( isHoliday ){
+					//如果不是配置的调休工作日,则当天不是工作日,当月出勤日减一天。
+					workDaysCountForMonth--;
+				}
+			}
+		}
+		return workDaysCountForMonth;
+	}
+	
+	//@MethodDescribe("根据节假日配置计算一个周期内的应出勤天数")
+	public Integer getWorkDaysCountForMonth( Date startDate, Date endDate, List<AttendanceWorkDayConfig> workDayConfigList ) throws Exception {
+		/**
+		 * 1、计算当月的总天数
+		 * 2、遍历每天的日期
+		 *    1)判断是否周末
+		 *    2)判断是否调工作日
+		 *    3)判断是否节日
+		 */
+		boolean isHoliday = true;
+		int workDaysCountForMonth = 0;
+		if( endDate.getTime() > new Date().getTime()){
+			endDate = new Date();
+		}
+		List<String> dateStringList = dateOperation.listDateStringBetweenDate(startDate, endDate);
+		if( dateStringList != null && dateStringList.size() > 0 ){
+			workDaysCountForMonth = dateStringList.size();
+			for( String dateString : dateStringList){
+				//判断当天是否周末
+				if( !dateOperation.isWeekend( dateOperation.getDateFromString( dateString )) ){
+					//如果不是周末
+					if( workDayConfigList != null && workDayConfigList.size() > 0 ){
+						//遍历所有的节假日配置进行判断,是否法定节假日
+						for( AttendanceWorkDayConfig workDayConfig : workDayConfigList ){
+							if( workDayConfig.getConfigDate().trim().equals( dateString ) && "Holiday".equalsIgnoreCase( workDayConfig.getConfigType() )
+							){
+								workDaysCountForMonth--;//当天不是工作日,当月出勤日减一天。
+								break;
+							}
+						}
+					}
+				}else{
+					//如果是周末
+					if( workDayConfigList != null && workDayConfigList.size() > 0 ){
+						//遍历所有的节假日配置进行判断,是否调休工作日
+						for( AttendanceWorkDayConfig workDayConfig : workDayConfigList ){
+							if( workDayConfig.getConfigDate().trim().equals( dateString ) && "Workday".equalsIgnoreCase( workDayConfig.getConfigType() )
+							){
+								isHoliday = false; //是配置的调休工作日
+								break;
+							}
+						}
+					}
+					if( isHoliday ){
+						//如果不是配置的调休工作日,则当天不是工作日,当月出勤日减一天。
+						workDaysCountForMonth--;
+					}
+				}
+			}
+		}
+		return workDaysCountForMonth;
+	}
+}

+ 53 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/AttendanceWorkPlaceFactory.java

@@ -0,0 +1,53 @@
+package com.x.attendance.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import com.x.attendance.assemble.control.AbstractFactory;
+import com.x.attendance.assemble.control.Business;
+import com.x.attendance.entity.AttendanceWorkPlace;
+import com.x.attendance.entity.AttendanceWorkPlace_;
+import com.x.base.core.project.exception.ExceptionWhen;
+/**
+ * 工作场所信息服务类
+ */
+public class AttendanceWorkPlaceFactory extends AbstractFactory {
+	
+	public AttendanceWorkPlaceFactory(Business business) throws Exception {
+		super(business);
+	}
+
+	//@MethodDescribe("获取指定Id的AttendanceWorkPlace应用信息对象")
+	public AttendanceWorkPlace get( String id ) throws Exception {
+		return this.entityManagerContainer().find(id, AttendanceWorkPlace.class, ExceptionWhen.none);
+	}
+	
+//	@MethodDescribe("列示全部的AttendanceWorkPlace应用信息列表")
+	@SuppressWarnings("unused")
+	public List<AttendanceWorkPlace> listAll() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(AttendanceWorkPlace.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceWorkPlace> cq = cb.createQuery(AttendanceWorkPlace.class);
+		Root<AttendanceWorkPlace> root = cq.from( AttendanceWorkPlace.class);
+		return em.createQuery(cq).getResultList();
+	}
+	
+	//@MethodDescribe("列示指定Id的AttendanceWorkPlace应用信息列表")
+	public List<AttendanceWorkPlace> list(List<String> ids) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<AttendanceWorkPlace>();
+		}
+		EntityManager em = this.entityManagerContainer().get(AttendanceWorkPlace.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<AttendanceWorkPlace> cq = cb.createQuery(AttendanceWorkPlace.class);
+		Root<AttendanceWorkPlace> root = cq.from(AttendanceWorkPlace.class);
+		Predicate p = root.get(AttendanceWorkPlace_.id).in(ids);
+		return em.createQuery(cq.where(p)).getResultList();
+	}	
+}

+ 12 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/CycleMonthEmptyException.java

@@ -0,0 +1,12 @@
+package com.x.attendance.assemble.control.factory;
+
+import com.x.base.core.project.exception.PromptException;
+
+class CycleMonthEmptyException extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	CycleMonthEmptyException() {
+		super("统计月份不能为空.");
+	}
+}

+ 12 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/CycleYearEmptyException.java

@@ -0,0 +1,12 @@
+package com.x.attendance.assemble.control.factory;
+
+import com.x.base.core.project.exception.PromptException;
+
+class CycleYearEmptyException extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	CycleYearEmptyException() {
+		super("统计年份不能为空.");
+	}
+}

+ 12 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/EmployeeNamesEmptyException.java

@@ -0,0 +1,12 @@
+package com.x.attendance.assemble.control.factory;
+
+import com.x.base.core.project.exception.PromptException;
+
+class EmployeeNamesEmptyException extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	EmployeeNamesEmptyException() {
+		super("员工姓名列表不能为空.");
+	}
+}

+ 12 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/RecordDateEmptyException.java

@@ -0,0 +1,12 @@
+package com.x.attendance.assemble.control.factory;
+
+import com.x.base.core.project.exception.PromptException;
+
+class RecordDateEmptyException extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	RecordDateEmptyException() {
+		super("打卡日期不能为空.");
+	}
+}

+ 12 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/StatisticDateEmptyException.java

@@ -0,0 +1,12 @@
+package com.x.attendance.assemble.control.factory;
+
+import com.x.base.core.project.exception.PromptException;
+
+class StatisticDateEmptyException extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	StatisticDateEmptyException() {
+		super("统计日期不能为空.");
+	}
+}

+ 12 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/StatisticMonthEmptyException.java

@@ -0,0 +1,12 @@
+package com.x.attendance.assemble.control.factory;
+
+import com.x.base.core.project.exception.PromptException;
+
+class StatisticMonthEmptyException extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	StatisticMonthEmptyException() {
+		super("统计月份不能为空.");
+	}
+}

+ 652 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/StatisticPersonForMonthFactory.java

@@ -0,0 +1,652 @@
+package com.x.attendance.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
+import javax.persistence.Query;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.x.attendance.assemble.control.AbstractFactory;
+import com.x.attendance.assemble.control.Business;
+import com.x.attendance.assemble.control.jaxrs.attendancestatistic.WrapInFilterStatisticPersonForMonth;
+import com.x.attendance.entity.StatisticPersonForMonth;
+import com.x.attendance.entity.StatisticPersonForMonth_;
+import com.x.base.core.project.exception.ExceptionWhen;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+
+public class StatisticPersonForMonthFactory extends AbstractFactory {
+
+	private static  Logger logger = LoggerFactory.getLogger( StatisticPersonForMonthFactory.class );
+	
+	public StatisticPersonForMonthFactory(Business business) throws Exception {
+		super(business);
+	}
+
+	//@MethodDescribe("获取指定Id的StatisticPersonForMonth信息对象")
+	public StatisticPersonForMonth get( String id ) throws Exception {
+		return this.entityManagerContainer().find(id, StatisticPersonForMonth.class, ExceptionWhen.none);
+	}
+	
+	//@MethodDescribe("列示全部的StatisticPersonForMonth信息列表")
+	public List<String> listAll() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(StatisticPersonForMonth.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<StatisticPersonForMonth> root = cq.from( StatisticPersonForMonth.class);
+		cq.select(root.get(StatisticPersonForMonth_.id));
+		return em.createQuery(cq).getResultList();
+	}
+	
+	//@MethodDescribe("列示指定Id的StatisticPersonForMonth信息列表")
+	public List<StatisticPersonForMonth> list( List<String> ids ) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<StatisticPersonForMonth>();
+		}
+		EntityManager em = this.entityManagerContainer().get(StatisticPersonForMonth.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<StatisticPersonForMonth> cq = cb.createQuery(StatisticPersonForMonth.class);
+		Root<StatisticPersonForMonth> root = cq.from(StatisticPersonForMonth.class);
+		Predicate p = root.get(StatisticPersonForMonth_.id).in(ids);
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+
+	public List<String> listByUserYearAndMonth( String employeeName, String sYear, String sMonth ) throws Exception {
+		if( employeeName == null || employeeName.isEmpty() ){
+			logger.error( new EmployeeNamesEmptyException() );
+			return null;
+		}
+		
+		EntityManager em = this.entityManagerContainer().get( StatisticPersonForMonth.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class );
+		Root<StatisticPersonForMonth> root = cq.from( StatisticPersonForMonth.class );
+		Predicate p = cb.equal( root.get( StatisticPersonForMonth_.employeeName ), employeeName );
+		if( sYear == null || sYear.isEmpty() ){
+			logger.error( new StatisticYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( StatisticPersonForMonth_.statisticYear ), sYear));
+		}
+		if( sMonth == null || sMonth.isEmpty() ){
+			logger.error( new StatisticMonthEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( StatisticPersonForMonth_.statisticMonth ), sMonth));
+		}
+		cq.select(root.get( StatisticPersonForMonth_.id ) );
+		return em.createQuery( cq.where( p ) ).setMaxResults( 60 ).getResultList();
+	}
+
+	public List<String> listByUnitYearAndMonth( List<String> unitNameList, String year, String month ) throws Exception{
+		
+		if( unitNameList == null || unitNameList.size() == 0 ){
+			logger.error( new UnitNamesEmptyException() );
+			return null;
+		}
+		
+		EntityManager em = this.entityManagerContainer().get( StatisticPersonForMonth.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class );
+		Root<StatisticPersonForMonth> root = cq.from( StatisticPersonForMonth.class );
+		Predicate p = root.get( StatisticPersonForMonth_.unitName ).in(unitNameList);
+		if( year == null || year.isEmpty() ){
+			logger.error( new StatisticYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( StatisticPersonForMonth_.statisticYear ), year ) );
+		}
+		if( month == null || month.isEmpty() ){
+			logger.error( new StatisticMonthEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( StatisticPersonForMonth_.statisticMonth ), month ));
+		}
+		cq.select(root.get( StatisticPersonForMonth_.id ));
+		return em.createQuery( cq.where( p ) ).setMaxResults( 60 ).getResultList();
+	}
+	
+	/**
+	 * 查询下一页的信息数据
+	 * @param id
+	 * @param count
+	 * @param sequence
+	 * @param wrapIn
+	 * @return
+	 * @throws Exception
+	 */
+	@SuppressWarnings("unchecked")
+	public List<StatisticPersonForMonth> listIdsNextWithFilter( String id, Integer count, Object sequence, WrapInFilterStatisticPersonForMonth wrapIn ) throws Exception {
+		//先获取上一页最后一条的sequence值,如果有值的话,以此sequence值作为依据取后续的count条数据
+		EntityManager em = this.entityManagerContainer().get( StatisticPersonForMonth.class );
+		String order = wrapIn.getOrder();//排序方式
+		List<Object> vs = new ArrayList<>();
+		StringBuffer sql_stringBuffer = new StringBuffer();
+		
+		if( order == null || order.isEmpty() ){
+			order = "DESC";
+		}
+		
+		Integer index = 1;
+		sql_stringBuffer.append( "SELECT o FROM "+StatisticPersonForMonth.class.getCanonicalName()+" o where 1=1" );
+
+		if ((null != sequence) ) {
+			sql_stringBuffer.append(" and o.sequence " + (StringUtils.equalsIgnoreCase(order, "DESC") ? "<" : ">") + (" ?" + (index)));
+			vs.add(sequence);
+			index++;
+		}
+				
+		if ((null != wrapIn.getEmployeeName()) && wrapIn.getEmployeeName().size() > 0) {
+			sql_stringBuffer.append(" and o.employeeName in ?" + (index));
+			vs.add( wrapIn.getEmployeeName() );
+			index++;
+		}
+		if ((null != wrapIn.getUnitName()) && wrapIn.getUnitName().size() > 0 ) {
+			sql_stringBuffer.append(" and o.unitName in ?" + (index));
+			vs.add( wrapIn.getUnitName() );
+			index++;
+		}
+		if ((null != wrapIn.getTopUnitName()) && wrapIn.getTopUnitName().size() > 0 ) {
+			sql_stringBuffer.append(" and o.topUnitName in ?" + (index));
+			vs.add( wrapIn.getTopUnitName() );
+			index++;
+		}
+		if ((null != wrapIn.getStatisticYear() ) && (!wrapIn.getStatisticYear().isEmpty())) {
+			sql_stringBuffer.append(" and o.statisticYear = ?" + (index));
+			vs.add( wrapIn.getStatisticYear() );
+			index++;
+		}
+		if ((null != wrapIn.getStatisticMonth()) && (!wrapIn.getStatisticMonth().isEmpty())) {
+			sql_stringBuffer.append(" and o.statisticMonth = ?" + (index));
+			vs.add( wrapIn.getStatisticMonth() );
+			index++;
+		}
+		sql_stringBuffer.append(" order by o.sequence " + order );		
+		Query query = em.createQuery( sql_stringBuffer.toString(), StatisticPersonForMonth.class );
+		//为查询设置所有的参数值
+		for (int i = 0; i < vs.size(); i++) {
+			query.setParameter(i + 1, vs.get(i));
+		}
+		return query.setMaxResults(count).getResultList();
+	}	
+	
+	/**
+	 * 查询上一页的文档信息数据
+	 * @param id
+	 * @param count
+	 * @param sequence
+	 * @param wrapIn
+	 * @return
+	 * @throws Exception
+	 */
+	@SuppressWarnings("unchecked")
+	public List<StatisticPersonForMonth> listIdsPrevWithFilter( String id, Integer count, Object sequence, WrapInFilterStatisticPersonForMonth wrapIn ) throws Exception {
+		//先获取上一页最后一条的sequence值,如果有值的话,以此sequence值作为依据取后续的count条数据
+		EntityManager em = this.entityManagerContainer().get( StatisticPersonForMonth.class );
+		String order = wrapIn.getOrder();//排序方式
+		List<Object> vs = new ArrayList<>();
+		StringBuffer sql_stringBuffer = new StringBuffer();
+		Integer index = 1;
+		
+		if( order == null || order.isEmpty() ){
+			order = "DESC";
+		}
+		
+		sql_stringBuffer.append( "SELECT o FROM "+StatisticPersonForMonth.class.getCanonicalName()+" o where 1=1" );
+		if ((null != sequence) ) {
+			sql_stringBuffer.append(" and o.sequence " + (StringUtils.equalsIgnoreCase(order, "DESC") ? ">" : "<") + (" ?" + (index)));
+			vs.add(sequence);
+			index++;
+		}
+		if ((null != wrapIn.getEmployeeName()) && wrapIn.getEmployeeName().size() > 0) {
+			sql_stringBuffer.append(" and o.employeeName in ?" + (index));
+			vs.add( wrapIn.getEmployeeName() );
+			index++;
+		}
+		if ((null != wrapIn.getUnitName()) && wrapIn.getUnitName().size() > 0 ) {
+			sql_stringBuffer.append(" and o.unitName in ?" + (index));
+			vs.add( wrapIn.getUnitName() );
+			index++;
+		}
+		if ((null != wrapIn.getTopUnitName()) && wrapIn.getTopUnitName().size() > 0 ) {
+			sql_stringBuffer.append(" and o.topUnitName in ?" + (index));
+			vs.add( wrapIn.getTopUnitName() );
+			index++;
+		}
+		if ((null != wrapIn.getStatisticYear() ) && (!wrapIn.getStatisticYear().isEmpty())) {
+			sql_stringBuffer.append(" and o.statisticYear = ?" + (index));
+			vs.add( wrapIn.getStatisticYear() );
+			index++;
+		}
+		if ((null != wrapIn.getStatisticMonth()) && (!wrapIn.getStatisticMonth().isEmpty())) {
+			sql_stringBuffer.append(" and o.statisticMonth = ?" + (index));
+			vs.add( wrapIn.getStatisticMonth() );
+			index++;
+		}
+		sql_stringBuffer.append(" order by o.sequence " + order );
+		
+		Query query = em.createQuery( sql_stringBuffer.toString(), StatisticPersonForMonth.class );
+		//为查询设置所有的参数值
+		for (int i = 0; i < vs.size(); i++) {
+			query.setParameter(i + 1, vs.get(i));
+		}
+		
+		return query.setMaxResults(20).getResultList();
+	}
+	
+	/**
+	 * 查询符合的文档信息总数
+	 * @param id
+	 * @param count
+	 * @param sequence
+	 * @param wrapIn
+	 * @return
+	 * @throws Exception
+	 */
+	public long getCountWithFilter( WrapInFilterStatisticPersonForMonth wrapIn ) throws Exception {
+		//先获取上一页最后一条的sequence值,如果有值的话,以此sequence值作为依据取后续的count条数据
+		EntityManager em = this.entityManagerContainer().get( StatisticPersonForMonth.class );
+		List<Object> vs = new ArrayList<>();
+		StringBuffer sql_stringBuffer = new StringBuffer();
+		Integer index = 1;
+		
+		sql_stringBuffer.append( "SELECT count(o.id) FROM "+StatisticPersonForMonth.class.getCanonicalName()+" o where 1=1" );
+		
+		if ((null != wrapIn.getEmployeeName()) && wrapIn.getEmployeeName().size() > 0) {
+			sql_stringBuffer.append(" and o.employeeName in ?" + (index));
+			vs.add( wrapIn.getEmployeeName() );
+			index++;
+		}
+		if ((null != wrapIn.getUnitName()) && wrapIn.getUnitName().size() > 0 ) {
+			sql_stringBuffer.append(" and o.unitName in ?" + (index));
+			vs.add( wrapIn.getUnitName() );
+			index++;
+		}
+		if ((null != wrapIn.getTopUnitName()) && wrapIn.getTopUnitName().size() > 0 ) {
+			sql_stringBuffer.append(" and o.topUnitName in ?" + (index));
+			vs.add( wrapIn.getTopUnitName() );
+			index++;
+		}
+		if ((null != wrapIn.getStatisticYear() ) && (!wrapIn.getStatisticYear().isEmpty())) {
+			sql_stringBuffer.append(" and o.statisticYear = ?" + (index));
+			vs.add( wrapIn.getStatisticYear() );
+			index++;
+		}
+		if ((null != wrapIn.getStatisticMonth()) && (!wrapIn.getStatisticMonth().isEmpty())) {
+			sql_stringBuffer.append(" and o.statisticMonth = ?" + (index));
+			vs.add( wrapIn.getStatisticMonth() );
+			index++;
+		}
+		Query query = em.createQuery( sql_stringBuffer.toString(), StatisticPersonForMonth.class );
+		//为查询设置所有的参数值
+		for (int i = 0; i < vs.size(); i++) {
+			query.setParameter(i + 1, vs.get(i));
+		}		
+		return (Long) query.getSingleResult();
+	}
+	
+	public StatisticPersonForMonth get(String employeeName, String cycleYear, String cycleMonth) throws Exception {
+		if( employeeName == null ){
+			logger.error( new EmployeeNamesEmptyException() );
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get( StatisticPersonForMonth.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<StatisticPersonForMonth> cq = cb.createQuery(StatisticPersonForMonth.class);
+		Root<StatisticPersonForMonth> root = cq.from( StatisticPersonForMonth.class);	
+		Predicate p = cb.equal( root.get( StatisticPersonForMonth_.employeeName ), employeeName);		
+		if( cycleYear == null || cycleYear.isEmpty() ){
+			logger.error( new CycleYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( StatisticPersonForMonth_.statisticYear), cycleYear));
+		}
+		
+		if( cycleMonth == null || cycleMonth.isEmpty() ){
+			logger.error( new CycleMonthEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( StatisticPersonForMonth_.statisticMonth), cycleMonth));
+		}
+		try{
+			return em.createQuery(cq.where(p)).getSingleResult();
+		}catch(NoResultException e){
+			return null;
+		}
+	}
+	
+	/**
+	 * 根据组织名称,年份月份,统计员工数量
+	 * @param unitName
+	 * @param sYear
+	 * @param sMonth
+	 * @return
+	 * @throws Exception
+	 */
+	public Long countEmployeeCountByUnitYearAndMonth( List<String> unitName, String sYear, String sMonth) throws Exception{
+		if( unitName == null || unitName.size() == 0 ){
+			logger.error( new UnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( StatisticPersonForMonth.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<StatisticPersonForMonth> root = cq.from( StatisticPersonForMonth.class);
+		Predicate p = root.get(StatisticPersonForMonth_.unitName).in( unitName );
+		if( sYear == null || sYear.isEmpty() ){
+			logger.error( new StatisticYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get(StatisticPersonForMonth_.statisticYear), sYear));
+		}
+		if( sMonth == null || sMonth.isEmpty() ){
+			logger.error( new StatisticMonthEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get(StatisticPersonForMonth_.statisticMonth), sMonth));
+		}
+		//查询总数
+		cq.select( cb.count( root ) );	
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据组织,统计年月,计算组织内所有员工迟到数总和
+	 * @param unitName
+	 * @param sYear
+	 * @param sMonth
+	 * @return
+	 * @throws Exception
+	 */
+	public Long sumLateCountByUnitYearAndMonth(List<String> unitName, String sYear, String sMonth) throws Exception{
+		if( unitName == null || unitName.size() == 0 ){
+			logger.error( new UnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( StatisticPersonForMonth.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<StatisticPersonForMonth> root = cq.from( StatisticPersonForMonth.class);		
+		//查询总数
+		cq.select( cb.sum( root.get(StatisticPersonForMonth_.lateTimes ) ) );		
+		Predicate p = root.get(StatisticPersonForMonth_.unitName).in( unitName );
+		if( sYear == null || sYear.isEmpty() ){
+			logger.error( new StatisticYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get(StatisticPersonForMonth_.statisticYear), sYear));
+		}
+		if( sMonth == null || sMonth.isEmpty() ){
+			logger.error( new StatisticMonthEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get(StatisticPersonForMonth_.statisticMonth), sMonth));
+		}
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	
+	/**
+	 * 根据组织列表,统计年月,计算组织内所有员工出勤天数总和
+	 * @param unitName
+	 * @param sYear
+	 * @param sMonth
+	 * @return
+	 * @throws Exception
+	 */
+	public Double sumAttendanceDayCountByUnitYearAndMonth( List<String> unitName, String sYear, String sMonth) throws Exception{
+		if( unitName == null || unitName.size() == 0 ){
+			logger.error( new UnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( StatisticPersonForMonth.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Double> cq = cb.createQuery(Double.class);
+		Root<StatisticPersonForMonth> root = cq.from( StatisticPersonForMonth.class);		
+		//查询总数
+		cq.select( cb.sum( root.get(StatisticPersonForMonth_.onDutyDayCount) ) );		
+		Predicate p = root.get(StatisticPersonForMonth_.unitName).in( unitName );
+		if( sYear == null || sYear.isEmpty() ){
+			logger.error( new StatisticYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get(StatisticPersonForMonth_.statisticYear), sYear));
+		}
+		if( sMonth == null || sMonth.isEmpty() ){
+			logger.error( new StatisticMonthEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get(StatisticPersonForMonth_.statisticMonth), sMonth));
+		}
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据组织列表,统计年月,计算组织内所有员工异常打卡数总和
+	 * @param unitName
+	 * @param sYear
+	 * @param sMonth
+	 * @return
+	 * @throws Exception
+	 */
+	public Long sumAbNormalDutyCountByUnitYearAndMonth( List<String> unitName, String sYear, String sMonth) throws Exception{
+		if( unitName == null || unitName.size() == 0 ){
+			logger.error( new UnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( StatisticPersonForMonth.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<StatisticPersonForMonth> root = cq.from( StatisticPersonForMonth.class);		
+		//查询总数
+		cq.select( cb.sum( root.get(StatisticPersonForMonth_.abNormalDutyCount) ) );		
+		Predicate p = root.get(StatisticPersonForMonth_.unitName).in( unitName );
+		if( sYear == null || sYear.isEmpty() ){
+			logger.error( new StatisticYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get(StatisticPersonForMonth_.statisticYear), sYear));
+		}
+		if( sMonth == null || sMonth.isEmpty() ){
+			logger.error( new StatisticMonthEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get(StatisticPersonForMonth_.statisticMonth), sMonth));
+		}
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据组织列表,统计年月,计算组织内所有员工工时不足次数总和
+	 * @param unitName
+	 * @param sYear
+	 * @param sMonth
+	 * @return
+	 * @throws Exception
+	 */
+	public Long sumLackOfTimeCountByUnitYearAndMonth(List<String> unitName, String sYear, String sMonth) throws Exception{
+		if( unitName == null || unitName.size() == 0 ){
+			logger.error( new UnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( StatisticPersonForMonth.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<StatisticPersonForMonth> root = cq.from( StatisticPersonForMonth.class);		
+		//查询总数
+		cq.select( cb.sum( root.get(StatisticPersonForMonth_.lackOfTimeCount) ) );		
+		Predicate p = root.get(StatisticPersonForMonth_.unitName).in( unitName );
+		if( sYear == null || sYear.isEmpty() ){
+			logger.error( new StatisticYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get(StatisticPersonForMonth_.statisticYear), sYear));
+		}
+		if( sMonth == null || sMonth.isEmpty() ){
+			logger.error( new StatisticMonthEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get(StatisticPersonForMonth_.statisticMonth), sMonth));
+		}
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据组织列表,统计年月,计算组织内所有员工早退次数总和
+	 * @param unitName
+	 * @param sYear
+	 * @param sMonth
+	 * @return
+	 * @throws Exception
+	 */
+	public Long sumLeaveEarlyCountByUnitYearAndMonth( List<String> unitName, String sYear, String sMonth) throws Exception{
+		if( unitName == null || unitName.size() == 0 ){
+			logger.error( new UnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( StatisticPersonForMonth.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<StatisticPersonForMonth> root = cq.from( StatisticPersonForMonth.class);		
+		//查询总数
+		cq.select( cb.sum( root.get(StatisticPersonForMonth_.leaveEarlyTimes ) ) );		
+		Predicate p = root.get(StatisticPersonForMonth_.unitName).in( unitName );
+		if( sYear == null || sYear.isEmpty() ){
+			logger.error( new StatisticYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get(StatisticPersonForMonth_.statisticYear), sYear));
+		}
+		if( sMonth == null || sMonth.isEmpty() ){
+			logger.error( new StatisticMonthEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get(StatisticPersonForMonth_.statisticMonth), sMonth));
+		}
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据组织列表,统计年月,计算组织内所有员工签退次数总和
+	 * @param unitName
+	 * @param sYear
+	 * @param sMonth
+	 * @return
+	 * @throws Exception
+	 */
+	public Long sumOffDutyCountByUnitYearAndMonth( List<String> unitName, String sYear, String sMonth) throws Exception{
+		if( unitName == null || unitName.size() == 0 ){
+			logger.error( new UnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( StatisticPersonForMonth.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<StatisticPersonForMonth> root = cq.from( StatisticPersonForMonth.class);		
+		//查询总数
+		cq.select( cb.sum( root.get(StatisticPersonForMonth_.offDutyTimes ) ) );		
+		Predicate p = root.get(StatisticPersonForMonth_.unitName).in( unitName );
+		if( sYear == null || sYear.isEmpty() ){
+			logger.error( new StatisticYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get(StatisticPersonForMonth_.statisticYear), sYear));
+		}
+		if( sMonth == null || sMonth.isEmpty() ){
+			logger.error( new StatisticMonthEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get(StatisticPersonForMonth_.statisticMonth), sMonth));
+		}
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据组织列表,统计年月,计算组织内所有员工签到退次数总和
+	 * @param unitName
+	 * @param sYear
+	 * @param sMonth
+	 * @return
+	 * @throws Exception
+	 */
+	public Long sumOnDutyCountByUnitYearAndMonth( List<String> unitName, String sYear, String sMonth) throws Exception{
+		if( unitName == null || unitName.size() == 0 ){
+			logger.error( new UnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( StatisticPersonForMonth.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<StatisticPersonForMonth> root = cq.from( StatisticPersonForMonth.class);		
+		//查询总数
+		cq.select( cb.sum( root.get(StatisticPersonForMonth_.onDutyTimes ) ) );		
+		Predicate p = root.get(StatisticPersonForMonth_.unitName).in( unitName );
+		if( sYear == null || sYear.isEmpty() ){
+			logger.error( new StatisticYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get(StatisticPersonForMonth_.statisticYear), sYear));
+		}
+		if( sMonth == null || sMonth.isEmpty() ){
+			logger.error( new StatisticMonthEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get(StatisticPersonForMonth_.statisticMonth), sMonth));
+		}
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据组织列表,统计年月,计算组织内所有员工请假天数总和
+	 * @param unitName
+	 * @param sYear
+	 * @param sMonth
+	 * @return
+	 * @throws Exception
+	 */
+	public Double sumOnSelfHolidayCountByUnitYearAndMonth( List<String> unitName, String sYear, String sMonth) throws Exception{
+		if( unitName == null || unitName.size() == 0 ){
+			logger.error( new UnitNamesEmptyException() );
+			return null;
+		}		
+		EntityManager em = this.entityManagerContainer().get( StatisticPersonForMonth.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Double> cq = cb.createQuery(Double.class);
+		Root<StatisticPersonForMonth> root = cq.from( StatisticPersonForMonth.class);		
+		//查询总数
+		cq.select( cb.sum( root.get(StatisticPersonForMonth_.onSelfHolidayCount) ) );		
+		Predicate p = root.get(StatisticPersonForMonth_.unitName).in( unitName );
+		if( sYear == null || sYear.isEmpty() ){
+			logger.error( new StatisticYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get(StatisticPersonForMonth_.statisticYear), sYear));
+		}
+		if( sMonth == null || sMonth.isEmpty() ){
+			logger.error( new StatisticMonthEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get(StatisticPersonForMonth_.statisticMonth), sMonth));
+		}
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	/**
+	 * 根据组织列表,统计年月,计算组织内所有员工缺勤天数总和
+	 * @param unitName
+	 * @param sYear
+	 * @param sMonth
+	 * @return
+	 * @throws Exception
+	 */
+	public Double sumAbsenceDayCountByUnitYearAndMonth( List<String> unitName, String sYear, String sMonth) throws Exception{
+		if( unitName == null || unitName.size() == 0 ){
+			logger.error( new UnitNamesEmptyException() );
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get( StatisticPersonForMonth.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Double> cq = cb.createQuery(Double.class);
+		Root<StatisticPersonForMonth> root = cq.from( StatisticPersonForMonth.class);		
+		//查询总数
+		cq.select( cb.sum( root.get(StatisticPersonForMonth_.absenceDayCount) ) );	
+		
+		Predicate p = root.get(StatisticPersonForMonth_.unitName).in( unitName );
+		
+		if( sYear == null || sYear.isEmpty() ){
+			logger.error( new StatisticYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get(StatisticPersonForMonth_.statisticYear), sYear));
+		}
+		
+		if( sMonth == null || sMonth.isEmpty() ){
+			logger.error( new StatisticMonthEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get(StatisticPersonForMonth_.statisticMonth), sMonth));
+		}
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+}

+ 281 - 0
o2server/x_attendance_assemble_control/src/main/webapp/describe/sources/com/x/attendance/assemble/control/factory/StatisticTopUnitForDayFactory.java

@@ -0,0 +1,281 @@
+package com.x.attendance.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.x.attendance.assemble.control.AbstractFactory;
+import com.x.attendance.assemble.control.Business;
+import com.x.attendance.assemble.control.jaxrs.attendancestatistic.WrapInFilterStatisticTopUnitForDay;
+import com.x.attendance.entity.StatisticTopUnitForDay;
+import com.x.attendance.entity.StatisticTopUnitForDay_;
+import com.x.base.core.project.exception.ExceptionWhen;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+
+public class StatisticTopUnitForDayFactory extends AbstractFactory {
+
+	private static  Logger logger = LoggerFactory.getLogger( StatisticTopUnitForDayFactory.class );
+	
+	public StatisticTopUnitForDayFactory(Business business) throws Exception {
+		super(business);
+	}
+
+	//@MethodDescribe("获取指定Id的StatisticTopUnitForDay应用信息对象")
+	public StatisticTopUnitForDay get( String id ) throws Exception {
+		return this.entityManagerContainer().find(id, StatisticTopUnitForDay.class, ExceptionWhen.none);
+	}
+	
+	//@MethodDescribe("列示全部的StatisticTopUnitForDay应用信息列表")
+	public List<String> listAll() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(StatisticTopUnitForDay.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<StatisticTopUnitForDay> root = cq.from( StatisticTopUnitForDay.class);
+		cq.select(root.get(StatisticTopUnitForDay_.id));
+		return em.createQuery(cq).getResultList();
+	}
+	
+	//@MethodDescribe("列示指定Id的StatisticTopUnitForDay应用信息列表")
+	public List<StatisticTopUnitForDay> list(List<String> ids) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<StatisticTopUnitForDay>();
+		}
+		EntityManager em = this.entityManagerContainer().get(StatisticTopUnitForDay.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<StatisticTopUnitForDay> cq = cb.createQuery(StatisticTopUnitForDay.class);
+		Root<StatisticTopUnitForDay> root = cq.from(StatisticTopUnitForDay.class);
+		Predicate p = root.get(StatisticTopUnitForDay_.id).in(ids);
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+
+	public List<String> listByTopUnitRecordDateString(String topUnitName, String sDate) throws Exception{
+		if( topUnitName == null || topUnitName.isEmpty() ){
+			logger.error( new TopUnitNamesEmptyException() );
+			return null;
+		}
+		
+		EntityManager em = this.entityManagerContainer().get( StatisticTopUnitForDay.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root< StatisticTopUnitForDay> root = cq.from( StatisticTopUnitForDay.class);
+		Predicate p = cb.equal( root.get( StatisticTopUnitForDay_.topUnitName), topUnitName);
+		if( sDate == null || sDate.isEmpty() ){
+			logger.error( new StatisticDateEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( StatisticTopUnitForDay_.statisticDate), sDate));
+		}
+		cq.select(root.get( StatisticTopUnitForDay_.id));
+		return em.createQuery(cq.where(p)).setMaxResults(62).getResultList();
+	}
+
+	public List<String> listByNameYearAndMonth(String topUnitName, String year, String month) throws Exception {
+		if( topUnitName == null || topUnitName.isEmpty() ){
+			logger.error( new TopUnitNamesEmptyException() );
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get( StatisticTopUnitForDay.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root< StatisticTopUnitForDay> root = cq.from( StatisticTopUnitForDay.class);
+		Predicate p = cb.equal( root.get( StatisticTopUnitForDay_.topUnitName), topUnitName);
+		if( year == null || year.isEmpty() ){
+			logger.error( new StatisticYearEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( StatisticTopUnitForDay_.statisticYear), year));
+		}
+		if( month == null || month.isEmpty() ){
+			logger.error( new StatisticMonthEmptyException() );
+		}else{
+			p = cb.and( p, cb.equal( root.get( StatisticTopUnitForDay_.statisticMonth), month));
+		}
+		cq.select(root.get( StatisticTopUnitForDay_.id));
+		return em.createQuery(cq.where(p)).setMaxResults(62).getResultList();
+	}
+	
+	/**
+	 * 查询下一页的信息数据
+	 * @param id
+	 * @param count
+	 * @param sequence
+	 * @param wrapIn
+	 * @return
+	 * @throws Exception
+	 */
+	@SuppressWarnings("unchecked")
+	public List<StatisticTopUnitForDay> listIdsNextWithFilter( String id, Integer count, Object sequence, WrapInFilterStatisticTopUnitForDay wrapIn ) throws Exception {
+		//先获取上一页最后一条的sequence值,如果有值的话,以此sequence值作为依据取后续的count条数据
+		EntityManager em = this.entityManagerContainer().get( StatisticTopUnitForDay.class );
+		String order = wrapIn.getOrder();//排序方式
+		List<Object> vs = new ArrayList<>();
+		StringBuffer sql_stringBuffer = new StringBuffer();
+		
+		if( order == null || order.isEmpty() ){
+			order = "DESC";
+		}
+		
+		Integer index = 1;
+		sql_stringBuffer.append( "SELECT o FROM "+StatisticTopUnitForDay.class.getCanonicalName()+" o where 1=1" );
+
+		if ((null != sequence) ) {
+			sql_stringBuffer.append(" and o.sequence " + (StringUtils.equalsIgnoreCase(order, "DESC") ? "<" : ">") + (" ?" + (index)));
+			vs.add(sequence);
+			index++;
+		}
+				
+		if ((null != wrapIn.getEmployeeName()) && wrapIn.getEmployeeName().size() > 0) {
+			sql_stringBuffer.append(" and o.employeeName in ?" + (index));
+			vs.add( wrapIn.getEmployeeName() );
+			index++;
+		}
+		if ((null != wrapIn.getUnitName()) && wrapIn.getUnitName().size() > 0 ) {
+			sql_stringBuffer.append(" and o.unitName in ?" + (index));
+			vs.add( wrapIn.getUnitName() );
+			index++;
+		}
+		if ((null != wrapIn.getTopUnitName()) && wrapIn.getTopUnitName().size() > 0 ) {
+			sql_stringBuffer.append(" and o.topUnitName in ?" + (index));
+			vs.add( wrapIn.getTopUnitName() );
+			index++;
+		}
+		if ((null != wrapIn.getStatisticYear() ) && (!wrapIn.getStatisticYear().isEmpty())) {
+			sql_stringBuffer.append(" and o.statisticYear = ?" + (index));
+			vs.add( wrapIn.getStatisticYear() );
+			index++;
+		}
+		if ((null != wrapIn.getStatisticMonth()) && (!wrapIn.getStatisticMonth().isEmpty())) {
+			sql_stringBuffer.append(" and o.statisticMonth = ?" + (index));
+			vs.add( wrapIn.getStatisticMonth() );
+			index++;
+		}
+		sql_stringBuffer.append(" order by o.sequence " + order );
+		Query query = em.createQuery( sql_stringBuffer.toString(), StatisticTopUnitForDay.class );
+		//为查询设置所有的参数值
+		for (int i = 0; i < vs.size(); i++) {
+			query.setParameter(i + 1, vs.get(i));
+		}
+		return query.setMaxResults(count).getResultList();
+	}	
+	
+	/**
+	 * 查询上一页的文档信息数据
+	 * @param id
+	 * @param count
+	 * @param sequence
+	 * @param wrapIn
+	 * @return
+	 * @throws Exception
+	 */
+	@SuppressWarnings("unchecked")
+	public List<StatisticTopUnitForDay> listIdsPrevWithFilter( String id, Integer count, Object sequence, WrapInFilterStatisticTopUnitForDay wrapIn ) throws Exception {
+		//先获取上一页最后一条的sequence值,如果有值的话,以此sequence值作为依据取后续的count条数据
+		EntityManager em = this.entityManagerContainer().get( StatisticTopUnitForDay.class );
+		String order = wrapIn.getOrder();//排序方式
+		List<Object> vs = new ArrayList<>();
+		StringBuffer sql_stringBuffer = new StringBuffer();
+		Integer index = 1;
+		
+		if( order == null || order.isEmpty() ){
+			order = "DESC";
+		}
+		
+		sql_stringBuffer.append( "SELECT o FROM "+StatisticTopUnitForDay.class.getCanonicalName()+" o where 1=1" );
+		if ((null != sequence) ) {
+			sql_stringBuffer.append(" and o.sequence " + (StringUtils.equalsIgnoreCase(order, "DESC") ? ">" : "<") + (" ?" + (index)));
+			vs.add(sequence);
+			index++;
+		}
+		if ((null != wrapIn.getEmployeeName()) && wrapIn.getEmployeeName().size() > 0) {
+			sql_stringBuffer.append(" and o.employeeName in ?" + (index));
+			vs.add( wrapIn.getEmployeeName() );
+			index++;
+		}
+		if ((null != wrapIn.getUnitName()) && wrapIn.getUnitName().size() > 0 ) {
+			sql_stringBuffer.append(" and o.unitName in ?" + (index));
+			vs.add( wrapIn.getUnitName() );
+			index++;
+		}
+		if ((null != wrapIn.getTopUnitName()) && wrapIn.getTopUnitName().size() > 0 ) {
+			sql_stringBuffer.append(" and o.topUnitName in ?" + (index));
+			vs.add( wrapIn.getTopUnitName() );
+			index++;
+		}
+		if ((null != wrapIn.getStatisticYear() ) && (!wrapIn.getStatisticYear().isEmpty())) {
+			sql_stringBuffer.append(" and o.statisticYear = ?" + (index));
+			vs.add( wrapIn.getStatisticYear() );
+			index++;
+		}
+		if ((null != wrapIn.getStatisticMonth()) && (!wrapIn.getStatisticMonth().isEmpty())) {
+			sql_stringBuffer.append(" and o.statisticMonth = ?" + (index));
+			vs.add( wrapIn.getStatisticMonth() );
+			index++;
+		}
+		sql_stringBuffer.append(" order by o.sequence " + order );
+		Query query = em.createQuery( sql_stringBuffer.toString(), StatisticTopUnitForDay.class );
+		//为查询设置所有的参数值
+		for (int i = 0; i < vs.size(); i++) {
+			query.setParameter(i + 1, vs.get(i));
+		}
+		
+		return query.setMaxResults(20).getResultList();
+	}
+	
+	/**
+	 * 查询符合的文档信息总数
+	 * @param id
+	 * @param count
+	 * @param sequence
+	 * @param wrapIn
+	 * @return
+	 * @throws Exception
+	 */
+	public long getCountWithFilter( WrapInFilterStatisticTopUnitForDay wrapIn ) throws Exception {
+		//先获取上一页最后一条的sequence值,如果有值的话,以此sequence值作为依据取后续的count条数据
+		EntityManager em = this.entityManagerContainer().get( StatisticTopUnitForDay.class );
+		List<Object> vs = new ArrayList<>();
+		StringBuffer sql_stringBuffer = new StringBuffer();
+		Integer index = 1;
+		
+		sql_stringBuffer.append( "SELECT count(o.id) FROM "+StatisticTopUnitForDay.class.getCanonicalName()+" o where 1=1" );
+		
+		if ((null != wrapIn.getEmployeeName()) && wrapIn.getEmployeeName().size() > 0) {
+			sql_stringBuffer.append(" and o.employeeName in ?" + (index));
+			vs.add( wrapIn.getEmployeeName() );
+			index++;
+		}
+		if ((null != wrapIn.getUnitName()) && wrapIn.getUnitName().size() > 0 ) {
+			sql_stringBuffer.append(" and o.unitName in ?" + (index));
+			vs.add( wrapIn.getUnitName() );
+			index++;
+		}
+		if ((null != wrapIn.getTopUnitName()) && wrapIn.getTopUnitName().size() > 0 ) {
+			sql_stringBuffer.append(" and o.topUnitName in ?" + (index));
+			vs.add( wrapIn.getTopUnitName() );
+			index++;
+		}
+		if ((null != wrapIn.getStatisticYear() ) && (!wrapIn.getStatisticYear().isEmpty())) {
+			sql_stringBuffer.append(" and o.statisticYear = ?" + (index));
+			vs.add( wrapIn.getStatisticYear() );
+			index++;
+		}
+		if ((null != wrapIn.getStatisticMonth()) && (!wrapIn.getStatisticMonth().isEmpty())) {
+			sql_stringBuffer.append(" and o.statisticMonth = ?" + (index));
+			vs.add( wrapIn.getStatisticMonth() );
+			index++;
+		}
+		Query query = em.createQuery( sql_stringBuffer.toString(), StatisticTopUnitForDay.class );
+		//为查询设置所有的参数值
+		for (int i = 0; i < vs.size(); i++) {
+			query.setParameter(i + 1, vs.get(i));
+		}		
+		return (Long) query.getSingleResult();
+	}
+}

Некоторые файлы не были показаны из-за большого количества измененных файлов