فهرست منبع

Merge branch 'develop' into 'feature/documenteditor_history'

# Conflicts:
#   o2web/source/o2_core/o2/xDesktop/WebSocket.js
胡起 5 سال پیش
والد
کامیت
37315386c0
100فایلهای تغییر یافته به همراه1262 افزوده شده و 299 حذف شده
  1. 4 0
      .gitignore
  2. 1 1
      gulpfile.js
  3. 18 7
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/calendar/CalendarMainActivity.kt
  4. 5 2
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/calendar/CalendarOB.kt
  5. 87 17
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/calendar/CreateCalendarActivity.kt
  6. 180 25
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/calendar/vm/CreateCalendarViewModel.kt
  7. 1 1
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/clouddrive/v2/f/FileFolderListFragment.kt
  8. 10 5
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/o2/organization/ContactPickerActivity.kt
  9. 8 8
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/o2/webview/JSInterfaceO2mBiz.kt
  10. 5 1
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/core/service/CollectLogJobService.kt
  11. 196 19
      o2android/app/src/main/res/layout/activity_create_calendar.xml
  12. 1 1
      o2android/app/src/main/res/layout/activity_create_event.xml
  13. 13 2
      o2android/o2_auth_sdk/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/model/bo/api/calendar/CalendarPostData.kt
  14. 4 4
      o2ios/O2Platform.xcodeproj/project.pbxproj
  15. 14 4
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Headers/O2OA_Auth_SDK-Swift.h
  16. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Info.plist
  17. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/arm.swiftsourceinfo
  18. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo
  19. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/arm64.swiftsourceinfo
  20. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/armv7-apple-ios.swiftsourceinfo
  21. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/armv7.swiftsourceinfo
  22. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/i386-apple-ios-simulator.swiftsourceinfo
  23. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/i386.swiftsourceinfo
  24. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/x86_64-apple-ios-simulator.swiftsourceinfo
  25. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/x86_64.swiftsourceinfo
  26. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/arm.swiftdoc
  27. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/arm.swiftmodule
  28. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/arm64-apple-ios.swiftdoc
  29. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/arm64-apple-ios.swiftmodule
  30. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/arm64.swiftdoc
  31. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/arm64.swiftmodule
  32. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/armv7-apple-ios.swiftdoc
  33. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/armv7-apple-ios.swiftmodule
  34. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/armv7.swiftdoc
  35. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/armv7.swiftmodule
  36. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/i386-apple-ios-simulator.swiftdoc
  37. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/i386-apple-ios-simulator.swiftmodule
  38. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/i386.swiftdoc
  39. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/i386.swiftmodule
  40. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/x86_64-apple-ios-simulator.swiftdoc
  41. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/x86_64-apple-ios-simulator.swiftmodule
  42. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/x86_64.swiftdoc
  43. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/x86_64.swiftmodule
  44. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/O2OA_Auth_SDK
  45. 0 0
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/image_picker.framework/Headers/ImagePickerPlugin.h
  46. 0 0
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/image_picker.framework/Headers/image_picker-umbrella.h
  47. 0 0
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/image_picker.framework/Info.plist
  48. 0 0
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/image_picker.framework/Modules/module.modulemap
  49. BIN
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/image_picker.framework/image_picker
  50. 0 0
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/path_provider.framework/Headers/PathProviderPlugin.h
  51. 0 0
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/path_provider.framework/Headers/path_provider-umbrella.h
  52. 0 0
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/path_provider.framework/Info.plist
  53. 0 0
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/path_provider.framework/Modules/module.modulemap
  54. BIN
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/path_provider.framework/path_provider
  55. 0 0
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/shared_preferences.framework/Headers/SharedPreferencesPlugin.h
  56. 0 0
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/shared_preferences.framework/Headers/shared_preferences-umbrella.h
  57. 0 0
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/shared_preferences.framework/Info.plist
  58. 0 0
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/shared_preferences.framework/Modules/module.modulemap
  59. BIN
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/shared_preferences.framework/shared_preferences
  60. BIN
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins/image_picker.framework/image_picker
  61. BIN
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins/path_provider.framework/path_provider
  62. BIN
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins/shared_preferences.framework/shared_preferences
  63. 1 1
      o2ios/O2Platform/config/config.swift
  64. 2 2
      o2ios/Podfile
  65. 7 7
      o2ios/Podfile.lock
  66. 1 0
      o2server/.gitignore
  67. 10 0
      o2server/configSample/externalDataSources.json
  68. 10 0
      o2server/configSample/externalDataSources_db2.json
  69. 10 0
      o2server/configSample/externalDataSources_dm.json
  70. 10 0
      o2server/configSample/externalDataSources_informix.json
  71. 10 0
      o2server/configSample/externalDataSources_kingbase.json
  72. 10 0
      o2server/configSample/externalDataSources_mysql.json
  73. 10 0
      o2server/configSample/externalDataSources_oracle.json
  74. 10 0
      o2server/configSample/externalDataSources_postgresql.json
  75. 10 0
      o2server/configSample/externalDataSources_sqlserver.json
  76. 290 0
      o2server/configSample/externalStorageSources.json
  77. 1 1
      o2server/configSample/messages.json
  78. 4 3
      o2server/configSample/node_127.0.0.1.json
  79. 2 2
      o2server/configSample/processPlatform.json
  80. 1 1
      o2server/start_linux.sh
  81. 2 3
      o2server/x_attendance_assemble_control/src/main/webapp/jest/describe.js
  82. 2 0
      o2server/x_base_core_project/pom.xml
  83. 6 18
      o2server/x_base_core_project/src/main/java/com/x/base/core/container/EntityManagerContainer.java
  84. 3 3
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/build/CreateVersion.java
  85. 45 44
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/build/PackageO2server.java
  86. 16 8
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Config.java
  87. 1 1
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Messages.java
  88. 16 8
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Node.java
  89. 13 36
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/ProcessPlatform.java
  90. 1 2
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/executor/ProcessPlatformExecutorFactory.java
  91. 23 3
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/gson/XGsonBuilder.java
  92. 29 28
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/http/HttpToken.java
  93. 25 3
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/jaxrs/StandardJaxrsAction.java
  94. 5 3
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/Crypto.java
  95. 85 19
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/StringTools.java
  96. 1 0
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_organization_assemble_control.java
  97. 11 2
      o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/factory/BBSReplyInfoFactory.java
  98. 18 4
      o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/factory/BBSSubjectInfoFactory.java
  99. 13 0
      o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/factory/BBSVoteRecordFactory.java
  100. 1 0
      o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/jaxrs/configsetting/BBSConfigSettingAnonymousAction.java

+ 4 - 0
.gitignore

@@ -151,3 +151,7 @@ typings/
 #vscode
 **/.factorypath
 **/.vscode/
+
+
+*.swp
+

+ 1 - 1
gulpfile.js

@@ -128,7 +128,7 @@ function downloadFile(path, filename, headcb, progresscb, cb){
                     });
                     request.get(options).pipe(str).pipe(stream);
                 } else {
-                    gutil.log(gutil.colors.red("download error"), ":", gutil.colors.red(filename), "statusCode:"+res.statusCode);
+                    gutil.log(gutil.colors.red("download error"), ":", gutil.colors.red(filename), "statusCode:"+response.statusCode);
                 }
             })
             req.on('error', (e) => {

+ 18 - 7
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/calendar/CalendarMainActivity.kt

@@ -80,8 +80,7 @@ class CalendarMainActivity : BaseO2Activity() {
                 checkBox.setOnClickListener {
                     toggleCheck(checkBox.isChecked, child.id)
                 }
-                //@date 2018-8-8 暂时不修改组织日历
-                if (child.manageable && child.type == "PERSON") {
+                if (child.manageable) {
                     editBtn.visible()
                     editBtn.setOnClickListener {
                         XLog.info("点击编辑日历。。。。。。${child.name}.........")
@@ -210,9 +209,16 @@ class CalendarMainActivity : BaseO2Activity() {
      * 修改日程事件
      */
     fun editEvent(event: CalendarEventInfoData) {
-        val arr = ArrayList<CalendarInfoPickViewData>()
-        groups[0].children.forEach { arr.add(it) }
-        go<CreateEventActivity>(CreateEventActivity.startEdit(event, arr))
+        if (groups.isNotEmpty()) {
+            val arr = ArrayList<CalendarInfoPickViewData>()
+            if (groups.size > 1) {
+                groups[0].children.forEach { arr.add(it) }
+                groups[1].children.forEach { arr.add(it) }
+            }else {
+                groups[0].children.forEach { arr.add(it) }
+            }
+            go<CreateEventActivity>(CreateEventActivity.startEdit(event, arr))
+        }
     }
 
     /**
@@ -228,9 +234,14 @@ class CalendarMainActivity : BaseO2Activity() {
      * 创建日程事件
      */
     private fun createCalendarEvent() {
-        if (groups.isNotEmpty() && groups[0].children.isNotEmpty()) {
+        if (groups.isNotEmpty()) {
             val arr = ArrayList<CalendarInfoPickViewData>()
-            groups[0].children.forEach { arr.add(it) }
+            if (groups.size > 1) {
+                groups[0].children.forEach { arr.add(it) }
+                groups[1].children.forEach { arr.add(it) }
+            }else {
+                groups[0].children.forEach { arr.add(it) }
+            }
             go<CreateEventActivity>(CreateEventActivity.startCreate(arr))
         } else {
             XToast.toastShort(this, "日历数据为空!!!!")

+ 5 - 2
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/calendar/CalendarOB.kt

@@ -25,6 +25,8 @@ object CalendarOB {
     const val MONTHLY = "MONTHLY"
     const val YEARLY = "YEARLY"
     const val NONE = "NONE"
+    const val CalendarTypePERSON = "PERSON"
+    const val CalendarTypeUNIT = "UNIT"
 
     val deepColor = linkedMapOf(
             0 to "#428ffc",
@@ -47,9 +49,10 @@ object CalendarOB {
             7 to "#cae2ff"
     )
 
+
     val calendarTypes = linkedMapOf(
-            "PERSON" to "个人日历",
-            "UNIT" to "组织日历"
+            CalendarTypePERSON to "个人日历",
+            CalendarTypeUNIT to "组织日历"
     )
 
     val remindOptions = linkedMapOf(

+ 87 - 17
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/calendar/CreateCalendarActivity.kt

@@ -15,12 +15,16 @@ import android.widget.ImageView
 import android.widget.LinearLayout
 import com.bigkoo.pickerview.OptionsPickerView
 import com.readystatesoftware.systembartint.SystemBarTintManager
+import com.wugang.activityresult.library.ActivityResult
 import kotlinx.android.synthetic.main.activity_create_calendar.*
 import net.muliba.changeskin.FancySkinManager
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.R
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.calendar.CalendarOB.CalendarTypeUNIT
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.calendar.vm.CreateCalendarViewModel
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.o2.organization.ContactPickerActivity
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.databinding.ActivityCreateCalendarBinding
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.vo.CalendarPickerOption
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.vo.ContactPickerResult
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.ImmersedStatusBarUtils
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.XLog
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.XToast
@@ -68,6 +72,12 @@ class CreateCalendarActivity : AppCompatActivity() {
             XToast.toastShort(this, "日历名称不能为空!")
             return
         }
+        if (viewModel.calendarTypeKey.value == CalendarTypeUNIT) {
+            if (TextUtils.isEmpty(viewModel.target.value)){
+                XToast.toastShort(this, "日历所属组织不能为空!")
+                return
+            }
+        }
         if (TextUtils.isEmpty(viewModel.calendarId.value)) {
             viewModel.saveCalendar()
         } else {
@@ -87,22 +97,82 @@ class CreateCalendarActivity : AppCompatActivity() {
 
     /**
      * 日历类型 选择
-     * @2018-8-8 先删除这个事件 暂时不能选择类型 因为组织类型还有其他字段问题。。。。
      */
-//    fun chooseType(view: View) {
-//        val picker = OptionsPickerView.Builder(this, OptionsPickerView.OnOptionsSelectListener { option1, _, _, _ ->
-//            viewModel.setCalendarType(typeList[option1])
-//        }).setTitleText(getString(R.string.calendar_type_choose))
-//                .isDialog(true)
-//                .build()
-//        picker.setPicker(typeList)
-//        var selectIndex = typeList.indexOfFirst { it.name == viewModel.calendarType.value }
-//        if (selectIndex < 0) {
-//            selectIndex = 0
-//        }
-//        picker.setSelectOptions(selectIndex)
-//        picker.showDialog()
-//    }
+    fun chooseType(view: View) {
+        if (TextUtils.isEmpty(viewModel.calendarId.value)) {
+            val picker = OptionsPickerView.Builder(this, OptionsPickerView.OnOptionsSelectListener { option1, _, _, _ ->
+                viewModel.setCalendarType(typeList[option1])
+            }).setTitleText(getString(R.string.calendar_type_choose))
+                    .isDialog(true)
+                    .build()
+            picker.setPicker(typeList)
+            var selectIndex = typeList.indexOfFirst { it.name == viewModel.calendarType.value }
+            if (selectIndex < 0) {
+                selectIndex = 0
+            }
+            picker.setSelectOptions(selectIndex)
+            picker.showDialog()
+        }
+    }
+
+    //选择所属组织
+    fun chooseOrgTarget(view: View) {
+        val bundle = ContactPickerActivity.startPickerBundle(arrayListOf(ContactPickerActivity.departmentPicker),multiple=false)
+        ActivityResult.of(this)
+                .className(ContactPickerActivity::class.java)
+                .params(bundle)
+                .greenChannel().forResult { _, data ->
+                    val result = data?.getParcelableExtra<ContactPickerResult>(ContactPickerActivity.CONTACT_PICKED_RESULT)
+                    if (result != null) {
+                         viewModel.target.value = result.departments.firstOrNull()?.distinguishedName
+                    }
+                }
+    }
+
+    //选择管理者
+    fun chooseManageablePersonList(view: View) {
+        val bundle = ContactPickerActivity.startPickerBundle(arrayListOf("personPicker"),multiple=true)
+        ActivityResult.of(this)
+                .className(ContactPickerActivity::class.java)
+                .params(bundle)
+                .greenChannel().forResult { _, data ->
+                    val result = data?.getParcelableExtra<ContactPickerResult>(ContactPickerActivity.CONTACT_PICKED_RESULT)
+                    if (result != null) {
+                        viewModel.manageablePersonList.value = result.users.map { it.distinguishedName }
+                    }
+                }
+    }
+    //选择可见范围
+    fun chooseViewableList(view: View) {
+        val bundle = ContactPickerActivity.startPickerBundle(arrayListOf(ContactPickerActivity.personPicker, ContactPickerActivity.departmentPicker,ContactPickerActivity.groupPicker), multiple=true)
+        ActivityResult.of(this)
+                .className(ContactPickerActivity::class.java)
+                .params(bundle)
+                .greenChannel().forResult { _, data ->
+                    val result = data?.getParcelableExtra<ContactPickerResult>(ContactPickerActivity.CONTACT_PICKED_RESULT)
+                    if (result != null) {
+                        viewModel.viewablePersonList.value = result.users.map { it.distinguishedName }
+                        viewModel.viewableUnitList.value = result.departments.map { it.distinguishedName }
+                        viewModel.viewableGroupList.value = result.groups.map { it.distinguishedName }
+                    }
+                }
+    }
+    //选择可新建日程范围
+    fun choosePublishableList(view: View) {
+        val bundle = ContactPickerActivity.startPickerBundle(arrayListOf(ContactPickerActivity.personPicker, ContactPickerActivity.departmentPicker,ContactPickerActivity.groupPicker), multiple=true)
+        ActivityResult.of(this)
+                .className(ContactPickerActivity::class.java)
+                .params(bundle)
+                .greenChannel().forResult { _, data ->
+                    val result = data?.getParcelableExtra<ContactPickerResult>(ContactPickerActivity.CONTACT_PICKED_RESULT)
+                    if (result != null) {
+                        viewModel.publishablePersonList.value = result.users.map { it.distinguishedName }
+                        viewModel.publishableUnitList.value = result.departments.map { it.distinguishedName }
+                        viewModel.publishableGroupList.value = result.groups.map { it.distinguishedName }
+                    }
+                }
+    }
+
 
 
     /************* MARK private ************/
@@ -160,9 +230,9 @@ class CreateCalendarActivity : AppCompatActivity() {
         CalendarOB.deepColor.forEach { (_, value) ->
             val card = CardView(this@CreateCalendarActivity)
             card.setCardBackgroundColor(Color.parseColor(value))
-            card.radius = dip(11).toFloat()
+            card.radius = dip(15).toFloat()
             card.tag = value
-            val lp = LinearLayout.LayoutParams(dip(22), dip(22))
+            val lp = LinearLayout.LayoutParams(dip(30), dip(30))
             val margin = dip(8)
             lp.setMargins(margin, margin, margin, margin)
             ll_create_calendar_color_layout.addView(card, lp)

+ 180 - 25
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/calendar/vm/CreateCalendarViewModel.kt

@@ -6,7 +6,6 @@ import android.arch.lifecycle.MediatorLiveData
 import android.arch.lifecycle.MutableLiveData
 import android.arch.lifecycle.Transformations
 import android.text.TextUtils
-import net.zoneland.x.bpm.mobile.v1.zoneXBPM.O2App
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.O2SDKManager
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.base.BaseO2ViewModel
 import net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.calendar.CalendarOB
@@ -32,30 +31,147 @@ class CreateCalendarViewModel(app: Application) : BaseO2ViewModel(app) {
     val calendarColor: MutableLiveData<String> by lazy { MutableLiveData<String>() }
     val comment: MutableLiveData<String> by lazy { MutableLiveData<String>() }
     val isPublic: MutableLiveData<Boolean> by lazy { MutableLiveData<Boolean>() }
+    val isOrgCalendar: MutableLiveData<Boolean> by lazy { MutableLiveData<Boolean>() }
     val calendarType:  MutableLiveData<String> by lazy { MutableLiveData<String>() }
     //id 触发查询Calendar对象
-    val oldCalendar: LiveData<CalendarPostData> = Transformations.switchMap(calendarId, { id ->
+    val oldCalendar: LiveData<CalendarPostData> = Transformations.switchMap(calendarId) { id ->
         val calendarData = MutableLiveData<CalendarPostData>()
         loadFromNet(id, calendarData)
         calendarData
+    }
 
-    })
-
-    val deleteBtnVisibleable: MediatorLiveData<Boolean> = MediatorLiveData()
+    //所属组织、人员
+    val target:  MutableLiveData<String> by lazy { MutableLiveData<String>() }
+    val targetName: MediatorLiveData<String> by lazy { MediatorLiveData<String>() }
+    //管理者
+    val manageablePersonList:  MutableLiveData<List<String>> by lazy { MutableLiveData<List<String>>() }
+    val manageablePersonName: MediatorLiveData<String> by lazy { MediatorLiveData<String>() }
+    //可见范围
+    val viewablePersonList:  MutableLiveData<List<String>> by lazy { MutableLiveData<List<String>>() }
+    val viewableUnitList:  MutableLiveData<List<String>> by lazy { MutableLiveData<List<String>>() }
+    val viewableGroupList:  MutableLiveData<List<String>> by lazy { MutableLiveData<List<String>>() }
+    val viewableName: MediatorLiveData<String> by lazy { MediatorLiveData<String>() }
+    //可新建日程的范围
+    val publishablePersonList:  MutableLiveData<List<String>> by lazy { MutableLiveData<List<String>>() }
+    val publishableUnitList:  MutableLiveData<List<String>> by lazy { MutableLiveData<List<String>>() }
+    val publishableGroupList:  MutableLiveData<List<String>> by lazy { MutableLiveData<List<String>>() }
+    val publishableName: MediatorLiveData<String> by lazy { MediatorLiveData<String>() }
 
 
+    val deleteBtnVisibleable: MediatorLiveData<Boolean> = MediatorLiveData()
 
     private val isLoading: MutableLiveData<Boolean> by lazy { MutableLiveData<Boolean>() }
     //网络操作反馈结果
     private val netResponse: MutableLiveData<FrontendResponse> by lazy { MutableLiveData<FrontendResponse>() }
 
-    private val calendarTypeKey: MutableLiveData<String> by lazy { MutableLiveData<String>() }
+    val calendarTypeKey: MutableLiveData<String> by lazy { MutableLiveData<String>() }
 
     init {
         isPublic.value = false
-        deleteBtnVisibleable.addSource(calendarId, { id->
+        isOrgCalendar.value = false
+        deleteBtnVisibleable.addSource(calendarId) { id->
             deleteBtnVisibleable.value = !TextUtils.isEmpty(id)
-        })
+        }
+        targetName.addSource(target) { value ->
+            targetName.value = if (value?.contains("@") == true) {
+                value.split("@").first()
+            }else {
+                ""
+            }
+        }
+        manageablePersonName.addSource(manageablePersonList) { value ->
+            if (value != null && value.isNotEmpty()) {
+                manageablePersonName.value = value.joinToString {
+                    if (it.contains("@")) {
+                        it.split("@").first()
+                    } else {
+                        it
+                    }
+                }
+            }else {
+                manageablePersonName.value = ""
+            }
+        }
+        viewableName.addSource(viewablePersonList) { viewableNameSetup() }
+        viewableName.addSource(viewableUnitList) { viewableNameSetup() }
+        viewableName.addSource(viewableGroupList) { viewableNameSetup() }
+        publishableName.addSource(publishablePersonList) {
+            publishableNameSetup()
+        }
+        publishableName.addSource(publishableUnitList) {
+            publishableNameSetup()
+        }
+        publishableName.addSource(publishableGroupList) {
+            publishableNameSetup()
+        }
+    }
+    private fun viewableNameSetup() {
+        val personList = viewablePersonList.value
+        val unitList = viewableUnitList.value
+        val groupList = viewableGroupList.value
+        var name = ""
+        if (personList != null && personList.isNotEmpty()) {
+            name += personList.joinToString {
+                if (it.contains("@")) {
+                    it.split("@").first()
+                } else {
+                    it
+                }
+            } + " "
+        }
+        if (unitList != null && unitList.isNotEmpty()) {
+            name += unitList.joinToString {
+                if (it.contains("@")) {
+                    it.split("@").first()
+                } else {
+                    it
+                }
+            } + " "
+        }
+        if (groupList != null && groupList.isNotEmpty()) {
+            name += groupList.joinToString {
+                if (it.contains("@")) {
+                    it.split("@").first()
+                } else {
+                    it
+                }
+            } + " "
+        }
+        viewableName.value = name
+    }
+    private fun publishableNameSetup() {
+        val personList = publishablePersonList.value
+        val unitList = publishableUnitList.value
+        val groupList = publishableGroupList.value
+        var name = ""
+        if (personList != null && personList.isNotEmpty()) {
+            name += personList.joinToString {
+                if (it.contains("@")) {
+                    it.split("@").first()
+                } else {
+                    it
+                }
+            } + " "
+        }
+        if (unitList != null && unitList.isNotEmpty()) {
+            name += unitList.joinToString {
+                if (it.contains("@")) {
+                    it.split("@").first()
+                } else {
+                    it
+                }
+            } + " "
+        }
+        if (groupList != null && groupList.isNotEmpty()) {
+            name += groupList.joinToString {
+                if (it.contains("@")) {
+                    it.split("@").first()
+                } else {
+                    it
+                }
+            } + " "
+        }
+        publishableName.value = name
     }
 
 
@@ -67,7 +183,18 @@ class CreateCalendarViewModel(app: Application) : BaseO2ViewModel(app) {
         post.isPublic = isPublic.value ?:false
         post.status = "OPEN"
         post.description = comment.value ?:""
-        post.target = O2SDKManager.instance().distinguishedName
+        if (TextUtils.isEmpty(target.value)) {
+            post.target = O2SDKManager.instance().distinguishedName
+        }else {
+            post.target = target.value!!
+        }
+        post.manageablePersonList = manageablePersonList.value ?: ArrayList()
+        post.viewablePersonList = viewablePersonList.value ?: ArrayList()
+        post.viewableUnitList = viewableUnitList.value ?: ArrayList()
+        post.viewableGroupList = viewableGroupList.value ?: ArrayList()
+        post.publishablePersonList = publishablePersonList.value ?: ArrayList()
+        post.publishableUnitList = publishableUnitList.value ?: ArrayList()
+        post.publishableGroupList = publishableGroupList.value ?: ArrayList()
 
         XLog.info("$post")
         isLoading.value = true
@@ -103,7 +230,19 @@ class CreateCalendarViewModel(app: Application) : BaseO2ViewModel(app) {
         post.isPublic = isPublic.value ?:false
         post.status = "OPEN"
         post.description = comment.value ?:""
-        post.target = O2SDKManager.instance().distinguishedName
+
+        if (TextUtils.isEmpty(target.value)) {
+            post.target = O2SDKManager.instance().distinguishedName
+        }else {
+            post.target = target.value!!
+        }
+        post.manageablePersonList = manageablePersonList.value ?: ArrayList()
+        post.viewablePersonList = viewablePersonList.value ?: ArrayList()
+        post.viewableUnitList = viewableUnitList.value ?: ArrayList()
+        post.viewableGroupList = viewableGroupList.value ?: ArrayList()
+        post.publishablePersonList = publishablePersonList.value ?: ArrayList()
+        post.publishableUnitList = publishableUnitList.value ?: ArrayList()
+        post.publishableGroupList = publishableGroupList.value ?: ArrayList()
         XLog.info("update calendar: $post")
         isLoading.value = true
         getCalendarAssembleService()?.saveCalendar(post)
@@ -159,38 +298,54 @@ class CreateCalendarViewModel(app: Application) : BaseO2ViewModel(app) {
     fun setCalendarType(type: CalendarPickerOption) {
         calendarTypeKey.value = type.value
         calendarType.value = type.name
+        val isOrg = type.value == "UNIT"
+        isOrgCalendar.value = isOrg
+        if (isOrg) {
+            target.value = ""
+            manageablePersonList.value = ArrayList()
+            viewablePersonList.value = ArrayList()
+            viewableUnitList.value = ArrayList()
+            viewableGroupList.value = ArrayList()
+            publishablePersonList.value = ArrayList()
+            publishableUnitList.value = ArrayList()
+            publishableGroupList.value = ArrayList()
+        }
     }
 
     fun setBackCalendarInfo(info: CalendarPostData) {
-        calendarTitle.value = info.name
         var type = CalendarOB.calendarTypes[info.type]
         if (type == null) {
             type = CalendarOB.calendarTypes["PERSON"]!!
         }
         setCalendarType(CalendarPickerOption(type, info.type))
+
+        calendarTitle.value = info.name
         calendarColor.value = info.color
         isPublic.value = info.isPublic
         comment.value = info.description
+        target.value = info.target
+        manageablePersonList.value = info.manageablePersonList
+        viewablePersonList.value = info.viewablePersonList
+        viewableUnitList.value = info.viewableUnitList
+        viewableGroupList.value = info.viewableGroupList
+        publishablePersonList.value = info.publishablePersonList
+        publishableUnitList.value = info.publishableUnitList
+        publishableGroupList.value = info.publishableGroupList
     }
 
 
     private fun loadFromNet(id: String?, calendarPostData: MutableLiveData<CalendarPostData>) {
         if (!TextUtils.isEmpty(id)) {
             val service = getCalendarAssembleService()
-            if (service!=null) {
-                service.getCalendar(id!!)
-                        .subscribeOn(Schedulers.io())
-                        .observeOn(AndroidSchedulers.mainThread())
-                        .o2Subscribe {
-                            onNext { res ->
-                                val calendar = res.data
-                                calendarPostData.value = calendar
-                            }
-                            onError { e, isNetworkError ->
-                                XLog.error("查询日历出错, isnetworkError:$isNetworkError", e)
-                                calendarPostData.value = null
-                            }
-                        }
+            service?.getCalendar(id!!)?.subscribeOn(Schedulers.io())?.observeOn(AndroidSchedulers.mainThread())?.o2Subscribe {
+                onNext { res ->
+                    val calendar = res.data
+                    calendarPostData.value = calendar
+                }
+                onError { e, isNetworkError ->
+                    XLog.error("查询日历出错, isnetworkError:$isNetworkError", e)
+                    calendarPostData.value = null
+                }
             }
         }
     }

+ 1 - 1
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/clouddrive/v2/f/FileFolderListFragment.kt

@@ -244,7 +244,7 @@ class FileFolderListFragment : BaseMVPFragment<FileFolderListContract.View, File
 
     private fun share() {
         val bundle = ContactPickerActivity.startPickerBundle(
-                arrayListOf("personPicker", "departmentPicker"),
+                arrayListOf(ContactPickerActivity.personPicker, ContactPickerActivity.departmentPicker),
                 multiple = true)
         if (activity is CloudDiskActivity) {
             (activity as CloudDiskActivity).contactPicker(bundle) { result ->

+ 10 - 5
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/o2/organization/ContactPickerActivity.kt

@@ -26,8 +26,13 @@ class ContactPickerActivity : BaseMVPActivity<ContactPickerActivityContract.View
     override fun layoutResId(): Int = R.layout.activity_contact_picker
 
     companion object {
+        const val departmentPicker = "departmentPicker"
+        const val identityPicker = "identityPicker"
+        const val personPicker = "personPicker"
+        const val groupPicker = "groupPicker"
+
         const val CONTACT_PICKED_RESULT = "CONTACT_PICKED_RESULT"
-        val picker_mode_list = arrayOf("departmentPicker", "identityPicker", "groupPicker", "personPicker")
+        val picker_mode_list = arrayOf(departmentPicker, identityPicker, personPicker, groupPicker)
         const val PICKER_MODE_KEY = "PICKER_MODE_KEY"
         const val TOP_LIST_KEY = "TOP_LIST_KEY"
         const val ORG_TYPE_KEY = "ORG_TYPE_KEY"
@@ -322,7 +327,7 @@ class ContactPickerActivity : BaseMVPActivity<ContactPickerActivityContract.View
 
     private fun createFragment(mode: String, index: Int, isShowTab:Boolean) {
         when(mode) {
-            "departmentPicker" -> {
+            departmentPicker -> {
                 if (index == 0) {pickerTitle = "组织选择"}
                 val f = ContactUnitAndIdentityPicker.startPicker(
                         ContactUnitAndIdentityPicker.ORG_PICK_MODE,
@@ -335,7 +340,7 @@ class ContactPickerActivity : BaseMVPActivity<ContactPickerActivityContract.View
                 fragments.add(f)
                 if (isShowTab) {toolbar_snippet_tab_layout.addTab(toolbar_snippet_tab_layout.newTab().setText("组织选择"))}
             }
-            "identityPicker" -> {
+            identityPicker -> {
                 if (index == 0) {pickerTitle = "身份选择"}
                 val f = ContactUnitAndIdentityPicker.startPicker(
                         ContactUnitAndIdentityPicker.IDENTITY_PICK_MODE,
@@ -348,7 +353,7 @@ class ContactPickerActivity : BaseMVPActivity<ContactPickerActivityContract.View
                 fragments.add(f)
                 if (isShowTab) {toolbar_snippet_tab_layout.addTab(toolbar_snippet_tab_layout.newTab().setText("身份选择"))}
             }
-            "groupPicker" -> {
+            groupPicker -> {
                 if (index == 0) {pickerTitle = "群组选择"}
                 val f = ContactPersonGroupPicker.startPicker(
                         ContactPersonGroupPicker.GROUP_PICK_MODE,
@@ -358,7 +363,7 @@ class ContactPickerActivity : BaseMVPActivity<ContactPickerActivityContract.View
                 fragments.add(f)
                 if (isShowTab) {toolbar_snippet_tab_layout.addTab(toolbar_snippet_tab_layout.newTab().setText("群组选择"))}
             }
-            "personPicker" -> {
+            personPicker -> {
                 if (index == 0) {pickerTitle = "人员选择"}
                 val f =  ContactUnitAndIdentityPicker.startPicker(
                         ContactUnitAndIdentityPicker.PERSON_PICK_MODE,

+ 8 - 8
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/o2/webview/JSInterfaceO2mBiz.kt

@@ -81,7 +81,7 @@ class JSInterfaceO2mBiz  private constructor(val activity: FragmentActivity?) {
                 val maxNumber = jsFormData.maxNumber ?: 0
                 val pickedIdentities = jsFormData.pickedIdentities ?: ArrayList()
                 ContactPickerActivity.startPickerBundle(
-                        arrayListOf("identityPicker"),
+                        arrayListOf(ContactPickerActivity.identityPicker),
                         dutyList = dutyList,
                         multiple = multiple,
                         topUnitList = topList,
@@ -90,7 +90,7 @@ class JSInterfaceO2mBiz  private constructor(val activity: FragmentActivity?) {
                         initIdList = pickedIdentities
                 )
             }else {
-                ContactPickerActivity.startPickerBundle(arrayListOf("identityPicker"))
+                ContactPickerActivity.startPickerBundle(arrayListOf(ContactPickerActivity.identityPicker))
             }
             showPicker(bundle, callback)
         } else {
@@ -111,7 +111,7 @@ class JSInterfaceO2mBiz  private constructor(val activity: FragmentActivity?) {
                 val maxNumber = jsFormData.maxNumber ?: 0
                 val pickedDepartments = jsFormData.pickedDepartments ?: ArrayList()
                 ContactPickerActivity.startPickerBundle(
-                        arrayListOf("departmentPicker"),
+                        arrayListOf(ContactPickerActivity.departmentPicker),
                         dutyList = arrayListOf(),
                         multiple = multiple,
                         topUnitList = topList,
@@ -120,7 +120,7 @@ class JSInterfaceO2mBiz  private constructor(val activity: FragmentActivity?) {
                         initDeptList = pickedDepartments
                 )
             }else {
-                ContactPickerActivity.startPickerBundle(arrayListOf("departmentPicker"))
+                ContactPickerActivity.startPickerBundle(arrayListOf(ContactPickerActivity.departmentPicker))
             }
             showPicker(bundle, callback)
         } else {
@@ -139,7 +139,7 @@ class JSInterfaceO2mBiz  private constructor(val activity: FragmentActivity?) {
                 val maxNumber = jsFormData.maxNumber ?: 0
                 val pickedPersonList = jsFormData.pickedUsers ?: ArrayList()
                 ContactPickerActivity.startPickerBundle(
-                        arrayListOf("personPicker"),
+                        arrayListOf(ContactPickerActivity.personPicker),
                         dutyList = arrayListOf(),
                         multiple = multiple,
                         topUnitList = arrayListOf(),
@@ -148,7 +148,7 @@ class JSInterfaceO2mBiz  private constructor(val activity: FragmentActivity?) {
                         initUserList = pickedPersonList
                 )
             }else {
-                ContactPickerActivity.startPickerBundle(arrayListOf("personPicker"))
+                ContactPickerActivity.startPickerBundle(arrayListOf(ContactPickerActivity.personPicker))
             }
            showPicker(bundle, callback)
         } else {
@@ -167,7 +167,7 @@ class JSInterfaceO2mBiz  private constructor(val activity: FragmentActivity?) {
                 val maxNumber = jsFormData.maxNumber ?: 0
                 val pickedGroups = jsFormData.pickedGroups ?: ArrayList()
                 ContactPickerActivity.startPickerBundle(
-                        arrayListOf("groupPicker"),
+                        arrayListOf(ContactPickerActivity.groupPicker),
                         dutyList = arrayListOf(),
                         multiple = multiple,
                         topUnitList = arrayListOf(),
@@ -176,7 +176,7 @@ class JSInterfaceO2mBiz  private constructor(val activity: FragmentActivity?) {
                         initGroupList = pickedGroups
                 )
             }else {
-                ContactPickerActivity.startPickerBundle(arrayListOf("groupPicker"))
+                ContactPickerActivity.startPickerBundle(arrayListOf(ContactPickerActivity.groupPicker))
             }
             showPicker( bundle, callback)
         } else {

+ 5 - 1
o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/core/service/CollectLogJobService.kt

@@ -34,7 +34,11 @@ class CollectLogJobService : JobService() {
     private var collectService: CollectService? = null
 
     override fun onStartJob(params: JobParameters?): Boolean {
-        collectService = RetrofitClient.instance().collectApi()
+        try {
+            collectService = RetrofitClient.instance().collectApi()
+        } catch (e: Exception) {
+            XLog.error("中心服务器获取失败", e)
+        }
         XLog.info("onStartJob :" + params?.jobId)
         executeTask(params)
         return false//true还在执行,任务执行完成后需要手动调用jobFinished, false 表示任务执行完了

+ 196 - 19
o2android/app/src/main/res/layout/activity_create_calendar.xml

@@ -1,17 +1,21 @@
 <?xml version="1.0" encoding="utf-8"?>
 <layout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    xmlns:app="http://schemas.android.com/apk/res-auto">
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools">
+
     <data>
+
         <variable
             name="viewmodel"
-            type="net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.calendar.vm.CreateCalendarViewModel"/>
+            type="net.zoneland.x.bpm.mobile.v1.zoneXBPM.app.calendar.vm.CreateCalendarViewModel" />
     </data>
+
     <android.support.constraint.ConstraintLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:background="@color/z_color_background"
         tools:context=".app.calendar.CreateCalendarActivity">
+
         <RelativeLayout
             android:id="@+id/rl_create_calendar_top"
             android:layout_width="match_parent"
@@ -48,10 +52,10 @@
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_below="@+id/image_create_calendar_close_btn"
-                android:layout_marginBottom="@dimen/spacing_small"
-                android:layout_marginEnd="@dimen/spacing_small"
                 android:layout_marginStart="@dimen/spacing_small"
                 android:layout_marginTop="@dimen/spacing_large"
+                android:layout_marginEnd="@dimen/spacing_small"
+                android:layout_marginBottom="@dimen/spacing_small"
                 android:background="@null"
                 android:hint="@string/calendar_title_hint"
                 android:text="@={viewmodel.calendarTitle}"
@@ -66,11 +70,11 @@
             android:layout_height="wrap_content"
             android:layout_marginStart="@dimen/spacing_normal"
             android:layout_marginTop="@dimen/spacing_normal"
-            android:checked="@={viewmodel.isPublic()}"
-            android:text="@string/calendar_is_open"
             android:button="@drawable/o2_checkbox"
+            android:checked="@={viewmodel.isPublic()}"
             android:paddingStart="10dp"
             android:paddingEnd="10dp"
+            android:text="@string/calendar_is_open"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toBottomOf="@+id/rl_create_calendar_top" />
@@ -111,13 +115,14 @@
 
         <TextView
             android:id="@+id/tv_create_calendar_type"
-            android:layout_width="335dp"
+            android:layout_width="0dp"
             android:layout_height="wrap_content"
             android:layout_marginStart="@dimen/spacing_normal"
             android:layout_marginTop="@dimen/spacing_normal"
             android:text="@={viewmodel.calendarType}"
             android:textColor="@color/z_color_text_primary_dark"
             android:textSize="@dimen/font_large"
+            android:onClick="chooseType"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toBottomOf="@+id/view_create_calendar_color_divider"
@@ -126,15 +131,188 @@
         <ImageView
             android:layout_width="18dp"
             android:layout_height="18dp"
-            android:layout_marginEnd="@dimen/spacing_normal"
             android:layout_marginTop="@dimen/spacing_normal"
+            android:layout_marginEnd="@dimen/spacing_normal"
             android:src="@mipmap/icon_arrow_22dp"
-            android:visibility="invisible"
+            android:visibility="visible"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintHorizontal_bias="1"
             app:layout_constraintStart_toEndOf="@+id/tv_create_calendar_type"
             app:layout_constraintTop_toBottomOf="@+id/view_create_calendar_color_divider" />
 
+
+        <LinearLayout
+            android:id="@+id/ll_create_calendar_org_args"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            visibleOrGone="@{viewmodel.isOrgCalendar}"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/tv_create_calendar_type">
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="1px"
+                android:layout_marginTop="@dimen/spacing_normal"
+                android:background="@color/divider" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/spacing_normal"
+                android:layout_marginEnd="@dimen/spacing_normal"
+                android:layout_marginTop="@dimen/spacing_normal"
+                android:orientation="horizontal"
+                android:onClick="chooseOrgTarget">
+
+                <TextView
+                    android:layout_width="100dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginEnd="@dimen/spacing_small"
+                    android:textColor="@color/z_color_text_primary_dark"
+                    android:textSize="@dimen/font_large"
+                    android:text="所属组织" />
+                <TextView
+                    android:id="@+id/tv_create_calendar_target_name"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    android:textColor="@color/z_color_text_primary_dark"
+                    android:textSize="@dimen/font_normal"
+                    tools:text="组织1"
+                    android:text="@={viewmodel.targetName}"/>
+
+                <ImageView
+                    android:layout_width="18dp"
+                    android:layout_height="18dp"
+                    android:layout_gravity="center_vertical"
+                    android:src="@mipmap/icon_arrow_22dp" />
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="1px"
+                android:layout_marginTop="@dimen/spacing_normal"
+                android:background="@color/divider" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/spacing_normal"
+                android:layout_marginEnd="@dimen/spacing_normal"
+                android:layout_marginTop="@dimen/spacing_normal"
+                android:orientation="horizontal"
+                android:onClick="chooseManageablePersonList">
+
+                <TextView
+                    android:layout_width="100dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginEnd="@dimen/spacing_small"
+                    android:textColor="@color/z_color_text_primary_dark"
+                    android:textSize="@dimen/font_large"
+                    android:text="管理者" />
+                <TextView
+                    android:id="@+id/tv_create_calendar_manager_name"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    android:textColor="@color/z_color_text_primary_dark"
+                    android:textSize="@dimen/font_normal"
+                    tools:text="组织1"
+                    android:text="@={viewmodel.manageablePersonName}"/>
+
+                <ImageView
+                    android:layout_width="18dp"
+                    android:layout_height="18dp"
+                    android:layout_gravity="center_vertical"
+                    android:src="@mipmap/icon_arrow_22dp" />
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="1px"
+                android:layout_marginTop="@dimen/spacing_normal"
+                android:background="@color/divider" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/spacing_normal"
+                android:layout_marginEnd="@dimen/spacing_normal"
+                android:layout_marginTop="@dimen/spacing_normal"
+                android:orientation="horizontal"
+                android:onClick="chooseViewableList">
+
+                <TextView
+                    android:layout_width="100dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginEnd="@dimen/spacing_small"
+                    android:textColor="@color/z_color_text_primary_dark"
+                    android:textSize="@dimen/font_large"
+                    android:text="可见范围" />
+                <TextView
+                    android:id="@+id/tv_create_calendar_viewable_name"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    android:textColor="@color/z_color_text_primary_dark"
+                    android:textSize="@dimen/font_normal"
+                    tools:text="组织1"
+                    android:text="@={viewmodel.viewableName}"/>
+
+                <ImageView
+                    android:layout_width="18dp"
+                    android:layout_height="18dp"
+                    android:layout_gravity="center_vertical"
+                    android:src="@mipmap/icon_arrow_22dp" />
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="1px"
+                android:layout_marginTop="@dimen/spacing_normal"
+                android:background="@color/divider" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/spacing_normal"
+                android:layout_marginEnd="@dimen/spacing_normal"
+                android:layout_marginTop="@dimen/spacing_normal"
+                android:orientation="horizontal"
+                android:onClick="choosePublishableList">
+
+                <TextView
+                    android:layout_width="100dp"
+                    android:layout_height="wrap_content"
+                    android:textColor="@color/z_color_text_primary_dark"
+                    android:textSize="@dimen/font_large"
+                    android:text="可新建范围"
+                    android:layout_marginEnd="@dimen/spacing_small"/>
+                <TextView
+                    android:id="@+id/tv_create_calendar_publishable_name"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    android:textColor="@color/z_color_text_primary_dark"
+                    android:textSize="@dimen/font_normal"
+                    tools:text="组织1"
+                    android:text="@={viewmodel.publishableName}"/>
+
+                <ImageView
+                    android:layout_width="18dp"
+                    android:layout_height="18dp"
+                    android:layout_gravity="center_vertical"
+                    android:src="@mipmap/icon_arrow_22dp" />
+
+            </LinearLayout>
+
+        </LinearLayout>
+
+
         <View
             android:id="@+id/view_create_calendar_type_divider"
             android:layout_width="match_parent"
@@ -143,7 +321,7 @@
             android:background="@color/divider"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/tv_create_calendar_type" />
+            app:layout_constraintTop_toBottomOf="@+id/ll_create_calendar_org_args" />
 
         <EditText
             android:id="@+id/et_create_calendar_comment"
@@ -152,9 +330,9 @@
             android:layout_marginStart="@dimen/spacing_small"
             android:layout_marginTop="@dimen/spacing_normal"
             android:background="@null"
-            android:minLines="3"
-            android:hint="@string/calendar_comment"
             android:gravity="top"
+            android:hint="@string/calendar_comment"
+            android:minLines="3"
             android:text="@={viewmodel.comment}"
             android:textColor="@color/z_color_text_primary"
             android:textColorHint="@color/z_color_text_hint"
@@ -165,20 +343,19 @@
 
         <Button
             android:id="@+id/btn_login_submit"
+            visibleOrGone="@{viewmodel.deleteBtnVisibleable}"
             android:layout_width="325dp"
             android:layout_height="44dp"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/et_create_calendar_comment"
             android:layout_marginTop="@dimen/spacing_normal"
             android:layout_marginBottom="@dimen/spacing_normal"
             android:background="@drawable/button_background_44dp"
+            android:onClick="clickDeleteBtn"
             android:text="@string/calendar_delete_calendar"
             android:textColor="@android:color/white"
             android:textSize="18sp"
-            visibleOrGone="@{viewmodel.deleteBtnVisibleable}"
-            android:onClick="clickDeleteBtn"
-            />
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/et_create_calendar_comment" />
 
     </android.support.constraint.ConstraintLayout>
 </layout>

+ 1 - 1
o2android/app/src/main/res/layout/activity_create_event.xml

@@ -320,7 +320,7 @@
                 android:orientation="horizontal"
                 app:layout_constraintEnd_toEndOf="parent"
                 app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toBottomOf="@+id/tv_create_calendar_event_repeat_name"></LinearLayout>
+                app:layout_constraintTop_toBottomOf="@+id/tv_create_calendar_event_repeat_name"/>
 
             <LinearLayout
                 android:id="@+id/ll_create_calendar_event_repeat_until_date"

+ 13 - 2
o2android/o2_auth_sdk/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/model/bo/api/calendar/CalendarPostData.kt

@@ -12,8 +12,19 @@ data class CalendarPostData (
         var color: String = "",
         var isPublic: Boolean = false,
         var followed: Boolean = false,
-        var target: String = "",
         var description: String = "",
         var status: String = "",
-        var createor: String = ""
+        var createor: String = "",
+        //所属组织、人员
+        var target: String = "",
+        //管理者
+        var manageablePersonList: List<String> = ArrayList(),
+        //可见范围
+        var viewablePersonList: List<String> = ArrayList(),
+        var viewableUnitList: List<String> = ArrayList(),
+        var viewableGroupList: List<String> = ArrayList(),
+        //可新建日程的范围
+        var publishablePersonList: List<String> = ArrayList(),
+        var publishableUnitList: List<String> = ArrayList(),
+        var publishableGroupList: List<String> = ArrayList()
 )

+ 4 - 4
o2ios/O2Platform.xcodeproj/project.pbxproj

@@ -6619,7 +6619,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 66;
+				CURRENT_PROJECT_VERSION = 67;
 				DEVELOPMENT_TEAM = NTDRU2P6T4;
 				ENABLE_BITCODE = NO;
 				FRAMEWORK_SEARCH_PATHS = (
@@ -6651,7 +6651,7 @@
 					"$(PROJECT_DIR)/O2Platform/framework/MegviiLicMgr-iOS-SDK",
 					"$(PROJECT_DIR)/O2Platform/framework/O2OA_Flutter_SDK",
 				);
-				MARKETING_VERSION = 5.0.6;
+				MARKETING_VERSION = 5.0.7;
 				OTHER_LDFLAGS = (
 					"$(inherited)",
 					"-ObjC",
@@ -6733,7 +6733,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Distribution";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 66;
+				CURRENT_PROJECT_VERSION = 67;
 				DEVELOPMENT_TEAM = NTDRU2P6T4;
 				ENABLE_BITCODE = NO;
 				FRAMEWORK_SEARCH_PATHS = (
@@ -6765,7 +6765,7 @@
 					"$(PROJECT_DIR)/O2Platform/framework/MegviiLicMgr-iOS-SDK",
 					"$(PROJECT_DIR)/O2Platform/framework/O2OA_Flutter_SDK",
 				);
-				MARKETING_VERSION = 5.0.6;
+				MARKETING_VERSION = 5.0.7;
 				OTHER_LDFLAGS = (
 					"$(inherited)",
 					"-ObjC",

+ 14 - 4
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Headers/O2OA_Auth_SDK-Swift.h

@@ -1,6 +1,6 @@
 #if 0
 #elif defined(__arm64__) && __arm64__
-// Generated by Apple Swift version 5.1.2 effective-4.2 (swiftlang-1100.0.278 clang-1100.0.33.9)
+// Generated by Apple Swift version 5.2 (swiftlang-1103.0.32.1 clang-1103.0.32.29)
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wgcc-compat"
 
@@ -84,6 +84,11 @@ typedef unsigned int swift_uint4  __attribute__((__ext_vector_type__(4)));
 #else
 # define SWIFT_NOESCAPE
 #endif
+#if __has_attribute(ns_consumed)
+# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed))
+#else
+# define SWIFT_RELEASES_ARGUMENT
+#endif
 #if __has_attribute(warn_unused_result)
 # define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
 #else
@@ -234,7 +239,7 @@ SWIFT_CLASS("_TtC13O2OA_Auth_SDK10O2AppModel")
 SWIFT_CLASS("_TtC13O2OA_Auth_SDK9O2AuthSDK")
 @interface O2AuthSDK : NSObject
 - (nonnull instancetype)init SWIFT_UNAVAILABLE;
-+ (nonnull instancetype)new SWIFT_DEPRECATED_MSG("-init is unavailable");
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
 @end
 
 
@@ -412,7 +417,7 @@ SWIFT_CLASS("_TtC13O2OA_Auth_SDK16O2WebServerModel")
 #pragma clang diagnostic pop
 
 #elif defined(__ARM_ARCH_7A__) && __ARM_ARCH_7A__
-// Generated by Apple Swift version 5.1.2 effective-4.2 (swiftlang-1100.0.278 clang-1100.0.33.9)
+// Generated by Apple Swift version 5.2 (swiftlang-1103.0.32.1 clang-1103.0.32.29)
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wgcc-compat"
 
@@ -496,6 +501,11 @@ typedef unsigned int swift_uint4  __attribute__((__ext_vector_type__(4)));
 #else
 # define SWIFT_NOESCAPE
 #endif
+#if __has_attribute(ns_consumed)
+# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed))
+#else
+# define SWIFT_RELEASES_ARGUMENT
+#endif
 #if __has_attribute(warn_unused_result)
 # define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
 #else
@@ -646,7 +656,7 @@ SWIFT_CLASS("_TtC13O2OA_Auth_SDK10O2AppModel")
 SWIFT_CLASS("_TtC13O2OA_Auth_SDK9O2AuthSDK")
 @interface O2AuthSDK : NSObject
 - (nonnull instancetype)init SWIFT_UNAVAILABLE;
-+ (nonnull instancetype)new SWIFT_DEPRECATED_MSG("-init is unavailable");
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
 @end
 
 

BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Info.plist


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/arm.swiftsourceinfo


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/arm64.swiftsourceinfo


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/armv7-apple-ios.swiftsourceinfo


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/armv7.swiftsourceinfo


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/i386-apple-ios-simulator.swiftsourceinfo


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/i386.swiftsourceinfo


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/x86_64-apple-ios-simulator.swiftsourceinfo


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/x86_64.swiftsourceinfo


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/arm.swiftdoc


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/arm.swiftmodule


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/arm64-apple-ios.swiftdoc


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/arm64-apple-ios.swiftmodule


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/arm64.swiftdoc


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/arm64.swiftmodule


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/armv7-apple-ios.swiftdoc


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/armv7-apple-ios.swiftmodule


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/armv7.swiftdoc


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/armv7.swiftmodule


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/i386-apple-ios-simulator.swiftdoc


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/i386-apple-ios-simulator.swiftmodule


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/i386.swiftdoc


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/i386.swiftmodule


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/x86_64-apple-ios-simulator.swiftdoc


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/x86_64-apple-ios-simulator.swiftmodule


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/x86_64.swiftdoc


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/x86_64.swiftmodule


BIN
o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/O2OA_Auth_SDK


+ 0 - 0
o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins--/image_picker.framework/Headers/ImagePickerPlugin.h → o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/image_picker.framework/Headers/ImagePickerPlugin.h


+ 0 - 0
o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins--/image_picker.framework/Headers/image_picker-umbrella.h → o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/image_picker.framework/Headers/image_picker-umbrella.h


+ 0 - 0
o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins--/image_picker.framework/Info.plist → o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/image_picker.framework/Info.plist


+ 0 - 0
o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins--/image_picker.framework/Modules/module.modulemap → o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/image_picker.framework/Modules/module.modulemap


BIN
o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins--/image_picker.framework/image_picker → o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/image_picker.framework/image_picker


+ 0 - 0
o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins--/path_provider.framework/Headers/PathProviderPlugin.h → o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/path_provider.framework/Headers/PathProviderPlugin.h


+ 0 - 0
o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins--/path_provider.framework/Headers/path_provider-umbrella.h → o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/path_provider.framework/Headers/path_provider-umbrella.h


+ 0 - 0
o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins--/path_provider.framework/Info.plist → o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/path_provider.framework/Info.plist


+ 0 - 0
o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins--/path_provider.framework/Modules/module.modulemap → o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/path_provider.framework/Modules/module.modulemap


BIN
o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins--/path_provider.framework/path_provider → o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/path_provider.framework/path_provider


+ 0 - 0
o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins--/shared_preferences.framework/Headers/SharedPreferencesPlugin.h → o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/shared_preferences.framework/Headers/SharedPreferencesPlugin.h


+ 0 - 0
o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins--/shared_preferences.framework/Headers/shared_preferences-umbrella.h → o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/shared_preferences.framework/Headers/shared_preferences-umbrella.h


+ 0 - 0
o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins--/shared_preferences.framework/Info.plist → o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/shared_preferences.framework/Info.plist


+ 0 - 0
o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins--/shared_preferences.framework/Modules/module.modulemap → o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/shared_preferences.framework/Modules/module.modulemap


BIN
o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins--/shared_preferences.framework/shared_preferences → o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/shared_preferences.framework/shared_preferences


BIN
o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins/image_picker.framework/image_picker


BIN
o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins/path_provider.framework/path_provider


BIN
o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins/shared_preferences.framework/shared_preferences


+ 1 - 1
o2ios/O2Platform/config/config.swift

@@ -10,7 +10,7 @@ import Foundation
 
 
 //是否连接到collect服务器 直连版本false 需要在Info.plist配置服务器信息
-let O2IsConnect2Collect = false
+let O2IsConnect2Collect = true
 
 //一些常量
 //bugly

+ 2 - 2
o2ios/Podfile

@@ -46,7 +46,7 @@ target 'O2Platform' do
     # UserDefaults加强
     pod 'SwiftyUserDefaults', '~>3.0'
     # json
-    pod 'HandyJSON', '~> 5.0.0'
+    pod 'HandyJSON', '~> 5.0.2-beta'
     pod 'SwiftyJSON', '~>3.1'
     # reactive
     pod 'ReactiveSwift', '~> 5.0'
@@ -58,7 +58,7 @@ target 'O2Platform' do
     pod 'SDWebImage', '~>4.0'
     
     pod 'BSImagePicker'
-    pod 'Eureka'
+    pod 'Eureka', '~> 5.2.1'
     pod 'SwiftyTimer'
 
     pod 'Charts'

+ 7 - 7
o2ios/Podfile.lock

@@ -24,12 +24,12 @@ PODS:
   - CocoaLumberjack/Swift (3.5.3):
     - CocoaLumberjack/Core
   - EmptyDataSet-Swift (5.0.0)
-  - Eureka (4.3.0)
+  - Eureka (5.2.1)
   - FMDB (2.6.2):
     - FMDB/standard (= 2.6.2)
   - FMDB/standard (2.6.2)
   - FSCalendar (2.8.0)
-  - HandyJSON (5.0.0)
+  - HandyJSON (5.0.2-beta)
   - ImageSlideshow (1.7.0):
     - ImageSlideshow/Core (= 1.7.0)
   - ImageSlideshow/Alamofire (1.7.0):
@@ -92,10 +92,10 @@ DEPENDENCIES:
   - Chrysan
   - CocoaLumberjack/Swift (~> 3.5)
   - EmptyDataSet-Swift (~> 5.0.0)
-  - Eureka
+  - Eureka (~> 5.2.1)
   - FMDB (~> 2.6.2)
   - FSCalendar
-  - HandyJSON (~> 5.0.0)
+  - HandyJSON (~> 5.0.2-beta)
   - ImageSlideshow (~> 1.5)
   - ImageSlideshow/Alamofire
   - IQKeyboardManagerSwift
@@ -193,10 +193,10 @@ SPEC CHECKSUMS:
   Chrysan: 6bf6682adb2db76f7f5c103930a8c6670f54eebe
   CocoaLumberjack: 2f44e60eb91c176d471fdba43b9e3eae6a721947
   EmptyDataSet-Swift: eb382c0c87a2d9c678077385a595cec52da38171
-  Eureka: 6d711cb30ca333b4bc893110285a722ae3840114
+  Eureka: c883105488e05bc65539f583246ecf9657cabbfe
   FMDB: 854a0341b4726e53276f2a8996f06f1b80f9259a
   FSCalendar: 3a5ed3636e2ba1b83ebebfcf0c2603105a6f5efe
-  HandyJSON: 992f2d661716d6a91de82d0056927bc7813b5770
+  HandyJSON: e18b035d60cb4847c609a59bb831c5db8c549663
   ImageSlideshow: f8eec5e37a980f60923b585ff23b0e140fd24018
   IQKeyboardManagerSwift: b07ccf9d8cafe993dcd6cb794eb4ba34611a0c4e
   JCore: 1a426120b510cdebfd67b82bfb9483238ee09413
@@ -224,6 +224,6 @@ SPEC CHECKSUMS:
   YHPhotoKit: e88368af1fca0a110d41b88417088f7e49876981
   YHPopupView: 96d9c05c79a2a17cf69c3def09e5305cfae9e8e8
 
-PODFILE CHECKSUM: d1360080e7994d58c830e43b2e9d56aa35f3e3e6
+PODFILE CHECKSUM: db8bd463f4a5f9d40d99734694cef3178373900d
 
 COCOAPODS: 1.8.4

+ 1 - 0
o2server/.gitignore

@@ -0,0 +1 @@
+/x_teamwork_assemble_control/src/main/webapp/describe/

+ 10 - 0
o2server/configSample/externalDataSources.json

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

+ 10 - 0
o2server/configSample/externalDataSources_db2.json

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

+ 10 - 0
o2server/configSample/externalDataSources_dm.json

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

+ 10 - 0
o2server/configSample/externalDataSources_informix.json

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

+ 10 - 0
o2server/configSample/externalDataSources_kingbase.json

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

+ 10 - 0
o2server/configSample/externalDataSources_mysql.json

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

+ 10 - 0
o2server/configSample/externalDataSources_oracle.json

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

+ 10 - 0
o2server/configSample/externalDataSources_postgresql.json

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

+ 10 - 0
o2server/configSample/externalDataSources_sqlserver.json

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

+ 290 - 0
o2server/configSample/externalStorageSources.json

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

+ 1 - 1
o2server/configSample/messages.json

@@ -3,7 +3,7 @@
     "consumers": [],
     "consumersV2": {
       "qiyeweixin": "excute",
-      "describe": "excute表示脚本messageRule.js中的方法名称,该js文件需放在与messages.json同目录下,更改脚本需重启服务"
+      "describe": "excute表示脚本messageSendRule.js中的方法名称,该js文件需放在与messages.json同目录下,更改脚本需重启服务"
     }
   },
   "attachment_editor": {

+ 4 - 3
o2server/configSample/node_127.0.0.1.json

@@ -150,7 +150,7 @@
     "enable": false,
     "cron": "",
     "path": "",
-    "###enable": "是否启用,默认每天凌晨2点进行备份.###",
+    "###enable": "是否启用.###",
     "###cron": "定时任务cron表达式###",
     "###path": "恢复路径###"
   },
@@ -158,7 +158,7 @@
     "enable": false,
     "cron": "",
     "path": "",
-    "###enable": "是否启用,默认每天凌晨2点进行备份.###",
+    "###enable": "是否启用.###",
     "###cron": "定时任务cron表达式###",
     "###path": "恢复路径###"
   },
@@ -186,5 +186,6 @@
   "###nodeAgentEncrypt": "是否启用节点代理加密###",
   "###quickStartWebApp": "是否使用快速应用部署###",
   "###banner": "服务器控制台启动标识###",
-  "###autoStart": "是否自动启动###"
+  "###autoStart": "是否自动启动###",
+  "###eraseContentEnable": "是否允许使用擦除数据功能###"
 }

+ 2 - 2
o2server/configSample/processPlatform.json

@@ -25,7 +25,7 @@
     "###enable": "是否启用###",
     "###cron": "定时cron表达式###"
   },
-  "dataMerge": {
+  "combine": {
     "enable": false,
     "cron": "30 30 6 * * ?",
     "thresholdDays": 730.0,
@@ -66,7 +66,7 @@
   "###urge": "催办任务设置,发现即将过期时发送提醒消息.###",
   "###expire": "将已经过了截至时间的待办标记过期.###",
   "###touchDelay": "延时任务设置,定时触发延时任务,当超过延时时间后继续流转.###",
-  "###dataMerge": "合并任务设置,定时触发合并任务,将已完成工作的Data从Item表中提取合并到WorkCompleted的Data字段中,默认工作完成后2年开始进行合并.###",
+  "###combine": "合并任务设置,定时触发合并任务,将已完成工作的Data从Item表中提取合并到WorkCompleted的Data字段中,默认工作完成后2年开始进行合并.###",
   "###deleteDraft": "清除草稿状态的工作.###",
   "###passExpired": "超时工作路由设置.###",
   "###touchDetained": "触发长时间未处理的工作.###",

+ 1 - 1
o2server/start_linux.sh

@@ -1,4 +1,4 @@
-current_dir=$(cd "$(dirname "$0")"; pwd);
+current_dir=$(cd "$(dirname "$0")"; pwd);
 if [ -d ${current_dir}/local/update ]; then
 	if [ ! -d ${current_dir}/commons ]; then
 	mkdir ${current_dir}/commons

+ 2 - 3
o2server/x_attendance_assemble_control/src/main/webapp/jest/describe.js

@@ -971,8 +971,7 @@ Describe.prototype = {
 								})
 								
 								debugger;
-							$('#Sample').html("<div style=\"border-bottom:1px solid #E6E6E6;padding-bottom: 40px;line-height:21px\"><span style=\"font-size:17px;font-weight:bold;color: #1E7ACE;\">\n平台推荐脚本样例</span>\n\n"+ Describe.createSampleCommon(m,j.name)+ "</div><div style=\"border-bottom:1px solid #E6E6E6;padding-bottom: 40px;line-height:21px\"><span style=\"font-size:17px;font-weight:bold;\">\n前台脚本样例</span>\n\n"+ Describe.createSampleJSO2(m)+ "</div><div  style=\"border-bottom:1px solid #E6E6E6;padding-bottom: 40px;line-height:21px\"><span style=\"font-size:17px;font-weight:bold;\">\n\n后台脚本样例</span>\n\n" + Describe.createSampleO2(m) + "</div><div  style=\"border-bottom:1px solid #E6E6E6;padding-bottom: 40px;line-height:21px\"><span style=\"font-size:17px;font-weight:bold;\">\n\nmootools样例</span>\n\n"+Describe.createSampleMootools(m)+"</div><div  style=\"line-height:21px\"><span style=\"font-size:17px;font-weight:bold;\">\n\njquery样例</span>\n\n<span style=\"\">"+ Describe.createSample(m)+"</span></div>");
-
+								$('#Sample').html("<div style=\"border-bottom:1px solid #E6E6E6;padding-bottom: 40px;line-height:21px\"><span style=\"font-size:17px;font-weight:bold;color: #1E7ACE;\">\n平台推荐脚本样例</span>\n\n"+ Describe.createSampleCommon(m,j.name)+ "</div><div  style=\"border-bottom:1px solid #E6E6E6;padding-bottom: 40px;line-height:21px\"><span style=\"font-size:17px;font-weight:bold;\">\n\n后台脚本样例</span>\n\n" + Describe.createSampleO2(m) + "</div><div  style=\"line-height:21px\"><span style=\"font-size:17px;font-weight:bold;\">\n\njquery样例</span>\n\n<span style=\"\">"+ Describe.createSample(m)+"</span></div>");
 							});
 				});
 			});
@@ -1319,7 +1318,7 @@ Describe.prototype = {
 								})
 								
 								debugger;
-							$('#Sample').html("<div style=\"border-bottom:1px solid #E6E6E6;padding-bottom: 40px;line-height:21px\"><span style=\"font-size:17px;font-weight:bold;color: #1E7ACE;\">\n平台推荐脚本样例</span>\n\n"+ Describe.createSampleCommon(m,j.name)+ "</div><div style=\"border-bottom:1px solid #E6E6E6;padding-bottom: 40px;line-height:21px\"><span style=\"font-size:17px;font-weight:bold;\">\n前台脚本样例</span>\n\n"+ Describe.createSampleJSO2(m)+ "</div><div  style=\"border-bottom:1px solid #E6E6E6;padding-bottom: 40px;line-height:21px\"><span style=\"font-size:17px;font-weight:bold;\">\n\n后台脚本样例</span>\n\n" + Describe.createSampleO2(m) + "</div><div  style=\"border-bottom:1px solid #E6E6E6;padding-bottom: 40px;line-height:21px\"><span style=\"font-size:17px;font-weight:bold;\">\n\nmootools样例</span>\n\n"+Describe.createSampleMootools(m)+"</div><div  style=\"line-height:21px\"><span style=\"font-size:17px;font-weight:bold;\">\n\njquery样例</span>\n\n<span style=\"\">"+ Describe.createSample(m)+"</span></div>");
+								$('#Sample').html("<div style=\"border-bottom:1px solid #E6E6E6;padding-bottom: 40px;line-height:21px\"><span style=\"font-size:17px;font-weight:bold;color: #1E7ACE;\">\n平台推荐脚本样例</span>\n\n"+ Describe.createSampleCommon(m,j.name)+ "</div><div  style=\"border-bottom:1px solid #E6E6E6;padding-bottom: 40px;line-height:21px\"><span style=\"font-size:17px;font-weight:bold;\">\n\n后台脚本样例</span>\n\n" + Describe.createSampleO2(m) + "</div><div  style=\"line-height:21px\"><span style=\"font-size:17px;font-weight:bold;\">\n\njquery样例</span>\n\n<span style=\"\">"+ Describe.createSample(m)+"</span></div>");
 							});
 				});
 			});

+ 2 - 0
o2server/x_base_core_project/pom.xml

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

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

@@ -541,25 +541,13 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 
 	public <T extends JpaObject, W extends Object> List<T> listBetweenAndEqual(Class<T> cls, String attribute,
 			Object start, Object end, String equalAttribute, Object equalValue) throws Exception {
-		Comparable s = (Comparable) start;
-		Comparable e = (Comparable) end;
 		EntityManager em = this.get(cls);
-		CriteriaBuilder cb = em.getCriteriaBuilder();
-		CriteriaQuery<T> cq = cb.createQuery(cls);
-		Root<T> root = cq.from(cls);
-		Predicate p = cb.between(root.get(attribute), s, e);
-		p = cb.and(p, cb.equal(root.get(equalAttribute), equalValue));
-		cq.select(root).where(p);
-		List<T> os = em.createQuery(cq).getResultList();
-		List<T> list = new ArrayList<>(os);
-		return list;
-		// Query query = em.createQuery("select o from " + cls.getName() + " o where
-		// ((o." + attribute
-		// + " between ?1 and ?2) and (o." + equalAttribute + " = ?3))");
-		// query.setParameter(1, start);
-		// query.setParameter(2, end);
-		// query.setParameter(3, equalValue);
-		// return new ArrayList<T>(query.getResultList());
+		Query query = em.createQuery("select o from " + cls.getName() + " o where ((o." + attribute
+				+ " between ?1 and ?2) and (o." + equalAttribute + " = ?3))");
+		query.setParameter(1, start);
+		query.setParameter(2, end);
+		query.setParameter(3, equalValue);
+		return new ArrayList<T>(query.getResultList());
 	}
 
 	public <T extends JpaObject> List<T> listNotEqual(Class<T> cls, String attribute, Object value) throws Exception {

+ 3 - 3
o2server/x_base_core_project/src/main/java/com/x/base/core/project/build/CreateVersionFile.java → o2server/x_base_core_project/src/main/java/com/x/base/core/project/build/CreateVersion.java

@@ -13,11 +13,11 @@ import org.apache.commons.io.FileUtils;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
 
-public class CreateVersionFile {
+public class CreateVersion {
 	public static void main(String... args) throws Exception {
 		File base = new File(args[0]);
-		File file = new File(base, "../version.o2");
-		File pom = new File(base, "../pom.xml");
+		File file = new File(base, "version.o2");
+		File pom = new File(base, "pom.xml");
 
 		MavenXpp3Reader reader = new MavenXpp3Reader();
 		Model model = reader.read(new FileReader(pom));

+ 45 - 44
o2server/x_base_core_project/src/main/java/com/x/base/core/project/build/PackageO2server.java

@@ -29,50 +29,51 @@ public class PackageO2server {
 		createO2Version(base.getAbsolutePath());
 		CreateConfigSample.main(base.getAbsolutePath());
 		CreateLocalSample.main(base.getAbsolutePath());
-		File file = new File(base, "o2server.zip");
-		FileUtils.forceMkdir(new File(base.getAbsolutePath(), "servers"));
-		try (ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(file))) {
-			compress(outputStream, base.getAbsolutePath(), "configSample");
-			compress(outputStream, base.getAbsolutePath(), "jvm");
-			compress(outputStream, base.getAbsolutePath(), "commons");
-			compress(outputStream, base.getAbsolutePath(), "store");
-			compress(outputStream, base.getAbsolutePath(), "localSample");
-			compress(outputStream, base.getAbsolutePath(), "servers");
-			compress(outputStream, base.getAbsolutePath(), "console.jar");
-			compress(outputStream, base.getAbsolutePath(), "index.html");
-			compress(outputStream, base.getAbsolutePath(), "service_windows.bat");
-			compress(outputStream, base.getAbsolutePath(), "start_windows.bat");
-			compress(outputStream, base.getAbsolutePath(), "start_windows_debug.bat");
-			compress(outputStream, base.getAbsolutePath(), "stop_windows.bat");
-			compress(outputStream, base.getAbsolutePath(), "console_windows.bat");
-			compress(outputStream, base.getAbsolutePath(), "start_linux.sh");
-			compress(outputStream, base.getAbsolutePath(), "start_linux_debug.sh");
-			compress(outputStream, base.getAbsolutePath(), "stop_linux.sh");
-			compress(outputStream, base.getAbsolutePath(), "console_linux.sh");
-			compress(outputStream, base.getAbsolutePath(), "start_macos.sh");
-			compress(outputStream, base.getAbsolutePath(), "start_macos_debug.sh");
-			compress(outputStream, base.getAbsolutePath(), "stop_macos.sh");
-			compress(outputStream, base.getAbsolutePath(), "console_macos.sh");
-			compress(outputStream, base.getAbsolutePath(), "start_aix.sh");
-			compress(outputStream, base.getAbsolutePath(), "start_aix_debug.sh");
-			compress(outputStream, base.getAbsolutePath(), "stop_aix.sh");
-			compress(outputStream, base.getAbsolutePath(), "console_aix.sh");
-			compress(outputStream, base.getAbsolutePath(), "start_raspberrypi.sh");
-			compress(outputStream, base.getAbsolutePath(), "start_raspberrypi_debug.sh");
-			compress(outputStream, base.getAbsolutePath(), "stop_raspberrypi.sh");
-			compress(outputStream, base.getAbsolutePath(), "console_raspberrypi.sh");
-			compress(outputStream, base.getAbsolutePath(), "start_neokylin_loongson.sh");
-			compress(outputStream, base.getAbsolutePath(), "start_neokylin_loongson_debug.sh");
-			compress(outputStream, base.getAbsolutePath(), "stop_neokylin_loongson.sh");
-			compress(outputStream, base.getAbsolutePath(), "console_neokylin_loongson.sh");
-			compress(outputStream, base.getAbsolutePath(), "start_kylinos_phytium.sh");
-			compress(outputStream, base.getAbsolutePath(), "start_kylinos_phytium_debug.sh");
-			compress(outputStream, base.getAbsolutePath(), "stop_kylinos_phytium.sh");
-			compress(outputStream, base.getAbsolutePath(), "console_kylinos_phytium.sh");
-			compress(outputStream, base.getAbsolutePath(), "version.o2");
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
+		CreateVersion.main(base.getAbsolutePath());
+		// File file = new File(base, "o2server.zip");
+		// FileUtils.forceMkdir(new File(base.getAbsolutePath(), "servers"));
+		// try (ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(file))) {
+		// 	compress(outputStream, base.getAbsolutePath(), "configSample");
+		// 	compress(outputStream, base.getAbsolutePath(), "jvm");
+		// 	compress(outputStream, base.getAbsolutePath(), "commons");
+		// 	compress(outputStream, base.getAbsolutePath(), "store");
+		// 	compress(outputStream, base.getAbsolutePath(), "localSample");
+		// 	compress(outputStream, base.getAbsolutePath(), "servers");
+		// 	compress(outputStream, base.getAbsolutePath(), "console.jar");
+		// 	compress(outputStream, base.getAbsolutePath(), "index.html");
+		// 	compress(outputStream, base.getAbsolutePath(), "service_windows.bat");
+		// 	compress(outputStream, base.getAbsolutePath(), "start_windows.bat");
+		// 	compress(outputStream, base.getAbsolutePath(), "start_windows_debug.bat");
+		// 	compress(outputStream, base.getAbsolutePath(), "stop_windows.bat");
+		// 	compress(outputStream, base.getAbsolutePath(), "console_windows.bat");
+		// 	compress(outputStream, base.getAbsolutePath(), "start_linux.sh");
+		// 	compress(outputStream, base.getAbsolutePath(), "start_linux_debug.sh");
+		// 	compress(outputStream, base.getAbsolutePath(), "stop_linux.sh");
+		// 	compress(outputStream, base.getAbsolutePath(), "console_linux.sh");
+		// 	compress(outputStream, base.getAbsolutePath(), "start_macos.sh");
+		// 	compress(outputStream, base.getAbsolutePath(), "start_macos_debug.sh");
+		// 	compress(outputStream, base.getAbsolutePath(), "stop_macos.sh");
+		// 	compress(outputStream, base.getAbsolutePath(), "console_macos.sh");
+		// 	compress(outputStream, base.getAbsolutePath(), "start_aix.sh");
+		// 	compress(outputStream, base.getAbsolutePath(), "start_aix_debug.sh");
+		// 	compress(outputStream, base.getAbsolutePath(), "stop_aix.sh");
+		// 	compress(outputStream, base.getAbsolutePath(), "console_aix.sh");
+		// 	compress(outputStream, base.getAbsolutePath(), "start_raspberrypi.sh");
+		// 	compress(outputStream, base.getAbsolutePath(), "start_raspberrypi_debug.sh");
+		// 	compress(outputStream, base.getAbsolutePath(), "stop_raspberrypi.sh");
+		// 	compress(outputStream, base.getAbsolutePath(), "console_raspberrypi.sh");
+		// 	compress(outputStream, base.getAbsolutePath(), "start_neokylin_loongson.sh");
+		// 	compress(outputStream, base.getAbsolutePath(), "start_neokylin_loongson_debug.sh");
+		// 	compress(outputStream, base.getAbsolutePath(), "stop_neokylin_loongson.sh");
+		// 	compress(outputStream, base.getAbsolutePath(), "console_neokylin_loongson.sh");
+		// 	compress(outputStream, base.getAbsolutePath(), "start_kylinos_phytium.sh");
+		// 	compress(outputStream, base.getAbsolutePath(), "start_kylinos_phytium_debug.sh");
+		// 	compress(outputStream, base.getAbsolutePath(), "stop_kylinos_phytium.sh");
+		// 	compress(outputStream, base.getAbsolutePath(), "console_kylinos_phytium.sh");
+		// 	compress(outputStream, base.getAbsolutePath(), "version.o2");
+		// } catch (IOException e) {
+		// 	e.printStackTrace();
+		// }
 	}
 
 	public static void compress(ZipOutputStream outputStream, String base, String path) throws Exception {

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

@@ -13,20 +13,22 @@ import java.util.concurrent.LinkedBlockingQueue;
 import javax.naming.InitialContext;
 import javax.ws.rs.core.MediaType;
 
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.FilenameUtils;
-import org.apache.commons.io.filefilter.WildcardFileFilter;
-import org.apache.commons.lang3.BooleanUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.eclipse.jetty.http.MimeTypes;
-
 import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
 import com.x.base.core.project.x_program_center;
+import com.x.base.core.project.gson.XGsonBuilder;
 import com.x.base.core.project.tools.BaseTools;
 import com.x.base.core.project.tools.DefaultCharset;
 import com.x.base.core.project.tools.Host;
 import com.x.base.core.project.tools.NumberTools;
 
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.io.filefilter.WildcardFileFilter;
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.eclipse.jetty.http.MimeTypes;
+
 public class Config {
 
 	private static Config INSTANCE;
@@ -449,7 +451,13 @@ public class Config {
 		if (null == instance().version) {
 			synchronized (Config.class) {
 				if (null == instance().version) {
-					instance().version = BaseTools.readCfg(PATH_VERSION);
+					String text = BaseTools.readString(PATH_VERSION);
+					if (XGsonBuilder.isJsonObject(text)) {
+						JsonObject obj = XGsonBuilder.instance().fromJson(text, JsonObject.class);
+						instance().version = obj.get("version").getAsString();
+					} else {
+						instance().version = text;
+					}
 				}
 			}
 		}

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

@@ -21,7 +21,7 @@ public class Messages extends ConcurrentSkipListMap<String, Message> {
 		/* 示例 */
 		Map<String,String> map = new HashMap<>();
 		map.put(MessageConnector.CONSUME_QIYEWEIXIN, "excute");
-		map.put("describe","excute表示脚本messageRule.js中的方法名称,该js文件需放在与messages.json同目录下,更改脚本需重启服务");
+		map.put("describe","excute表示脚本messageSendRule.js中的方法名称,该js文件需放在与messages.json同目录下,更改脚本需重启服务");
 		o.put("##sample##", new Message(map));
 
 		/* 文件通知 */

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

@@ -1,12 +1,11 @@
 package com.x.base.core.project.config;
 
-import org.apache.commons.lang3.BooleanUtils;
-import org.apache.commons.lang3.StringUtils;
-
 import com.x.base.core.project.annotation.FieldDescribe;
-import com.x.base.core.project.tools.BaseTools;
 import com.x.base.core.project.tools.DateTools;
 
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.StringUtils;
+
 public class Node extends ConfigObject {
 
 	public static final Integer default_nodeAgentPort = 20010;
@@ -75,6 +74,8 @@ public class Node extends ConfigObject {
 	private String banner;
 	@FieldDescribe("是否自动启动")
 	private Boolean autoStart;
+	@FieldDescribe("是否允许使用擦除数据功能")
+	private Boolean eraseContentEnable;
 
 	/* 20191009兼容centerServer */
 	protected void setCenter(CenterServer centerServer) {
@@ -82,6 +83,11 @@ public class Node extends ConfigObject {
 	}
 	/* 20191009兼容centerServer end */
 
+ 
+	public Boolean getEraseContentEnable() {
+		return BooleanUtils.isNotFalse(eraseContentEnable);
+	}
+
 	public Boolean autoStart() {
 		return BooleanUtils.isNotFalse(autoStart);
 	}
@@ -186,7 +192,7 @@ public class Node extends ConfigObject {
 		}
 
 		public boolean available() {
-			return DateTools.cronAvailable(this.cron);
+			return DateTools.cronAvailable(this.cron());
 		}
 
 		@FieldDescribe("是否启用,默认每天凌晨2点进行备份.")
@@ -226,7 +232,7 @@ public class Node extends ConfigObject {
 		}
 
 		public boolean available() {
-			return DateTools.cronAvailable(this.cron);
+			return DateTools.cronAvailable(this.cron());
 		}
 
 		@FieldDescribe("是否启用,默认每天凌晨4点进行备份.")
@@ -269,7 +275,7 @@ public class Node extends ConfigObject {
 			return DateTools.cronAvailable(this.cron) && StringUtils.isNotEmpty(this.path);
 		}
 
-		@FieldDescribe("是否启用,默认每天凌晨2点进行备份.")
+		@FieldDescribe("是否启用.")
 		private Boolean enable = false;
 
 		@FieldDescribe("定时任务cron表达式")
@@ -302,7 +308,7 @@ public class Node extends ConfigObject {
 			return DateTools.cronAvailable(this.cron) && StringUtils.isNotEmpty(this.path);
 		}
 
-		@FieldDescribe("是否启用,默认每天凌晨2点进行备份.")
+		@FieldDescribe("是否启用.")
 		private Boolean enable = false;
 
 		@FieldDescribe("定时任务cron表达式")
@@ -325,4 +331,6 @@ public class Node extends ConfigObject {
 
 	}
 
+
+
 }

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

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

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

@@ -2,7 +2,6 @@ package com.x.base.core.project.executor;
 
 import java.util.Objects;
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 import java.util.zip.CRC32;
 
 import com.x.base.core.project.config.Config;
@@ -41,7 +40,7 @@ public class ProcessPlatformExecutorFactory {
 		}
 		CRC32 crc32 = new CRC32();
 		crc32.update(Objects.toString(seed, "").getBytes());
-		int idx = (int) (crc32.getValue() % executors.length);
+		int idx = (int) (Math.abs(crc32.getValue()) % executors.length);
 		return executors[idx];
 	}
 

+ 23 - 3
o2server/x_base_core_project/src/main/java/com/x/base/core/project/gson/XGsonBuilder.java

@@ -151,13 +151,33 @@ public class XGsonBuilder {
 		return instance().fromJson(element, cls);
 	}
 
-	public static boolean isJson(String json) {
+	public static boolean isJsonObject(String json) {
 		if (StringUtils.isBlank(json)) {
 			return false;
 		}
 		try {
-			new JsonParser().parse(json);
-			return true;
+			JsonElement jsonElement = new JsonParser().parse(json);
+			if (jsonElement.isJsonObject()){
+				return true;
+			} else {
+				return false;
+			}
+		} catch (JsonParseException e) {
+			return false;
+		}
+	}
+
+	public static boolean isJsonArray(String json) {
+		if (StringUtils.isBlank(json)) {
+			return false;
+		}
+		try {
+			JsonElement jsonElement = new JsonParser().parse(json);
+			if (jsonElement.isJsonArray()){
+				return true;
+			} else {
+				return false;
+			}
 		} catch (JsonParseException e) {
 			return false;
 		}

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

@@ -2,6 +2,7 @@ package com.x.base.core.project.http;
 
 import java.net.URLDecoder;
 import java.util.Date;
+import java.util.Enumeration;
 import java.util.Objects;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -74,7 +75,7 @@ public class HttpToken {
 			}
 			Date date = DateUtils.parseDate(matcher.group(2), DateTools.formatCompact_yyyyMMddHHmmss);
 			TokenType tokenType = TokenType.valueOf(matcher.group(1));
-			long diff = (new Date().getTime() - date.getTime());
+			long diff = (System.currentTimeMillis() - date.getTime());
 			diff = Math.abs(diff);
 			if (TokenType.user.equals(tokenType) || TokenType.manager.equals(tokenType)) {
 				if (diff > (60000L * Config.person().getTokenExpiredMinutes())) {
@@ -111,20 +112,20 @@ public class HttpToken {
 	public void setToken(HttpServletRequest request, HttpServletResponse response, EffectivePerson effectivePerson)
 			throws Exception {
 		switch (effectivePerson.getTokenType()) {
-		case anonymous:
-			// this.deleteToken(request, response);
-			break;
-		case user:
-			this.setResponseToken(request, response, effectivePerson);
-			break;
-		case manager:
-			this.setResponseToken(request, response, effectivePerson);
-			break;
-		case cipher:
-			this.deleteToken(request, response);
-			break;
-		default:
-			break;
+			case anonymous:
+				// this.deleteToken(request, response);
+				break;
+			case user:
+				this.setResponseToken(request, response, effectivePerson);
+				break;
+			case manager:
+				this.setResponseToken(request, response, effectivePerson);
+				break;
+			case cipher:
+				this.deleteToken(request, response);
+				break;
+			default:
+				break;
 		}
 	}
 
@@ -139,27 +140,27 @@ public class HttpToken {
 
 	public String getToken(HttpServletRequest request) throws Exception {
 		String token = null;
-		if (null != request.getCookies()) {
-			for (Cookie c : request.getCookies()) {
-				if (StringUtils.equals(X_Token, c.getName())) {
-					token = c.getValue();
-					break;
-				}
-			}
-		}
+		token = URLTools.getQueryStringParameter(request.getQueryString(), X_Token);
 		if (StringUtils.isEmpty(token)) {
 			token = request.getHeader(X_Token);
 		}
 		if (StringUtils.isEmpty(token)) {
-			token = request.getHeader(X_Authorization);
+			if (null != request.getCookies()) {
+				for (Cookie c : request.getCookies()) {
+					if (StringUtils.equals(X_Token, c.getName())) {
+						token = c.getValue();
+						break;
+					}
+				}
+			}
 		}
 		if (StringUtils.isEmpty(token)) {
-			token = URLTools.getQueryStringParameter(request.getQueryString(), X_Token);
+			token = request.getHeader(X_Authorization);
 		}
 		// 此代码将导致input被关闭.
-//		if (StringUtils.isEmpty(token)) {
-//			token = request.getParameter(X_Token);
-//		}
+		// if (StringUtils.isEmpty(token)) {
+		// token = request.getParameter(X_Token);
+		// }
 		return token;
 	}
 

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

@@ -1,9 +1,7 @@
 package com.x.base.core.project.jaxrs;
 
 import java.lang.reflect.Constructor;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
+import java.util.*;
 import java.util.Map.Entry;
 
 import javax.persistence.EntityManager;
@@ -14,6 +12,7 @@ import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 import javax.persistence.criteria.Selection;
+import javax.servlet.http.HttpServletRequest;
 
 import org.apache.commons.beanutils.PropertyUtils;
 import org.apache.commons.collections4.map.ListOrderedMap;
@@ -1244,4 +1243,27 @@ public abstract class StandardJaxrsAction extends AbstractJaxrsAction {
 		return em.createQuery(cq.select(cb.count(root)).where(predicate)).getSingleResult();
 	}
 
+	/**
+	 * 将request参数值转为json
+	 */
+	public String request2Json(HttpServletRequest request) {
+		Map<String,String> map = new HashMap<>();
+		Enumeration paramNames = request.getParameterNames();
+		while (paramNames.hasMoreElements()) {
+			String paramName = (String) paramNames.nextElement();
+			String[] pv = request.getParameterValues(paramName);
+			StringBuilder sb = new StringBuilder();
+			for (int i = 0; i < pv.length; i++) {
+				if (pv[i].length() > 0) {
+					if (i > 0) {
+						sb.append(",");
+					}
+					sb.append(pv[i]);
+				}
+			}
+			map.put(paramName, sb.toString());
+		}
+		return gson.toJson(map);
+	}
+
 }

+ 5 - 3
o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/Crypto.java

@@ -26,10 +26,12 @@ public class Crypto {
 
 	private final static String DES = "DES";
 	
-	private final static String cipher_init = "DES";
+	//private final static String CIPHER_INIT = "DES";
 
 	private final static String RSA = "RSA";
 
+	//private final static SecureRandom sr = new SecureRandom();
+
 	public static String encrypt(String data, String key) throws Exception {
 		byte[] bt = encrypt(data.getBytes(), key.getBytes());
 		String str = Base64.encodeBase64URLSafeString(bt);
@@ -45,7 +47,7 @@ public class Crypto {
 		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
 		SecretKey securekey = keyFactory.generateSecret(dks);
 		// Cipher对象实际完成加密操作
-		Cipher cipher = Cipher.getInstance(cipher_init);
+		Cipher cipher = Cipher.getInstance(DES);
 		// 用密钥初始化Cipher对象
 		cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);
 		return cipher.doFinal(data);
@@ -70,7 +72,7 @@ public class Crypto {
 		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
 		SecretKey securekey = keyFactory.generateSecret(dks);
 		// Cipher对象实际完成解密操作
-		Cipher cipher = Cipher.getInstance(cipher_init);
+		Cipher cipher = Cipher.getInstance(DES);
 		// 用密钥初始化Cipher对象
 		cipher.init(Cipher.DECRYPT_MODE, securekey, sr);
 		return cipher.doFinal(data);

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

@@ -13,6 +13,7 @@ import java.util.Comparator;
 import java.util.List;
 import java.util.Objects;
 import java.util.Random;
+import java.util.StringTokenizer;
 import java.util.UUID;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -336,25 +337,28 @@ public class StringTools {
 
 	public static boolean matchWildcard(String str, String pattern) {
 		return Objects.toString(str, "").matches(Objects.toString(pattern, "").replace("?", ".?").replace("*", ".*?"));
-//		if (StringUtils.isNotEmpty(str) && StringUtils.isNotEmpty(pattern) && StringUtils.contains(pattern, "*")) {
-//			if (StringUtils.equals(pattern, "*")) {
-//				return true;
-//			}
-//			if (StringUtils.startsWith(pattern, "*")) {
-//				return StringUtils.endsWith(str, StringUtils.substringAfter(pattern, "*"));
-//			}
-//			if (StringUtils.endsWith(pattern, "*")) {
-//				return StringUtils.startsWith(str, StringUtils.substringBeforeLast(pattern, "*"));
-//			}
-//			String[] parts = StringUtils.split(pattern, "*", 2);
-//			if (StringUtils.startsWith(str, parts[0]) && StringUtils.endsWith(str, parts[1])) {
-//				return true;
-//			} else {
-//				return false;
-//			}
-//		} else {
-//			return StringUtils.equals(str, pattern);
-//		}
+		// if (StringUtils.isNotEmpty(str) && StringUtils.isNotEmpty(pattern) &&
+		// StringUtils.contains(pattern, "*")) {
+		// if (StringUtils.equals(pattern, "*")) {
+		// return true;
+		// }
+		// if (StringUtils.startsWith(pattern, "*")) {
+		// return StringUtils.endsWith(str, StringUtils.substringAfter(pattern, "*"));
+		// }
+		// if (StringUtils.endsWith(pattern, "*")) {
+		// return StringUtils.startsWith(str, StringUtils.substringBeforeLast(pattern,
+		// "*"));
+		// }
+		// String[] parts = StringUtils.split(pattern, "*", 2);
+		// if (StringUtils.startsWith(str, parts[0]) && StringUtils.endsWith(str,
+		// parts[1])) {
+		// return true;
+		// } else {
+		// return false;
+		// }
+		// } else {
+		// return StringUtils.equals(str, pattern);
+		// }
 	}
 
 	public static List<String> includesExcludesWithWildcard(List<String> list, Collection<String> includes,
@@ -450,4 +454,66 @@ public class StringTools {
 		return false;
 	}
 
+	// copy from /org/apache/tools/ant/types/Commandline.java
+	public static String[] translateCommandline(String toProcess) throws Exception {
+		if (toProcess == null || toProcess.isEmpty()) {
+			// no command? no string
+			return new String[0];
+		}
+		// parse with a simple finite state machine
+
+		final int normal = 0;
+		final int inQuote = 1;
+		final int inDoubleQuote = 2;
+		int state = normal;
+		final StringTokenizer tok = new StringTokenizer(toProcess, "\"\' ", true);
+		final ArrayList<String> result = new ArrayList<>();
+		final StringBuilder current = new StringBuilder();
+		boolean lastTokenHasBeenQuoted = false;
+
+		while (tok.hasMoreTokens()) {
+			String nextTok = tok.nextToken();
+			switch (state) {
+				case inQuote:
+					if ("\'".equals(nextTok)) {
+						lastTokenHasBeenQuoted = true;
+						state = normal;
+					} else {
+						current.append(nextTok);
+					}
+					break;
+				case inDoubleQuote:
+					if ("\"".equals(nextTok)) {
+						lastTokenHasBeenQuoted = true;
+						state = normal;
+					} else {
+						current.append(nextTok);
+					}
+					break;
+				default:
+					if ("\'".equals(nextTok)) {
+						state = inQuote;
+					} else if ("\"".equals(nextTok)) {
+						state = inDoubleQuote;
+					} else if (" ".equals(nextTok)) {
+						if (lastTokenHasBeenQuoted || current.length() > 0) {
+							result.add(current.toString());
+							current.setLength(0);
+						}
+					} else {
+						current.append(nextTok);
+					}
+					lastTokenHasBeenQuoted = false;
+					break;
+			}
+		}
+		if (lastTokenHasBeenQuoted || current.length() > 0) {
+			result.add(current.toString());
+		}
+		if (state == inQuote || state == inDoubleQuote) {
+			throw new Exception("unbalanced quotes in " + toProcess);
+		}
+		return result.toArray(new String[result.size()]);
+	}
+
 }

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

@@ -9,6 +9,7 @@ import com.x.base.core.project.annotation.ModuleType;
 		"com.x.organization.core.entity.Role", "com.x.organization.core.entity.Person",
 		"com.x.organization.core.entity.Identity", "com.x.organization.core.entity.PersonAttribute",
 		"com.x.organization.core.entity.Unit", "com.x.organization.core.entity.UnitAttribute",
+		"com.x.organization.core.entity.PersonCard","com.x.organization.core.entity.PermissionSetting",
 		"com.x.organization.core.entity.UnitDuty" }, storeJars = { "x_organization_core_entity" })
 public class x_organization_assemble_control extends Deployable {
 }

+ 11 - 2
o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/factory/BBSReplyInfoFactory.java

@@ -64,10 +64,14 @@ public class BBSReplyInfoFactory extends AbstractFactory {
 		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
 		Root<BBSReplyInfo> root = cq.from( BBSReplyInfo.class);
 		Predicate p = cb.equal( root.get( BBSReplyInfo_.subjectId ), subjectId );
+
 		if( !showSubReply ){
-			p = cb.and( p,cb.equal(root.get( BBSReplyInfo_.parentId ), ""));
+			Predicate p_showSubReply = cb.isNull( root.get( BBSReplyInfo_.parentId ));
+			p_showSubReply = cb.or( p_showSubReply, cb.equal( root.get( BBSReplyInfo_.parentId), ""));
+			p = cb.and( p, p_showSubReply);
 		}
 		cq.select( cb.count( root ) );
+//		System.out.println( ">>>>>SQL:" + em.createQuery(cq.where(p)).toString() );
 		return em.createQuery(cq.where(p)).getSingleResult();
 	}
 	
@@ -112,12 +116,17 @@ public class BBSReplyInfoFactory extends AbstractFactory {
 		Root<BBSReplyInfo> root = cq.from( BBSReplyInfo.class );
 		Predicate p = cb.equal( root.get( BBSReplyInfo_.subjectId ), subjectId );
 		if( !showSubReply ){
-			p = cb.and( p, cb.equal(root.get( BBSReplyInfo_.parentId ), ""));
+			Predicate p_showSubReply = cb.isNull( root.get( BBSReplyInfo_.parentId ));
+			p_showSubReply = cb.or( p_showSubReply, cb.equal( root.get( BBSReplyInfo_.parentId), ""));
+			p = cb.and( p, p_showSubReply);
 		}
+
 		cq.orderBy( cb.desc( root.get( BBSReplyInfo_.createTime ) ) );
 		if( maxCount == null ){
+//			System.out.println( ">>>>>SQL:" + em.createQuery(cq.where(p)).toString() );
 			return em.createQuery(cq.where(p)).getResultList();
 		}else{
+//			System.out.println( ">>>>>SQL:" + em.createQuery(cq.where(p)).setMaxResults( maxCount ).toString() );
 			return em.createQuery(cq.where(p)).setMaxResults( maxCount ).getResultList();
 		}
 	}

+ 18 - 4
o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/factory/BBSSubjectInfoFactory.java

@@ -262,12 +262,13 @@ public class BBSSubjectInfoFactory extends AbstractFactory {
 	}
 	
 	//@MethodDescribe( "根据版块ID, 主版块ID,版块ID,创建者姓名查询符合要求所有主题列表,不包括子版块内的主题数量" )
-	public Long countSubjectInSectionForPage( String forumId, String mainSectionId, String sectionId, String creatorName, Boolean needPicture, Boolean isTopSubject, List<String> viewSectionIds ) throws Exception {
+	public Long countSubjectInSectionForPage( String searchTitle, String forumId, String mainSectionId, String sectionId, String creatorName, Boolean needPicture, Boolean isTopSubject, List<String> viewSectionIds ) throws Exception {
 		EntityManager em = this.entityManagerContainer().get(BBSSubjectInfo.class);
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
 		Root<BBSSubjectInfo> root = cq.from(BBSSubjectInfo.class);
 		Predicate p = cb.isNotNull( root.get(BBSSubjectInfo_.id ) );
+
 		if( StringUtils.isNotEmpty( forumId ) ){
 			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.forumId ), forumId));
 		}
@@ -293,12 +294,16 @@ public class BBSSubjectInfoFactory extends AbstractFactory {
 				p = cb.and( p, cb.isFalse( root.get( BBSSubjectInfo_.isTopSubject ) ) );
 			}
 		}
+		if( StringUtils.isNotEmpty( searchTitle ) ){
+			p = cb.and( p, cb.like( root.get( BBSSubjectInfo_.title ), searchTitle ) );
+		}
 		cq.select( cb.count( root ) );
+		//SELECT COUNT(b) FROM BBSSubjectInfo b WHERE ((b.id IS NOT NULL AND b.sectionId IN ('1c1d9dfc-0034-4d9a-adc7-bb4b3925bbd5')) AND b.title LIKE 'Count')
 		return em.createQuery(cq.where(p)).getSingleResult();
 	}
 	
 	//@MethodDescribe( "根据版块ID, 主版块ID,版块ID,创建者姓名查询符合要求所有主题列表,不包括子版块内的主题" )
-	public List<BBSSubjectInfo> listSubjectInSectionForPage( String forumId, String mainSectionId, String sectionId, String creatorName, Boolean needPicture, Boolean isTopSubject, Integer maxRecordCount, List<String> viewSectionIds ) throws Exception {
+	public List<BBSSubjectInfo> listSubjectInSectionForPage( String searchTitle, String forumId, String mainSectionId, String sectionId, String creatorName, Boolean needPicture, Boolean isTopSubject, Integer maxRecordCount, List<String> viewSectionIds ) throws Exception {
 		if( maxRecordCount == null ){
 			throw new Exception( "maxRecordCount is null." );
 		}
@@ -332,6 +337,9 @@ public class BBSSubjectInfoFactory extends AbstractFactory {
 				p = cb.and( p, cb.isFalse( root.get( BBSSubjectInfo_.isTopSubject ) ) );
 			}
 		}
+		if( StringUtils.isNotEmpty( searchTitle ) ){
+			p = cb.and( p, cb.like( root.get( BBSSubjectInfo_.title ), searchTitle ) );
+		}
 		cq.orderBy( cb.desc( root.get( BBSSubjectInfo_.latestReplyTime ) ) );
 		return em.createQuery(cq.where(p)).setMaxResults( maxRecordCount ).getResultList();
 	}	
@@ -393,7 +401,7 @@ public class BBSSubjectInfoFactory extends AbstractFactory {
 	}
 
 	//@MethodDescribe( "根据论坛ID,主版块ID,版块ID查询指定用户发表的主题数量" )
-	public Long countUserSubjectForPage( String forumId, String mainSectionId, String sectionId, Boolean needPicture, Boolean withTopSubject, String creatorName ) throws Exception {
+	public Long countUserSubjectForPage( String searchTitle, String forumId, String mainSectionId, String sectionId, Boolean needPicture, Boolean withTopSubject, String creatorName ) throws Exception {
 		if( creatorName == null || creatorName.isEmpty() ){
 			throw new Exception( "creatorName can not null." );
 		}
@@ -421,12 +429,15 @@ public class BBSSubjectInfoFactory extends AbstractFactory {
 		if( needPicture != null && needPicture ){
 			p = cb.and( p, cb.isNotNull( root.get( BBSSubjectInfo_.picId ) ),  cb.notEqual( root.get( BBSSubjectInfo_.picId ), ""));
 		}
+		if( StringUtils.isNotEmpty( searchTitle ) ){
+			p = cb.and( p, cb.like( root.get( BBSSubjectInfo_.title ), searchTitle ) );
+		}
 		cq.select( cb.count( root ) );		
 		return em.createQuery(cq.where(p)).getSingleResult();
 	}
 
 	//@MethodDescribe( "根据论坛ID,主版块ID,版块ID查询指定用户发表的主题列表, 分页" )
-	public List<BBSSubjectInfo> listUserSubjectForPage( String forumId, String mainSectionId, String sectionId, Boolean needPicture, Boolean withTopSubject, Integer maxRecordCount, String creatorName ) throws Exception {
+	public List<BBSSubjectInfo> listUserSubjectForPage( String searchTitle, String forumId, String mainSectionId, String sectionId, Boolean needPicture, Boolean withTopSubject, Integer maxRecordCount, String creatorName ) throws Exception {
 		if( creatorName == null || creatorName.isEmpty() ){
 			throw new Exception( "creatorName can not null." );
 		}
@@ -457,6 +468,9 @@ public class BBSSubjectInfoFactory extends AbstractFactory {
 		if( needPicture != null && needPicture ){
 			p = cb.and( p, cb.isNotNull( root.get( BBSSubjectInfo_.picId ) ),  cb.notEqual( root.get( BBSSubjectInfo_.picId ), ""));
 		}
+		if( StringUtils.isNotEmpty( searchTitle ) ){
+			p = cb.and( p, cb.like( root.get( BBSSubjectInfo_.title ), searchTitle ) );
+		}
 		cq.orderBy( cb.desc( root.get( BBSSubjectInfo_.createTime ) ) );
 		return em.createQuery(cq.where(p)).setMaxResults( maxRecordCount ).getResultList();
 	}

+ 13 - 0
o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/factory/BBSVoteRecordFactory.java

@@ -123,6 +123,19 @@ public class BBSVoteRecordFactory extends AbstractFactory {
 		return em.createQuery(cq.where(p)).getSingleResult();
 	}
 
+	public List<String> listVoteUserForSubject( String subjectId, String voteOptionId ) throws Exception {
+		EntityManager em = this.entityManagerContainer().get( BBSVoteRecord.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<BBSVoteRecord> root = cq.from( BBSVoteRecord.class);
+		Predicate p = cb.equal( root.get( BBSVoteRecord_.subjectId ), subjectId );
+		if( StringUtils.isNotEmpty( voteOptionId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSVoteRecord_.optionId ), voteOptionId ));
+		}
+		cq.select( root.get( BBSVoteRecord_.votorName ) );
+		return em.createQuery(cq.where(p).distinct(true)).getResultList();
+	}
+
 	public List<BBSVoteRecord> listVoteRecordForPage(String subjectId, String voteOptionId, Integer maxRecordCount) throws Exception {
 		if( maxRecordCount == null ){
 			throw new Exception( "maxRecordCount is null." );

+ 1 - 0
o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/jaxrs/configsetting/BBSConfigSettingAnonymousAction.java

@@ -9,6 +9,7 @@ import javax.ws.rs.container.AsyncResponse;
 import javax.ws.rs.container.Suspended;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 
 import com.x.base.core.project.annotation.JaxrsDescribe;
 import com.x.base.core.project.annotation.JaxrsMethodDescribe;

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