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

Merge branch 'develop' of ssh://git.o2oa.net:2020/o2oa/o2oa into fix/buildpackage

tangxl пре 5 година
родитељ
комит
489c808d38
100 измењених фајлова са 1137 додато и 406 уклоњено
  1. 3 0
      .gitignore
  2. 18 7
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/calendar/CalendarMainActivity.kt
  3. 5 2
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/calendar/CalendarOB.kt
  4. 87 17
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/calendar/CreateCalendarActivity.kt
  5. 180 25
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/calendar/vm/CreateCalendarViewModel.kt
  6. 1 1
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/clouddrive/v2/f/FileFolderListFragment.kt
  7. 10 5
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/o2/organization/ContactPickerActivity.kt
  8. 8 8
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/app/o2/webview/JSInterfaceO2mBiz.kt
  9. 5 1
      o2android/app/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/core/service/CollectLogJobService.kt
  10. 196 19
      o2android/app/src/main/res/layout/activity_create_calendar.xml
  11. 1 1
      o2android/app/src/main/res/layout/activity_create_event.xml
  12. 13 2
      o2android/o2_auth_sdk/src/main/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/model/bo/api/calendar/CalendarPostData.kt
  13. 4 4
      o2ios/O2Platform.xcodeproj/project.pbxproj
  14. 14 4
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Headers/O2OA_Auth_SDK-Swift.h
  15. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Info.plist
  16. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/arm.swiftsourceinfo
  17. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo
  18. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/arm64.swiftsourceinfo
  19. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/armv7-apple-ios.swiftsourceinfo
  20. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/armv7.swiftsourceinfo
  21. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/i386-apple-ios-simulator.swiftsourceinfo
  22. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/i386.swiftsourceinfo
  23. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/x86_64-apple-ios-simulator.swiftsourceinfo
  24. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/Project/x86_64.swiftsourceinfo
  25. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/arm.swiftdoc
  26. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/arm.swiftmodule
  27. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/arm64-apple-ios.swiftdoc
  28. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/arm64-apple-ios.swiftmodule
  29. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/arm64.swiftdoc
  30. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/arm64.swiftmodule
  31. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/armv7-apple-ios.swiftdoc
  32. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/armv7-apple-ios.swiftmodule
  33. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/armv7.swiftdoc
  34. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/armv7.swiftmodule
  35. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/i386-apple-ios-simulator.swiftdoc
  36. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/i386-apple-ios-simulator.swiftmodule
  37. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/i386.swiftdoc
  38. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/i386.swiftmodule
  39. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/x86_64-apple-ios-simulator.swiftdoc
  40. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/x86_64-apple-ios-simulator.swiftmodule
  41. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/x86_64.swiftdoc
  42. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/Modules/O2OA_Auth_SDK.swiftmodule/x86_64.swiftmodule
  43. BIN
      o2ios/O2Platform/Framework/O2OA_Auth_SDK.framework/O2OA_Auth_SDK
  44. 0 0
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/image_picker.framework/Headers/ImagePickerPlugin.h
  45. 0 0
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/image_picker.framework/Headers/image_picker-umbrella.h
  46. 0 0
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/image_picker.framework/Info.plist
  47. 0 0
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/image_picker.framework/Modules/module.modulemap
  48. BIN
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/image_picker.framework/image_picker
  49. 0 0
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/path_provider.framework/Headers/PathProviderPlugin.h
  50. 0 0
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/path_provider.framework/Headers/path_provider-umbrella.h
  51. 0 0
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/path_provider.framework/Info.plist
  52. 0 0
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/path_provider.framework/Modules/module.modulemap
  53. BIN
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/path_provider.framework/path_provider
  54. 0 0
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/shared_preferences.framework/Headers/SharedPreferencesPlugin.h
  55. 0 0
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/shared_preferences.framework/Headers/shared_preferences-umbrella.h
  56. 0 0
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/shared_preferences.framework/Info.plist
  57. 0 0
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/shared_preferences.framework/Modules/module.modulemap
  58. BIN
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins-os/shared_preferences.framework/shared_preferences
  59. BIN
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins/image_picker.framework/image_picker
  60. BIN
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins/path_provider.framework/path_provider
  61. BIN
      o2ios/O2Platform/Framework/O2OA_Flutter_SDK/plugins/shared_preferences.framework/shared_preferences
  62. 1 1
      o2ios/O2Platform/config/config.swift
  63. 2 2
      o2ios/Podfile
  64. 7 7
      o2ios/Podfile.lock
  65. 1 0
      o2server/.gitignore
  66. 1 1
      o2server/configSample/messages.json
  67. 4 3
      o2server/configSample/node_127.0.0.1.json
  68. 2 2
      o2server/configSample/processPlatform.json
  69. 1 1
      o2server/start_linux.sh
  70. 2 3
      o2server/x_attendance_assemble_control/src/main/webapp/jest/describe.js
  71. 2 0
      o2server/x_base_core_project/pom.xml
  72. 107 107
      o2server/x_base_core_project/src/main/java/com/x/base/core/container/EntityManagerContainer.java
  73. 16 8
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Config.java
  74. 1 1
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Messages.java
  75. 16 8
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Node.java
  76. 13 36
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/ProcessPlatform.java
  77. 23 3
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/gson/XGsonBuilder.java
  78. 29 28
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/http/HttpToken.java
  79. 25 3
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/jaxrs/StandardJaxrsAction.java
  80. 5 3
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/Crypto.java
  81. 85 19
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/StringTools.java
  82. 1 0
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_organization_assemble_control.java
  83. 18 4
      o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/factory/BBSSubjectInfoFactory.java
  84. 13 0
      o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/factory/BBSVoteRecordFactory.java
  85. 6 1
      o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/jaxrs/permissioninfo/ActionGetSubjectOperationPermissoin.java
  86. 2 5
      o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/jaxrs/permissioninfo/BaseAction.java
  87. 28 13
      o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/jaxrs/subjectinfo/ActionSubjectListForBBSIndex.java
  88. 8 5
      o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/jaxrs/subjectinfo/ActionSubjectListForPage.java
  89. 94 3
      o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/jaxrs/subjectinfo/ActionSubjectListMyForPage.java
  90. 27 7
      o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/jaxrs/subjectinfo/ActionSubjectView.java
  91. 6 1
      o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/service/BBSReplyInfoService.java
  92. 9 9
      o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/service/BBSSubjectInfoService.java
  93. 15 12
      o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/service/BBSSubjectInfoServiceAdv.java
  94. 14 0
      o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/service/BBSSubjectVoteService.java
  95. 2 3
      o2server/x_bbs_assemble_control/src/main/webapp/jest/describe.js
  96. 2 3
      o2server/x_calendar_assemble_control/src/main/webapp/jest/describe.js
  97. 0 1
      o2server/x_cms_assemble_control/.gitignore
  98. 2 3
      o2server/x_cms_assemble_control/src/main/webapp/jest/describe.js
  99. 0 1
      o2server/x_cms_core_entity/.gitignore
  100. 2 3
      o2server/x_component_assemble_control/src/main/webapp/jest/describe.js

+ 3 - 0
.gitignore

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

+ 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/

+ 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>

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

@@ -83,70 +83,70 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 			// Object object = jpa.get(field.getName());
 			Object object = FieldUtils.readField(field, jpa, true);
 			switch (fieldType) {
-			case stringValue:
-				this.persistChecker.stringValue.check(field, null == object ? null : Objects.toString(object), jpa,
-						checkPersist, checkPersistType);
-				break;
-			case stringValueList:
-				this.persistChecker.stringValueList.check(field, null == object ? null : (List<String>) object, jpa,
-						checkPersist, checkPersistType);
-				break;
-			case dateValue:
-				this.persistChecker.dateValue.check(field, (null == object ? null : (Date) object), jpa, checkPersist,
-						checkPersistType);
-				break;
-			case dateValueList:
-				this.persistChecker.dateValueList.check(field, (null == object ? null : (List<Date>) object), jpa,
-						checkPersist, checkPersistType);
-				break;
-			case booleanValue:
-				this.persistChecker.booleanValue.check(field, (null == object ? null : (Boolean) object), jpa,
-						checkPersist, checkPersistType);
-				break;
-			case booleanValueList:
-				this.persistChecker.booleanValueList.check(field, (null == object ? null : (List<Boolean>) object), jpa,
-						checkPersist, checkPersistType);
-				break;
-			case integerValue:
-				this.persistChecker.integerValue.check(field, (null == object ? null : (Integer) object), jpa,
-						checkPersist, checkPersistType);
-				break;
-			case integerValueList:
-				this.persistChecker.integerValueList.check(field, (null == object ? null : (List<Integer>) object), jpa,
-						checkPersist, checkPersistType);
-				break;
-			case doubleValue:
-				this.persistChecker.doubleValue.check(field, (null == object ? null : (Double) object), jpa,
-						checkPersist, checkPersistType);
-				break;
-			case doubleValueList:
-				this.persistChecker.doubleValueList.check(field, (null == object ? null : (List<Double>) object), jpa,
-						checkPersist, checkPersistType);
-				break;
-			case longValue:
-				this.persistChecker.longValue.check(field, (null == object ? null : (Long) object), jpa, checkPersist,
-						checkPersistType);
-				break;
-			case longValueList:
-				this.persistChecker.longValueList.check(field, (null == object ? null : (List<Long>) object), jpa,
-						checkPersist, checkPersistType);
-				break;
-			case floatValue:
-				this.persistChecker.floatValue.check(field, (null == object ? null : (Float) object), jpa, checkPersist,
-						checkPersistType);
-				break;
-			case floatValueList:
-				this.persistChecker.floatValueList.check(field, (null == object ? null : (List<Float>) object), jpa,
-						checkPersist, checkPersistType);
-				break;
-			case byteValueArray:
-				this.persistChecker.byteValueArray.check(field, (null == object ? null : (byte[]) object), jpa,
-						checkPersist, checkPersistType);
-				break;
-			case enumValue:
-				break;
-			default:
-				break;
+				case stringValue:
+					this.persistChecker.stringValue.check(field, null == object ? null : Objects.toString(object), jpa,
+							checkPersist, checkPersistType);
+					break;
+				case stringValueList:
+					this.persistChecker.stringValueList.check(field, null == object ? null : (List<String>) object, jpa,
+							checkPersist, checkPersistType);
+					break;
+				case dateValue:
+					this.persistChecker.dateValue.check(field, (null == object ? null : (Date) object), jpa,
+							checkPersist, checkPersistType);
+					break;
+				case dateValueList:
+					this.persistChecker.dateValueList.check(field, (null == object ? null : (List<Date>) object), jpa,
+							checkPersist, checkPersistType);
+					break;
+				case booleanValue:
+					this.persistChecker.booleanValue.check(field, (null == object ? null : (Boolean) object), jpa,
+							checkPersist, checkPersistType);
+					break;
+				case booleanValueList:
+					this.persistChecker.booleanValueList.check(field, (null == object ? null : (List<Boolean>) object),
+							jpa, checkPersist, checkPersistType);
+					break;
+				case integerValue:
+					this.persistChecker.integerValue.check(field, (null == object ? null : (Integer) object), jpa,
+							checkPersist, checkPersistType);
+					break;
+				case integerValueList:
+					this.persistChecker.integerValueList.check(field, (null == object ? null : (List<Integer>) object),
+							jpa, checkPersist, checkPersistType);
+					break;
+				case doubleValue:
+					this.persistChecker.doubleValue.check(field, (null == object ? null : (Double) object), jpa,
+							checkPersist, checkPersistType);
+					break;
+				case doubleValueList:
+					this.persistChecker.doubleValueList.check(field, (null == object ? null : (List<Double>) object),
+							jpa, checkPersist, checkPersistType);
+					break;
+				case longValue:
+					this.persistChecker.longValue.check(field, (null == object ? null : (Long) object), jpa,
+							checkPersist, checkPersistType);
+					break;
+				case longValueList:
+					this.persistChecker.longValueList.check(field, (null == object ? null : (List<Long>) object), jpa,
+							checkPersist, checkPersistType);
+					break;
+				case floatValue:
+					this.persistChecker.floatValue.check(field, (null == object ? null : (Float) object), jpa,
+							checkPersist, checkPersistType);
+					break;
+				case floatValueList:
+					this.persistChecker.floatValueList.check(field, (null == object ? null : (List<Float>) object), jpa,
+							checkPersist, checkPersistType);
+					break;
+				case byteValueArray:
+					this.persistChecker.byteValueArray.check(field, (null == object ? null : (byte[]) object), jpa,
+							checkPersist, checkPersistType);
+					break;
+				case enumValue:
+					break;
+				default:
+					break;
 			}
 		}
 	}
@@ -161,16 +161,16 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 			// Object object = jpa.get(field.getName());
 			Object object = FieldUtils.readField(field, jpa, true);
 			switch (fieldType) {
-			case stringValue:
-				this.removeChecker.stringValue.check(field, null == object ? null : Objects.toString(object), jpa,
-						checkRemove, checkRemoveType);
-				break;
-			case stringValueList:
-				this.removeChecker.stringValueList.check(field, null == object ? null : (List<String>) object, jpa,
-						checkRemove, checkRemoveType);
-				break;
-			default:
-				break;
+				case stringValue:
+					this.removeChecker.stringValue.check(field, null == object ? null : Objects.toString(object), jpa,
+							checkRemove, checkRemoveType);
+					break;
+				case stringValueList:
+					this.removeChecker.stringValueList.check(field, null == object ? null : (List<String>) object, jpa,
+							checkRemove, checkRemoveType);
+					break;
+				default:
+					break;
 			}
 		}
 	}
@@ -208,18 +208,19 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 			t = em.find(cls, id);
 		}
 		switch (exceptionWhen) {
-		case not_found:
-			if (null == t) {
-				throw new Exception("can not find entity id: " + id + ", class: " + cls.getCanonicalName() + ".");
-			}
-			break;
-		case found:
-			if (null != t) {
-				throw new Exception("entity already existed, id: " + id + ", class: " + cls.getCanonicalName() + ".");
-			}
-			break;
-		default:
-			break;
+			case not_found:
+				if (null == t) {
+					throw new Exception("can not find entity id: " + id + ", class: " + cls.getCanonicalName() + ".");
+				}
+				break;
+			case found:
+				if (null != t) {
+					throw new Exception(
+							"entity already existed, id: " + id + ", class: " + cls.getCanonicalName() + ".");
+				}
+				break;
+			default:
+				break;
 		}
 		return t;
 	}
@@ -244,14 +245,14 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 			Predicate p = cb.equal(root.get(field.getName()), flag);
 			List<T> list = em.createQuery(cq.select(root).where(p).distinct(true)).setMaxResults(2).getResultList();
 			switch (list.size()) {
-			case 0:
-				break;
-			case 1:
-				t = list.get(0);
-				break out;
-			case 2:
-				throw new Exception("flag get multiple entity flag:" + flag + ", class:" + cls.getName()
-						+ ", attribute:" + field.getName() + ".");
+				case 0:
+					break;
+				case 1:
+					t = list.get(0);
+					break out;
+				case 2:
+					throw new Exception("flag get multiple entity flag:" + flag + ", class:" + cls.getName()
+							+ ", attribute:" + field.getName() + ".");
 			}
 		}
 		return t;
@@ -309,15 +310,15 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 			cq.select(root).where(p);
 			List<T> list = em.createQuery(cq).setMaxResults(2).getResultList();
 			switch (list.size()) {
-			case 0:
-				break;
-			case 1:
-				t = list.get(0);
-				break out;
-			case 2:
-				throw new Exception("flag get multiple entity flag:" + flag + ", class:" + cls.getName()
-						+ ", attribute:" + field.getName() + ", restrict attrubte:" + singularAttribute
-						+ ", restrict value:" + restrictValue + ".");
+				case 0:
+					break;
+				case 1:
+					t = list.get(0);
+					break out;
+				case 2:
+					throw new Exception("flag get multiple entity flag:" + flag + ", class:" + cls.getName()
+							+ ", attribute:" + field.getName() + ", restrict attrubte:" + singularAttribute
+							+ ", restrict value:" + restrictValue + ".");
 			}
 		}
 		return t;
@@ -1125,9 +1126,9 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 			selections.add(root.get(str));
 		}
 		cq.multiselect(selections).where(predicate);
-//		if (StringUtils.isNotEmpty(orderAttribute)) {
-//			cq.orderBy(cb.desc(root.get(orderAttribute)));
-//		}
+		// if (StringUtils.isNotEmpty(orderAttribute)) {
+		// cq.orderBy(cb.desc(root.get(orderAttribute)));
+		// }
 		T t = null;
 		for (Tuple o : em.createQuery(cq).getResultList()) {
 			t = clz.newInstance();
@@ -1823,5 +1824,4 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 		return list;
 	}
 
-
 }

+ 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;
 		}
 
 	}

+ 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 {
 }

+ 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." );

+ 6 - 1
o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/jaxrs/permissioninfo/ActionGetSubjectOperationPermissoin.java

@@ -162,7 +162,12 @@ public class ActionGetSubjectOperationPermissoin extends BaseAction {
 		if (check) {
 			if (effectivePerson.getDistinguishedName() != null
 					&& subjectInfo.getCreatorName().equalsIgnoreCase(effectivePerson.getDistinguishedName())) {
-				wrap.setEditAble(true);
+				//如果该贴子已经有回复内容了,就不允许删除了
+				if( replyInfoService.countWithSubjectForPage( subjectId, false ) == 0 ){
+					wrap.setEditAble(true);
+				}else{
+					wrap.setEditAble(false);
+				}
 			}
 		}
 

+ 2 - 5
o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/jaxrs/permissioninfo/BaseAction.java

@@ -5,11 +5,7 @@ import java.util.List;
 import com.x.base.core.project.cache.ApplicationCache;
 import com.x.base.core.project.jaxrs.StandardJaxrsAction;
 import com.x.base.core.project.tools.ListTools;
-import com.x.bbs.assemble.control.service.BBSPermissionInfoService;
-import com.x.bbs.assemble.control.service.BBSSectionInfoService;
-import com.x.bbs.assemble.control.service.BBSSubjectInfoService;
-import com.x.bbs.assemble.control.service.UserManagerService;
-import com.x.bbs.assemble.control.service.UserPermissionService;
+import com.x.bbs.assemble.control.service.*;
 
 import net.sf.ehcache.Ehcache;
 
@@ -18,6 +14,7 @@ public class BaseAction extends StandardJaxrsAction{
 	protected UserPermissionService UserPermissionService = new UserPermissionService();
 	protected Ehcache cache = ApplicationCache.instance().getCache( BaseAction.class);
 	protected BBSSubjectInfoService subjectInfoService = new BBSSubjectInfoService();
+	protected BBSReplyInfoService replyInfoService = new BBSReplyInfoService();
 	protected BBSSectionInfoService sectionInfoService = new BBSSectionInfoService();
 	protected BBSPermissionInfoService permissionInfoService = new BBSPermissionInfoService();
 	protected UserManagerService userManagerService = new UserManagerService();

+ 28 - 13
o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/jaxrs/subjectinfo/ActionSubjectListForBBSIndex.java

@@ -6,6 +6,7 @@ import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 
+import com.x.base.core.project.tools.ListTools;
 import org.apache.commons.lang3.StringUtils;
 
 import com.google.gson.JsonElement;
@@ -60,7 +61,7 @@ public class ActionSubjectListForBBSIndex extends BaseAction {
 		
 		if( check ) {
 			String cacheKey = wrapIn.getCacheKey( effectivePerson, isBBSManager );
-			Element element = cache.get( cacheKey );
+			Element element = cache.get( cacheKey + "#ActionSubjectListForBBSIndex#" + count + "#" + page );
 			
 			if ((null != element) && (null != element.getObjectValue())) {
 				ActionResult<List<Wo>> result_cache = (ActionResult<List<Wo>>) element.getObjectValue();
@@ -77,7 +78,8 @@ public class ActionSubjectListForBBSIndex extends BaseAction {
 	
 	public ActionResult<List<Wo>> getSubjectQueryResult( Wi wrapIn, HttpServletRequest request, EffectivePerson effectivePerson, Integer page, Integer count ) {
 		ActionResult<List<Wo>> result = new ActionResult<>();
-		List<Wo> wraps_out = new ArrayList<Wo>();
+		List<Wo> wraps_out = null;
+		List<Wo> wraps_out_result = new ArrayList<Wo>();
 		BBSSectionInfo sectionInfo = null;
 		List<BBSSubjectInfo> subjectInfoList = null;
 		List<String> viewSectionIds = new ArrayList<String>();
@@ -134,7 +136,7 @@ public class ActionSubjectListForBBSIndex extends BaseAction {
 		if( check ){
 			if( selectTotal > 0 ){
 				try{
-					total = subjectInfoServiceAdv.countSubjectInSectionForPage( wrapIn.getForumId(), wrapIn.getMainSectionId(), wrapIn.getSectionId(), wrapIn.getCreatorName(), wrapIn.getNeedPicture(), null, viewSectionIds );
+					total = subjectInfoServiceAdv.countSubjectInSectionForPage( wrapIn.getSearchContent(), wrapIn.getForumId(), wrapIn.getMainSectionId(), wrapIn.getSectionId(), wrapIn.getCreatorName(), wrapIn.getNeedPicture(), null, viewSectionIds );
 				} catch (Exception e) {
 					check = false;
 					Exception exception = new ExceptionSubjectFilter( e );
@@ -146,22 +148,33 @@ public class ActionSubjectListForBBSIndex extends BaseAction {
 		
 		if( check ){
 			if( selectTotal > 0 && total > 0 ){
+				if( page <= 0 ){ page = 1; }
+				if( count <= 0 ){ count = 20; }
+				int startIndex = ( page - 1 ) * count;
+				int endIndex = page * count;
+
 				try{
-					subjectInfoList = subjectInfoServiceAdv.listSubjectInSectionForPage( wrapIn.getForumId(), wrapIn.getMainSectionId(), wrapIn.getSectionId(), wrapIn.getCreatorName(), wrapIn.getNeedPicture(), null, selectTotal, viewSectionIds );
-					if( subjectInfoList != null ){
+					//内存分页
+					subjectInfoList = subjectInfoServiceAdv.listSubjectInSectionForPage( wrapIn.getSearchContent(), wrapIn.getForumId(), wrapIn.getMainSectionId(), wrapIn.getSectionId(), wrapIn.getCreatorName(), wrapIn.getNeedPicture(), null, selectTotal, viewSectionIds );
+					if(ListTools.isNotEmpty( subjectInfoList ) ){
 						try {
 							wraps_out = Wo.copier.copy( subjectInfoList );
-							for( Wo wo : wraps_out ) {
-								cutPersonNames( wo );
-							}
-							SortTools.desc( wraps_out, "latestReplyTime" );
-							result.setData( wraps_out );
-							result.setCount( total );
 						} catch (Exception e) {
 							Exception exception = new ExceptionSubjectWrapOut( e );
 							result.error( exception );
 							logger.error( e, effectivePerson, request, null);
 						}
+
+						int i = 0;
+						for( ; wraps_out != null && i< wraps_out.size(); i++ ){
+							if( i >= startIndex && i < endIndex ){
+								cutPersonNames( wraps_out.get( i ) );
+								wraps_out_result.add( wraps_out.get( i ) );
+							}
+						}
+						SortTools.desc( wraps_out_result, "latestReplyTime" );
+						result.setData( wraps_out_result );
+						result.setCount( total );
 					}
 				} catch (Exception e) {
 					check = false;
@@ -207,7 +220,7 @@ public class ActionSubjectListForBBSIndex extends BaseAction {
 		@FieldDescribe( "贴子所属版块ID." )
 		private String sectionId = null;
 		
-		@FieldDescribe( "搜索内容." )
+		@FieldDescribe( "标题模糊搜索关键词" )
 		private String searchContent = null;
 		
 		@FieldDescribe( "创建者名称." )
@@ -220,7 +233,6 @@ public class ActionSubjectListForBBSIndex extends BaseAction {
 		private Boolean withTopSubject = false; // 是否包含置顶贴
 		
 		public static List<String> Excludes = new ArrayList<String>( JpaObject.FieldsUnmodify );
-	
 		
 		public String getForumId() {
 			return forumId;
@@ -253,6 +265,9 @@ public class ActionSubjectListForBBSIndex extends BaseAction {
 			this.withTopSubject = withTopSubject;
 		}
 		public String getSearchContent() {
+			if( StringUtils.isNotEmpty( this.searchContent ) && this.searchContent.indexOf( "%" ) < 0 ){
+				return "%" + searchContent + "%";
+			}
 			return searchContent;
 		}
 		public void setSearchContent( String searchContent ) {

+ 8 - 5
o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/jaxrs/subjectinfo/ActionSubjectListForPage.java

@@ -58,7 +58,7 @@ public class ActionSubjectListForPage extends BaseAction {
 		
 		if( check ) {
 			String cacheKey = wrapIn.getCacheKey( effectivePerson, isBBSManager );
-			cacheKey += "#" + page + "#" + count;
+			cacheKey += "#" + page + "#" + count + "#ActionSubjectListForPage";
 			Element element = cache.get( cacheKey );
 			
 			if ((null != element) && (null != element.getObjectValue())) {
@@ -172,7 +172,7 @@ public class ActionSubjectListForPage extends BaseAction {
 			selectTopInSection = false; //置顶贴的处理已经在前面处理过了,置顶贴已经放到一个List里,不需要再次查询出来了,后续的查询过滤置顶贴
 			if( selectTotal > 0 ){
 				try{
-					total = subjectInfoServiceAdv.countSubjectInSectionForPage( wrapIn.getForumId(), wrapIn.getMainSectionId(), wrapIn.getSectionId(), wrapIn.getCreatorName(), wrapIn.getNeedPicture(), selectTopInSection, viewSectionIds );
+					total = subjectInfoServiceAdv.countSubjectInSectionForPage( wrapIn.getSearchContent(), wrapIn.getForumId(), wrapIn.getMainSectionId(), wrapIn.getSectionId(), wrapIn.getCreatorName(), wrapIn.getNeedPicture(), selectTopInSection, viewSectionIds );
 				} catch (Exception e) {
 					check = false;
 					Exception exception = new ExceptionSubjectFilter( e );
@@ -185,7 +185,7 @@ public class ActionSubjectListForPage extends BaseAction {
 		if( check ){
 			if( selectTotal > 0 && total > 0 ){
 				try{
-					subjectInfoList = subjectInfoServiceAdv.listSubjectInSectionForPage( wrapIn.getForumId(), wrapIn.getMainSectionId(), wrapIn.getSectionId(), wrapIn.getCreatorName(), wrapIn.getNeedPicture(), selectTopInSection, selectTotal, viewSectionIds );
+					subjectInfoList = subjectInfoServiceAdv.listSubjectInSectionForPage( wrapIn.getSearchContent(), wrapIn.getForumId(), wrapIn.getMainSectionId(), wrapIn.getSectionId(), wrapIn.getCreatorName(), wrapIn.getNeedPicture(), selectTopInSection, selectTotal, viewSectionIds );
 					if( subjectInfoList != null ){
 						try {
 							wraps_nonTop = Wo.copier.copy( subjectInfoList );
@@ -295,8 +295,8 @@ public class ActionSubjectListForPage extends BaseAction {
 		
 		@FieldDescribe( "贴子所属版块ID." )
 		private String sectionId = null;
-		
-		@FieldDescribe( "搜索内容." )
+
+		@FieldDescribe( "标题模糊搜索关键词" )
 		private String searchContent = null;
 		
 		@FieldDescribe( "创建者名称." )
@@ -342,6 +342,9 @@ public class ActionSubjectListForPage extends BaseAction {
 			this.withTopSubject = withTopSubject;
 		}
 		public String getSearchContent() {
+			if( StringUtils.isNotEmpty( this.searchContent ) && this.searchContent.indexOf( "%" ) < 0 ){
+				return "%" + searchContent + "%";
+			}
 			return searchContent;
 		}
 		public void setSearchContent( String searchContent ) {

+ 94 - 3
o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/jaxrs/subjectinfo/ActionSubjectListMyForPage.java

@@ -17,7 +17,6 @@ import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.tools.ListTools;
-import com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectListForPage.Wi;
 import com.x.bbs.assemble.control.jaxrs.subjectinfo.exception.ExceptionSubjectFilter;
 import com.x.bbs.assemble.control.jaxrs.subjectinfo.exception.ExceptionSubjectWrapOut;
 import com.x.bbs.assemble.control.jaxrs.subjectinfo.exception.ExceptionWrapInConvert;
@@ -61,7 +60,7 @@ public class ActionSubjectListMyForPage extends BaseAction {
 		}
 		if (check) {
 			try {
-				total = subjectInfoServiceAdv.countUserSubjectForPage(wrapIn.getForumId(), wrapIn.getMainSectionId(),
+				total = subjectInfoServiceAdv.countUserSubjectForPage( wrapIn.getSearchContent(), wrapIn.getForumId(), wrapIn.getMainSectionId(),
 						wrapIn.getSectionId(), wrapIn.getNeedPicture(), wrapIn.getWithTopSubject(),
 						effectivePerson.getDistinguishedName());
 			} catch (Exception e) {
@@ -74,7 +73,7 @@ public class ActionSubjectListMyForPage extends BaseAction {
 		if (check) {
 			if (total > 0) {
 				try {
-					subjectInfoList = subjectInfoServiceAdv.listUserSubjectForPage(wrapIn.getForumId(),
+					subjectInfoList = subjectInfoServiceAdv.listUserSubjectForPage( wrapIn.getSearchContent(), wrapIn.getForumId(),
 							wrapIn.getMainSectionId(), wrapIn.getSectionId(), wrapIn.getNeedPicture(),
 							wrapIn.getWithTopSubject(), page * count, effectivePerson.getDistinguishedName());
 				} catch (Exception e) {
@@ -155,6 +154,98 @@ public class ActionSubjectListMyForPage extends BaseAction {
 		}
 	}
 
+	public static class Wi{
+
+		@FieldDescribe( "贴子ID." )
+		private String subjectId = null;
+
+		@FieldDescribe( "投标选项ID." )
+		private String voteOptionId = null;
+
+		@FieldDescribe( "贴子所属论坛ID." )
+		private String forumId = null;
+
+		@FieldDescribe( "贴子所属主版块ID." )
+		private String mainSectionId = null;
+
+		@FieldDescribe( "贴子所属版块ID." )
+		private String sectionId = null;
+
+		@FieldDescribe( "标题模糊搜索关键词" )
+		private String searchContent = null;
+
+		@FieldDescribe( "创建者名称." )
+		private String creatorName = null;
+
+		@FieldDescribe( "是否只查询有大图的贴子." )
+		private Boolean needPicture = false;
+
+		@FieldDescribe( "是否包含置顶贴." )
+		private Boolean withTopSubject = false; // 是否包含置顶贴
+
+		public static List<String> Excludes = new ArrayList<String>( JpaObject.FieldsUnmodify );
+
+
+		public String getForumId() {
+			return forumId;
+		}
+		public void setForumId(String forumId) {
+			this.forumId = forumId;
+		}
+		public String getSectionId() {
+			return sectionId;
+		}
+		public void setSectionId(String sectionId) {
+			this.sectionId = sectionId;
+		}
+		public String getMainSectionId() {
+			return mainSectionId;
+		}
+		public void setMainSectionId(String mainSectionId) {
+			this.mainSectionId = mainSectionId;
+		}
+		public Boolean getNeedPicture() {
+			return needPicture;
+		}
+		public void setNeedPicture(Boolean needPicture) {
+			this.needPicture = needPicture;
+		}
+		public Boolean getWithTopSubject() {
+			return withTopSubject;
+		}
+		public void setWithTopSubject(Boolean withTopSubject) {
+			this.withTopSubject = withTopSubject;
+		}
+		public String getSearchContent() {
+			if( StringUtils.isNotEmpty( this.searchContent ) && this.searchContent.indexOf( "%" ) < 0 ){
+				return "%" + searchContent + "%";
+			}
+			return searchContent;
+		}
+		public void setSearchContent( String searchContent ) {
+			this.searchContent = searchContent;
+		}
+		public String getCreatorName() {
+			return creatorName;
+		}
+		public void setCreatorName(String creatorName) {
+			this.creatorName = creatorName;
+		}
+		public String getSubjectId() {
+			return subjectId;
+		}
+		public void setSubjectId(String subjectId) {
+			this.subjectId = subjectId;
+		}
+		public String getVoteOptionId() {
+			return voteOptionId;
+		}
+		public void setVoteOptionId(String voteOptionId) {
+			this.voteOptionId = voteOptionId;
+		}
+
+	}
+
 	public static class Wo extends BBSSubjectInfo {
 
 		private static final long serialVersionUID = -5076990764713538973L;

+ 27 - 7
o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/jaxrs/subjectinfo/ActionSubjectView.java

@@ -114,7 +114,7 @@ public class ActionSubjectView extends BaseAction {
 						logger.error( e, effectivePerson, request, null);
 					}
 					try {
-						//查询投票总
+						//查询投票总数
 						Long voteCount = subjectVoteService.countVoteRecordForSubject( id, null );
 						currentSubject.setVoteCount( voteCount );
 					}catch (Exception e) {
@@ -123,15 +123,26 @@ public class ActionSubjectView extends BaseAction {
 						result.error( exception );
 						logger.error( e, effectivePerson, request, null);
 					}
-					
+
 					try {
-						voteOptionList = subjectVoteService.listVoteOption( id );
-					} catch (Exception e) {
+						//查询投票总人数
+						List<String> voteUsers = subjectVoteService.listVoteUserForSubject( id, null );
+						currentSubject.setVoteUserCount( voteUsers.size() );
+					}catch (Exception e) {
 						check = false;
 						Exception exception = new ExceptionVoteOptionListById( e, id );
 						result.error( exception );
 						logger.error( e, effectivePerson, request, null);
 					}
+					
+//					try {
+//						voteOptionList = subjectVoteService.listVoteOption( id );
+//					} catch (Exception e) {
+//						check = false;
+//						Exception exception = new ExceptionVoteOptionListById( e, id );
+//						result.error( exception );
+//						logger.error( e, effectivePerson, request, null);
+//					}
 					result.getData().setCurrentSubject(currentSubject);
 				}
 			}
@@ -342,10 +353,15 @@ public class ActionSubjectView extends BaseAction {
 		
 		@FieldDescribe( "投票主题的所有投票选项列表." )
 		private List<WoBBSVoteOptionGroup> voteOptionGroupList;
-		
+
+		@FieldDescribe( "主贴内容" )
 		private String content = null;
-		
+
+		@FieldDescribe( "投票总数" )
 		private Long voteCount = 0L;
+
+		@FieldDescribe( "投票人数" )
+		private Integer voteUserCount = 0;
 		
 		private String pictureBase64 = null;
 		
@@ -369,7 +385,11 @@ public class ActionSubjectView extends BaseAction {
 		
 		@FieldDescribe( "当前用户是否已经投票过." )
 		private Boolean voted = false;
-		
+
+		public Integer getVoteUserCount() { return voteUserCount; }
+
+		public void setVoteUserCount(Integer voteUserCount) { this.voteUserCount = voteUserCount; }
+
 		public String getLatestReplyUserShort() {
 			return latestReplyUserShort;
 		}

+ 6 - 1
o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/service/BBSReplyInfoService.java

@@ -3,7 +3,6 @@ package com.x.bbs.assemble.control.service;
 import java.util.Date;
 import java.util.List;
 
-import com.alibaba.druid.util.StringUtils;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.entity.JpaObject;
@@ -16,6 +15,7 @@ import com.x.bbs.entity.BBSForumInfo;
 import com.x.bbs.entity.BBSReplyInfo;
 import com.x.bbs.entity.BBSSectionInfo;
 import com.x.bbs.entity.BBSSubjectInfo;
+import org.apache.commons.lang3.StringUtils;
 
 /**
  * 论坛信息管理服务类
@@ -150,6 +150,11 @@ public class BBSReplyInfoService {
 				if( _subjectInfo != null ){
 					if( _subjectInfo.getReplyTotal() > 0 ){
 						_subjectInfo.setReplyTotal( _subjectInfo.getReplyTotal() - 1 );
+						//如果当前删除的回复,是主贴采纳的解决方案,那么需要把主贴采纳的解决方案置空
+						if( StringUtils.isNotEmpty( _subjectInfo.getAcceptReplyId() ) &&
+							StringUtils.equals( _subjectInfo.getAcceptReplyId(), id )){
+							_subjectInfo.setAcceptReplyId( null );
+						}
 						emc.check( _subjectInfo, CheckPersistType.all );
 					}
 				}

+ 9 - 9
o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/service/BBSSubjectInfoService.java

@@ -641,7 +641,7 @@ public class BBSSubjectInfoService {
 		return business.subjectAttachmentFactory().list( attachmentList );
 	}
 
-	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( viewSectionIds == null || viewSectionIds.isEmpty() ){
 			return null;
 		}
@@ -651,20 +651,20 @@ public class BBSSubjectInfoService {
 		Business business = null;
 		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
 			business = new Business(emc);
-			return business.subjectInfoFactory().listSubjectInSectionForPage( forumId, mainSectionId, sectionId, creatorName, needPicture, isTopSubject, maxRecordCount, viewSectionIds );
+			return business.subjectInfoFactory().listSubjectInSectionForPage( searchTitle, forumId, mainSectionId, sectionId, creatorName, needPicture, isTopSubject, maxRecordCount, viewSectionIds );
 		}catch( Exception e ){
 			throw e;
 		}
 	}
 	
-	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 {
 		if( viewSectionIds == null || viewSectionIds.isEmpty() ){
 			return 0L;
 		}
 		Business business = null;
 		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
 			business = new Business(emc);
-			return business.subjectInfoFactory().countSubjectInSectionForPage( forumId, mainSectionId, sectionId, creatorName, needPicture, isTopSubject, viewSectionIds );
+			return business.subjectInfoFactory().countSubjectInSectionForPage( searchTitle, forumId, mainSectionId, sectionId, creatorName, needPicture, isTopSubject, viewSectionIds );
 		}catch( Exception e ){
 			throw e;
 		}
@@ -754,20 +754,20 @@ public class BBSSubjectInfoService {
 		}
 	}
 
-	public Long countUserSubjectForPage( String forumId, String mainSectionId, String sectionId, Boolean needPicture, Boolean withTopSubject, String name) throws Exception {
+	public Long countUserSubjectForPage( String searchTitle, String forumId, String mainSectionId, String sectionId, Boolean needPicture, Boolean withTopSubject, String name) throws Exception {
 		if( name == null || name.isEmpty() ){
 			throw new Exception( "name can not null." );
 		}
 		Business business = null;
 		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
 			business = new Business(emc);
-			return business.subjectInfoFactory().countUserSubjectForPage( forumId, mainSectionId, sectionId, needPicture, withTopSubject, name );
+			return business.subjectInfoFactory().countUserSubjectForPage( searchTitle, forumId, mainSectionId, sectionId, needPicture, withTopSubject, name );
 		}catch( Exception e ){
 			throw e;
 		}
 	}
 
-	public List<BBSSubjectInfo> listUserSubjectForPage(String forumId, String mainSectionId, String sectionId, Boolean needPicture, Boolean withTopSubject, Integer maxRecordCount, String name ) throws Exception {
+	public List<BBSSubjectInfo> listUserSubjectForPage( String searchTitle, String forumId, String mainSectionId, String sectionId, Boolean needPicture, Boolean withTopSubject, Integer maxRecordCount, String name ) throws Exception {
 		if( name == null || name.isEmpty() ){
 			throw new Exception( "name can not null." );
 		}
@@ -777,7 +777,7 @@ public class BBSSubjectInfoService {
 		Business business = null;
 		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
 			business = new Business(emc);
-			return business.subjectInfoFactory().listUserSubjectForPage( forumId, mainSectionId, sectionId, needPicture, withTopSubject, maxRecordCount, name );
+			return business.subjectInfoFactory().listUserSubjectForPage( searchTitle, forumId, mainSectionId, sectionId, needPicture, withTopSubject, maxRecordCount, name );
 		}catch( Exception e ){
 			throw e;
 		}
@@ -790,7 +790,7 @@ public class BBSSubjectInfoService {
 		Business business = null;
 		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
 			business = new Business(emc);
-			return business.subjectInfoFactory().countUserSubjectForPage( null, null, null, null, null, userName );
+			return business.subjectInfoFactory().countUserSubjectForPage( null, null, null, null, null, null, userName );
 		}catch( Exception e ){
 			throw e;
 		}

+ 15 - 12
o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/service/BBSSubjectInfoServiceAdv.java

@@ -87,10 +87,13 @@ public class BBSSubjectInfoServiceAdv {
 			throw e;
 		}
 	}
-	
+
 	/**
 	 * 向数据库保存BBSSubjectInfo对象
-	 * @param wrapIn
+	 * @param _bBSSubjectInfo
+	 * @param content
+	 * @return
+	 * @throws Exception
 	 */
 	public BBSSubjectInfo save( BBSSubjectInfo _bBSSubjectInfo, String content ) throws Exception {
 		if( _bBSSubjectInfo  == null ){
@@ -261,7 +264,7 @@ public class BBSSubjectInfoServiceAdv {
 	/**
 	 * 版块置顶设置
 	 * @param subjectId
-	 * @param topToForum
+	 * @param topToSection
 	 * @param name
 	 * @return
 	 * @throws Exception
@@ -326,7 +329,7 @@ public class BBSSubjectInfoServiceAdv {
 		}
 	}
 
-	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( viewSectionIds == null || viewSectionIds.isEmpty() ){
 			return null;
 		}
@@ -336,13 +339,13 @@ public class BBSSubjectInfoServiceAdv {
 		Business business = null;
 		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
 			business = new Business(emc);
-			return business.subjectInfoFactory().listSubjectInSectionForPage( forumId, mainSectionId, sectionId, creatorName, needPicture, isTopSubject, maxRecordCount, viewSectionIds );
+			return business.subjectInfoFactory().listSubjectInSectionForPage( searchTitle, forumId, mainSectionId, sectionId, creatorName, needPicture, isTopSubject, maxRecordCount, viewSectionIds );
 		}catch( Exception e ){
 			throw e;
 		}
 	}
 	
-	public Long countSubjectInSectionForPage( 
+	public Long countSubjectInSectionForPage( String searchTitle,
 			String forumId, String mainSectionId, String sectionId, String creatorName, Boolean needPicture, Boolean isTopSubject, 
 			List<String> viewSectionIds ) throws Exception {
 		if( viewSectionIds == null || viewSectionIds.isEmpty() ){
@@ -351,7 +354,7 @@ public class BBSSubjectInfoServiceAdv {
 		Business business = null;
 		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
 			business = new Business(emc);
-			return business.subjectInfoFactory().countSubjectInSectionForPage( 
+			return business.subjectInfoFactory().countSubjectInSectionForPage( searchTitle,
 					forumId, mainSectionId, sectionId, creatorName, needPicture, isTopSubject, viewSectionIds );
 		}catch( Exception e ){
 			throw e;
@@ -442,20 +445,20 @@ public class BBSSubjectInfoServiceAdv {
 		}
 	}
 
-	public Long countUserSubjectForPage( String forumId, String mainSectionId, String sectionId, Boolean needPicture, Boolean withTopSubject, String name) throws Exception {
+	public Long countUserSubjectForPage( String searchTitle, String forumId, String mainSectionId, String sectionId, Boolean needPicture, Boolean withTopSubject, String name) throws Exception {
 		if( name == null || name.isEmpty() ){
 			throw new Exception( "name can not null." );
 		}
 		Business business = null;
 		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
 			business = new Business(emc);
-			return business.subjectInfoFactory().countUserSubjectForPage( forumId, mainSectionId, sectionId, needPicture, withTopSubject, name );
+			return business.subjectInfoFactory().countUserSubjectForPage( searchTitle, forumId, mainSectionId, sectionId, needPicture, withTopSubject, name );
 		}catch( Exception e ){
 			throw e;
 		}
 	}
 
-	public List<BBSSubjectInfo> listUserSubjectForPage(String forumId, String mainSectionId, String sectionId, Boolean needPicture, Boolean withTopSubject, Integer maxRecordCount, String name ) throws Exception {
+	public List<BBSSubjectInfo> listUserSubjectForPage( String searchTitle, String forumId, String mainSectionId, String sectionId, Boolean needPicture, Boolean withTopSubject, Integer maxRecordCount, String name ) throws Exception {
 		if( name == null || name.isEmpty() ){
 			throw new Exception( "name can not null." );
 		}
@@ -465,7 +468,7 @@ public class BBSSubjectInfoServiceAdv {
 		Business business = null;
 		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
 			business = new Business(emc);
-			return business.subjectInfoFactory().listUserSubjectForPage( forumId, mainSectionId, sectionId, needPicture, withTopSubject, maxRecordCount, name );
+			return business.subjectInfoFactory().listUserSubjectForPage( searchTitle, forumId, mainSectionId, sectionId, needPicture, withTopSubject, maxRecordCount, name );
 		}catch( Exception e ){
 			throw e;
 		}
@@ -478,7 +481,7 @@ public class BBSSubjectInfoServiceAdv {
 		Business business = null;
 		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
 			business = new Business(emc);
-			return business.subjectInfoFactory().countUserSubjectForPage( null, null, null, null, null, userName );
+			return business.subjectInfoFactory().countUserSubjectForPage( null, null, null, null, null, null, userName );
 		}catch( Exception e ){
 			throw e;
 		}

+ 14 - 0
o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/service/BBSSubjectVoteService.java

@@ -1,5 +1,6 @@
 package com.x.bbs.assemble.control.service;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
@@ -315,6 +316,19 @@ public class BBSSubjectVoteService {
 		}
 	}
 
+	public List<String> listVoteUserForSubject( String subjectId, String voteOptionId ) throws Exception {
+		if( subjectId == null || subjectId.isEmpty() ){
+			return new ArrayList<>();
+		}
+		Business business = null;
+		try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
+			business = new Business(emc);
+			return business.voteRecordFactory().listVoteUserForSubject( subjectId, voteOptionId );
+		}catch( Exception e ){
+			throw e;
+		}
+	}
+
 	public List<BBSVoteRecord> listVoteRecordForPage(String subjectId, String voteOptionId, Integer maxRecordCount ) throws Exception {
 		if( subjectId == null || subjectId.isEmpty() ){
 			return null;

+ 2 - 3
o2server/x_bbs_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 - 3
o2server/x_calendar_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>");
 							});
 				});
 			});

+ 0 - 1
o2server/x_cms_assemble_control/.gitignore

@@ -1 +0,0 @@
-/target/

+ 2 - 3
o2server/x_cms_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>");
 							});
 				});
 			});

+ 0 - 1
o2server/x_cms_core_entity/.gitignore

@@ -1 +0,0 @@
-/target/

+ 2 - 3
o2server/x_component_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>");
 							});
 				});
 			});

Неке датотеке нису приказане због велике количине промена