Ver código fonte

feat: FindPartner增加扩展字段查询

DoggyZhang 2 meses atrás
pai
commit
209c900cbb
22 arquivos alterados com 328 adições e 94 exclusões
  1. 2 0
      app/src/main/java/com/adealink/weparty/module/playmate/Router.kt
  2. 20 0
      app/src/main/java/com/adealink/weparty/module/playmate/data/CategoryData.kt
  3. 5 0
      app/src/main/java/com/adealink/weparty/module/playmate/viewmodel/IPlaymateViewModel.kt
  4. 0 0
      app/src/main/res/drawable/common_form_widget_divider.xml
  5. 1 1
      module/joinus/src/main/res/layout/fragment_apply_skill_form.xml
  6. 1 1
      module/joinus/src/main/res/layout/fragment_join_us_step_3_skill_form.xml
  7. 1 1
      module/joinus/src/main/res/layout/fragment_playmate_setting_form.xml
  8. 5 0
      module/playmate/src/main/java/com/adealink/weparty/playmate/data/CategoryData.kt
  9. 7 0
      module/playmate/src/main/java/com/adealink/weparty/playmate/data/PlaymateListData.kt
  10. 5 0
      module/playmate/src/main/java/com/adealink/weparty/playmate/datasource/remote/PlaymateHttpService.kt
  11. 4 1
      module/playmate/src/main/java/com/adealink/weparty/playmate/findpartner/FindPartnerFragment.kt
  12. 9 3
      module/playmate/src/main/java/com/adealink/weparty/playmate/findpartner/data/FindPartnerData.kt
  13. 138 53
      module/playmate/src/main/java/com/adealink/weparty/playmate/findpartner/page/SelectOtherFragment.kt
  14. 12 0
      module/playmate/src/main/java/com/adealink/weparty/playmate/findpartner/viewmodel/FindPartnerViewModel.kt
  15. 16 4
      module/playmate/src/main/java/com/adealink/weparty/playmate/list/PlaymateListActivity.kt
  16. 16 9
      module/playmate/src/main/java/com/adealink/weparty/playmate/list/PlaymateListFragment.kt
  17. 14 1
      module/playmate/src/main/java/com/adealink/weparty/playmate/list/viewmodel/PlaymateListViewModel.kt
  18. 3 0
      module/playmate/src/main/java/com/adealink/weparty/playmate/manager/IPlaymateManager.kt
  19. 38 9
      module/playmate/src/main/java/com/adealink/weparty/playmate/manager/PlaymateManager.kt
  20. 15 0
      module/playmate/src/main/java/com/adealink/weparty/playmate/viewmodel/PlaymateViewModel.kt
  21. 5 0
      module/playmate/src/main/res/drawable/find_partner_form_divider.xml
  22. 11 11
      module/playmate/src/main/res/layout/fragment_find_partner_other.xml

+ 2 - 0
app/src/main/java/com/adealink/weparty/module/playmate/Router.kt

@@ -40,6 +40,8 @@ interface Playmate {
             const val EXTRA_OPTION_STAR = "extra_option_star"
             const val EXTRA_OPTION_PRICE_RANGE = "extra_option_price"
 
+            const val EXTRA_OPTION_OTHER = "extra_option_other" //其他自定义选项
+
             const val GUEST_PATH = "${Common.PATH}/guest_list"
         }
     }

+ 20 - 0
app/src/main/java/com/adealink/weparty/module/playmate/data/CategoryData.kt

@@ -17,6 +17,26 @@ data class PlaymateCategoryData(
     }
 }
 
+@Parcelize
+data class PlaymateCategoryConditionData(
+    @SerializedName("code") val code: String, //品类编码
+    @SerializedName("filterFields") val filterFields: List<ConditionField>, //品类名称
+) : Parcelable
+
+@Parcelize
+data class ConditionField(
+    @SerializedName("name") val name: String,
+    @SerializedName("fieldCode") val fieldCode: String,
+    @SerializedName("constants") val options: List<ConditionFieldOption>,
+) : Parcelable
+
+@Parcelize
+data class ConditionFieldOption(
+    @SerializedName("key") val key: String,
+    @SerializedName("value") val value: String,
+    @SerializedName("icon") val icon: String
+) : Parcelable
+
 
 @Parcelize
 data class UserPlaymateCategoryData(

+ 5 - 0
app/src/main/java/com/adealink/weparty/module/playmate/viewmodel/IPlaymateViewModel.kt

@@ -3,6 +3,7 @@ package com.adealink.weparty.module.playmate.viewmodel
 import androidx.lifecycle.LiveData
 import com.adealink.frame.base.Rlt
 import com.adealink.weparty.module.playmate.data.PlaymateBusinessData
+import com.adealink.weparty.module.playmate.data.PlaymateCategoryConditionData
 import com.adealink.weparty.module.playmate.data.PlaymateCategoryData
 import com.adealink.weparty.module.playmate.data.PlaymateDetailData
 import com.adealink.weparty.module.playmate.data.SkillSettingData
@@ -12,8 +13,12 @@ interface IPlaymateViewModel {
 
     val allCategoryLD: LiveData<List<PlaymateCategoryData>>
 
+    val allCategoryConditionLD: LiveData<Map<String, PlaymateCategoryConditionData>>
+
     fun pullAllCategory()
 
+    fun pullAllCategoryCondition()
+
     fun getUserPlaymateCategory(
         uid: String,
         cache: Boolean

+ 0 - 0
app/src/main/res/drawable/common_form_widget_divicer.xml → app/src/main/res/drawable/common_form_widget_divider.xml


+ 1 - 1
module/joinus/src/main/res/layout/fragment_apply_skill_form.xml

@@ -43,7 +43,7 @@
                     android:layout_height="wrap_content"
                     android:layout_marginTop="20dp"
                     android:orientation="vertical"
-                    app:divider="@drawable/common_form_widget_divicer"
+                    app:divider="@drawable/common_form_widget_divider"
                     app:layout_constraintTop_toBottomOf="@id/tv_title"
                     app:showDividers="middle" />
 

+ 1 - 1
module/joinus/src/main/res/layout/fragment_join_us_step_3_skill_form.xml

@@ -36,7 +36,7 @@
                 android:layout_height="wrap_content"
                 android:layout_marginTop="20dp"
                 android:orientation="vertical"
-                app:divider="@drawable/common_form_widget_divicer"
+                app:divider="@drawable/common_form_widget_divider"
                 app:showDividers="middle" />
 
         </androidx.appcompat.widget.LinearLayoutCompat>

+ 1 - 1
module/joinus/src/main/res/layout/fragment_playmate_setting_form.xml

@@ -43,7 +43,7 @@
                     android:layout_height="wrap_content"
                     android:layout_marginTop="20dp"
                     android:orientation="vertical"
-                    app:divider="@drawable/common_form_widget_divicer"
+                    app:divider="@drawable/common_form_widget_divider"
                     app:layout_constraintTop_toBottomOf="@id/tv_title"
                     app:showDividers="middle" />
 

+ 5 - 0
module/playmate/src/main/java/com/adealink/weparty/playmate/data/CategoryData.kt

@@ -1,8 +1,13 @@
 package com.adealink.weparty.playmate.data
 
+import com.adealink.weparty.module.playmate.data.PlaymateCategoryConditionData
 import com.adealink.weparty.module.playmate.data.PlaymateCategoryData
 import com.google.gson.annotations.SerializedName
 
 data class PlaymateCategoryRes(
     @SerializedName("list") val list: List<PlaymateCategoryData>, //品类列表
 )
+
+data class PlaymateCategoryConditionRes(
+    @SerializedName("list") val list: List<PlaymateCategoryConditionData>, //品类列表
+)

+ 7 - 0
module/playmate/src/main/java/com/adealink/weparty/playmate/data/PlaymateListData.kt

@@ -18,6 +18,13 @@ data class PlaymateListReq(
     @SerializedName("sortByStar") val sortByStar: Int? = null, //评分排序,-1:默认排序,0:升序,1:降序
     @SerializedName("sortByPrice") val sortByPrice: Int? = null, //价格排序,-1:默认排序,0:升序,1:降序
     @SerializedName("priceRange") val priceRange: Int? = null, //价格区间,-1:无限制,0:0-1000,1:1000-1500,2:1500-2500,3:2500-5000,4:5000以上
+
+    @SerializedName("categoryFilters") val otherOptions: List<PlaymateListOtherOptions>? = null
+)
+
+data class PlaymateListOtherOptions(
+    @SerializedName("fieldCode") val fieldCode: String,
+    @SerializedName("filterValues") val filterValues: List<String>,
 )
 
 

+ 5 - 0
module/playmate/src/main/java/com/adealink/weparty/playmate/datasource/remote/PlaymateHttpService.kt

@@ -8,6 +8,7 @@ import com.adealink.weparty.playmate.comment.data.PlaymateCommentReq
 import com.adealink.weparty.playmate.comment.data.PlaymateCommentRes
 import com.adealink.weparty.playmate.data.BusinessTimeData
 import com.adealink.weparty.playmate.data.GetSkillSwitchReq
+import com.adealink.weparty.playmate.data.PlaymateCategoryConditionRes
 import com.adealink.weparty.playmate.data.PlaymateCategoryRes
 import com.adealink.weparty.playmate.data.PlaymateDetailReq
 import com.adealink.weparty.playmate.data.PlaymateListReq
@@ -32,6 +33,10 @@ interface PlaymateHttpService {
     suspend fun getAllCategory(): Rlt<Res<PlaymateCategoryRes>>
 
 
+    @POST("biz/categorys/filter/condition")
+    suspend fun getAllCategoryCondition(): Rlt<Res<PlaymateCategoryConditionRes>>
+
+
     @POST("skill/list")
     suspend fun getPlaymateList(@Body req: PlaymateListReq): Rlt<Res<PlaymateListRes>>
 

+ 4 - 1
module/playmate/src/main/java/com/adealink/weparty/playmate/findpartner/FindPartnerFragment.kt

@@ -81,6 +81,9 @@ class FindPartnerFragment : BottomSheetDialogFragment(R.layout.fragment_find_par
                 categoryList.map { CategoryListTitleData(it) }
             )
         }
+        categoryViewModel.allCategoryConditionLD.observe(viewLifecycleOwner) { condition ->
+            findPartnerViewModel.setCondition(condition)
+        }
     }
 
     private fun inflatePage(page: FindPartnerPage) {
@@ -103,7 +106,7 @@ class FindPartnerFragment : BottomSheetDialogFragment(R.layout.fragment_find_par
     }
 
     private fun loadData() {
-        categoryViewModel.pullAllCategory()
+        categoryViewModel.pullAllCategoryCondition()
     }
 
     private fun clickBack() {

+ 9 - 3
module/playmate/src/main/java/com/adealink/weparty/playmate/findpartner/data/FindPartnerData.kt

@@ -1,5 +1,8 @@
 package com.adealink.weparty.playmate.findpartner.data
 
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
 
 enum class FindPartnerPage {
     SELECT_CATEGORY,
@@ -16,11 +19,14 @@ enum class Option(val type: String) {
     PRICE("price"),
 }
 
+@Parcelize
 data class OptionData(
-    val option: String,
-    val value: Int,
+    val option: String?,
+    val value: String?,
+
+    val key: String? = null,
     var selected: Boolean = false
-)
+) : Parcelable
 
 data class OptionItemData(
     val data: OptionData

+ 138 - 53
module/playmate/src/main/java/com/adealink/weparty/playmate/findpartner/page/SelectOtherFragment.kt

@@ -1,5 +1,7 @@
 package com.adealink.weparty.playmate.findpartner.page
 
+import android.view.LayoutInflater
+import androidx.appcompat.widget.LinearLayoutCompat
 import com.adealink.frame.aab.util.getCompatString
 import com.adealink.frame.mvvm.view.viewBinding
 import com.adealink.frame.router.Router
@@ -7,11 +9,11 @@ import com.adealink.frame.util.onClick
 import com.adealink.weparty.commonui.BaseFragment
 import com.adealink.weparty.module.playmate.Playmate
 import com.adealink.weparty.playmate.R
-import com.adealink.weparty.playmate.data.AgeOption
 import com.adealink.weparty.playmate.data.GenderOption
 import com.adealink.weparty.playmate.data.PriceRangeOption
 import com.adealink.weparty.playmate.data.StarOption
 import com.adealink.weparty.playmate.databinding.FragmentFindPartnerOtherBinding
+import com.adealink.weparty.playmate.databinding.LayoutFindPartnerOptionBinding
 import com.adealink.weparty.playmate.findpartner.FindPartnerFragment
 import com.adealink.weparty.playmate.findpartner.comp.FindPartnerOptionsComp
 import com.adealink.weparty.playmate.findpartner.data.OptionData
@@ -30,9 +32,12 @@ class SelectOtherFragment : BaseFragment(R.layout.fragment_find_partner_other) {
     private val findPartnerViewModel by parentFragmentViewModels<FindPartnerViewModel, FindPartnerFragment>(
         FindPartnerFragment::class.java
     )
+    private val optionCompList = mutableListOf<FindPartnerOptionsComp>()
+    private val otherOptionCompList = mutableListOf<FindPartnerOptionsComp>()
 
     private lateinit var genderOption: FindPartnerOptionsComp
-    private lateinit var ageOption: FindPartnerOptionsComp
+
+    //    private lateinit var ageOption: FindPartnerOptionsComp
     private lateinit var starOption: FindPartnerOptionsComp
     private lateinit var priceOption: FindPartnerOptionsComp
     override fun initViews() {
@@ -53,44 +58,47 @@ class SelectOtherFragment : BaseFragment(R.layout.fragment_find_partner_other) {
             listOf(
                 OptionData(
                     getCompatString(R.string.playmate_find_partner_option_unlimited),
-                    GenderOption.UNLIMITED.value,
-                    true
+                    GenderOption.UNLIMITED.value.toString(),
+                    selected = true
                 ),
                 OptionData(
                     getCompatString(R.string.playmate_find_partner_option_male),
-                    GenderOption.MALE.value,
+                    GenderOption.MALE.value.toString(),
                 ),
                 OptionData(
                     getCompatString(R.string.playmate_find_partner_option_female),
-                    GenderOption.FEMALE.value,
+                    GenderOption.FEMALE.value.toString(),
                 ),
             ),
             binding.vOptionGender
-        ).also { genderOption = it }.attach()
+        ).also {
+            genderOption = it
+            optionCompList.add(it)
+        }.attach()
 
-        FindPartnerOptionsComp(
-            this,
-            getCompatString(APP_R.string.common_age),
-            listOf(
-                OptionData(
-                    getCompatString(R.string.playmate_find_partner_option_unlimited),
-                    AgeOption.UNLIMITED.value, true
-                ),
-                OptionData(
-                    getCompatString(R.string.playmate_find_partner_option_age_15_25),
-                    AgeOption.AGE_15_25.value
-                ),
-                OptionData(
-                    getCompatString(R.string.playmate_find_partner_option_age_25_35),
-                    AgeOption.AGE_25_35.value
-                ),
-                OptionData(
-                    getCompatString(R.string.playmate_find_partner_option_age_35),
-                    AgeOption.AGE_35.value
-                )
-            ),
-            binding.vOptionAge
-        ).also { ageOption = it }.attach()
+//        FindPartnerOptionsComp(
+//            this,
+//            getCompatString(APP_R.string.common_age),
+//            listOf(
+//                OptionData(
+//                    getCompatString(R.string.playmate_find_partner_option_unlimited),
+//                    AgeOption.UNLIMITED.value, true
+//                ),
+//                OptionData(
+//                    getCompatString(R.string.playmate_find_partner_option_age_15_25),
+//                    AgeOption.AGE_15_25.value
+//                ),
+//                OptionData(
+//                    getCompatString(R.string.playmate_find_partner_option_age_25_35),
+//                    AgeOption.AGE_25_35.value
+//                ),
+//                OptionData(
+//                    getCompatString(R.string.playmate_find_partner_option_age_35),
+//                    AgeOption.AGE_35.value
+//                )
+//            ),
+//            binding.vOptionAge
+//        ).also { ageOption = it }.attach()
 
         FindPartnerOptionsComp(
             this,
@@ -98,19 +106,23 @@ class SelectOtherFragment : BaseFragment(R.layout.fragment_find_partner_other) {
             listOf(
                 OptionData(
                     getCompatString(R.string.playmate_find_partner_option_unlimited),
-                    StarOption.DEFAULT.value, true
+                    StarOption.DEFAULT.value.toString(),
+                    selected = true
                 ),
                 OptionData(
                     getCompatString(R.string.playmate_find_partner_option_evaluate_high_low),
-                    StarOption.DESC.value
+                    StarOption.DESC.value.toString()
                 ),
                 OptionData(
                     getCompatString(R.string.playmate_find_partner_option_evaluate_low_high),
-                    StarOption.ASC.value
+                    StarOption.ASC.value.toString()
                 ),
             ),
             binding.vOptionEvaluate
-        ).also { starOption = it }.attach()
+        ).also {
+            starOption = it
+            optionCompList.add(it)
+        }.attach()
 
         FindPartnerOptionsComp(
             this,
@@ -118,52 +130,125 @@ class SelectOtherFragment : BaseFragment(R.layout.fragment_find_partner_other) {
             listOf(
                 OptionData(
                     getCompatString(R.string.playmate_find_partner_option_unlimited),
-                    PriceRangeOption.UNLIMITED.value, true
+                    PriceRangeOption.UNLIMITED.value.toString(),
+                    selected = true
                 ),
                 OptionData(
                     getCompatString(R.string.playmate_find_partner_option_price_0_1000),
-                    PriceRangeOption.PRICE_0_1000.value
+                    PriceRangeOption.PRICE_0_1000.value.toString()
                 ),
                 OptionData(
                     getCompatString(R.string.playmate_find_partner_option_price_1000_1500),
-                    PriceRangeOption.PRICE_1000_1500.value
+                    PriceRangeOption.PRICE_1000_1500.value.toString()
                 ),
                 OptionData(
                     getCompatString(R.string.playmate_find_partner_option_price_1500_2500),
-                    PriceRangeOption.PRICE_1500_2500.value
+                    PriceRangeOption.PRICE_1500_2500.value.toString()
                 ),
                 OptionData(
                     getCompatString(R.string.playmate_find_partner_option_price_2500_5000),
-                    PriceRangeOption.PRICE_2500_5000.value
+                    PriceRangeOption.PRICE_2500_5000.value.toString()
                 ),
                 OptionData(
                     getCompatString(R.string.playmate_find_partner_option_price_5000),
-                    PriceRangeOption.PRICE_5000.value
+                    PriceRangeOption.PRICE_5000.value.toString()
                 ),
             ),
             binding.vOptionPrice
-        ).also { priceOption = it }.attach()
+        ).also {
+            priceOption = it
+            optionCompList.add(it)
+        }.attach()
+
+
+        //添加额外的选项
+        inflateOptions()
+    }
+
+    private fun inflateOptions() {
+        val data = findPartnerViewModel.selectCategoryLD.value
+        val condition = findPartnerViewModel.getCondition(data?.code) ?: return
+        for (field in condition.filterFields) {
+            if (field.options.isEmpty()) {
+                continue
+            }
+            val optionBinding =
+                LayoutFindPartnerOptionBinding.inflate(LayoutInflater.from(context), null, false)
+            binding.llOption.addView(
+                optionBinding.root,
+                LinearLayoutCompat.LayoutParams(
+                    LinearLayoutCompat.LayoutParams.MATCH_PARENT,
+                    LinearLayoutCompat.LayoutParams.WRAP_CONTENT
+                )
+            )
+
+            val options = mutableListOf<OptionData>()
+            options.add(
+                OptionData(
+                    getCompatString(R.string.playmate_find_partner_option_unlimited),
+                    null,
+                    key = field.fieldCode,
+                    selected = true
+                )
+            )
+            options.addAll(
+                field.options.map {
+                    OptionData(
+                        it.value, it.key,
+                        key = field.fieldCode
+                    )
+                }
+            )
+
+            FindPartnerOptionsComp(
+                this,
+                field.name,
+                options,
+                optionBinding
+            ).also {
+                optionCompList.add(it)
+                otherOptionCompList.add(it)
+            }.attach()
+        }
     }
 
     private fun reset() {
-        genderOption.reset()
-        ageOption.reset()
-        starOption.reset()
-        priceOption.reset()
+        for (comp in optionCompList) {
+            comp.reset()
+        }
     }
 
     private fun submit() {
         val act = activity ?: return
         val firstCode = findPartnerViewModel.firstCategoryCodeLD.value ?: return
         val category = findPartnerViewModel.selectCategoryLD.value ?: return
-        Router.build(act, Playmate.List.PATH)
-            .putExtra(Playmate.Common.EXTRA_FIRST_CATEGORY_CODE, firstCode)
-            .putExtra(Playmate.Common.EXTRA_CATEGORY, category)
-            .putExtra(Playmate.List.EXTRA_OPTION_GENDER, genderOption.getSelected()?.value ?: GenderOption.UNLIMITED.value)
-            .putExtra(Playmate.List.EXTRA_OPTION_AGE, ageOption.getSelected()?.value ?: AgeOption.UNLIMITED.value)
-            .putExtra(Playmate.List.EXTRA_OPTION_STAR, starOption.getSelected()?.value?: StarOption.DEFAULT.value)
-            .putExtra(Playmate.List.EXTRA_OPTION_PRICE_RANGE, priceOption.getSelected()?.value?: PriceRangeOption.UNLIMITED.value)
-            .start()
+        Router.build(act, Playmate.List.PATH).apply {
+            putExtra(Playmate.Common.EXTRA_FIRST_CATEGORY_CODE, firstCode)
+            putExtra(Playmate.Common.EXTRA_CATEGORY, category)
+            putExtra(
+                Playmate.List.EXTRA_OPTION_GENDER,
+                genderOption.getSelected()?.value?.toIntOrNull() ?: GenderOption.UNLIMITED.value
+            )
+//            .putExtra(Playmate.List.EXTRA_OPTION_AGE, ageOption.getSelected()?.value ?: AgeOption.UNLIMITED.value)
+            putExtra(
+                Playmate.List.EXTRA_OPTION_STAR,
+                starOption.getSelected()?.value?.toIntOrNull() ?: StarOption.DEFAULT.value
+            )
+            putExtra(
+                Playmate.List.EXTRA_OPTION_PRICE_RANGE,
+                priceOption.getSelected()?.value?.toIntOrNull() ?: PriceRangeOption.UNLIMITED.value
+            )
+
+            val otherOptions = arrayListOf<OptionData>()
+            for (option in otherOptionCompList) {
+                val selected = option.getSelected() ?: continue
+                otherOptions.add(selected)
+            }
+            putParcelableArrayListExtra(
+                Playmate.List.EXTRA_OPTION_OTHER,
+                otherOptions
+            )
+        }.start()
         findPartnerViewModel.dismiss()
     }
 

+ 12 - 0
module/playmate/src/main/java/com/adealink/weparty/playmate/findpartner/viewmodel/FindPartnerViewModel.kt

@@ -2,6 +2,7 @@ package com.adealink.weparty.playmate.findpartner.viewmodel
 
 import com.adealink.frame.mvvm.livedata.ExtMutableLiveData
 import com.adealink.frame.mvvm.viewmodel.BaseViewModel
+import com.adealink.weparty.module.playmate.data.PlaymateCategoryConditionData
 import com.adealink.weparty.module.playmate.data.PlaymateCategoryData
 import com.adealink.weparty.playmate.findpartner.data.FindPartnerPage
 import com.adealink.weparty.ui.category.data.CategoryListTitleData
@@ -25,6 +26,17 @@ class FindPartnerViewModel : BaseViewModel() {
         categoryTitleLD.send(titleList)
     }
 
+
+    private var allCategoryCondition = mapOf<String, PlaymateCategoryConditionData>()
+    fun setCondition(condition: Map<String, PlaymateCategoryConditionData>) {
+        this.allCategoryCondition = condition
+    }
+
+    fun getCondition(code: String?): PlaymateCategoryConditionData? {
+        code ?: return null
+        return allCategoryCondition[code]
+    }
+
     val firstCategoryCodeLD = ExtMutableLiveData<String?>()
     fun selectFirstCode(code: String?) {
         firstCategoryCodeLD.send(code)

+ 16 - 4
module/playmate/src/main/java/com/adealink/weparty/playmate/list/PlaymateListActivity.kt

@@ -21,6 +21,7 @@ import com.adealink.weparty.playmate.data.GenderOption
 import com.adealink.weparty.playmate.data.PriceRangeOption
 import com.adealink.weparty.playmate.data.StarOption
 import com.adealink.weparty.playmate.databinding.ActivityPlaymateListBinding
+import com.adealink.weparty.playmate.findpartner.data.OptionData
 import com.adealink.weparty.util.parcelableExtra
 import com.adealink.weparty.R as APP_R
 
@@ -39,8 +40,8 @@ class PlaymateListActivity : BaseActivity() {
     @BindExtra(Playmate.List.EXTRA_OPTION_GENDER)
     var optionGender: Int = GenderOption.UNLIMITED.value
 
-    @BindExtra(Playmate.List.EXTRA_OPTION_AGE)
-    var optionAge: Int = AgeOption.UNLIMITED.value
+//    @BindExtra(Playmate.List.EXTRA_OPTION_AGE)
+//    var optionAge: Int = AgeOption.UNLIMITED.value
 
     @BindExtra(Playmate.List.EXTRA_OPTION_STAR)
     var optionStar: Int = StarOption.DEFAULT.value
@@ -48,6 +49,9 @@ class PlaymateListActivity : BaseActivity() {
     @BindExtra(Playmate.List.EXTRA_OPTION_PRICE_RANGE)
     var optionPrice: Int = PriceRangeOption.UNLIMITED.value
 
+    @BindExtra(Playmate.List.EXTRA_OPTION_OTHER)
+    var otherOptions: List<OptionData>? = null
+
     private val binding by viewBinding(ActivityPlaymateListBinding::inflate)
     private val listFragment: PlaymateListFragment by fastLazy { PlaymateListFragment() }
 
@@ -86,13 +90,14 @@ class PlaymateListActivity : BaseActivity() {
         }
         optionGender =
             intent.getIntExtra(Playmate.List.EXTRA_OPTION_GENDER, GenderOption.UNLIMITED.value)
-        optionAge = intent.getIntExtra(Playmate.List.EXTRA_OPTION_AGE, AgeOption.UNLIMITED.value)
+//        optionAge = intent.getIntExtra(Playmate.List.EXTRA_OPTION_AGE, AgeOption.UNLIMITED.value)
         optionStar = intent.getIntExtra(Playmate.List.EXTRA_OPTION_STAR, StarOption.DEFAULT.value)
         optionPrice =
             intent.getIntExtra(
                 Playmate.List.EXTRA_OPTION_PRICE_RANGE,
                 PriceRangeOption.UNLIMITED.value
             )
+        otherOptions = intent.getParcelableArrayListExtra(Playmate.List.EXTRA_OPTION_OTHER)
         if (listFragment.isAdded) {
             listFragment.onNewIntent(intent)
         }
@@ -112,9 +117,16 @@ class PlaymateListActivity : BaseActivity() {
                 category
             )
             putInt(Playmate.List.EXTRA_OPTION_GENDER, optionGender)
-            putInt(Playmate.List.EXTRA_OPTION_AGE, optionAge)
+//            putInt(Playmate.List.EXTRA_OPTION_AGE, optionAge)
             putInt(Playmate.List.EXTRA_OPTION_STAR, optionStar)
             putInt(Playmate.List.EXTRA_OPTION_PRICE_RANGE, optionPrice)
+            otherOptions?.let {
+                putParcelableArrayList(
+                    Playmate.List.EXTRA_OPTION_OTHER,
+                    arrayListOf<OptionData>().apply {
+                        addAll(it)
+                    })
+            }
         }
         supportFragmentManager.beginTransaction()
             .replace(binding.flContent.id, listFragment, "PlaymateHomeList")

+ 16 - 9
module/playmate/src/main/java/com/adealink/weparty/playmate/list/PlaymateListFragment.kt

@@ -38,6 +38,7 @@ import com.adealink.weparty.playmate.data.PriceSort
 import com.adealink.weparty.playmate.data.StarOption
 import com.adealink.weparty.playmate.databinding.FragmentPlaymateListBinding
 import com.adealink.weparty.playmate.findpartner.FindPartnerFragment
+import com.adealink.weparty.playmate.findpartner.data.OptionData
 import com.adealink.weparty.playmate.list.adapter.PlaymateListItemViewBinder
 import com.adealink.weparty.playmate.list.comp.PlaymateListFilterComp
 import com.adealink.weparty.playmate.list.viewmodel.PlaymateListViewModel
@@ -63,8 +64,8 @@ class PlaymateListFragment : BaseFragment(R.layout.fragment_playmate_list),
     @BindExtra(Playmate.List.EXTRA_OPTION_GENDER)
     var optionGender: Int? = GenderOption.UNLIMITED.value
 
-    @BindExtra(Playmate.List.EXTRA_OPTION_AGE)
-    var optionAge: Int? = AgeOption.UNLIMITED.value
+//    @BindExtra(Playmate.List.EXTRA_OPTION_AGE)
+//    var optionAge: Int? = AgeOption.UNLIMITED.value
 
     @BindExtra(Playmate.List.EXTRA_OPTION_STAR)
     var optionStar: Int? = StarOption.DEFAULT.value
@@ -72,6 +73,10 @@ class PlaymateListFragment : BaseFragment(R.layout.fragment_playmate_list),
     @BindExtra(Playmate.List.EXTRA_OPTION_PRICE_RANGE)
     var optionPriceRange: Int? = PriceRangeOption.UNLIMITED.value
 
+    @BindExtra(Playmate.List.EXTRA_OPTION_OTHER)
+    var otherOptions: List<OptionData>? = null
+
+
     private val binding by viewBinding(FragmentPlaymateListBinding::bind)
     private val listAdapter by fastLazy { MultiTypeListAdapter(BaseListDiffUtil()) }
     private val playmateListViewModel by viewModels<PlaymateListViewModel> { PlaymateViewModelFactory() }
@@ -106,13 +111,14 @@ class PlaymateListFragment : BaseFragment(R.layout.fragment_playmate_list),
             )
         optionGender =
             intent?.getIntExtra(Playmate.List.EXTRA_OPTION_GENDER, GenderOption.UNLIMITED.value)
-        optionAge = intent?.getIntExtra(Playmate.List.EXTRA_OPTION_AGE, AgeOption.UNLIMITED.value)
+//        optionAge = intent?.getIntExtra(Playmate.List.EXTRA_OPTION_AGE, AgeOption.UNLIMITED.value)
         optionStar = intent?.getIntExtra(Playmate.List.EXTRA_OPTION_STAR, StarOption.DEFAULT.value)
         optionPriceRange =
             intent?.getIntExtra(
                 Playmate.List.EXTRA_OPTION_PRICE_RANGE,
                 PriceRangeOption.UNLIMITED.value
             )
+        otherOptions = intent?.getParcelableArrayListExtra(Playmate.List.EXTRA_OPTION_OTHER)
         loadData()
     }
 
@@ -189,12 +195,13 @@ class PlaymateListFragment : BaseFragment(R.layout.fragment_playmate_list),
     override fun loadData() {
         super.loadData()
         playmateListViewModel.setCategoryCode(
-            firstCategoryCode,
-            category?.code,
-            optionGender,
-            optionAge,
-            optionStar,
-            optionPriceRange
+            firstCategoryCode = firstCategoryCode,
+            code = category?.code,
+            optionGender = optionGender,
+            optionAge = null,
+            optionStar = optionStar,
+            optionPriceRange = optionPriceRange,
+            otherOptions = otherOptions
         )
         refreshPlaymateList()
     }

+ 14 - 1
module/playmate/src/main/java/com/adealink/weparty/playmate/list/viewmodel/PlaymateListViewModel.kt

@@ -8,10 +8,12 @@ import com.adealink.frame.network.data.PageReq
 import com.adealink.weparty.App
 import com.adealink.weparty.network.data.NoMoreDataError
 import com.adealink.weparty.playmate.data.PlaymateListData
+import com.adealink.weparty.playmate.data.PlaymateListOtherOptions
 import com.adealink.weparty.playmate.data.PlaymateListReq
 import com.adealink.weparty.playmate.data.PriceSort
 import com.adealink.weparty.playmate.data.StarOption
 import com.adealink.weparty.playmate.datasource.remote.PlaymateHttpService
+import com.adealink.weparty.playmate.findpartner.data.OptionData
 import com.adealink.weparty.util.PageHandler
 import kotlinx.coroutines.launch
 
@@ -36,6 +38,7 @@ class PlaymateListViewModel : BaseViewModel() {
     var optionGender: Int? = null
     var optionAge: Int? = null
     var optionPriceRange: Int? = null
+    var otherOptions: List<OptionData>? = null
 
     fun setCategoryCode(
         firstCategoryCode: String?,
@@ -44,13 +47,15 @@ class PlaymateListViewModel : BaseViewModel() {
         optionGender: Int? = null,
         optionAge: Int? = null,
         optionStar: Int? = null,
-        optionPriceRange: Int? = null
+        optionPriceRange: Int? = null,
+        otherOptions: List<OptionData>? = null
     ) {
         this.firstCategoryCode = firstCategoryCode
         categoryCode = code
         this.optionGender = optionGender
         this.optionAge = optionAge
         this.optionPriceRange = optionPriceRange
+        this.otherOptions = otherOptions
         starRankLD.send(StarOption.map(optionStar))
         pageHandler.reset()
         playmateList.clear()
@@ -123,6 +128,14 @@ class PlaymateListViewModel : BaseViewModel() {
                 sortByStar = starRankLD.value?.value ?: StarOption.DEFAULT.value,
                 sortByPrice = priceRankLD.value?.value ?: PriceSort.DEFAULT.value,
 
+                otherOptions = otherOptions?.mapNotNull {
+                    if (it.key.isNullOrEmpty() || it.value.isNullOrEmpty()) {
+                        null
+                    } else {
+                        PlaymateListOtherOptions(it.key, listOf(it.value))
+                    }
+                },
+
                 page = PageReq(size = pageHandler.pageSize, next = pageHandler.currentPage)
             )
         )

+ 3 - 0
module/playmate/src/main/java/com/adealink/weparty/playmate/manager/IPlaymateManager.kt

@@ -2,6 +2,7 @@ package com.adealink.weparty.playmate.manager
 
 import com.adealink.frame.base.Rlt
 import com.adealink.frame.frame.IBaseFrame
+import com.adealink.weparty.module.playmate.data.PlaymateCategoryConditionData
 import com.adealink.weparty.module.playmate.data.PlaymateCategoryData
 import com.adealink.weparty.module.playmate.data.UserPlaymateCategoryData
 
@@ -9,6 +10,8 @@ interface IPlaymateManager : IBaseFrame<IPlaymateListener> {
 
     suspend fun pullAllCategory(): List<PlaymateCategoryData>
 
+    suspend fun pullAllCategoryCondition(): Map<String, PlaymateCategoryConditionData>
+
     suspend fun getUserPlaymateCategory(uid: String, cache: Boolean): Rlt<List<UserPlaymateCategoryData>>
 
 }

+ 38 - 9
module/playmate/src/main/java/com/adealink/weparty/playmate/manager/PlaymateManager.kt

@@ -10,6 +10,7 @@ import com.adealink.frame.locale.language.listener.ILanguageListener
 import com.adealink.frame.log.Log
 import com.adealink.frame.storage.cache.TimeoutLruCache
 import com.adealink.weparty.App
+import com.adealink.weparty.module.playmate.data.PlaymateCategoryConditionData
 import com.adealink.weparty.module.playmate.data.PlaymateCategoryData
 import com.adealink.weparty.module.playmate.data.TAG_PLAYMATE_MANAGER
 import com.adealink.weparty.module.playmate.data.UserPlaymateCategoryData
@@ -32,8 +33,11 @@ class PlaymateManager : BaseFrame<IPlaymateListener>(), IPlaymateManager, ILangu
         ) //最多缓存5000个,缓存时长10分钟
     }
 
-    private var allPlaymateCategoryCacheTs = 0L
-    private var allPlaymateCategory = listOf<PlaymateCategoryData>()
+    private var allCategoryCacheTs = 0L
+    private var allCategory = listOf<PlaymateCategoryData>()
+
+    private var allCategoryConditionCacheTs = 0L
+    private var allCategoryCondition = mapOf<String, PlaymateCategoryConditionData>()
 
     init {
         App.instance.languageManager.addListener(this)
@@ -42,8 +46,8 @@ class PlaymateManager : BaseFrame<IPlaymateListener>(), IPlaymateManager, ILangu
 
     override suspend fun pullAllCategory(): List<PlaymateCategoryData> {
         //缓存时间1h ( 3_600_00 )
-        if (allPlaymateCategory.isNotEmpty() && (System.currentTimeMillis() - allPlaymateCategoryCacheTs < 3_600_00)) {
-            return allPlaymateCategory
+        if (allCategory.isNotEmpty() && (System.currentTimeMillis() - allCategoryCacheTs < 3_600_00)) {
+            return allCategory
         }
         val rlt = playmateHttpService.getAllCategory()
         when (rlt) {
@@ -53,13 +57,38 @@ class PlaymateManager : BaseFrame<IPlaymateListener>(), IPlaymateManager, ILangu
 
             is Rlt.Success -> {
                 val list = rlt.data.data?.list ?: emptyList()
-                allPlaymateCategory = list
-                allPlaymateCategoryCacheTs = System.currentTimeMillis()
-                return allPlaymateCategory
+                allCategory = list
+                allCategoryCacheTs = System.currentTimeMillis()
+                return allCategory
+            }
+        }
+    }
+
+    override suspend fun pullAllCategoryCondition(): Map<String, PlaymateCategoryConditionData> {
+        //缓存时间1h ( 3_600_00 )
+        if (allCategoryCondition.isNotEmpty() && (System.currentTimeMillis() - allCategoryConditionCacheTs < 3_600_00)) {
+            return allCategoryCondition
+        }
+        val rlt = playmateHttpService.getAllCategoryCondition()
+        when (rlt) {
+            is Rlt.Failed -> {
+                return emptyMap()
+            }
+
+            is Rlt.Success -> {
+                val list = rlt.data.data?.list ?: emptyList()
+                val map = mutableMapOf<String, PlaymateCategoryConditionData>()
+                for (data in list) {
+                    map[data.code] = data
+                }
+                allCategoryCondition = map
+                allCategoryConditionCacheTs = System.currentTimeMillis()
+                return allCategoryCondition
             }
         }
     }
 
+
     override suspend fun getUserPlaymateCategory(
         uid: String,
         cache: Boolean
@@ -97,8 +126,8 @@ class PlaymateManager : BaseFrame<IPlaymateListener>(), IPlaymateManager, ILangu
     }
 
     override fun onLanguageChanged(currentLanguage: Language) {
-        allPlaymateCategoryCacheTs = 0
-        allPlaymateCategory = emptyList()
+        allCategoryCacheTs = 0
+        allCategory = emptyList()
     }
 
 }

+ 15 - 0
module/playmate/src/main/java/com/adealink/weparty/playmate/viewmodel/PlaymateViewModel.kt

@@ -9,6 +9,7 @@ import com.adealink.frame.mvvm.livedata.OnceMutableLiveData
 import com.adealink.frame.mvvm.viewmodel.BaseViewModel
 import com.adealink.weparty.App
 import com.adealink.weparty.module.playmate.data.PlaymateBusinessData
+import com.adealink.weparty.module.playmate.data.PlaymateCategoryConditionData
 import com.adealink.weparty.module.playmate.data.PlaymateCategoryData
 import com.adealink.weparty.module.playmate.data.PlaymateDetailData
 import com.adealink.weparty.module.playmate.data.SkillSettingData
@@ -23,11 +24,14 @@ import com.adealink.weparty.playmate.data.SwitchBusinessReq
 import com.adealink.weparty.playmate.data.SwitchSkillReq
 import com.adealink.weparty.playmate.datasource.remote.PlaymateHttpService
 import com.adealink.weparty.playmate.manager.playmateManager
+import kotlinx.coroutines.async
 import kotlinx.coroutines.launch
 
 class PlaymateViewModel : BaseViewModel(), IPlaymateViewModel {
 
     override val allCategoryLD = MutableLiveData<List<PlaymateCategoryData>>()
+    override val allCategoryConditionLD =
+        MutableLiveData<Map<String, PlaymateCategoryConditionData>>()
 
     private val playmateHttpService by lazy {
         App.instance.networkService.getHttpService(PlaymateHttpService::class.java)
@@ -40,6 +44,17 @@ class PlaymateViewModel : BaseViewModel(), IPlaymateViewModel {
         }
     }
 
+    override fun pullAllCategoryCondition() {
+        viewModelScope.launch {
+            val categoryDef = async { playmateManager.pullAllCategory() }
+            val conditionDef = async { playmateManager.pullAllCategoryCondition() }
+            val categoryList = categoryDef.await()
+            val conditionMap = conditionDef.await()
+            allCategoryLD.send(categoryList)
+            allCategoryConditionLD.send(conditionMap)
+        }
+    }
+
     override fun getUserPlaymateCategory(
         uid: String,
         cache: Boolean

+ 5 - 0
module/playmate/src/main/res/drawable/find_partner_form_divider.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <size android:height="20dp" />
+</shape>

+ 11 - 11
module/playmate/src/main/res/layout/fragment_find_partner_other.xml

@@ -13,15 +13,18 @@
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent">
 
-        <androidx.constraintlayout.widget.ConstraintLayout
-            android:id="@+id/cl_option"
+        <androidx.appcompat.widget.LinearLayoutCompat
+            android:id="@+id/ll_option"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_marginTop="8dp"
+            android:orientation="vertical"
             android:padding="14dp"
+            app:divider="@drawable/find_partner_form_divider"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toBottomOf="@id/rv_category">
+            app:layout_constraintTop_toBottomOf="@id/rv_category"
+            app:showDividers="middle">
 
             <!-- 性别 -->
             <include
@@ -39,7 +42,6 @@
                 layout="@layout/layout_find_partner_option"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_marginTop="12dp"
                 app:layout_constraintEnd_toEndOf="parent"
                 app:layout_constraintStart_toStartOf="parent"
                 app:layout_constraintTop_toBottomOf="@id/v_option_gender" />
@@ -50,7 +52,6 @@
                 layout="@layout/layout_find_partner_option"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_marginTop="12dp"
                 app:layout_constraintEnd_toEndOf="parent"
                 app:layout_constraintStart_toStartOf="parent"
                 app:layout_constraintTop_toBottomOf="@id/v_option_age" />
@@ -61,12 +62,11 @@
                 layout="@layout/layout_find_partner_option"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_marginTop="12dp"
                 app:layout_constraintEnd_toEndOf="parent"
                 app:layout_constraintStart_toStartOf="parent"
                 app:layout_constraintTop_toBottomOf="@id/v_option_evaluate" />
 
-        </androidx.constraintlayout.widget.ConstraintLayout>
+        </androidx.appcompat.widget.LinearLayoutCompat>
 
     </androidx.core.widget.NestedScrollView>
 
@@ -97,12 +97,12 @@
         android:layout_width="0dp"
         android:layout_height="44dp"
         android:layout_marginTop="16dp"
-        app:text="@string/playmate_find_partner_submit"
-        app:textColor="@color/white"
-        app:textSize="16sp"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintHorizontal_weight="190"
-        app:layout_constraintStart_toEndOf="@id/btn_reset" />
+        app:layout_constraintStart_toEndOf="@id/btn_reset"
+        app:text="@string/playmate_find_partner_submit"
+        app:textColor="@color/white"
+        app:textSize="16sp" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>